{
  "version": 3,
  "sources": ["../lib/evilfont/font-asset.mjs", "../node_modules/twgl/dist/7.x/twgl-full.module.js", "../lib/portal-asset-manifest.mjs", "../lib/evil-works-utils.mjs", "../lib/eviltime.mjs", "../controls.mjs", "../lib/evilui/browser-gpu-diagnostics.mjs", "../lib/evilui/gl-buffer.mjs", "../lib/evilui/gl-picker.mjs", "../lib/evilui/input-route-log.mjs", "../debug-build-version.mjs", "../lib/frame-wakeup.mjs", "../lib/evilui/dirty-flags.mjs", "../lib/evilui/click-trace.mjs", "../lib/evilui/testing-trace.mjs", "../lib/evilui/focus-manager.mjs", "../lib/evilui/evil_palette.mjs", "../lib/evilui/base.mjs", "../lib/config.mjs", "../lib/evilui/gl-program.mjs", "../lib/evilfont/evilfont.mjs", "../lib/ptrless/flags.gen.mjs", "../lib/ptrless/flags.mjs", "../lib/ptrless/concrete/base.gen.mjs", "../lib/ptrless/hash.mjs", "../lib/ptrless/serialization-state.mjs", "../lib/ptrless/abstract/Core.mjs", "../lib/ptrless/concrete/MetadataFields.mjs", "../lib/ptrless/abstract/Hetero.mjs", "../lib/ptrless/concrete/Struct.mjs", "../lib/ptrless/abstract/Scalar.mjs", "../lib/ptrless/concrete/BoolScalar.mjs", "../lib/ptrless/concrete/BytesScalar.mjs", "../lib/ptrless/concrete/FloatScalar.mjs", "../lib/ptrless/concrete/IntegralScalar.mjs", "../lib/ptrless/concrete/ArrayIndex.mjs", "../lib/ptrless/concrete/ArraySlice.mjs", "../lib/ptrless/abstract/Arrow.mjs", "../lib/ptrless/concrete/BoolArrow.mjs", "../lib/ptrless/concrete/BytesArrow.mjs", "../lib/ptrless/concrete/err_meta.gen.mjs", "../lib/ptrless/concrete/Diagnostic.mjs", "../lib/ptrless/concrete/IntegralArrow.mjs", "../lib/ptrless/concrete/FloatArrow.mjs", "../lib/ptrless/concrete/Chunked.mjs", "../lib/ptrless/concrete/LogicalAxis.mjs", "../lib/ptrless/concrete/Lazy.mjs", "../lib/ptrless/concrete/Untyped.mjs", "../lib/ptrless/concrete/VecArrow.mjs", "../lib/ptrless/concrete/HomoArrow.mjs", "../lib/ptrless/concrete/MetadataV1.mjs", "../lib/ptrless/concrete/metadata_schema_current.gen.mjs", "../lib/ptrless/builder.mjs", "../lib/ptrless/import.mjs", "../lib/ptrless/ptrless.gen.mjs", "../lib/ptrless/export.mjs", "../lib/puffrpc/puffrpc.gen.mjs", "../lib/puffrpc/puffrpc.ptrless.mjs", "../lib/ptrless/rpc.mjs", "../lib/ptrless/dumper.mjs", "../lib/ptrless/ptrless.mjs", "../lib/evilui/visualization-plugin.mjs", "../lib/evilui/tile-material.mjs", "../lib/evilui/rounded-tile-state.mjs", "../lib/evilui/tile-shape.mjs", "../lib/evilui/scene-lighting.mjs", "../lib/evilui/tile.mjs", "../lib/evilui/text-utils.mjs", "../lib/evilui/popup.mjs", "../lib/evilui/primitive-shapes.mjs", "../lib/evilui/geometry-plot.mjs", "../lib/evilui/cartesian-plot-baseline.mjs", "../lib/evilui/tableview-helpers.mjs", "../lib/evilui/scatterplot.mjs", "../lib/evilui/visualization-plugin-registry.mjs", "../lib/evilui/builtin-visualization-plugins.mjs", "../lib/evilui/render-target.mjs", "../lib/evilui/context-image-texture.mjs", "../lib/evilui/caret.mjs", "../lib/evilui/diagnostics-control.mjs", "../lib/input-pick-policy.mjs", "../lib/evilui/scene.mjs", "../lib/evilui/window-manager.mjs", "../lib/evilui/stage.mjs", "../lib/evilui/backdrop.mjs", "../lib/evilui/overlay.mjs", "../lib/evilui/caret-quad.mjs", "../lib/evilui/gl-program-wait.mjs", "../lib/evilui/slab.mjs", "../lib/evilui/document.mjs", "../lib/evilui/activation.mjs", "../lib/evilui/output-metadata-panel.mjs", "../lib/evilui/demon.mjs", "../lib/quat.mjs", "../lib/evilui/button.mjs", "../lib/commander.mjs", "../lib/evilui/linear-space.mjs", "../lib/evilui/documentview-utils.mjs", "../puffbook-editchain.mjs", "../puffbook-replacespan.mjs", "../puffbook-output-lines.mjs", "../puffbook-line-status.mjs", "../lib/evilui/space-tabs.mjs", "../lib/evilui/clipboard-text.mjs", "../puffbook-selection.mjs", "../lib/evilui/documentview.mjs", "../lib/evilui/screen.mjs", "../lib/evilui/violin-plot.mjs", "../lib/evilui/sort-panel.mjs", "../lib/evilui/filter-panel.mjs", "../lib/evilui/fill-panel.mjs", "../lib/evilui/data-lineage-panel.mjs", "../lib/evilui/columns-metadata-panel.mjs", "../lib/build-flags.mjs", "../lib/evilui/icon.mjs", "../lib/evilui/fullscreen-chrome-button.mjs", "../lib/evilui/uniform-zebra-stripes.mjs", "../lib/evilui/tableview-header-layout.mjs", "../lib/evilui/tableview-header-tooltip.mjs", "../lib/evilui/formatters.mjs", "../lib/evilui/tableview-chunk-executor.mjs", "../lib/evilui/tableview.mjs", "../lib/evilui/checkbox.mjs", "../lib/evilui/context-menu.mjs", "../lib/evilui/toolbar.mjs", "../lib/evilui/inner-shadow.mjs", "../lib/evilui/drop-shadow.mjs", "../lib/evilui/chrome-spacing.mjs", "../lib/evilui/viewport.mjs", "../lib/evilui/stack-layout.mjs", "../lib/evilui/padding-layout.mjs", "../lib/evilui/scroll-box.mjs", "../lib/evilui/ui-window.mjs", "../lib/evilui/ui-dialog.mjs", "../lib/evilui/dialog-panel.mjs", "../lib/evilui/input-cell-math.mjs", "../lib/evilui/wrapped-input-layout.mjs", "../lib/evilui/input-cell.mjs", "../puffbook-search.mjs", "../lib/evilui/search-puffbook.mjs", "../lib/evilui/close-button.mjs", "../lib/evilui/keyboard.mjs", "../lib/evilui/labelled-icon.mjs", "../lib/evilui/polygon.mjs", "../node_modules/@loaders.gl/loader-utils/src/loader-types.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/env-utils/assert.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/env-utils/globals.ts", "../node_modules/@probe.gl/env/src/lib/globals.ts", "../node_modules/@probe.gl/env/src/lib/is-electron.ts", "../node_modules/@probe.gl/env/src/lib/is-browser.ts", "../node_modules/@probe.gl/env/src/index.ts", "../node_modules/@probe.gl/log/src/utils/assert.ts", "../node_modules/@probe.gl/log/src/loggers/log-utils.ts", "../node_modules/@probe.gl/log/src/loggers/base-log.ts", "../node_modules/@probe.gl/log/src/utils/local-storage.ts", "../node_modules/@probe.gl/log/src/utils/formatters.ts", "../node_modules/@probe.gl/log/src/utils/color.ts", "../node_modules/@probe.gl/log/src/utils/autobind.ts", "../node_modules/@probe.gl/log/src/utils/hi-res-timestamp.ts", "../node_modules/@probe.gl/log/src/loggers/probe-log.ts", "../node_modules/@probe.gl/log/src/init.ts", "../node_modules/@probe.gl/log/src/index.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/log-utils/log.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/javascript-utils/is-type.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/option-utils/merge-options.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/module-utils/js-module-utils.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/npm-tag.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/env-utils/version.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/env-utils/assert.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/env-utils/globals.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-farm/worker-job.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/node/worker_threads-browser.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-utils/get-loadable-worker-url.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-utils/get-transfer-list.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-farm/worker-thread.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-farm/worker-pool.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-farm/worker-farm.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-api/get-worker-url.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/worker-api/validate-worker-version.ts", "../node_modules/@loaders.gl/worker-utils/src/lib/library-utils/library-utils.ts", "../node_modules/@loaders.gl/worker-utils/src/index.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/worker-loader-utils/parse-with-worker.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/binary-utils/get-first-characters.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/parser-utils/parse-json.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/binary-utils/array-buffer-utils.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/binary-utils/memory-copy-utils.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/iterators/async-iteration.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/path-utils/file-aliases.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/node/buffer.browser.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/binary-utils/memory-conversion-utils.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/path-utils/get-cwd.ts", "../node_modules/@loaders.gl/loader-utils/src/lib/path-utils/path.ts", "../node_modules/@loaders.gl/loader-utils/src/index.ts", "../node_modules/@loaders.gl/core/src/lib/fetch/fetch-error.ts", "../node_modules/@loaders.gl/core/src/lib/utils/mime-type-utils.ts", "../node_modules/@loaders.gl/core/src/lib/utils/url-utils.ts", "../node_modules/@loaders.gl/core/src/lib/utils/resource-utils.ts", "../node_modules/@loaders.gl/core/src/lib/utils/response-utils.ts", "../node_modules/@loaders.gl/core/src/lib/fetch/fetch-file.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/loggers.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/option-defaults.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/option-utils.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/normalize-loader.ts", "../node_modules/@loaders.gl/core/src/lib/api/register-loaders.ts", "../node_modules/@loaders.gl/core/src/lib/api/select-loader.ts", "../node_modules/@loaders.gl/core/src/iterators/make-iterator/make-string-iterator.ts", "../node_modules/@loaders.gl/core/src/iterators/make-iterator/make-array-buffer-iterator.ts", "../node_modules/@loaders.gl/core/src/iterators/make-iterator/make-blob-iterator.ts", "../node_modules/@loaders.gl/core/src/iterators/make-iterator/make-stream-iterator.ts", "../node_modules/@loaders.gl/core/src/iterators/make-iterator/make-iterator.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/get-data.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/get-fetch-function.ts", "../node_modules/@loaders.gl/core/src/lib/loader-utils/loader-context.ts", "../node_modules/@loaders.gl/core/src/lib/api/parse.ts", "../node_modules/@loaders.gl/schema-utils/src/lib/schema/data-type.ts", "../node_modules/@loaders.gl/schema-utils/src/lib/mesh/mesh-utils.ts", "../node_modules/@loaders.gl/schema-utils/src/lib/mesh/deduce-mesh-schema.ts", "../node_modules/@loaders.gl/schema-utils/src/index.ts", "../node_modules/@loaders.gl/core/src/lib/api/load.ts", "../node_modules/@loaders.gl/core/src/index.ts", "../node_modules/@loaders.gl/images/src/lib/utils/version.ts", "../node_modules/@loaders.gl/images/src/lib/category-api/image-type.ts", "../node_modules/@loaders.gl/images/src/lib/category-api/parsed-image-api.ts", "../node_modules/@loaders.gl/images/src/lib/parsers/svg-utils.ts", "../node_modules/@loaders.gl/images/src/lib/parsers/parse-to-image.ts", "../node_modules/@loaders.gl/images/src/lib/parsers/parse-to-image-bitmap.ts", "../node_modules/@loaders.gl/images/src/lib/category-api/parse-isobmff-binary.ts", "../node_modules/@loaders.gl/images/src/lib/category-api/binary-image-api.ts", "../node_modules/@loaders.gl/images/src/lib/parsers/parse-to-node-image.ts", "../node_modules/@loaders.gl/images/src/lib/parsers/parse-image.ts", "../node_modules/@loaders.gl/images/src/image-loader.ts", "../node_modules/@loaders.gl/images/src/lib/category-api/image-format.ts", "../node_modules/@loaders.gl/images/src/index.ts", "../node_modules/@loaders.gl/gltf/src/lib/utils/assert.ts", "../node_modules/@loaders.gl/gltf/src/lib/gltf-utils/gltf-constants.ts", "../node_modules/@loaders.gl/gltf/src/lib/gltf-utils/gltf-utils.ts", "../node_modules/@loaders.gl/gltf/src/lib/gltf-utils/get-typed-array.ts", "../node_modules/@loaders.gl/gltf/src/lib/api/gltf-scenegraph.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/utils/3d-tiles-utils.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/EXT_mesh_features.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/EXT_structural_metadata.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/deprecated/EXT_feature_metadata.ts", "../node_modules/@loaders.gl/gltf/src/lib/utils/version.ts", "../node_modules/@loaders.gl/textures/src/lib/utils/version.ts", "../node_modules/@loaders.gl/textures/src/lib/parsers/basis-module-loader.ts", "../node_modules/@loaders.gl/textures/src/lib/gl-extensions.ts", "../node_modules/@loaders.gl/textures/src/lib/utils/detect-supported-texture-formats.ts", "../node_modules/@loaders.gl/textures/src/lib/parsers/parse-ktx.ts", "../node_modules/@loaders.gl/textures/src/lib/parsers/parse-basis.ts", "../node_modules/@loaders.gl/textures/src/basis-loader.ts", "../node_modules/@loaders.gl/textures/src/index.ts", "../node_modules/@loaders.gl/gltf/src/lib/parsers/parse-glb.ts", "../node_modules/@loaders.gl/gltf/src/lib/gltf-utils/resolve-url.ts", "../node_modules/@loaders.gl/gltf/src/meshopt/meshopt-decoder.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/EXT_meshopt_compression.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/EXT_texture_webp.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/KHR_texture_basisu.ts", "../node_modules/@loaders.gl/draco/src/lib/draco-module-loader.ts", "../node_modules/@loaders.gl/draco/src/lib/utils/version.ts", "../node_modules/@loaders.gl/draco/src/lib/utils/get-draco-schema.ts", "../node_modules/@loaders.gl/draco/src/lib/draco-parser.ts", "../node_modules/@loaders.gl/draco/src/draco-loader.ts", "../node_modules/@loaders.gl/draco/src/index.ts", "../node_modules/@loaders.gl/gltf/src/lib/gltf-utils/gltf-attribute-utils.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/KHR_draco_mesh_compression.ts", "../node_modules/@math.gl/core/src/lib/common.ts", "../node_modules/@math.gl/core/src/classes/base/math-array.ts", "../node_modules/@math.gl/core/src/lib/validators.ts", "../node_modules/@math.gl/core/src/lib/assert.ts", "../node_modules/@math.gl/core/src/classes/base/vector.ts", "../node_modules/@math.gl/core/src/gl-matrix/common.js", "../node_modules/@math.gl/core/src/gl-matrix/vec2.ts", "../node_modules/@math.gl/core/src/lib/gl-matrix-extras.ts", "../node_modules/@math.gl/core/src/gl-matrix/vec3.ts", "../node_modules/@math.gl/core/src/classes/vector3.ts", "../node_modules/@math.gl/core/src/classes/base/matrix.ts", "../node_modules/@math.gl/core/src/gl-matrix/mat3.ts", "../node_modules/@math.gl/core/src/classes/matrix3.ts", "../node_modules/@math.gl/core/src/gl-matrix/mat4.ts", "../node_modules/@math.gl/core/src/gl-matrix/vec4.ts", "../node_modules/@math.gl/core/src/gl-matrix/quat.ts", "../node_modules/@math.gl/core/src/lib/math-utils.ts", "../node_modules/@math.gl/core/src/index.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/KHR_texture_transform.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/deprecated/KHR_lights_punctual.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/deprecated/KHR_materials_unlit.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/deprecated/KHR_techniques_webgl.ts", "../node_modules/@loaders.gl/gltf/src/lib/api/gltf-extensions.ts", "../node_modules/@loaders.gl/gltf/src/lib/extensions/KHR_binary_gltf.ts", "../node_modules/@loaders.gl/gltf/src/lib/api/normalize-gltf-v1.ts", "../node_modules/@loaders.gl/gltf/src/lib/parsers/parse-gltf.ts", "../node_modules/@loaders.gl/gltf/src/gltf-loader.ts", "../node_modules/@loaders.gl/gltf/src/lib/api/post-process-gltf.ts", "../node_modules/@loaders.gl/gltf/src/index.ts", "../lib/evilui/mesh-instance.mjs", "../lib/evilui/banner-layout.mjs", "../lib/evilui/loader-ui.mjs", "../lib/evilui/camera.mjs", "../lib/evilui/texture-tile.mjs", "../lib/evilui/container.mjs", "../lib/evilui/info-bar.mjs", "../lib/evilui/evilui.mjs", "../lib/focus-scene.mjs", "../lib/director.mjs", "../env.mjs", "../node_modules/jwt-decode/build/esm/index.js", "../node_modules/oidc-client-ts/src/utils/Logger.ts", "../node_modules/oidc-client-ts/src/utils/JwtUtils.ts", "../node_modules/oidc-client-ts/src/utils/CryptoUtils.ts", "../node_modules/oidc-client-ts/src/utils/Event.ts", "../node_modules/oidc-client-ts/src/utils/PopupUtils.ts", "../node_modules/oidc-client-ts/src/utils/Timer.ts", "../node_modules/oidc-client-ts/src/utils/UrlUtils.ts", "../node_modules/oidc-client-ts/src/errors/ErrorResponse.ts", "../node_modules/oidc-client-ts/src/errors/ErrorTimeout.ts", "../node_modules/oidc-client-ts/src/AccessTokenEvents.ts", "../node_modules/oidc-client-ts/src/CheckSessionIFrame.ts", "../node_modules/oidc-client-ts/src/InMemoryWebStorage.ts", "../node_modules/oidc-client-ts/src/errors/ErrorDPoPNonce.ts", "../node_modules/oidc-client-ts/src/JsonService.ts", "../node_modules/oidc-client-ts/src/MetadataService.ts", "../node_modules/oidc-client-ts/src/WebStorageStateStore.ts", "../node_modules/oidc-client-ts/src/OidcClientSettings.ts", "../node_modules/oidc-client-ts/src/UserInfoService.ts", "../node_modules/oidc-client-ts/src/TokenClient.ts", "../node_modules/oidc-client-ts/src/ResponseValidator.ts", "../node_modules/oidc-client-ts/src/State.ts", "../node_modules/oidc-client-ts/src/SigninState.ts", "../node_modules/oidc-client-ts/src/SigninRequest.ts", "../node_modules/oidc-client-ts/src/SigninResponse.ts", "../node_modules/oidc-client-ts/src/SignoutRequest.ts", "../node_modules/oidc-client-ts/src/SignoutResponse.ts", "../node_modules/oidc-client-ts/src/ClaimsService.ts", "../node_modules/oidc-client-ts/src/DPoPStore.ts", "../node_modules/oidc-client-ts/src/OidcClient.ts", "../node_modules/oidc-client-ts/src/SessionMonitor.ts", "../node_modules/oidc-client-ts/src/User.ts", "../node_modules/oidc-client-ts/src/navigators/AbstractChildWindow.ts", "../node_modules/oidc-client-ts/src/UserManagerSettings.ts", "../node_modules/oidc-client-ts/src/navigators/IFrameWindow.ts", "../node_modules/oidc-client-ts/src/navigators/IFrameNavigator.ts", "../node_modules/oidc-client-ts/src/navigators/PopupWindow.ts", "../node_modules/oidc-client-ts/src/navigators/PopupNavigator.ts", "../node_modules/oidc-client-ts/src/navigators/RedirectNavigator.ts", "../node_modules/oidc-client-ts/src/UserManagerEvents.ts", "../node_modules/oidc-client-ts/src/SilentRenewService.ts", "../node_modules/oidc-client-ts/src/RefreshState.ts", "../node_modules/oidc-client-ts/src/UserManager.ts", "../node_modules/oidc-client-ts/package.json", "../node_modules/oidc-client-ts/src/Version.ts", "../node_modules/oidc-client-ts/src/IndexedDbDPoPStore.ts", "../lib/auth-policy.mjs", "../auth.mjs", "../api-config.mjs", "../api.mjs", "../lib/testing-bridge.mjs", "../testing-state.mjs", "../lib/font-test-preview.mjs", "../testing-entry.mjs", "../portal.mjs", "../lib/evilui/focus-accessibility.mjs", "../lib/shortcut-glossary.mjs", "../portal.entry.mjs", "../lib/evilui/agent-chat.mjs", "../lib/evilui/agent-input.mjs", "../lib/evilui/agent-conversation.mjs", "../fps-indicator.mjs", "../fps-hud-format.mjs", "../fps-format.mjs", "../ping-sampler.mjs", "../file-drop.mjs", "../lib/evilui/file-drop-overlay.mjs", "../lib/evilui/file-activity-indicator.mjs", "../lib/evilui/directory.mjs", "../lib/evilui/visual-tester-panel.mjs", "../lib/evilui/rename-panel.mjs", "../lib/evilui/form-submission.mjs", "../lib/evilui/permission-panel.mjs", "../lib/evilui/confirmation-panel.mjs", "../lib/evilui/new-file-panel.mjs", "../lib/evilui/new-dir-panel.mjs", "../lib/evilui/file-activity-queue.mjs", "../lib/evilui/upload-conflicts-panel.mjs", "../puffbook.mjs", "../puffbook-output-records.mjs", "../puffbook-body-window.mjs", "../puffbook-ops.mjs", "../puffbook-recording-state.mjs", "../puffbook-output-display.mjs", "../puffbook-line-policy.mjs", "../puffbook-lifecycle.mjs", "../puffbook-reconnect.mjs", "../puffbook-state.mjs", "../puffbook-predicted-state.mjs", "../puffbook-invariants.mjs", "../puffbook-doc-edits.mjs", "../puffbook-mutation.mjs", "../puffbook-pending-base.mjs", "../convo.mjs", "../lib/evilui/directory-utils.mjs", "../portal-routes.mjs", "../portal-policy.mjs", "../lib/evilui/input-recorder.mjs", "../lib/evilui/bug-report-recorder.mjs", "../portal-route-resolver.mjs", "../invite-links.mjs", "../jitter-probe.mjs"],
  "sourcesContent": ["// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport const FONT_FORMAT = 'evilfont.v2';\n\nexport function isUnicodeScalar(value) {\n    return Number.isInteger(value) && value >= 0 && value <= 0x10ffff\n        && (value < 0xd800 || value > 0xdfff);\n}\n\n/* One boundary contract shared by offline publication and browser loading. */\nexport function validateFontAsset(asset, label = 'font asset') {\n    const fail = (field, reason) => { throw new Error(`${label}: ${field} ${reason}.`); };\n    const object = (value, field) => {\n        if (!value || typeof value !== 'object' || Array.isArray(value)) fail(field, 'must be an object');\n    };\n    const finite = (value, field, positive = false) => {\n        if (!Number.isFinite(value) || (positive && value <= 0)) fail(field, `must be finite${positive ? ' and positive' : ''}`);\n    };\n    object(asset, 'asset');\n    if (asset.format !== FONT_FORMAT) fail('format', `must be '${FONT_FORMAT}', got '${asset.format}'; regenerate and publish the font bundle`);\n    object(asset.atlas, 'atlas');\n    const atlas = asset.atlas;\n    if (atlas.type !== 'msdf') fail('atlas.type', \"must be 'msdf'\");\n    if (atlas.yOrigin !== 'bottom') fail('atlas.yOrigin', \"must be 'bottom'\");\n    for (const field of ['width', 'height']) {\n        if (!Number.isSafeInteger(atlas[field]) || atlas[field] <= 0) fail(`atlas.${field}`, 'must be a positive integer');\n    }\n    finite(atlas.distanceRange, 'atlas.distanceRange', true);\n    // Only centred distance fields are currently supported by the shader.\n    if (atlas.distanceRangeMiddle !== 0) fail('atlas.distanceRangeMiddle', 'must be zero');\n    if (typeof atlas.image !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]*\\.png$/.test(atlas.image)) {\n        fail('atlas.image', 'must name a sibling PNG file');\n    }\n    object(asset.metrics, 'metrics');\n    for (const field of ['emSize', 'lineHeight']) finite(asset.metrics[field], `metrics.${field}`, true);\n    for (const field of ['ascender', 'descender']) finite(asset.metrics[field], `metrics.${field}`);\n    if (asset.metrics.ascender <= asset.metrics.descender) fail('metrics', 'must have ascender greater than descender');\n    for (const field of ['underlineY', 'underlineThickness', 'capHeight', 'xHeight']) {\n        if (asset.metrics[field] !== undefined) finite(asset.metrics[field], `metrics.${field}`);\n    }\n    if (!Array.isArray(asset.glyphs) || asset.glyphs.length === 0) fail('glyphs', 'must be a non-empty array');\n    const seen = new Set();\n    for (const [index, glyph] of asset.glyphs.entries()) {\n        const field = `glyphs[${index}]`;\n        object(glyph, field);\n        if (!isUnicodeScalar(glyph.codepoint)) fail(`${field}.codepoint`, 'must be a Unicode scalar');\n        if (seen.has(glyph.codepoint)) fail(`${field}.codepoint`, `duplicates U+${glyph.codepoint.toString(16).toUpperCase()}`);\n        seen.add(glyph.codepoint);\n        finite(glyph.advance, `${field}.advance`);\n        if (glyph.glyph_id !== undefined && (!Number.isSafeInteger(glyph.glyph_id) || glyph.glyph_id < 0)) fail(`${field}.glyph_id`, 'must be a non-negative integer');\n        if (glyph.glyph_name !== undefined && (typeof glyph.glyph_name !== 'string' || !glyph.glyph_name)) fail(`${field}.glyph_name`, 'must be a non-empty string');\n        // Null bounds explicitly represent advance-only glyphs, including spaces.\n        if (glyph.planeBounds === null && glyph.atlasBounds === null) continue;\n        for (const name of ['planeBounds', 'atlasBounds']) {\n            const bounds = glyph[name];\n            object(bounds, `${field}.${name}`);\n            for (const edge of ['left', 'bottom', 'right', 'top']) finite(bounds[edge], `${field}.${name}.${edge}`);\n            if (bounds.left >= bounds.right || bounds.bottom >= bounds.top) fail(`${field}.${name}`, 'must have positive area');\n        }\n        const b = glyph.atlasBounds;\n        if (b.left < 0 || b.bottom < 0 || b.right > atlas.width || b.top > atlas.height) fail(`${field}.atlasBounds`, 'lies outside the atlas');\n    }\n    if (asset.requiredCodepoints !== undefined) {\n        if (!Array.isArray(asset.requiredCodepoints) || asset.requiredCodepoints.some(cp => !isUnicodeScalar(cp))) {\n            fail('requiredCodepoints', 'must be an array of Unicode scalars');\n        }\n        for (const cp of asset.requiredCodepoints) {\n            const glyph = asset.glyphs.find(record => record.codepoint === cp);\n            if (!glyph?.planeBounds) fail('requiredCodepoints', `requires drawable U+${cp.toString(16).toUpperCase()}`);\n        }\n    }\n    return asset;\n}\n\n/* Runtime projection: metrics are in ems and lookup keys are complete scalars. */\nexport function fontDataFromAsset(asset, label) {\n    validateFontAsset(asset, label);\n    const { atlas, metrics } = asset;\n    const em = metrics.emSize;\n    const glyphs = Object.create(null);\n    for (const record of asset.glyphs) {\n        const b = record.atlasBounds;\n        const p = record.planeBounds;\n        glyphs[String.fromCodePoint(record.codepoint)] = {\n            advance: record.advance / em,\n            planeBounds: p ? Object.fromEntries(Object.entries(p).map(([key, value]) => [key, value / em])) : null,\n            tex_rect: b ? [b.left / atlas.width, b.bottom / atlas.height,\n                (b.right - b.left) / atlas.width, (b.top - b.bottom) / atlas.height] : [0, 0, 0, 0],\n        };\n    }\n    return { glyphs, atlas, size: em, pxRange: atlas.distanceRange,\n        lineHeight: metrics.lineHeight / em, ascender: metrics.ascender / em,\n        descender: metrics.descender / em };\n}\n\nfunction symbolCodepoint(symbol) {\n    const codepoint = typeof symbol === 'number' ? symbol : typeof symbol === 'string' ? symbol.codePointAt(0) : undefined;\n    if (!isUnicodeScalar(codepoint) || (typeof symbol === 'string' && symbol.length !== (codepoint > 0xffff ? 2 : 1))) {\n        throw new Error(`Font lookup requires one Unicode scalar, got '${symbol}'.`);\n    }\n    return codepoint;\n}\n\nconst FONT_FALLBACK_SPECS = Object.freeze([\n    Object.freeze({ name: 'FiraCode-Regular', requiredCharacters: '\uFFFD' }),\n    Object.freeze({ name: 'NotoSansMono-Regular', requiredCharacters: '\u2071\u2090\u2091\u2092\u2093\u2094\u2095\u2096\u2097\u2098\u2099\u209A\u209B\u209C' }),\n    Object.freeze({ name: 'NotoSansMath-Regular', requiredCharacters: '\u27E6\u27E7\u27EA\u27EB\u2308\u2309\u230A\u230B\u2983\u2984\u2985\u2986\u2997\u2998\u27C5\u27C6\u29D8\u29D9\u29DA\u29DB' }),\n]);\nexport const FONT_FALLBACK_NAMES = Object.freeze(FONT_FALLBACK_SPECS.map(spec => spec.name));\nconst fallbackDiagnostics = new WeakMap();\n\n/* Validate the complete fixed policy before installing immutable palettes. */\nexport function configureFontFallbacks(primaryFonts, fallbackFonts) {\n    if (fallbackFonts.length !== FONT_FALLBACK_SPECS.length) throw new Error('Expected Fira Code, Noto Sans Mono and Noto Sans Math fallback fonts.');\n    for (const [index, spec] of FONT_FALLBACK_SPECS.entries()) {\n        const font = fallbackFonts[index];\n        if (font.name !== spec.name) throw new Error(`Fallback ${index} must be ${spec.name}.`);\n        for (const ch of spec.requiredCharacters) {\n            if (!font.fontData.glyphs[ch]?.planeBounds) {\n                throw new Error(`${font.name} lacks required drawable U+${ch.codePointAt(0).toString(16).toUpperCase()}; regenerate and publish the matching bundle to fonts-v2/.`);\n            }\n        }\n    }\n    const fonts = new Set([...primaryFonts, ...fallbackFonts]);\n    for (const font of fonts) {\n        if (font.fontData.atlasFonts !== undefined) throw new Error(`${font.name}: fallback palette is already configured.`);\n        const canonicalIndex = FONT_FALLBACK_NAMES.indexOf(font.name);\n        if (canonicalIndex >= 0 && font !== fallbackFonts[canonicalIndex]) {\n            throw new Error(`${font.name}: selected fallback font must use the registered font object.`);\n        }\n    }\n    const replacementFont = fallbackFonts[0];\n    const cellAdvance = replacementFont.fontData.glyphs.M?.advance;\n    if (!Number.isFinite(cellAdvance) || cellAdvance <= 0) throw new Error('Fira Code requires a positive M cell advance.');\n    for (const font of fonts) {\n        const palette = Object.freeze([font, ...fallbackFonts.filter(fallback => fallback !== font)]);\n        Object.defineProperties(font.fontData, {\n            atlasFonts: { value: palette },\n            replacementAtlasIndex: { value: palette.indexOf(replacementFont) },\n        });\n        if (font === replacementFont) Object.defineProperty(font.fontData, 'cellAdvance', { value: cellAdvance });\n    }\n}\n\n/* Missing external text is presentation data; invalid scalars remain contract errors. */\nexport function resolveGlyphForSymbol(fontData, symbol) {\n    const codepoint = symbolCodepoint(symbol);\n    const ch = String.fromCodePoint(codepoint);\n    const primaryGlyph = fontData.glyphs[ch];\n    if (primaryGlyph) return { glyph: primaryGlyph, atlasIndex: 0, codepoint, renderedCodepoint: codepoint };\n    const palette = fontData.atlasFonts;\n    if (!palette) throw new Error(`Font is missing U+${codepoint.toString(16).toUpperCase()}; add it to the curated charset and regenerate the bundle.`);\n    let atlasIndex = palette.findIndex(font => font.fontData.glyphs[ch]);\n    let renderedCodepoint = codepoint;\n    if (atlasIndex < 0) {\n        atlasIndex = fontData.replacementAtlasIndex;\n        renderedCodepoint = 0xfffd;\n    }\n    const sourceGlyph = palette[atlasIndex].fontData.glyphs[String.fromCodePoint(renderedCodepoint)];\n    const advance = fontData.cellAdvance ?? sourceGlyph.advance;\n    const offset = (advance - sourceGlyph.advance) / 2;\n    const glyph = advance === sourceGlyph.advance ? sourceGlyph : { ...sourceGlyph, advance,\n        planeBounds: sourceGlyph.planeBounds ? { ...sourceGlyph.planeBounds,\n            left: sourceGlyph.planeBounds.left + offset, right: sourceGlyph.planeBounds.right + offset } : null };\n    let diagnostics = fallbackDiagnostics.get(fontData);\n    if (!diagnostics) { diagnostics = new Map(); fallbackDiagnostics.set(fontData, diagnostics); }\n    if (diagnostics.size < 128 && !diagnostics.has(codepoint)) {\n        diagnostics.set(codepoint, Object.freeze({ codepoint, renderedCodepoint, fontName: palette[atlasIndex].name }));\n    }\n    return { glyph, atlasIndex, codepoint, renderedCodepoint };\n}\n\nexport function getFontFallbackDiagnostics(fontData) {\n    return Array.from(fallbackDiagnostics.get(fontData)?.values() ?? []);\n}\n\nexport function glyphForSymbol(fontData, symbol) {\n    return resolveGlyphForSymbol(fontData, symbol).glyph;\n}\n", "/* @license twgl.js 7.0.0 Copyright (c) 2015, Gregg Tavares All Rights Reserved.\nAvailable via the MIT license.\nsee: http://github.com/greggman/twgl.js for details */\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n *\n * Vec3 math math functions.\n *\n * Almost all functions take an optional `dst` argument. If it is not passed in the\n * functions will create a new Vec3. In other words you can do this\n *\n *     var v = v3.cross(v1, v2);  // Creates a new Vec3 with the cross product of v1 x v2.\n *\n * or\n *\n *     var v = v3.create();\n *     v3.cross(v1, v2, v);  // Puts the cross product of v1 x v2 in v\n *\n * The first style is often easier but depending on where it's used it generates garbage where\n * as there is almost never allocation with the second style.\n *\n * It is always save to pass any vector as the destination. So for example\n *\n *     v3.cross(v1, v2, v1);  // Puts the cross product of v1 x v2 in v1\n *\n * @module twgl/v3\n */\n\nlet VecType = Float32Array;\n\n/**\n * A JavaScript array with 3 values or a Float32Array with 3 values.\n * When created by the library will create the default type which is `Float32Array`\n * but can be set by calling {@link module:twgl/v3.setDefaultType}.\n * @typedef {(number[]|Float32Array)} Vec3\n * @memberOf module:twgl/v3\n */\n\n/**\n * Sets the type this library creates for a Vec3\n * @param {constructor} ctor the constructor for the type. Either `Float32Array` or `Array`\n * @return {constructor} previous constructor for Vec3\n * @memberOf module:twgl/v3\n */\nfunction setDefaultType$1(ctor) {\n  const oldType = VecType;\n  VecType = ctor;\n  return oldType;\n}\n\n/**\n * Creates a vec3; may be called with x, y, z to set initial values.\n * @param {number} [x] Initial x value.\n * @param {number} [y] Initial y value.\n * @param {number} [z] Initial z value.\n * @return {module:twgl/v3.Vec3} the created vector\n * @memberOf module:twgl/v3\n */\nfunction create$1(x, y, z) {\n  const dst = new VecType(3);\n  if (x) {\n    dst[0] = x;\n  }\n  if (y) {\n    dst[1] = y;\n  }\n  if (z) {\n    dst[2] = z;\n  }\n  return dst;\n}\n\n/**\n * Adds two vectors; assumes a and b have the same dimension.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} A vector tha tis the sum of a and b.\n * @memberOf module:twgl/v3\n */\nfunction add(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] + b[0];\n  dst[1] = a[1] + b[1];\n  dst[2] = a[2] + b[2];\n\n  return dst;\n}\n\n/**\n * Subtracts two vectors.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} A vector that is the difference of a and b.\n * @memberOf module:twgl/v3\n */\nfunction subtract(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] - b[0];\n  dst[1] = a[1] - b[1];\n  dst[2] = a[2] - b[2];\n\n  return dst;\n}\n\n/**\n * Performs linear interpolation on two vectors.\n * Given vectors a and b and interpolation coefficient t, returns\n * a + t * (b - a).\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {number} t Interpolation coefficient.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The linear interpolated result.\n * @memberOf module:twgl/v3\n */\nfunction lerp(a, b, t, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] + t * (b[0] - a[0]);\n  dst[1] = a[1] + t * (b[1] - a[1]);\n  dst[2] = a[2] + t * (b[2] - a[2]);\n\n  return dst;\n}\n\n/**\n * Performs linear interpolation on two vectors.\n * Given vectors a and b and interpolation coefficient vector t, returns\n * a + t * (b - a).\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} t Interpolation coefficients vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} the linear interpolated result.\n * @memberOf module:twgl/v3\n */\nfunction lerpV(a, b, t, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] + t[0] * (b[0] - a[0]);\n  dst[1] = a[1] + t[1] * (b[1] - a[1]);\n  dst[2] = a[2] + t[2] * (b[2] - a[2]);\n\n  return dst;\n}\n\n/**\n * Return max values of two vectors.\n * Given vectors a and b returns\n * [max(a[0], b[0]), max(a[1], b[1]), max(a[2], b[2])].\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The max components vector.\n * @memberOf module:twgl/v3\n */\nfunction max(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = Math.max(a[0], b[0]);\n  dst[1] = Math.max(a[1], b[1]);\n  dst[2] = Math.max(a[2], b[2]);\n\n  return dst;\n}\n\n/**\n * Return min values of two vectors.\n * Given vectors a and b returns\n * [min(a[0], b[0]), min(a[1], b[1]), min(a[2], b[2])].\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The min components vector.\n * @memberOf module:twgl/v3\n */\nfunction min(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = Math.min(a[0], b[0]);\n  dst[1] = Math.min(a[1], b[1]);\n  dst[2] = Math.min(a[2], b[2]);\n\n  return dst;\n}\n\n/**\n * Multiplies a vector by a scalar.\n * @param {module:twgl/v3.Vec3} v The vector.\n * @param {number} k The scalar.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The scaled vector.\n * @memberOf module:twgl/v3\n */\nfunction mulScalar(v, k, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = v[0] * k;\n  dst[1] = v[1] * k;\n  dst[2] = v[2] * k;\n\n  return dst;\n}\n\n/**\n * Divides a vector by a scalar.\n * @param {module:twgl/v3.Vec3} v The vector.\n * @param {number} k The scalar.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The scaled vector.\n * @memberOf module:twgl/v3\n */\nfunction divScalar(v, k, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = v[0] / k;\n  dst[1] = v[1] / k;\n  dst[2] = v[2] / k;\n\n  return dst;\n}\n\n/**\n * Computes the cross product of two vectors; assumes both vectors have\n * three entries.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The vector of a cross b.\n * @memberOf module:twgl/v3\n */\nfunction cross(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  const t1 = a[2] * b[0] - a[0] * b[2];\n  const t2 = a[0] * b[1] - a[1] * b[0];\n  dst[0] = a[1] * b[2] - a[2] * b[1];\n  dst[1] = t1;\n  dst[2] = t2;\n\n  return dst;\n}\n\n/**\n * Computes the dot product of two vectors; assumes both vectors have\n * three entries.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @return {number} dot product\n * @memberOf module:twgl/v3\n */\nfunction dot(a, b) {\n  return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);\n}\n\n/**\n * Computes the length of vector\n * @param {module:twgl/v3.Vec3} v vector.\n * @return {number} length of vector.\n * @memberOf module:twgl/v3\n */\nfunction length$1(v) {\n  return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n}\n\n/**\n * Computes the square of the length of vector\n * @param {module:twgl/v3.Vec3} v vector.\n * @return {number} square of the length of vector.\n * @memberOf module:twgl/v3\n */\nfunction lengthSq(v) {\n  return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n}\n\n/**\n * Computes the distance between 2 points\n * @param {module:twgl/v3.Vec3} a vector.\n * @param {module:twgl/v3.Vec3} b vector.\n * @return {number} distance between a and b\n * @memberOf module:twgl/v3\n */\nfunction distance(a, b) {\n  const dx = a[0] - b[0];\n  const dy = a[1] - b[1];\n  const dz = a[2] - b[2];\n  return Math.sqrt(dx * dx + dy * dy + dz * dz);\n}\n\n/**\n * Computes the square of the distance between 2 points\n * @param {module:twgl/v3.Vec3} a vector.\n * @param {module:twgl/v3.Vec3} b vector.\n * @return {number} square of the distance between a and b\n * @memberOf module:twgl/v3\n */\nfunction distanceSq(a, b) {\n  const dx = a[0] - b[0];\n  const dy = a[1] - b[1];\n  const dz = a[2] - b[2];\n  return dx * dx + dy * dy + dz * dz;\n}\n\n/**\n * Divides a vector by its Euclidean length and returns the quotient.\n * @param {module:twgl/v3.Vec3} a The vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The normalized vector.\n * @memberOf module:twgl/v3\n */\nfunction normalize(a, dst) {\n  dst = dst || new VecType(3);\n\n  const lenSq = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];\n  const len = Math.sqrt(lenSq);\n  if (len > 0.00001) {\n    dst[0] = a[0] / len;\n    dst[1] = a[1] / len;\n    dst[2] = a[2] / len;\n  } else {\n    dst[0] = 0;\n    dst[1] = 0;\n    dst[2] = 0;\n  }\n\n  return dst;\n}\n\n/**\n * Negates a vector.\n * @param {module:twgl/v3.Vec3} v The vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} -v.\n * @memberOf module:twgl/v3\n */\nfunction negate$1(v, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = -v[0];\n  dst[1] = -v[1];\n  dst[2] = -v[2];\n\n  return dst;\n}\n\n/**\n * Copies a vector.\n * @param {module:twgl/v3.Vec3} v The vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} A copy of v.\n * @memberOf module:twgl/v3\n */\nfunction copy$1(v, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = v[0];\n  dst[1] = v[1];\n  dst[2] = v[2];\n\n  return dst;\n}\n\n/**\n * Multiplies a vector by another vector (component-wise); assumes a and\n * b have the same length.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The vector of products of entries of a and\n *     b.\n * @memberOf module:twgl/v3\n */\nfunction multiply$1(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] * b[0];\n  dst[1] = a[1] * b[1];\n  dst[2] = a[2] * b[2];\n\n  return dst;\n}\n\n/**\n * Divides a vector by another vector (component-wise); assumes a and\n * b have the same length.\n * @param {module:twgl/v3.Vec3} a Operand vector.\n * @param {module:twgl/v3.Vec3} b Operand vector.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not new one is created.\n * @return {module:twgl/v3.Vec3} The vector of quotients of entries of a and\n *     b.\n * @memberOf module:twgl/v3\n */\nfunction divide(a, b, dst) {\n  dst = dst || new VecType(3);\n\n  dst[0] = a[0] / b[0];\n  dst[1] = a[1] / b[1];\n  dst[2] = a[2] / b[2];\n\n  return dst;\n}\n\nvar v3 = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  add: add,\n  copy: copy$1,\n  create: create$1,\n  cross: cross,\n  distance: distance,\n  distanceSq: distanceSq,\n  divide: divide,\n  divScalar: divScalar,\n  dot: dot,\n  lerp: lerp,\n  lerpV: lerpV,\n  length: length$1,\n  lengthSq: lengthSq,\n  max: max,\n  min: min,\n  mulScalar: mulScalar,\n  multiply: multiply$1,\n  negate: negate$1,\n  normalize: normalize,\n  setDefaultType: setDefaultType$1,\n  subtract: subtract\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * 4x4 Matrix math math functions.\n *\n * Almost all functions take an optional `dst` argument. If it is not passed in the\n * functions will create a new matrix. In other words you can do this\n *\n *     const mat = m4.translation([1, 2, 3]);  // Creates a new translation matrix\n *\n * or\n *\n *     const mat = m4.create();\n *     m4.translation([1, 2, 3], mat);  // Puts translation matrix in mat.\n *\n * The first style is often easier but depending on where it's used it generates garbage where\n * as there is almost never allocation with the second style.\n *\n * It is always save to pass any matrix as the destination. So for example\n *\n *     const mat = m4.identity();\n *     const trans = m4.translation([1, 2, 3]);\n *     m4.multiply(mat, trans, mat);  // Multiplies mat * trans and puts result in mat.\n *\n * @module twgl/m4\n */\nlet MatType = Float32Array;\n\n/**\n * A JavaScript array with 16 values or a Float32Array with 16 values.\n * When created by the library will create the default type which is `Float32Array`\n * but can be set by calling {@link module:twgl/m4.setDefaultType}.\n * @typedef {(number[]|Float32Array)} Mat4\n * @memberOf module:twgl/m4\n */\n\n/**\n * Sets the type this library creates for a Mat4\n * @param {constructor} ctor the constructor for the type. Either `Float32Array` or `Array`\n * @return {constructor} previous constructor for Mat4\n * @memberOf module:twgl/m4\n */\nfunction setDefaultType(ctor) {\n  const oldType = MatType;\n  MatType = ctor;\n  return oldType;\n}\n\n/**\n * Negates a matrix.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} -m.\n * @memberOf module:twgl/m4\n */\nfunction negate(m, dst) {\n  dst = dst || new MatType(16);\n\n  dst[ 0] = -m[ 0];\n  dst[ 1] = -m[ 1];\n  dst[ 2] = -m[ 2];\n  dst[ 3] = -m[ 3];\n  dst[ 4] = -m[ 4];\n  dst[ 5] = -m[ 5];\n  dst[ 6] = -m[ 6];\n  dst[ 7] = -m[ 7];\n  dst[ 8] = -m[ 8];\n  dst[ 9] = -m[ 9];\n  dst[10] = -m[10];\n  dst[11] = -m[11];\n  dst[12] = -m[12];\n  dst[13] = -m[13];\n  dst[14] = -m[14];\n  dst[15] = -m[15];\n\n  return dst;\n}\n\n/**\n * Creates a matrix.\n * @return {module:twgl/m4.Mat4} A new matrix.\n * @memberOf module:twgl/m4\n */\nfunction create() {\n  return new MatType(16).fill(0);\n}\n\n/**\n * Copies a matrix.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/m4.Mat4} [dst] The matrix. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} A copy of m.\n * @memberOf module:twgl/m4\n */\nfunction copy(m, dst) {\n  dst = dst || new MatType(16);\n\n  dst[ 0] = m[ 0];\n  dst[ 1] = m[ 1];\n  dst[ 2] = m[ 2];\n  dst[ 3] = m[ 3];\n  dst[ 4] = m[ 4];\n  dst[ 5] = m[ 5];\n  dst[ 6] = m[ 6];\n  dst[ 7] = m[ 7];\n  dst[ 8] = m[ 8];\n  dst[ 9] = m[ 9];\n  dst[10] = m[10];\n  dst[11] = m[11];\n  dst[12] = m[12];\n  dst[13] = m[13];\n  dst[14] = m[14];\n  dst[15] = m[15];\n\n  return dst;\n}\n\n/**\n * Creates an n-by-n identity matrix.\n *\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} An n-by-n identity matrix.\n * @memberOf module:twgl/m4\n */\nfunction identity(dst) {\n  dst = dst || new MatType(16);\n\n  dst[ 0] = 1;\n  dst[ 1] = 0;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = 1;\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = 0;\n  dst[ 9] = 0;\n  dst[10] = 1;\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Takes the transpose of a matrix.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The transpose of m.\n * @memberOf module:twgl/m4\n */\n function transpose(m, dst) {\n  dst = dst || new MatType(16);\n  if (dst === m) {\n    let t;\n\n    t = m[1];\n    m[1] = m[4];\n    m[4] = t;\n\n    t = m[2];\n    m[2] = m[8];\n    m[8] = t;\n\n    t = m[3];\n    m[3] = m[12];\n    m[12] = t;\n\n    t = m[6];\n    m[6] = m[9];\n    m[9] = t;\n\n    t = m[7];\n    m[7] = m[13];\n    m[13] = t;\n\n    t = m[11];\n    m[11] = m[14];\n    m[14] = t;\n    return dst;\n  }\n\n  const m00 = m[0 * 4 + 0];\n  const m01 = m[0 * 4 + 1];\n  const m02 = m[0 * 4 + 2];\n  const m03 = m[0 * 4 + 3];\n  const m10 = m[1 * 4 + 0];\n  const m11 = m[1 * 4 + 1];\n  const m12 = m[1 * 4 + 2];\n  const m13 = m[1 * 4 + 3];\n  const m20 = m[2 * 4 + 0];\n  const m21 = m[2 * 4 + 1];\n  const m22 = m[2 * 4 + 2];\n  const m23 = m[2 * 4 + 3];\n  const m30 = m[3 * 4 + 0];\n  const m31 = m[3 * 4 + 1];\n  const m32 = m[3 * 4 + 2];\n  const m33 = m[3 * 4 + 3];\n\n  dst[ 0] = m00;\n  dst[ 1] = m10;\n  dst[ 2] = m20;\n  dst[ 3] = m30;\n  dst[ 4] = m01;\n  dst[ 5] = m11;\n  dst[ 6] = m21;\n  dst[ 7] = m31;\n  dst[ 8] = m02;\n  dst[ 9] = m12;\n  dst[10] = m22;\n  dst[11] = m32;\n  dst[12] = m03;\n  dst[13] = m13;\n  dst[14] = m23;\n  dst[15] = m33;\n\n  return dst;\n}\n\n/**\n * Computes the inverse of a 4-by-4 matrix.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The inverse of m.\n * @memberOf module:twgl/m4\n */\nfunction inverse(m, dst) {\n  dst = dst || new MatType(16);\n\n  const m00 = m[0 * 4 + 0];\n  const m01 = m[0 * 4 + 1];\n  const m02 = m[0 * 4 + 2];\n  const m03 = m[0 * 4 + 3];\n  const m10 = m[1 * 4 + 0];\n  const m11 = m[1 * 4 + 1];\n  const m12 = m[1 * 4 + 2];\n  const m13 = m[1 * 4 + 3];\n  const m20 = m[2 * 4 + 0];\n  const m21 = m[2 * 4 + 1];\n  const m22 = m[2 * 4 + 2];\n  const m23 = m[2 * 4 + 3];\n  const m30 = m[3 * 4 + 0];\n  const m31 = m[3 * 4 + 1];\n  const m32 = m[3 * 4 + 2];\n  const m33 = m[3 * 4 + 3];\n  const tmp_0  = m22 * m33;\n  const tmp_1  = m32 * m23;\n  const tmp_2  = m12 * m33;\n  const tmp_3  = m32 * m13;\n  const tmp_4  = m12 * m23;\n  const tmp_5  = m22 * m13;\n  const tmp_6  = m02 * m33;\n  const tmp_7  = m32 * m03;\n  const tmp_8  = m02 * m23;\n  const tmp_9  = m22 * m03;\n  const tmp_10 = m02 * m13;\n  const tmp_11 = m12 * m03;\n  const tmp_12 = m20 * m31;\n  const tmp_13 = m30 * m21;\n  const tmp_14 = m10 * m31;\n  const tmp_15 = m30 * m11;\n  const tmp_16 = m10 * m21;\n  const tmp_17 = m20 * m11;\n  const tmp_18 = m00 * m31;\n  const tmp_19 = m30 * m01;\n  const tmp_20 = m00 * m21;\n  const tmp_21 = m20 * m01;\n  const tmp_22 = m00 * m11;\n  const tmp_23 = m10 * m01;\n\n  const t0 = (tmp_0 * m11 + tmp_3 * m21 + tmp_4 * m31) -\n      (tmp_1 * m11 + tmp_2 * m21 + tmp_5 * m31);\n  const t1 = (tmp_1 * m01 + tmp_6 * m21 + tmp_9 * m31) -\n      (tmp_0 * m01 + tmp_7 * m21 + tmp_8 * m31);\n  const t2 = (tmp_2 * m01 + tmp_7 * m11 + tmp_10 * m31) -\n      (tmp_3 * m01 + tmp_6 * m11 + tmp_11 * m31);\n  const t3 = (tmp_5 * m01 + tmp_8 * m11 + tmp_11 * m21) -\n      (tmp_4 * m01 + tmp_9 * m11 + tmp_10 * m21);\n\n  const d = 1.0 / (m00 * t0 + m10 * t1 + m20 * t2 + m30 * t3);\n\n  dst[ 0] = d * t0;\n  dst[ 1] = d * t1;\n  dst[ 2] = d * t2;\n  dst[ 3] = d * t3;\n  dst[ 4] = d * ((tmp_1 * m10 + tmp_2 * m20 + tmp_5 * m30) -\n          (tmp_0 * m10 + tmp_3 * m20 + tmp_4 * m30));\n  dst[ 5] = d * ((tmp_0 * m00 + tmp_7 * m20 + tmp_8 * m30) -\n          (tmp_1 * m00 + tmp_6 * m20 + tmp_9 * m30));\n  dst[ 6] = d * ((tmp_3 * m00 + tmp_6 * m10 + tmp_11 * m30) -\n          (tmp_2 * m00 + tmp_7 * m10 + tmp_10 * m30));\n  dst[ 7] = d * ((tmp_4 * m00 + tmp_9 * m10 + tmp_10 * m20) -\n          (tmp_5 * m00 + tmp_8 * m10 + tmp_11 * m20));\n  dst[ 8] = d * ((tmp_12 * m13 + tmp_15 * m23 + tmp_16 * m33) -\n          (tmp_13 * m13 + tmp_14 * m23 + tmp_17 * m33));\n  dst[ 9] = d * ((tmp_13 * m03 + tmp_18 * m23 + tmp_21 * m33) -\n          (tmp_12 * m03 + tmp_19 * m23 + tmp_20 * m33));\n  dst[10] = d * ((tmp_14 * m03 + tmp_19 * m13 + tmp_22 * m33) -\n          (tmp_15 * m03 + tmp_18 * m13 + tmp_23 * m33));\n  dst[11] = d * ((tmp_17 * m03 + tmp_20 * m13 + tmp_23 * m23) -\n          (tmp_16 * m03 + tmp_21 * m13 + tmp_22 * m23));\n  dst[12] = d * ((tmp_14 * m22 + tmp_17 * m32 + tmp_13 * m12) -\n          (tmp_16 * m32 + tmp_12 * m12 + tmp_15 * m22));\n  dst[13] = d * ((tmp_20 * m32 + tmp_12 * m02 + tmp_19 * m22) -\n          (tmp_18 * m22 + tmp_21 * m32 + tmp_13 * m02));\n  dst[14] = d * ((tmp_18 * m12 + tmp_23 * m32 + tmp_15 * m02) -\n          (tmp_22 * m32 + tmp_14 * m02 + tmp_19 * m12));\n  dst[15] = d * ((tmp_22 * m22 + tmp_16 * m02 + tmp_21 * m12) -\n          (tmp_20 * m12 + tmp_23 * m22 + tmp_17 * m02));\n\n  return dst;\n}\n\n/**\n * Multiplies two 4-by-4 matrices with a on the left and b on the right\n * @param {module:twgl/m4.Mat4} a The matrix on the left.\n * @param {module:twgl/m4.Mat4} b The matrix on the right.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The matrix product of a and b.\n * @memberOf module:twgl/m4\n */\nfunction multiply(a, b, dst) {\n  dst = dst || new MatType(16);\n\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[ 4 + 0];\n  const a11 = a[ 4 + 1];\n  const a12 = a[ 4 + 2];\n  const a13 = a[ 4 + 3];\n  const a20 = a[ 8 + 0];\n  const a21 = a[ 8 + 1];\n  const a22 = a[ 8 + 2];\n  const a23 = a[ 8 + 3];\n  const a30 = a[12 + 0];\n  const a31 = a[12 + 1];\n  const a32 = a[12 + 2];\n  const a33 = a[12 + 3];\n  const b00 = b[0];\n  const b01 = b[1];\n  const b02 = b[2];\n  const b03 = b[3];\n  const b10 = b[ 4 + 0];\n  const b11 = b[ 4 + 1];\n  const b12 = b[ 4 + 2];\n  const b13 = b[ 4 + 3];\n  const b20 = b[ 8 + 0];\n  const b21 = b[ 8 + 1];\n  const b22 = b[ 8 + 2];\n  const b23 = b[ 8 + 3];\n  const b30 = b[12 + 0];\n  const b31 = b[12 + 1];\n  const b32 = b[12 + 2];\n  const b33 = b[12 + 3];\n\n  dst[ 0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;\n  dst[ 1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;\n  dst[ 2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03;\n  dst[ 3] = a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03;\n  dst[ 4] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13;\n  dst[ 5] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13;\n  dst[ 6] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13;\n  dst[ 7] = a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13;\n  dst[ 8] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23;\n  dst[ 9] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23;\n  dst[10] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23;\n  dst[11] = a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23;\n  dst[12] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33;\n  dst[13] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33;\n  dst[14] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33;\n  dst[15] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33;\n\n  return dst;\n}\n\n/**\n * Sets the translation component of a 4-by-4 matrix to the given\n * vector.\n * @param {module:twgl/m4.Mat4} a The matrix.\n * @param {module:twgl/v3.Vec3} v The vector.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The matrix with translation set.\n * @memberOf module:twgl/m4\n */\nfunction setTranslation(a, v, dst) {\n  dst = dst || identity();\n  if (a !== dst) {\n    dst[ 0] = a[ 0];\n    dst[ 1] = a[ 1];\n    dst[ 2] = a[ 2];\n    dst[ 3] = a[ 3];\n    dst[ 4] = a[ 4];\n    dst[ 5] = a[ 5];\n    dst[ 6] = a[ 6];\n    dst[ 7] = a[ 7];\n    dst[ 8] = a[ 8];\n    dst[ 9] = a[ 9];\n    dst[10] = a[10];\n    dst[11] = a[11];\n  }\n  dst[12] = v[0];\n  dst[13] = v[1];\n  dst[14] = v[2];\n  dst[15] = 1;\n  return dst;\n}\n\n/**\n * Returns the translation component of a 4-by-4 matrix as a vector with 3\n * entries.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} [dst] vector to hold result. If not passed a new one is created.\n * @return {module:twgl/v3.Vec3} The translation component of m.\n * @memberOf module:twgl/m4\n */\nfunction getTranslation(m, dst) {\n  dst = dst || create$1();\n  dst[0] = m[12];\n  dst[1] = m[13];\n  dst[2] = m[14];\n  return dst;\n}\n\n/**\n * Returns an axis of a 4x4 matrix as a vector with 3 entries\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {number} axis The axis 0 = x, 1 = y, 2 = z;\n * @return {module:twgl/v3.Vec3} [dst] vector.\n * @return {module:twgl/v3.Vec3} The axis component of m.\n * @memberOf module:twgl/m4\n */\nfunction getAxis(m, axis, dst) {\n  dst = dst || create$1();\n  const off = axis * 4;\n  dst[0] = m[off + 0];\n  dst[1] = m[off + 1];\n  dst[2] = m[off + 2];\n  return dst;\n}\n\n/**\n * Sets an axis of a 4x4 matrix as a vector with 3 entries\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} v the axis vector\n * @param {number} axis The axis  0 = x, 1 = y, 2 = z;\n * @param {module:twgl/m4.Mat4} [dst] The matrix to set. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The matrix with axis set.\n * @memberOf module:twgl/m4\n */\nfunction setAxis(a, v, axis, dst) {\n  if (dst !== a) {\n    dst = copy(a, dst);\n  }\n  const off = axis * 4;\n  dst[off + 0] = v[0];\n  dst[off + 1] = v[1];\n  dst[off + 2] = v[2];\n  return dst;\n}\n\n/**\n * Computes a 4-by-4 perspective transformation matrix given the angular height\n * of the frustum, the aspect ratio, and the near and far clipping planes.  The\n * arguments define a frustum extending in the negative z direction.  The given\n * angle is the vertical angle of the frustum, and the horizontal angle is\n * determined to produce the given aspect ratio.  The arguments near and far are\n * the distances to the near and far clipping planes.  Note that near and far\n * are not z coordinates, but rather they are distances along the negative\n * z-axis.  The matrix generated sends the viewing frustum to the unit box.\n * We assume a unit box extending from -1 to 1 in the x and y dimensions and\n * from 0 to 1 in the z dimension.\n * @param {number} fieldOfViewYInRadians The camera angle from top to bottom (in radians).\n * @param {number} aspect The aspect ratio width / height.\n * @param {number} zNear The depth (negative z coordinate)\n *     of the near clipping plane.\n * @param {number} zFar The depth (negative z coordinate)\n *     of the far clipping plane.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The perspective matrix.\n * @memberOf module:twgl/m4\n */\nfunction perspective(fieldOfViewYInRadians, aspect, zNear, zFar, dst) {\n  dst = dst || new MatType(16);\n\n  const f = Math.tan(Math.PI * 0.5 - 0.5 * fieldOfViewYInRadians);\n  const rangeInv = 1.0 / (zNear - zFar);\n\n  dst[0]  = f / aspect;\n  dst[1]  = 0;\n  dst[2]  = 0;\n  dst[3]  = 0;\n\n  dst[4]  = 0;\n  dst[5]  = f;\n  dst[6]  = 0;\n  dst[7]  = 0;\n\n  dst[8]  = 0;\n  dst[9]  = 0;\n  dst[10] = (zNear + zFar) * rangeInv;\n  dst[11] = -1;\n\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = zNear * zFar * rangeInv * 2;\n  dst[15] = 0;\n\n  return dst;\n}\n\n/**\n * Computes a 4-by-4 orthogonal transformation matrix given the left, right,\n * bottom, and top dimensions of the near clipping plane as well as the\n * near and far clipping plane distances.\n * @param {number} left Left side of the near clipping plane viewport.\n * @param {number} right Right side of the near clipping plane viewport.\n * @param {number} bottom Bottom of the near clipping plane viewport.\n * @param {number} top Top of the near clipping plane viewport.\n * @param {number} near The depth (negative z coordinate)\n *     of the near clipping plane.\n * @param {number} far The depth (negative z coordinate)\n *     of the far clipping plane.\n * @param {module:twgl/m4.Mat4} [dst] Output matrix. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The perspective matrix.\n * @memberOf module:twgl/m4\n */\nfunction ortho(left, right, bottom, top, near, far, dst) {\n  dst = dst || new MatType(16);\n\n  dst[0]  = 2 / (right - left);\n  dst[1]  = 0;\n  dst[2]  = 0;\n  dst[3]  = 0;\n\n  dst[4]  = 0;\n  dst[5]  = 2 / (top - bottom);\n  dst[6]  = 0;\n  dst[7]  = 0;\n\n  dst[8]  = 0;\n  dst[9]  = 0;\n  dst[10] = 2 / (near - far);\n  dst[11] = 0;\n\n  dst[12] = (right + left) / (left - right);\n  dst[13] = (top + bottom) / (bottom - top);\n  dst[14] = (far + near) / (near - far);\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Computes a 4-by-4 perspective transformation matrix given the left, right,\n * top, bottom, near and far clipping planes. The arguments define a frustum\n * extending in the negative z direction. The arguments near and far are the\n * distances to the near and far clipping planes. Note that near and far are not\n * z coordinates, but rather they are distances along the negative z-axis. The\n * matrix generated sends the viewing frustum to the unit box. We assume a unit\n * box extending from -1 to 1 in the x and y dimensions and from 0 to 1 in the z\n * dimension.\n * @param {number} left The x coordinate of the left plane of the box.\n * @param {number} right The x coordinate of the right plane of the box.\n * @param {number} bottom The y coordinate of the bottom plane of the box.\n * @param {number} top The y coordinate of the right plane of the box.\n * @param {number} near The negative z coordinate of the near plane of the box.\n * @param {number} far The negative z coordinate of the far plane of the box.\n * @param {module:twgl/m4.Mat4} [dst] Output matrix. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The perspective projection matrix.\n * @memberOf module:twgl/m4\n */\nfunction frustum(left, right, bottom, top, near, far, dst) {\n  dst = dst || new MatType(16);\n\n  const dx = (right - left);\n  const dy = (top - bottom);\n  const dz = (near - far);\n\n  dst[ 0] = 2 * near / dx;\n  dst[ 1] = 0;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = 2 * near / dy;\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = (left + right) / dx;\n  dst[ 9] = (top + bottom) / dy;\n  dst[10] = far / dz;\n  dst[11] = -1;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = near * far / dz;\n  dst[15] = 0;\n\n  return dst;\n}\n\nlet xAxis;\nlet yAxis;\nlet zAxis;\n\n/**\n * Computes a 4-by-4 look-at transformation.\n *\n * This is a matrix which positions the camera itself. If you want\n * a view matrix (a matrix which moves things in front of the camera)\n * take the inverse of this.\n *\n * @param {module:twgl/v3.Vec3} eye The position of the eye.\n * @param {module:twgl/v3.Vec3} target The position meant to be viewed.\n * @param {module:twgl/v3.Vec3} up A vector pointing up.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The look-at matrix.\n * @memberOf module:twgl/m4\n */\nfunction lookAt(eye, target, up, dst) {\n  dst = dst || new MatType(16);\n\n  xAxis = xAxis || create$1();\n  yAxis = yAxis || create$1();\n  zAxis = zAxis || create$1();\n\n  normalize(\n      subtract(eye, target, zAxis), zAxis);\n  normalize(cross(up, zAxis, xAxis), xAxis);\n  normalize(cross(zAxis, xAxis, yAxis), yAxis);\n\n  dst[ 0] = xAxis[0];\n  dst[ 1] = xAxis[1];\n  dst[ 2] = xAxis[2];\n  dst[ 3] = 0;\n  dst[ 4] = yAxis[0];\n  dst[ 5] = yAxis[1];\n  dst[ 6] = yAxis[2];\n  dst[ 7] = 0;\n  dst[ 8] = zAxis[0];\n  dst[ 9] = zAxis[1];\n  dst[10] = zAxis[2];\n  dst[11] = 0;\n  dst[12] = eye[0];\n  dst[13] = eye[1];\n  dst[14] = eye[2];\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which translates by the given vector v.\n * @param {module:twgl/v3.Vec3} v The vector by\n *     which to translate.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The translation matrix.\n * @memberOf module:twgl/m4\n */\nfunction translation(v, dst) {\n  dst = dst || new MatType(16);\n\n  dst[ 0] = 1;\n  dst[ 1] = 0;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = 1;\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = 0;\n  dst[ 9] = 0;\n  dst[10] = 1;\n  dst[11] = 0;\n  dst[12] = v[0];\n  dst[13] = v[1];\n  dst[14] = v[2];\n  dst[15] = 1;\n  return dst;\n}\n\n/**\n * Translates the given 4-by-4 matrix by the given vector v.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} v The vector by\n *     which to translate.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The translated matrix.\n * @memberOf module:twgl/m4\n */\nfunction translate(m, v, dst) {\n  dst = dst || new MatType(16);\n\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n  const m00 = m[0];\n  const m01 = m[1];\n  const m02 = m[2];\n  const m03 = m[3];\n  const m10 = m[1 * 4 + 0];\n  const m11 = m[1 * 4 + 1];\n  const m12 = m[1 * 4 + 2];\n  const m13 = m[1 * 4 + 3];\n  const m20 = m[2 * 4 + 0];\n  const m21 = m[2 * 4 + 1];\n  const m22 = m[2 * 4 + 2];\n  const m23 = m[2 * 4 + 3];\n  const m30 = m[3 * 4 + 0];\n  const m31 = m[3 * 4 + 1];\n  const m32 = m[3 * 4 + 2];\n  const m33 = m[3 * 4 + 3];\n\n  if (m !== dst) {\n    dst[ 0] = m00;\n    dst[ 1] = m01;\n    dst[ 2] = m02;\n    dst[ 3] = m03;\n    dst[ 4] = m10;\n    dst[ 5] = m11;\n    dst[ 6] = m12;\n    dst[ 7] = m13;\n    dst[ 8] = m20;\n    dst[ 9] = m21;\n    dst[10] = m22;\n    dst[11] = m23;\n  }\n\n  dst[12] = m00 * v0 + m10 * v1 + m20 * v2 + m30;\n  dst[13] = m01 * v0 + m11 * v1 + m21 * v2 + m31;\n  dst[14] = m02 * v0 + m12 * v1 + m22 * v2 + m32;\n  dst[15] = m03 * v0 + m13 * v1 + m23 * v2 + m33;\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which rotates around the x-axis by the given angle.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotation matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotationX(angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[ 0] = 1;\n  dst[ 1] = 0;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = c;\n  dst[ 6] = s;\n  dst[ 7] = 0;\n  dst[ 8] = 0;\n  dst[ 9] = -s;\n  dst[10] = c;\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Rotates the given 4-by-4 matrix around the x-axis by the given\n * angle.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotated matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotateX(m, angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const m10 = m[4];\n  const m11 = m[5];\n  const m12 = m[6];\n  const m13 = m[7];\n  const m20 = m[8];\n  const m21 = m[9];\n  const m22 = m[10];\n  const m23 = m[11];\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[4]  = c * m10 + s * m20;\n  dst[5]  = c * m11 + s * m21;\n  dst[6]  = c * m12 + s * m22;\n  dst[7]  = c * m13 + s * m23;\n  dst[8]  = c * m20 - s * m10;\n  dst[9]  = c * m21 - s * m11;\n  dst[10] = c * m22 - s * m12;\n  dst[11] = c * m23 - s * m13;\n\n  if (m !== dst) {\n    dst[ 0] = m[ 0];\n    dst[ 1] = m[ 1];\n    dst[ 2] = m[ 2];\n    dst[ 3] = m[ 3];\n    dst[12] = m[12];\n    dst[13] = m[13];\n    dst[14] = m[14];\n    dst[15] = m[15];\n  }\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which rotates around the y-axis by the given angle.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotation matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotationY(angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[ 0] = c;\n  dst[ 1] = 0;\n  dst[ 2] = -s;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = 1;\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = s;\n  dst[ 9] = 0;\n  dst[10] = c;\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Rotates the given 4-by-4 matrix around the y-axis by the given\n * angle.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotated matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotateY(m, angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const m00 = m[0 * 4 + 0];\n  const m01 = m[0 * 4 + 1];\n  const m02 = m[0 * 4 + 2];\n  const m03 = m[0 * 4 + 3];\n  const m20 = m[2 * 4 + 0];\n  const m21 = m[2 * 4 + 1];\n  const m22 = m[2 * 4 + 2];\n  const m23 = m[2 * 4 + 3];\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[ 0] = c * m00 - s * m20;\n  dst[ 1] = c * m01 - s * m21;\n  dst[ 2] = c * m02 - s * m22;\n  dst[ 3] = c * m03 - s * m23;\n  dst[ 8] = c * m20 + s * m00;\n  dst[ 9] = c * m21 + s * m01;\n  dst[10] = c * m22 + s * m02;\n  dst[11] = c * m23 + s * m03;\n\n  if (m !== dst) {\n    dst[ 4] = m[ 4];\n    dst[ 5] = m[ 5];\n    dst[ 6] = m[ 6];\n    dst[ 7] = m[ 7];\n    dst[12] = m[12];\n    dst[13] = m[13];\n    dst[14] = m[14];\n    dst[15] = m[15];\n  }\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotation matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotationZ(angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[ 0] = c;\n  dst[ 1] = s;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = -s;\n  dst[ 5] = c;\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = 0;\n  dst[ 9] = 0;\n  dst[10] = 1;\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Rotates the given 4-by-4 matrix around the z-axis by the given\n * angle.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotated matrix.\n * @memberOf module:twgl/m4\n */\nfunction rotateZ(m, angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  const m00 = m[0 * 4 + 0];\n  const m01 = m[0 * 4 + 1];\n  const m02 = m[0 * 4 + 2];\n  const m03 = m[0 * 4 + 3];\n  const m10 = m[1 * 4 + 0];\n  const m11 = m[1 * 4 + 1];\n  const m12 = m[1 * 4 + 2];\n  const m13 = m[1 * 4 + 3];\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n\n  dst[ 0] = c * m00 + s * m10;\n  dst[ 1] = c * m01 + s * m11;\n  dst[ 2] = c * m02 + s * m12;\n  dst[ 3] = c * m03 + s * m13;\n  dst[ 4] = c * m10 - s * m00;\n  dst[ 5] = c * m11 - s * m01;\n  dst[ 6] = c * m12 - s * m02;\n  dst[ 7] = c * m13 - s * m03;\n\n  if (m !== dst) {\n    dst[ 8] = m[ 8];\n    dst[ 9] = m[ 9];\n    dst[10] = m[10];\n    dst[11] = m[11];\n    dst[12] = m[12];\n    dst[13] = m[13];\n    dst[14] = m[14];\n    dst[15] = m[15];\n  }\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which rotates around the given axis by the given\n * angle.\n * @param {module:twgl/v3.Vec3} axis The axis\n *     about which to rotate.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} A matrix which rotates angle radians\n *     around the axis.\n * @memberOf module:twgl/m4\n */\nfunction axisRotation(axis, angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  let x = axis[0];\n  let y = axis[1];\n  let z = axis[2];\n  const n = Math.sqrt(x * x + y * y + z * z);\n  x /= n;\n  y /= n;\n  z /= n;\n  const xx = x * x;\n  const yy = y * y;\n  const zz = z * z;\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n  const oneMinusCosine = 1 - c;\n\n  dst[ 0] = xx + (1 - xx) * c;\n  dst[ 1] = x * y * oneMinusCosine + z * s;\n  dst[ 2] = x * z * oneMinusCosine - y * s;\n  dst[ 3] = 0;\n  dst[ 4] = x * y * oneMinusCosine - z * s;\n  dst[ 5] = yy + (1 - yy) * c;\n  dst[ 6] = y * z * oneMinusCosine + x * s;\n  dst[ 7] = 0;\n  dst[ 8] = x * z * oneMinusCosine + y * s;\n  dst[ 9] = y * z * oneMinusCosine - x * s;\n  dst[10] = zz + (1 - zz) * c;\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Rotates the given 4-by-4 matrix around the given axis by the\n * given angle.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} axis The axis\n *     about which to rotate.\n * @param {number} angleInRadians The angle by which to rotate (in radians).\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The rotated matrix.\n * @memberOf module:twgl/m4\n */\nfunction axisRotate(m, axis, angleInRadians, dst) {\n  dst = dst || new MatType(16);\n\n  let x = axis[0];\n  let y = axis[1];\n  let z = axis[2];\n  const n = Math.sqrt(x * x + y * y + z * z);\n  x /= n;\n  y /= n;\n  z /= n;\n  const xx = x * x;\n  const yy = y * y;\n  const zz = z * z;\n  const c = Math.cos(angleInRadians);\n  const s = Math.sin(angleInRadians);\n  const oneMinusCosine = 1 - c;\n\n  const r00 = xx + (1 - xx) * c;\n  const r01 = x * y * oneMinusCosine + z * s;\n  const r02 = x * z * oneMinusCosine - y * s;\n  const r10 = x * y * oneMinusCosine - z * s;\n  const r11 = yy + (1 - yy) * c;\n  const r12 = y * z * oneMinusCosine + x * s;\n  const r20 = x * z * oneMinusCosine + y * s;\n  const r21 = y * z * oneMinusCosine - x * s;\n  const r22 = zz + (1 - zz) * c;\n\n  const m00 = m[0];\n  const m01 = m[1];\n  const m02 = m[2];\n  const m03 = m[3];\n  const m10 = m[4];\n  const m11 = m[5];\n  const m12 = m[6];\n  const m13 = m[7];\n  const m20 = m[8];\n  const m21 = m[9];\n  const m22 = m[10];\n  const m23 = m[11];\n\n  dst[ 0] = r00 * m00 + r01 * m10 + r02 * m20;\n  dst[ 1] = r00 * m01 + r01 * m11 + r02 * m21;\n  dst[ 2] = r00 * m02 + r01 * m12 + r02 * m22;\n  dst[ 3] = r00 * m03 + r01 * m13 + r02 * m23;\n  dst[ 4] = r10 * m00 + r11 * m10 + r12 * m20;\n  dst[ 5] = r10 * m01 + r11 * m11 + r12 * m21;\n  dst[ 6] = r10 * m02 + r11 * m12 + r12 * m22;\n  dst[ 7] = r10 * m03 + r11 * m13 + r12 * m23;\n  dst[ 8] = r20 * m00 + r21 * m10 + r22 * m20;\n  dst[ 9] = r20 * m01 + r21 * m11 + r22 * m21;\n  dst[10] = r20 * m02 + r21 * m12 + r22 * m22;\n  dst[11] = r20 * m03 + r21 * m13 + r22 * m23;\n\n  if (m !== dst) {\n    dst[12] = m[12];\n    dst[13] = m[13];\n    dst[14] = m[14];\n    dst[15] = m[15];\n  }\n\n  return dst;\n}\n\n/**\n * Creates a 4-by-4 matrix which scales in each dimension by an amount given by\n * the corresponding entry in the given vector; assumes the vector has three\n * entries.\n * @param {module:twgl/v3.Vec3} v A vector of\n *     three entries specifying the factor by which to scale in each dimension.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The scaling matrix.\n * @memberOf module:twgl/m4\n */\nfunction scaling(v, dst) {\n  dst = dst || new MatType(16);\n\n  dst[ 0] = v[0];\n  dst[ 1] = 0;\n  dst[ 2] = 0;\n  dst[ 3] = 0;\n  dst[ 4] = 0;\n  dst[ 5] = v[1];\n  dst[ 6] = 0;\n  dst[ 7] = 0;\n  dst[ 8] = 0;\n  dst[ 9] = 0;\n  dst[10] = v[2];\n  dst[11] = 0;\n  dst[12] = 0;\n  dst[13] = 0;\n  dst[14] = 0;\n  dst[15] = 1;\n\n  return dst;\n}\n\n/**\n * Scales the given 4-by-4 matrix in each dimension by an amount\n * given by the corresponding entry in the given vector; assumes the vector has\n * three entries.\n * @param {module:twgl/m4.Mat4} m The matrix to be modified.\n * @param {module:twgl/v3.Vec3} v A vector of three entries specifying the\n *     factor by which to scale in each dimension.\n * @param {module:twgl/m4.Mat4} [dst] matrix to hold result. If not passed a new one is created.\n * @return {module:twgl/m4.Mat4} The scaled matrix.\n * @memberOf module:twgl/m4\n */\nfunction scale(m, v, dst) {\n  dst = dst || new MatType(16);\n\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n\n  dst[ 0] = v0 * m[0 * 4 + 0];\n  dst[ 1] = v0 * m[0 * 4 + 1];\n  dst[ 2] = v0 * m[0 * 4 + 2];\n  dst[ 3] = v0 * m[0 * 4 + 3];\n  dst[ 4] = v1 * m[1 * 4 + 0];\n  dst[ 5] = v1 * m[1 * 4 + 1];\n  dst[ 6] = v1 * m[1 * 4 + 2];\n  dst[ 7] = v1 * m[1 * 4 + 3];\n  dst[ 8] = v2 * m[2 * 4 + 0];\n  dst[ 9] = v2 * m[2 * 4 + 1];\n  dst[10] = v2 * m[2 * 4 + 2];\n  dst[11] = v2 * m[2 * 4 + 3];\n\n  if (m !== dst) {\n    dst[12] = m[12];\n    dst[13] = m[13];\n    dst[14] = m[14];\n    dst[15] = m[15];\n  }\n\n  return dst;\n}\n\n/**\n * Takes a 4-by-4 matrix and a vector with 3 entries,\n * interprets the vector as a point, transforms that point by the matrix, and\n * returns the result as a vector with 3 entries.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} v The point.\n * @param {module:twgl/v3.Vec3} [dst] optional vec3 to store result. If not passed a new one is created.\n * @return {module:twgl/v3.Vec3} The transformed point.\n * @memberOf module:twgl/m4\n */\nfunction transformPoint(m, v, dst) {\n  dst = dst || create$1();\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n  const d = v0 * m[0 * 4 + 3] + v1 * m[1 * 4 + 3] + v2 * m[2 * 4 + 3] + m[3 * 4 + 3];\n\n  dst[0] = (v0 * m[0 * 4 + 0] + v1 * m[1 * 4 + 0] + v2 * m[2 * 4 + 0] + m[3 * 4 + 0]) / d;\n  dst[1] = (v0 * m[0 * 4 + 1] + v1 * m[1 * 4 + 1] + v2 * m[2 * 4 + 1] + m[3 * 4 + 1]) / d;\n  dst[2] = (v0 * m[0 * 4 + 2] + v1 * m[1 * 4 + 2] + v2 * m[2 * 4 + 2] + m[3 * 4 + 2]) / d;\n\n  return dst;\n}\n\n/**\n * Takes a 4-by-4 matrix and a vector with 3 entries, interprets the vector as a\n * direction, transforms that direction by the matrix, and returns the result;\n * assumes the transformation of 3-dimensional space represented by the matrix\n * is parallel-preserving, i.e. any combination of rotation, scaling and\n * translation, but not a perspective distortion. Returns a vector with 3\n * entries.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} v The direction.\n * @param {module:twgl/v3.Vec3} [dst] optional Vec3 to store result. If not passed a new one is created.\n * @return {module:twgl/v3.Vec3} The transformed direction.\n * @memberOf module:twgl/m4\n */\nfunction transformDirection(m, v, dst) {\n  dst = dst || create$1();\n\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n\n  dst[0] = v0 * m[0 * 4 + 0] + v1 * m[1 * 4 + 0] + v2 * m[2 * 4 + 0];\n  dst[1] = v0 * m[0 * 4 + 1] + v1 * m[1 * 4 + 1] + v2 * m[2 * 4 + 1];\n  dst[2] = v0 * m[0 * 4 + 2] + v1 * m[1 * 4 + 2] + v2 * m[2 * 4 + 2];\n\n  return dst;\n}\n\n/**\n * Takes a 4-by-4 matrix m and a vector v with 3 entries, interprets the vector\n * as a normal to a surface, and computes a vector which is normal upon\n * transforming that surface by the matrix. The effect of this function is the\n * same as transforming v (as a direction) by the inverse-transpose of m.  This\n * function assumes the transformation of 3-dimensional space represented by the\n * matrix is parallel-preserving, i.e. any combination of rotation, scaling and\n * translation, but not a perspective distortion.  Returns a vector with 3\n * entries.\n * @param {module:twgl/m4.Mat4} m The matrix.\n * @param {module:twgl/v3.Vec3} v The normal.\n * @param {module:twgl/v3.Vec3} [dst] The direction. If not passed a new one is created.\n * @return {module:twgl/v3.Vec3} The transformed normal.\n * @memberOf module:twgl/m4\n */\nfunction transformNormal$1(m, v, dst) {\n  dst = dst || create$1();\n  const mi = inverse(m);\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n\n  dst[0] = v0 * mi[0 * 4 + 0] + v1 * mi[0 * 4 + 1] + v2 * mi[0 * 4 + 2];\n  dst[1] = v0 * mi[1 * 4 + 0] + v1 * mi[1 * 4 + 1] + v2 * mi[1 * 4 + 2];\n  dst[2] = v0 * mi[2 * 4 + 0] + v1 * mi[2 * 4 + 1] + v2 * mi[2 * 4 + 2];\n\n  return dst;\n}\n\nvar m4 = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  axisRotate: axisRotate,\n  axisRotation: axisRotation,\n  copy: copy,\n  create: create,\n  frustum: frustum,\n  getAxis: getAxis,\n  getTranslation: getTranslation,\n  identity: identity,\n  inverse: inverse,\n  lookAt: lookAt,\n  multiply: multiply,\n  negate: negate,\n  ortho: ortho,\n  perspective: perspective,\n  rotateX: rotateX,\n  rotateY: rotateY,\n  rotateZ: rotateZ,\n  rotationX: rotationX,\n  rotationY: rotationY,\n  rotationZ: rotationZ,\n  scale: scale,\n  scaling: scaling,\n  setAxis: setAxis,\n  setDefaultType: setDefaultType,\n  setTranslation: setTranslation,\n  transformDirection: transformDirection,\n  transformNormal: transformNormal$1,\n  transformPoint: transformPoint,\n  translate: translate,\n  translation: translation,\n  transpose: transpose\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/* DataType */\nconst BYTE$2                           = 0x1400;\nconst UNSIGNED_BYTE$3                  = 0x1401;\nconst SHORT$2                          = 0x1402;\nconst UNSIGNED_SHORT$3                 = 0x1403;\nconst INT$3                            = 0x1404;\nconst UNSIGNED_INT$3                   = 0x1405;\nconst FLOAT$3                          = 0x1406;\nconst UNSIGNED_SHORT_4_4_4_4$1       = 0x8033;\nconst UNSIGNED_SHORT_5_5_5_1$1       = 0x8034;\nconst UNSIGNED_SHORT_5_6_5$1         = 0x8363;\nconst HALF_FLOAT$1                   = 0x140B;\nconst UNSIGNED_INT_2_10_10_10_REV$1  = 0x8368;\nconst UNSIGNED_INT_10F_11F_11F_REV$1 = 0x8C3B;\nconst UNSIGNED_INT_5_9_9_9_REV$1     = 0x8C3E;\nconst FLOAT_32_UNSIGNED_INT_24_8_REV$1 = 0x8DAD;\nconst UNSIGNED_INT_24_8$1            = 0x84FA;\n\nconst glTypeToTypedArray = {};\n{\n  const tt = glTypeToTypedArray;\n  tt[BYTE$2]                           = Int8Array;\n  tt[UNSIGNED_BYTE$3]                  = Uint8Array;\n  tt[SHORT$2]                          = Int16Array;\n  tt[UNSIGNED_SHORT$3]                 = Uint16Array;\n  tt[INT$3]                            = Int32Array;\n  tt[UNSIGNED_INT$3]                   = Uint32Array;\n  tt[FLOAT$3]                          = Float32Array;\n  tt[UNSIGNED_SHORT_4_4_4_4$1]         = Uint16Array;\n  tt[UNSIGNED_SHORT_5_5_5_1$1]         = Uint16Array;\n  tt[UNSIGNED_SHORT_5_6_5$1]           = Uint16Array;\n  tt[HALF_FLOAT$1]                     = Uint16Array;\n  tt[UNSIGNED_INT_2_10_10_10_REV$1]    = Uint32Array;\n  tt[UNSIGNED_INT_10F_11F_11F_REV$1]   = Uint32Array;\n  tt[UNSIGNED_INT_5_9_9_9_REV$1]       = Uint32Array;\n  tt[FLOAT_32_UNSIGNED_INT_24_8_REV$1] = Uint32Array;\n  tt[UNSIGNED_INT_24_8$1]              = Uint32Array;\n}\n\n/**\n * Get the GL type for a typedArray\n * @param {ArrayBufferView} typedArray a typedArray\n * @return {number} the GL type for array. For example pass in an `Int8Array` and `gl.BYTE` will\n *   be returned. Pass in a `Uint32Array` and `gl.UNSIGNED_INT` will be returned\n * @memberOf module:twgl/typedArray\n */\nfunction getGLTypeForTypedArray(typedArray) {\n  if (typedArray instanceof Int8Array)         { return BYTE$2; }           // eslint-disable-line\n  if (typedArray instanceof Uint8Array)        { return UNSIGNED_BYTE$3; }  // eslint-disable-line\n  if (typedArray instanceof Uint8ClampedArray) { return UNSIGNED_BYTE$3; }  // eslint-disable-line\n  if (typedArray instanceof Int16Array)        { return SHORT$2; }          // eslint-disable-line\n  if (typedArray instanceof Uint16Array)       { return UNSIGNED_SHORT$3; } // eslint-disable-line\n  if (typedArray instanceof Int32Array)        { return INT$3; }            // eslint-disable-line\n  if (typedArray instanceof Uint32Array)       { return UNSIGNED_INT$3; }   // eslint-disable-line\n  if (typedArray instanceof Float32Array)      { return FLOAT$3; }          // eslint-disable-line\n  throw new Error('unsupported typed array type');\n}\n\n/**\n * Get the GL type for a typedArray type\n * @param {ArrayBufferView} typedArrayType a typedArray constructor\n * @return {number} the GL type for type. For example pass in `Int8Array` and `gl.BYTE` will\n *   be returned. Pass in `Uint32Array` and `gl.UNSIGNED_INT` will be returned\n * @memberOf module:twgl/typedArray\n */\nfunction getGLTypeForTypedArrayType(typedArrayType) {\n  if (typedArrayType === Int8Array)         { return BYTE$2; }           // eslint-disable-line\n  if (typedArrayType === Uint8Array)        { return UNSIGNED_BYTE$3; }  // eslint-disable-line\n  if (typedArrayType === Uint8ClampedArray) { return UNSIGNED_BYTE$3; }  // eslint-disable-line\n  if (typedArrayType === Int16Array)        { return SHORT$2; }          // eslint-disable-line\n  if (typedArrayType === Uint16Array)       { return UNSIGNED_SHORT$3; } // eslint-disable-line\n  if (typedArrayType === Int32Array)        { return INT$3; }            // eslint-disable-line\n  if (typedArrayType === Uint32Array)       { return UNSIGNED_INT$3; }   // eslint-disable-line\n  if (typedArrayType === Float32Array)      { return FLOAT$3; }          // eslint-disable-line\n  throw new Error('unsupported typed array type');\n}\n\n/**\n * Get the typed array constructor for a given GL type\n * @param {number} type the GL type. (eg: `gl.UNSIGNED_INT`)\n * @return {function} the constructor for a the corresponding typed array. (eg. `Uint32Array`).\n * @memberOf module:twgl/typedArray\n */\nfunction getTypedArrayTypeForGLType(type) {\n  const CTOR = glTypeToTypedArray[type];\n  if (!CTOR) {\n    throw new Error('unknown gl type');\n  }\n  return CTOR;\n}\n\nconst isArrayBuffer$1 = typeof SharedArrayBuffer !== 'undefined'\n  ? function isArrayBufferOrSharedArrayBuffer(a) {\n    return a && a.buffer && (a.buffer instanceof ArrayBuffer || a.buffer instanceof SharedArrayBuffer);\n  }\n  : function isArrayBuffer(a) {\n    return a && a.buffer && a.buffer instanceof ArrayBuffer;\n  };\n\nvar typedarrays = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  getGLTypeForTypedArray: getGLTypeForTypedArray,\n  getGLTypeForTypedArrayType: getGLTypeForTypedArrayType,\n  getTypedArrayTypeForGLType: getTypedArrayTypeForGLType,\n  isArrayBuffer: isArrayBuffer$1\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/* eslint no-console: \"off\" */\n\n/**\n * Copy named properties\n *\n * @param {string[]} names names of properties to copy\n * @param {object} src object to copy properties from\n * @param {object} dst object to copy properties to\n * @private\n */\nfunction copyNamedProperties(names, src, dst) {\n  names.forEach(function(name) {\n    const value = src[name];\n    if (value !== undefined) {\n      dst[name] = value;\n    }\n  });\n}\n\n/**\n * Copies properties from source to dest only if a matching key is in dest\n *\n * @param {Object.<string, ?>} src the source\n * @param {Object.<string, ?>} dst the dest\n * @private\n */\nfunction copyExistingProperties(src, dst) {\n  Object.keys(dst).forEach(function(key) {\n    if (dst.hasOwnProperty(key) && src.hasOwnProperty(key)) {  /* eslint no-prototype-builtins: 0 */\n      dst[key] = src[key];\n    }\n  });\n}\n\nfunction error$1(...args) {\n  console.error(...args);\n}\n\nfunction warn$1(...args) {\n  console.warn(...args);\n}\n\nconst isTypeWeakMaps = new Map();\n\nfunction isType(object, type) {\n  if (!object || typeof object !== 'object') {\n    return false;\n  }\n  let weakMap = isTypeWeakMaps.get(type);\n  if (!weakMap) {\n    weakMap = new WeakMap();\n    isTypeWeakMaps.set(type, weakMap);\n  }\n  let isOfType = weakMap.get(object);\n  if (isOfType === undefined) {\n    const s = Object.prototype.toString.call(object);\n    isOfType = s.substring(8, s.length - 1) === type;\n    weakMap.set(object, isOfType);\n  }\n  return isOfType;\n}\n\nfunction isBuffer(gl, t) {\n  return typeof WebGLBuffer !== 'undefined' && isType(t, 'WebGLBuffer');\n}\n\nfunction isRenderbuffer(gl, t) {\n  return typeof WebGLRenderbuffer !== 'undefined' && isType(t, 'WebGLRenderbuffer');\n}\n\nfunction isTexture(gl, t) {\n  return typeof WebGLTexture !== 'undefined' && isType(t, 'WebGLTexture');\n}\n\nfunction isSampler(gl, t) {\n  return typeof WebGLSampler !== 'undefined' && isType(t, 'WebGLSampler');\n}\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nconst STATIC_DRAW                  = 0x88e4;\nconst ARRAY_BUFFER$1                 = 0x8892;\nconst ELEMENT_ARRAY_BUFFER$2         = 0x8893;\nconst BUFFER_SIZE                  = 0x8764;\n\nconst BYTE$1                         = 0x1400;\nconst UNSIGNED_BYTE$2                = 0x1401;\nconst SHORT$1                        = 0x1402;\nconst UNSIGNED_SHORT$2               = 0x1403;\nconst INT$2                          = 0x1404;\nconst UNSIGNED_INT$2                 = 0x1405;\nconst FLOAT$2                        = 0x1406;\nconst defaults$2 = {\n  attribPrefix: \"\",\n};\n\n/**\n * Sets the default attrib prefix\n *\n * When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_`\n * as it makes it clear where they came from. But, when building geometry I prefer using un-prefixed names.\n *\n * In other words I'll create arrays of geometry like this\n *\n *     var arrays = {\n *       position: ...\n *       normal: ...\n *       texcoord: ...\n *     };\n *\n * But need those mapped to attributes and my attributes start with `a_`.\n *\n * @deprecated see {@link module:twgl.setDefaults}\n * @param {string} prefix prefix for attribs\n * @memberOf module:twgl/attributes\n */\nfunction setAttributePrefix(prefix) {\n  defaults$2.attribPrefix = prefix;\n}\n\nfunction setDefaults$2(newDefaults) {\n  copyExistingProperties(newDefaults, defaults$2);\n}\n\nfunction setBufferFromTypedArray(gl, type, buffer, array, drawType) {\n  gl.bindBuffer(type, buffer);\n  gl.bufferData(type, array, drawType || STATIC_DRAW);\n}\n\n/**\n * Given typed array creates a WebGLBuffer and copies the typed array\n * into it.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {ArrayBuffer|SharedArrayBuffer|ArrayBufferView|WebGLBuffer} typedArray the typed array. Note: If a WebGLBuffer is passed in it will just be returned. No action will be taken\n * @param {number} [type] the GL bind type for the buffer. Default = `gl.ARRAY_BUFFER`.\n * @param {number} [drawType] the GL draw type for the buffer. Default = 'gl.STATIC_DRAW`.\n * @return {WebGLBuffer} the created WebGLBuffer\n * @memberOf module:twgl/attributes\n */\nfunction createBufferFromTypedArray(gl, typedArray, type, drawType) {\n  if (isBuffer(gl, typedArray)) {\n    return typedArray;\n  }\n  type = type || ARRAY_BUFFER$1;\n  const buffer = gl.createBuffer();\n  setBufferFromTypedArray(gl, type, buffer, typedArray, drawType);\n  return buffer;\n}\n\nfunction isIndices(name) {\n  return name === \"indices\";\n}\n\n// This is really just a guess. Though I can't really imagine using\n// anything else? Maybe for some compression?\nfunction getNormalizationForTypedArrayType(typedArrayType) {\n  if (typedArrayType === Int8Array)    { return true; }  // eslint-disable-line\n  if (typedArrayType === Uint8Array)   { return true; }  // eslint-disable-line\n  return false;\n}\n\nfunction getArray$1(array) {\n  return array.length ? array : array.data;\n}\n\nconst texcoordRE = /coord|texture/i;\nconst colorRE = /color|colour/i;\n\nfunction guessNumComponentsFromName(name, length) {\n  let numComponents;\n  if (texcoordRE.test(name)) {\n    numComponents = 2;\n  } else if (colorRE.test(name)) {\n    numComponents = 4;\n  } else {\n    numComponents = 3;  // position, normals, indices ...\n  }\n\n  if (length % numComponents > 0) {\n    throw new Error(`Can not guess numComponents for attribute '${name}'. Tried ${numComponents} but ${length} values is not evenly divisible by ${numComponents}. You should specify it.`);\n  }\n\n  return numComponents;\n}\n\nfunction getNumComponents$1(array, arrayName, numValues) {\n  return array.numComponents || array.size || guessNumComponentsFromName(arrayName, numValues || getArray$1(array).length);\n}\n\nfunction makeTypedArray(array, name) {\n  if (isArrayBuffer$1(array)) {\n    return array;\n  }\n\n  if (isArrayBuffer$1(array.data)) {\n    return array.data;\n  }\n\n  if (Array.isArray(array)) {\n    array = {\n      data: array,\n    };\n  }\n\n  let Type = array.type ? typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type) : undefined;\n  if (!Type) {\n    if (isIndices(name)) {\n      Type = Uint16Array;\n    } else {\n      Type = Float32Array;\n    }\n  }\n  return new Type(array.data);\n}\n\nfunction glTypeFromGLTypeOrTypedArrayType(glTypeOrTypedArrayCtor) {\n  return typeof glTypeOrTypedArrayCtor === 'number'\n      ? glTypeOrTypedArrayCtor\n      : glTypeOrTypedArrayCtor ? getGLTypeForTypedArrayType(glTypeOrTypedArrayCtor) : FLOAT$2;\n}\n\nfunction typedArrayTypeFromGLTypeOrTypedArrayCtor(glTypeOrTypedArrayCtor) {\n  return typeof glTypeOrTypedArrayCtor === 'number'\n      ? getTypedArrayTypeForGLType(glTypeOrTypedArrayCtor)\n      : glTypeOrTypedArrayCtor || Float32Array;\n}\n\nfunction attribBufferFromBuffer(gl, array/*, arrayName */) {\n  return {\n    buffer: array.buffer,\n    numValues: 2 * 3 * 4,  // safely divided by 2, 3, 4\n    type: glTypeFromGLTypeOrTypedArrayType(array.type),\n    arrayType: typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type),\n  };\n}\n\nfunction attribBufferFromSize(gl, array/*, arrayName*/) {\n  const numValues = array.data || array;\n  const arrayType = typedArrayTypeFromGLTypeOrTypedArrayCtor(array.type);\n  const numBytes = numValues * arrayType.BYTES_PER_ELEMENT;\n  const buffer = gl.createBuffer();\n  gl.bindBuffer(ARRAY_BUFFER$1, buffer);\n  gl.bufferData(ARRAY_BUFFER$1, numBytes, array.drawType || STATIC_DRAW);\n  return {\n    buffer,\n    numValues,\n    type: getGLTypeForTypedArrayType(arrayType),\n    arrayType,\n  };\n}\n\nfunction attribBufferFromArrayLike(gl, array, arrayName) {\n  const typedArray = makeTypedArray(array, arrayName);\n  return {\n    arrayType: typedArray.constructor,\n    buffer: createBufferFromTypedArray(gl, typedArray, undefined, array.drawType),\n    type: getGLTypeForTypedArray(typedArray),\n    numValues: 0,\n  };\n}\n\n/**\n * The info for an attribute. This is effectively just the arguments to `gl.vertexAttribPointer` plus the WebGLBuffer\n * for the attribute.\n *\n * @typedef {Object} AttribInfo\n * @property {number[]|ArrayBufferView} [value] a constant value for the attribute. Note: if this is set the attribute will be\n *    disabled and set to this constant value and all other values will be ignored.\n * @property {number} [numComponents] the number of components for this attribute.\n * @property {number} [size] synonym for `numComponents`.\n * @property {number} [type] the type of the attribute (eg. `gl.FLOAT`, `gl.UNSIGNED_BYTE`, etc...) Default = `gl.FLOAT`\n * @property {boolean} [normalize] whether or not to normalize the data. Default = false\n * @property {number} [offset] offset into buffer in bytes. Default = 0\n * @property {number} [stride] the stride in bytes per element. Default = 0\n * @property {number} [divisor] the divisor in instances. Default = 0.\n *    Requires WebGL2 or the ANGLE_instanced_arrays extension.\n *    and, if you're using WebGL1 you must have called {@link module:twgl.addExtensionsToContext}\n * @property {WebGLBuffer} buffer the buffer that contains the data for this attribute\n * @property {number} [drawType] the draw type passed to gl.bufferData. Default = gl.STATIC_DRAW\n * @memberOf module:twgl\n */\n\n/**\n * @typedef {(Int8ArrayConstructor|Uint8ArrayConstructor|Int16ArrayConstructor|Uint16ArrayConstructor|Int32ArrayConstructor|Uint32ArrayConstructor|Float32ArrayConstructor)} TypedArrayConstructor\n */\n\n/**\n * Use this type of array spec when TWGL can't guess the type or number of components of an array\n * @typedef {Object} FullArraySpec\n * @property {number[]|ArrayBufferView} [value] a constant value for the attribute. Note: if this is set the attribute will be\n *    disabled and set to this constant value and all other values will be ignored.\n * @property {(number|number[]|ArrayBufferView)} [data] The data of the array. A number alone becomes the number of elements of type.\n * @property {number} [numComponents] number of components for `vertexAttribPointer`. Default is based on the name of the array.\n *    If `coord` is in the name assumes `numComponents = 2`.\n *    If `color` is in the name assumes `numComponents = 4`.\n *    otherwise assumes `numComponents = 3`\n * @property {number|TypedArrayConstructor} [type] type. This is used if `data` is a JavaScript array, or `buffer` is passed in, or `data` is a number.\n *   It can either be the constructor for a typedarray. (eg. `Uint8Array`) OR a WebGL type, (eg `gl.UNSIGNED_BYTE`).\n *   For example if you want colors in a `Uint8Array` you might have a `FullArraySpec` like `{ type: gl.UNSIGNED_BYTE, data: [255,0,255,255, ...], }`.\n * @property {number} [size] synonym for `numComponents`.\n * @property {boolean} [normalize] normalize for `vertexAttribPointer`. Default is true if type is `Int8Array` or `Uint8Array` otherwise false.\n * @property {number} [stride] stride for `vertexAttribPointer`. Default = 0\n * @property {number} [offset] offset for `vertexAttribPointer`. Default = 0\n * @property {number} [divisor] divisor for `vertexAttribDivisor`. Default = 0.\n *     Requires WebGL2 or the ANGLE_instanced_arrays extension.\n *     and, if you using WebGL1 you must have called {@link module:twgl.addExtensionsToContext}\n * @property {string} [attrib] name of attribute this array maps to. Defaults to same name as array prefixed by the default attribPrefix.\n * @property {string} [name] synonym for `attrib`.\n * @property {string} [attribName] synonym for `attrib`.\n * @property {WebGLBuffer} [buffer] Buffer to use for this attribute. This lets you use your own buffer\n *    but you will need to supply `numComponents` and `type`. You can effectively pass an `AttribInfo`\n *    to provide this. Example:\n *\n *         const bufferInfo1 = twgl.createBufferInfoFromArrays(gl, {\n *           position: [1, 2, 3, ... ],\n *         });\n *         const bufferInfo2 = twgl.createBufferInfoFromArrays(gl, {\n *           position: bufferInfo1.attribs.position,  // use the same buffer from bufferInfo1\n *         });\n *\n * @property {number} [drawType] the draw type passed to gl.bufferData. Default = gl.STATIC_DRAW\n * @memberOf module:twgl\n */\n\n/**\n * An individual array in {@link module:twgl.Arrays}\n *\n * When passed to {@link module:twgl.createBufferInfoFromArrays} if an ArraySpec is `number[]` or `ArrayBufferView`\n * the types will be guessed based on the name. `indices` will be `Uint16Array`, everything else will\n * be `Float32Array`. If an ArraySpec is a number it's the number of floats for an empty (zeroed) buffer.\n *\n * @typedef {(number|number[]|ArrayBufferView|module:twgl.FullArraySpec)} ArraySpec\n * @memberOf module:twgl\n */\n\n/**\n * This is a JavaScript object of arrays by name. The names should match your shader's attributes. If your\n * attributes have a common prefix you can specify it by calling {@link module:twgl.setAttributePrefix}.\n *\n *     Bare JavaScript Arrays\n *\n *         var arrays = {\n *            position: [-1, 1, 0],\n *            normal: [0, 1, 0],\n *            ...\n *         }\n *\n *     Bare TypedArrays\n *\n *         var arrays = {\n *            position: new Float32Array([-1, 1, 0]),\n *            color: new Uint8Array([255, 128, 64, 255]),\n *            ...\n *         }\n *\n * *   Will guess at `numComponents` if not specified based on name.\n *\n *     If `coord` is in the name assumes `numComponents = 2`\n *\n *     If `color` is in the name assumes `numComponents = 4`\n *\n *     otherwise assumes `numComponents = 3`\n *\n * Objects with various fields. See {@link module:twgl.FullArraySpec}.\n *\n *     var arrays = {\n *       position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], },\n *       texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1],                 },\n *       normal:   { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1],     },\n *       indices:  { numComponents: 3, data: [0, 1, 2, 1, 2, 3],                       },\n *     };\n *\n * @typedef {Object.<string, module:twgl.ArraySpec>} Arrays\n * @memberOf module:twgl\n */\n\n\n/**\n * Creates a set of attribute data and WebGLBuffers from set of arrays\n *\n * Given\n *\n *      var arrays = {\n *        position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], },\n *        texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1],                 },\n *        normal:   { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1],     },\n *        color:    { numComponents: 4, data: [255, 255, 255, 255, 255, 0, 0, 255, 0, 0, 255, 255], type: Uint8Array, },\n *        indices:  { numComponents: 3, data: [0, 1, 2, 1, 2, 3],                       },\n *      };\n *\n * returns something like\n *\n *      var attribs = {\n *        position: { numComponents: 3, type: gl.FLOAT,         normalize: false, buffer: WebGLBuffer, },\n *        texcoord: { numComponents: 2, type: gl.FLOAT,         normalize: false, buffer: WebGLBuffer, },\n *        normal:   { numComponents: 3, type: gl.FLOAT,         normalize: false, buffer: WebGLBuffer, },\n *        color:    { numComponents: 4, type: gl.UNSIGNED_BYTE, normalize: true,  buffer: WebGLBuffer, },\n *      };\n *\n * notes:\n *\n * *   Arrays can take various forms\n *\n *     Bare JavaScript Arrays\n *\n *         var arrays = {\n *            position: [-1, 1, 0],\n *            normal: [0, 1, 0],\n *            ...\n *         }\n *\n *     Bare TypedArrays\n *\n *         var arrays = {\n *            position: new Float32Array([-1, 1, 0]),\n *            color: new Uint8Array([255, 128, 64, 255]),\n *            ...\n *         }\n *\n * *   Will guess at `numComponents` if not specified based on name.\n *\n *     If `coord` is in the name assumes `numComponents = 2`\n *\n *     If `color` is in the name assumes `numComponents = 4`\n *\n *     otherwise assumes `numComponents = 3`\n *\n * @param {WebGLRenderingContext} gl The webgl rendering context.\n * @param {module:twgl.Arrays} arrays The arrays\n * @param {module:twgl.BufferInfo} [srcBufferInfo] a BufferInfo to copy from\n *   This lets you share buffers. Any arrays you supply will override\n *   the buffers from srcBufferInfo.\n * @return {Object.<string, module:twgl.AttribInfo>} the attribs\n * @memberOf module:twgl/attributes\n */\nfunction createAttribsFromArrays(gl, arrays) {\n  const attribs = {};\n  Object.keys(arrays).forEach(function(arrayName) {\n    if (!isIndices(arrayName)) {\n      const array = arrays[arrayName];\n      const attribName = array.attrib || array.name || array.attribName || (defaults$2.attribPrefix + arrayName);\n      if (array.value) {\n        if (!Array.isArray(array.value) && !isArrayBuffer$1(array.value)) {\n          throw new Error('array.value is not array or typedarray');\n        }\n        attribs[attribName] = {\n          value: array.value,\n        };\n      } else {\n        let fn;\n        if (array.buffer && array.buffer instanceof WebGLBuffer) {\n          fn = attribBufferFromBuffer;\n        } else if (typeof array === \"number\" || typeof array.data === \"number\") {\n          fn = attribBufferFromSize;\n        } else {\n          fn = attribBufferFromArrayLike;\n        }\n        const {buffer, type, numValues, arrayType} = fn(gl, array, arrayName);\n        const normalization = array.normalize !== undefined ? array.normalize : getNormalizationForTypedArrayType(arrayType);\n        const numComponents = getNumComponents$1(array, arrayName, numValues);\n        attribs[attribName] = {\n          buffer:        buffer,\n          numComponents: numComponents,\n          type:          type,\n          normalize:     normalization,\n          stride:        array.stride || 0,\n          offset:        array.offset || 0,\n          divisor:       array.divisor === undefined ? undefined : array.divisor,\n          drawType:      array.drawType,\n        };\n      }\n    }\n  });\n  gl.bindBuffer(ARRAY_BUFFER$1, null);\n  return attribs;\n}\n\n/**\n * Sets the contents of a buffer attached to an attribInfo\n *\n * This is helper function to dynamically update a buffer.\n *\n * Let's say you make a bufferInfo\n *\n *     var arrays = {\n *        position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]),\n *        texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]),\n *        normal:   new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n *        indices:  new Uint16Array([0, 1, 2, 1, 2, 3]),\n *     };\n *     var bufferInfo = twgl.createBufferInfoFromArrays(gl, arrays);\n *\n *  And you want to dynamically update the positions. You could do this\n *\n *     // assuming arrays.position has already been updated with new data.\n *     twgl.setAttribInfoBufferFromArray(gl, bufferInfo.attribs.position, arrays.position);\n *\n * @param {WebGLRenderingContext} gl\n * @param {AttribInfo} attribInfo The attribInfo who's buffer contents to set. NOTE: If you have an attribute prefix\n *   the name of the attribute will include the prefix.\n * @param {ArraySpec} array Note: it is arguably inefficient to pass in anything but a typed array because anything\n *    else will have to be converted to a typed array before it can be used by WebGL. During init time that\n *    inefficiency is usually not important but if you're updating data dynamically best to be efficient.\n * @param {number} [offset] an optional offset into the buffer. This is only an offset into the WebGL buffer\n *    not the array. To pass in an offset into the array itself use a typed array and create an `ArrayBufferView`\n *    for the portion of the array you want to use.\n *\n *        var someArray = new Float32Array(1000); // an array with 1000 floats\n *        var someSubArray = new Float32Array(someArray.buffer, offsetInBytes, sizeInUnits); // a view into someArray\n *\n *    Now you can pass `someSubArray` into setAttribInfoBufferFromArray`\n * @memberOf module:twgl/attributes\n */\nfunction setAttribInfoBufferFromArray(gl, attribInfo, array, offset) {\n  array = makeTypedArray(array);\n  if (offset !== undefined) {\n    gl.bindBuffer(ARRAY_BUFFER$1, attribInfo.buffer);\n    gl.bufferSubData(ARRAY_BUFFER$1, offset, array);\n  } else {\n    setBufferFromTypedArray(gl, ARRAY_BUFFER$1, attribInfo.buffer, array, attribInfo.drawType);\n  }\n}\n\nfunction getBytesPerValueForGLType(gl, type) {\n  if (type === BYTE$1)           return 1;  // eslint-disable-line\n  if (type === UNSIGNED_BYTE$2)  return 1;  // eslint-disable-line\n  if (type === SHORT$1)          return 2;  // eslint-disable-line\n  if (type === UNSIGNED_SHORT$2) return 2;  // eslint-disable-line\n  if (type === INT$2)            return 4;  // eslint-disable-line\n  if (type === UNSIGNED_INT$2)   return 4;  // eslint-disable-line\n  if (type === FLOAT$2)          return 4;  // eslint-disable-line\n  return 0;\n}\n\n// Tries to get the number of elements from a set of arrays.\nconst positionKeys = ['position', 'positions', 'a_position'];\nfunction getNumElementsFromNonIndexedArrays(arrays) {\n  let key;\n  let ii;\n  for (ii = 0; ii < positionKeys.length; ++ii) {\n    key = positionKeys[ii];\n    if (key in arrays) {\n      break;\n    }\n  }\n  if (ii === positionKeys.length) {\n    key = Object.keys(arrays)[0];\n  }\n  const array = arrays[key];\n  const length = getArray$1(array).length;\n  if (length === undefined) {\n    return 1;   // There's no arrays\n  }\n  const numComponents = getNumComponents$1(array, key);\n  const numElements = length / numComponents;\n  if (length % numComponents > 0) {\n    throw new Error(`numComponents ${numComponents} not correct for length ${length}`);\n  }\n  return numElements;\n}\n\nfunction getNumElementsFromAttributes(gl, attribs) {\n  let key;\n  let ii;\n  for (ii = 0; ii < positionKeys.length; ++ii) {\n    key = positionKeys[ii];\n    if (key in attribs) {\n      break;\n    }\n    key = defaults$2.attribPrefix + key;\n    if (key in attribs) {\n      break;\n    }\n  }\n  if (ii === positionKeys.length) {\n    key = Object.keys(attribs)[0];\n  }\n  const attrib = attribs[key];\n  if (!attrib.buffer) {\n    return 1; // There's no buffer\n  }\n  gl.bindBuffer(ARRAY_BUFFER$1, attrib.buffer);\n  const numBytes = gl.getBufferParameter(ARRAY_BUFFER$1, BUFFER_SIZE);\n  gl.bindBuffer(ARRAY_BUFFER$1, null);\n\n  const bytesPerValue = getBytesPerValueForGLType(gl, attrib.type);\n  const totalElements = numBytes / bytesPerValue;\n  const numComponents = attrib.numComponents || attrib.size;\n  // TODO: check stride\n  const numElements = totalElements / numComponents;\n  if (numElements % 1 !== 0) {\n    throw new Error(`numComponents ${numComponents} not correct for length ${length}`);\n  }\n  return numElements;\n}\n\n/**\n * @typedef {Object} BufferInfo\n * @property {number} numElements The number of elements to pass to `gl.drawArrays` or `gl.drawElements`.\n * @property {number} [elementType] The type of indices `UNSIGNED_BYTE`, `UNSIGNED_SHORT` etc..\n * @property {WebGLBuffer} [indices] The indices `ELEMENT_ARRAY_BUFFER` if any indices exist.\n * @property {Object.<string, module:twgl.AttribInfo>} [attribs] The attribs appropriate to call `setAttributes`\n * @memberOf module:twgl\n */\n\n/**\n * Creates a BufferInfo from an object of arrays.\n *\n * This can be passed to {@link module:twgl.setBuffersAndAttributes} and to\n * {@link module:twgl:drawBufferInfo}.\n *\n * Given an object like\n *\n *     var arrays = {\n *       position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], },\n *       texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1],                 },\n *       normal:   { numComponents: 3, data: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1],     },\n *       indices:  { numComponents: 3, data: [0, 1, 2, 1, 2, 3],                       },\n *     };\n *\n *  Creates an BufferInfo like this\n *\n *     bufferInfo = {\n *       numElements: 4,        // or whatever the number of elements is\n *       indices: WebGLBuffer,  // this property will not exist if there are no indices\n *       attribs: {\n *         position: { buffer: WebGLBuffer, numComponents: 3, },\n *         normal:   { buffer: WebGLBuffer, numComponents: 3, },\n *         texcoord: { buffer: WebGLBuffer, numComponents: 2, },\n *       },\n *     };\n *\n *  The properties of arrays can be JavaScript arrays in which case the number of components\n *  will be guessed.\n *\n *     var arrays = {\n *        position: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0],\n *        texcoord: [0, 0, 0, 1, 1, 0, 1, 1],\n *        normal:   [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1],\n *        indices:  [0, 1, 2, 1, 2, 3],\n *     };\n *\n *  They can also be TypedArrays\n *\n *     var arrays = {\n *        position: new Float32Array([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]),\n *        texcoord: new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]),\n *        normal:   new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n *        indices:  new Uint16Array([0, 1, 2, 1, 2, 3]),\n *     };\n *\n *  Or AugmentedTypedArrays\n *\n *     var positions = createAugmentedTypedArray(3, 4);\n *     var texcoords = createAugmentedTypedArray(2, 4);\n *     var normals   = createAugmentedTypedArray(3, 4);\n *     var indices   = createAugmentedTypedArray(3, 2, Uint16Array);\n *\n *     positions.push([0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0]);\n *     texcoords.push([0, 0, 0, 1, 1, 0, 1, 1]);\n *     normals.push([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n *     indices.push([0, 1, 2, 1, 2, 3]);\n *\n *     var arrays = {\n *        position: positions,\n *        texcoord: texcoords,\n *        normal:   normals,\n *        indices:  indices,\n *     };\n *\n * For the last example it is equivalent to\n *\n *     var bufferInfo = {\n *       attribs: {\n *         position: { numComponents: 3, buffer: gl.createBuffer(), },\n *         texcoord: { numComponents: 2, buffer: gl.createBuffer(), },\n *         normal: { numComponents: 3, buffer: gl.createBuffer(), },\n *       },\n *       indices: gl.createBuffer(),\n *       numElements: 6,\n *     };\n *\n *     gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.position.buffer);\n *     gl.bufferData(gl.ARRAY_BUFFER, arrays.position, gl.STATIC_DRAW);\n *     gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.texcoord.buffer);\n *     gl.bufferData(gl.ARRAY_BUFFER, arrays.texcoord, gl.STATIC_DRAW);\n *     gl.bindBuffer(gl.ARRAY_BUFFER, bufferInfo.attribs.normal.buffer);\n *     gl.bufferData(gl.ARRAY_BUFFER, arrays.normal, gl.STATIC_DRAW);\n *     gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferInfo.indices);\n *     gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, arrays.indices, gl.STATIC_DRAW);\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {module:twgl.Arrays} arrays Your data\n * @param {module:twgl.BufferInfo} [srcBufferInfo] An existing\n *        buffer info to start from. WebGLBuffers etc specified\n *        in the srcBufferInfo will be used in a new BufferInfo\n *        with any arrays specified overriding the ones in\n *        srcBufferInfo.\n * @return {module:twgl.BufferInfo} A BufferInfo\n * @memberOf module:twgl/attributes\n */\nfunction createBufferInfoFromArrays(gl, arrays, srcBufferInfo) {\n  const newAttribs = createAttribsFromArrays(gl, arrays);\n  const bufferInfo = Object.assign({}, srcBufferInfo ? srcBufferInfo : {});\n  bufferInfo.attribs = Object.assign({}, srcBufferInfo ? srcBufferInfo.attribs : {}, newAttribs);\n  const indices = arrays.indices;\n  if (indices) {\n    const newIndices = makeTypedArray(indices, \"indices\");\n    bufferInfo.indices = createBufferFromTypedArray(gl, newIndices, ELEMENT_ARRAY_BUFFER$2);\n    bufferInfo.numElements = newIndices.length;\n    bufferInfo.elementType = getGLTypeForTypedArray(newIndices);\n  } else if (!bufferInfo.numElements) {\n    bufferInfo.numElements = getNumElementsFromAttributes(gl, bufferInfo.attribs);\n  }\n\n  return bufferInfo;\n}\n\n/**\n * Creates a buffer from an array, typed array, or array spec\n *\n * Given something like this\n *\n *     [1, 2, 3],\n *\n * or\n *\n *     new Uint16Array([1,2,3]);\n *\n * or\n *\n *     {\n *        data: [1, 2, 3],\n *        type: Uint8Array,\n *     }\n *\n * returns a WebGLBuffer that contains the given data.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext.\n * @param {module:twgl.ArraySpec} array an array, typed array, or array spec.\n * @param {string} arrayName name of array. Used to guess the type if type can not be derived otherwise.\n * @return {WebGLBuffer} a WebGLBuffer containing the data in array.\n * @memberOf module:twgl/attributes\n */\nfunction createBufferFromArray(gl, array, arrayName) {\n  const type = arrayName === \"indices\" ? ELEMENT_ARRAY_BUFFER$2 : ARRAY_BUFFER$1;\n  const typedArray = makeTypedArray(array, arrayName);\n  return createBufferFromTypedArray(gl, typedArray, type);\n}\n\n/**\n * Creates buffers from arrays or typed arrays\n *\n * Given something like this\n *\n *     var arrays = {\n *        positions: [1, 2, 3],\n *        normals: [0, 0, 1],\n *     }\n *\n * returns something like\n *\n *     buffers = {\n *       positions: WebGLBuffer,\n *       normals: WebGLBuffer,\n *     }\n *\n * If the buffer is named 'indices' it will be made an ELEMENT_ARRAY_BUFFER.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext.\n * @param {module:twgl.Arrays} arrays\n * @return {Object<string, WebGLBuffer>} returns an object with one WebGLBuffer per array\n * @memberOf module:twgl/attributes\n */\nfunction createBuffersFromArrays(gl, arrays) {\n  const buffers = { };\n  Object.keys(arrays).forEach(function(key) {\n    buffers[key] = createBufferFromArray(gl, arrays[key], key);\n  });\n\n  // Ugh!\n  if (arrays.indices) {\n    buffers.numElements = arrays.indices.length;\n    buffers.elementType = getGLTypeForTypedArray(makeTypedArray(arrays.indices));\n  } else {\n    buffers.numElements = getNumElementsFromNonIndexedArrays(arrays);\n  }\n\n  return buffers;\n}\n\nvar attributes = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  createAttribsFromArrays: createAttribsFromArrays,\n  createBuffersFromArrays: createBuffersFromArrays,\n  createBufferFromArray: createBufferFromArray,\n  createBufferFromTypedArray: createBufferFromTypedArray,\n  createBufferInfoFromArrays: createBufferInfoFromArrays,\n  setAttribInfoBufferFromArray: setAttribInfoBufferFromArray,\n  setAttributePrefix: setAttributePrefix,\n  setAttributeDefaults_: setDefaults$2,\n  getNumComponents_: getNumComponents$1,\n  getArray_: getArray$1\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nconst getArray = getArray$1;  // eslint-disable-line\nconst getNumComponents = getNumComponents$1;  // eslint-disable-line\n\n/**\n * @typedef {(Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array)} TypedArray\n */\n\n/**\n * Add `push` to a typed array. It just keeps a 'cursor'\n * and allows use to `push` values into the array so we\n * don't have to manually compute offsets\n * @param {TypedArray} typedArray TypedArray to augment\n * @param {number} numComponents number of components.\n * @private\n */\nfunction augmentTypedArray(typedArray, numComponents) {\n  let cursor = 0;\n  typedArray.push = function() {\n    for (let ii = 0; ii < arguments.length; ++ii) {\n      const value = arguments[ii];\n      if (value instanceof Array || isArrayBuffer$1(value)) {\n        for (let jj = 0; jj < value.length; ++jj) {\n          typedArray[cursor++] = value[jj];\n        }\n      } else {\n        typedArray[cursor++] = value;\n      }\n    }\n  };\n  typedArray.reset = function(opt_index) {\n    cursor = opt_index || 0;\n  };\n  typedArray.numComponents = numComponents;\n  Object.defineProperty(typedArray, 'numElements', {\n    get: function() {\n      return this.length / this.numComponents | 0;\n    },\n  });\n  return typedArray;\n}\n\n/**\n * creates a typed array with a `push` function attached\n * so that you can easily *push* values.\n *\n * `push` can take multiple arguments. If an argument is an array each element\n * of the array will be added to the typed array.\n *\n * Example:\n *\n *     const array = createAugmentedTypedArray(3, 2);  // creates a Float32Array with 6 values\n *     array.push(1, 2, 3);\n *     array.push([4, 5, 6]);\n *     // array now contains [1, 2, 3, 4, 5, 6]\n *\n * Also has `numComponents` and `numElements` properties.\n *\n * @param {number} numComponents number of components\n * @param {number} numElements number of elements. The total size of the array will be `numComponents * numElements`.\n * @param {constructor} opt_type A constructor for the type. Default = `Float32Array`.\n * @return {ArrayBufferView} A typed array.\n * @memberOf module:twgl/primitives\n */\nfunction createAugmentedTypedArray(numComponents, numElements, opt_type) {\n  const Type = opt_type || Float32Array;\n  return augmentTypedArray(new Type(numComponents * numElements), numComponents);\n}\n\nfunction allButIndices(name) {\n  return name !== \"indices\";\n}\n\n/**\n * Given indexed vertices creates a new set of vertices un-indexed by expanding the indexed vertices.\n * @param {Object.<string, TypedArray>} vertices The indexed vertices to deindex\n * @return {Object.<string, TypedArray>} The deindexed vertices\n * @memberOf module:twgl/primitives\n */\nfunction deindexVertices(vertices) {\n  const indices = vertices.indices;\n  const newVertices = {};\n  const numElements = indices.length;\n\n  function expandToUnindexed(channel) {\n    const srcBuffer = vertices[channel];\n    const numComponents = srcBuffer.numComponents;\n    const dstBuffer = createAugmentedTypedArray(numComponents, numElements, srcBuffer.constructor);\n    for (let ii = 0; ii < numElements; ++ii) {\n      const ndx = indices[ii];\n      const offset = ndx * numComponents;\n      for (let jj = 0; jj < numComponents; ++jj) {\n        dstBuffer.push(srcBuffer[offset + jj]);\n      }\n    }\n    newVertices[channel] = dstBuffer;\n  }\n\n  Object.keys(vertices).filter(allButIndices).forEach(expandToUnindexed);\n\n  return newVertices;\n}\n\n/**\n * flattens the normals of deindexed vertices in place.\n * @param {Object.<string, TypedArray>} vertices The deindexed vertices who's normals to flatten\n * @return {Object.<string, TypedArray>} The flattened vertices (same as was passed in)\n * @memberOf module:twgl/primitives\n */\nfunction flattenNormals(vertices) {\n  if (vertices.indices) {\n    throw new Error('can not flatten normals of indexed vertices. deindex them first');\n  }\n\n  const normals = vertices.normal;\n  const numNormals = normals.length;\n  for (let ii = 0; ii < numNormals; ii += 9) {\n    // pull out the 3 normals for this triangle\n    const nax = normals[ii + 0];\n    const nay = normals[ii + 1];\n    const naz = normals[ii + 2];\n\n    const nbx = normals[ii + 3];\n    const nby = normals[ii + 4];\n    const nbz = normals[ii + 5];\n\n    const ncx = normals[ii + 6];\n    const ncy = normals[ii + 7];\n    const ncz = normals[ii + 8];\n\n    // add them\n    let nx = nax + nbx + ncx;\n    let ny = nay + nby + ncy;\n    let nz = naz + nbz + ncz;\n\n    // normalize them\n    const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n\n    nx /= length;\n    ny /= length;\n    nz /= length;\n\n    // copy them back in\n    normals[ii + 0] = nx;\n    normals[ii + 1] = ny;\n    normals[ii + 2] = nz;\n\n    normals[ii + 3] = nx;\n    normals[ii + 4] = ny;\n    normals[ii + 5] = nz;\n\n    normals[ii + 6] = nx;\n    normals[ii + 7] = ny;\n    normals[ii + 8] = nz;\n  }\n\n  return vertices;\n}\n\nfunction applyFuncToV3Array(array, matrix, fn) {\n  const len = array.length;\n  const tmp = new Float32Array(3);\n  for (let ii = 0; ii < len; ii += 3) {\n    fn(matrix, [array[ii], array[ii + 1], array[ii + 2]], tmp);\n    array[ii    ] = tmp[0];\n    array[ii + 1] = tmp[1];\n    array[ii + 2] = tmp[2];\n  }\n}\n\nfunction transformNormal(mi, v, dst) {\n  dst = dst || create$1();\n  const v0 = v[0];\n  const v1 = v[1];\n  const v2 = v[2];\n\n  dst[0] = v0 * mi[0 * 4 + 0] + v1 * mi[0 * 4 + 1] + v2 * mi[0 * 4 + 2];\n  dst[1] = v0 * mi[1 * 4 + 0] + v1 * mi[1 * 4 + 1] + v2 * mi[1 * 4 + 2];\n  dst[2] = v0 * mi[2 * 4 + 0] + v1 * mi[2 * 4 + 1] + v2 * mi[2 * 4 + 2];\n\n  return dst;\n}\n\n/**\n * Reorients directions by the given matrix..\n * @param {(number[]|TypedArray)} array The array. Assumes value floats per element.\n * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by.\n * @return {(number[]|TypedArray)} the same array that was passed in\n * @memberOf module:twgl/primitives\n */\nfunction reorientDirections(array, matrix) {\n  applyFuncToV3Array(array, matrix, transformDirection);\n  return array;\n}\n\n/**\n * Reorients normals by the inverse-transpose of the given\n * matrix..\n * @param {(number[]|TypedArray)} array The array. Assumes value floats per element.\n * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by.\n * @return {(number[]|TypedArray)} the same array that was passed in\n * @memberOf module:twgl/primitives\n */\nfunction reorientNormals(array, matrix) {\n  applyFuncToV3Array(array, inverse(matrix), transformNormal);\n  return array;\n}\n\n/**\n * Reorients positions by the given matrix. In other words, it\n * multiplies each vertex by the given matrix.\n * @param {(number[]|TypedArray)} array The array. Assumes value floats per element.\n * @param {module:twgl/m4.Mat4} matrix A matrix to multiply by.\n * @return {(number[]|TypedArray)} the same array that was passed in\n * @memberOf module:twgl/primitives\n */\nfunction reorientPositions(array, matrix) {\n  applyFuncToV3Array(array, matrix, transformPoint);\n  return array;\n}\n\n/**\n * @typedef {(number[]|TypedArray)} NativeArrayOrTypedArray\n */\n\n/**\n * Reorients arrays by the given matrix. Assumes arrays have\n * names that contains 'pos' could be reoriented as positions,\n * 'binorm' or 'tan' as directions, and 'norm' as normals.\n *\n * @param {Object.<string, NativeArrayOrTypedArray>} arrays The vertices to reorient\n * @param {module:twgl/m4.Mat4} matrix matrix to reorient by.\n * @return {Object.<string, NativeArrayOrTypedArray>} same arrays that were passed in.\n * @memberOf module:twgl/primitives\n */\nfunction reorientVertices(arrays, matrix) {\n  Object.keys(arrays).forEach(function(name) {\n    const array = arrays[name];\n    if (name.indexOf(\"pos\") >= 0) {\n      reorientPositions(array, matrix);\n    } else if (name.indexOf(\"tan\") >= 0 || name.indexOf(\"binorm\") >= 0) {\n      reorientDirections(array, matrix);\n    } else if (name.indexOf(\"norm\") >= 0) {\n      reorientNormals(array, matrix);\n    }\n  });\n  return arrays;\n}\n\n/**\n * Creates XY quad BufferInfo\n *\n * The default with no parameters will return a 2x2 quad with values from -1 to +1.\n * If you want a unit quad with that goes from 0 to 1 you'd call it with\n *\n *     twgl.primitives.createXYQuadBufferInfo(gl, 1, 0.5, 0.5);\n *\n * If you want a unit quad centered above 0,0 you'd call it with\n *\n *     twgl.primitives.createXYQuadBufferInfo(gl, 1, 0, 0.5);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1\n * @param {number} [xOffset] the amount to offset the quad in X\n * @param {number} [yOffset] the amount to offset the quad in Y\n * @return {Object.<string, WebGLBuffer>} the created XY Quad BufferInfo\n * @memberOf module:twgl/primitives\n * @function createXYQuadBuffers\n */\n\n/**\n * Creates XY quad Buffers\n *\n * The default with no parameters will return a 2x2 quad with values from -1 to +1.\n * If you want a unit quad with that goes from 0 to 1 you'd call it with\n *\n *     twgl.primitives.createXYQuadBufferInfo(gl, 1, 0.5, 0.5);\n *\n * If you want a unit quad centered above 0,0 you'd call it with\n *\n *     twgl.primitives.createXYQuadBufferInfo(gl, 1, 0, 0.5);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1\n * @param {number} [xOffset] the amount to offset the quad in X\n * @param {number} [yOffset] the amount to offset the quad in Y\n * @return {module:twgl.BufferInfo} the created XY Quad buffers\n * @memberOf module:twgl/primitives\n * @function createXYQuadBufferInfo\n */\n\n/**\n * Creates XY quad vertices\n *\n * The default with no parameters will return a 2x2 quad with values from -1 to +1.\n * If you want a unit quad with that goes from 0 to 1 you'd call it with\n *\n *     twgl.primitives.createXYQuadVertices(1, 0.5, 0.5);\n *\n * If you want a unit quad centered above 0,0 you'd call it with\n *\n *     twgl.primitives.createXYQuadVertices(1, 0, 0.5);\n *\n * @param {number} [size] the size across the quad. Defaults to 2 which means vertices will go from -1 to +1\n * @param {number} [xOffset] the amount to offset the quad in X\n * @param {number} [yOffset] the amount to offset the quad in Y\n * @return {Object.<string, TypedArray>} the created XY Quad vertices\n * @memberOf module:twgl/primitives\n */\nfunction createXYQuadVertices(size, xOffset, yOffset) {\n  size = size || 2;\n  xOffset = xOffset || 0;\n  yOffset = yOffset || 0;\n  size *= 0.5;\n  return {\n    position: {\n      numComponents: 2,\n      data: [\n        xOffset + -1 * size, yOffset + -1 * size,\n        xOffset +  1 * size, yOffset + -1 * size,\n        xOffset + -1 * size, yOffset +  1 * size,\n        xOffset +  1 * size, yOffset +  1 * size,\n      ],\n    },\n    normal: [\n      0, 0, 1,\n      0, 0, 1,\n      0, 0, 1,\n      0, 0, 1,\n    ],\n    texcoord: [\n      0, 0,\n      1, 0,\n      0, 1,\n      1, 1,\n    ],\n    indices: [ 0, 1, 2, 2, 1, 3 ],\n  };\n}\n\n/**\n * Creates XZ plane BufferInfo.\n *\n * The created plane has position, normal, and texcoord data\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [width] Width of the plane. Default = 1\n * @param {number} [depth] Depth of the plane. Default = 1\n * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1\n * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1\n * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices.\n * @return {module:twgl.BufferInfo} The created plane BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createPlaneBufferInfo\n */\n\n/**\n * Creates XZ plane buffers.\n *\n * The created plane has position, normal, and texcoord data\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [width] Width of the plane. Default = 1\n * @param {number} [depth] Depth of the plane. Default = 1\n * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1\n * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1\n * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices.\n * @return {Object.<string, WebGLBuffer>} The created plane buffers.\n * @memberOf module:twgl/primitives\n * @function createPlaneBuffers\n */\n\n/**\n * Creates XZ plane vertices.\n *\n * The created plane has position, normal, and texcoord data\n *\n * @param {number} [width] Width of the plane. Default = 1\n * @param {number} [depth] Depth of the plane. Default = 1\n * @param {number} [subdivisionsWidth] Number of steps across the plane. Default = 1\n * @param {number} [subdivisionsDepth] Number of steps down the plane. Default = 1\n * @param {module:twgl/m4.Mat4} [matrix] A matrix by which to multiply all the vertices.\n * @return {Object.<string, TypedArray>} The created plane vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createPlaneVertices(\n    width,\n    depth,\n    subdivisionsWidth,\n    subdivisionsDepth,\n    matrix) {\n  width = width || 1;\n  depth = depth || 1;\n  subdivisionsWidth = subdivisionsWidth || 1;\n  subdivisionsDepth = subdivisionsDepth || 1;\n  matrix = matrix || identity();\n\n  const numVertices = (subdivisionsWidth + 1) * (subdivisionsDepth + 1);\n  const positions = createAugmentedTypedArray(3, numVertices);\n  const normals = createAugmentedTypedArray(3, numVertices);\n  const texcoords = createAugmentedTypedArray(2, numVertices);\n\n  for (let z = 0; z <= subdivisionsDepth; z++) {\n    for (let x = 0; x <= subdivisionsWidth; x++) {\n      const u = x / subdivisionsWidth;\n      const v = z / subdivisionsDepth;\n      positions.push(\n          width * u - width * 0.5,\n          0,\n          depth * v - depth * 0.5);\n      normals.push(0, 1, 0);\n      texcoords.push(u, v);\n    }\n  }\n\n  const numVertsAcross = subdivisionsWidth + 1;\n  const indices = createAugmentedTypedArray(\n      3, subdivisionsWidth * subdivisionsDepth * 2, Uint16Array);\n\n  for (let z = 0; z < subdivisionsDepth; z++) {  // eslint-disable-line\n    for (let x = 0; x < subdivisionsWidth; x++) {  // eslint-disable-line\n      // Make triangle 1 of quad.\n      indices.push(\n          (z + 0) * numVertsAcross + x,\n          (z + 1) * numVertsAcross + x,\n          (z + 0) * numVertsAcross + x + 1);\n\n      // Make triangle 2 of quad.\n      indices.push(\n          (z + 1) * numVertsAcross + x,\n          (z + 1) * numVertsAcross + x + 1,\n          (z + 0) * numVertsAcross + x + 1);\n    }\n  }\n\n  const arrays = reorientVertices({\n    position: positions,\n    normal: normals,\n    texcoord: texcoords,\n    indices: indices,\n  }, matrix);\n  return arrays;\n}\n\n/**\n * Creates sphere BufferInfo.\n *\n * The created sphere has position, normal, and texcoord data\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius radius of the sphere.\n * @param {number} subdivisionsAxis number of steps around the sphere.\n * @param {number} subdivisionsHeight number of vertically on the sphere.\n * @param {number} [opt_startLatitudeInRadians] where to start the\n *     top of the sphere. Default = 0.\n * @param {number} [opt_endLatitudeInRadians] Where to end the\n *     bottom of the sphere. Default = Math.PI.\n * @param {number} [opt_startLongitudeInRadians] where to start\n *     wrapping the sphere. Default = 0.\n * @param {number} [opt_endLongitudeInRadians] where to end\n *     wrapping the sphere. Default = 2 * Math.PI.\n * @return {module:twgl.BufferInfo} The created sphere BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createSphereBufferInfo\n */\n\n/**\n * Creates sphere buffers.\n *\n * The created sphere has position, normal, and texcoord data\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius radius of the sphere.\n * @param {number} subdivisionsAxis number of steps around the sphere.\n * @param {number} subdivisionsHeight number of vertically on the sphere.\n * @param {number} [opt_startLatitudeInRadians] where to start the\n *     top of the sphere. Default = 0.\n * @param {number} [opt_endLatitudeInRadians] Where to end the\n *     bottom of the sphere. Default = Math.PI.\n * @param {number} [opt_startLongitudeInRadians] where to start\n *     wrapping the sphere. Default = 0.\n * @param {number} [opt_endLongitudeInRadians] where to end\n *     wrapping the sphere. Default = 2 * Math.PI.\n * @return {Object.<string, WebGLBuffer>} The created sphere buffers.\n * @memberOf module:twgl/primitives\n * @function createSphereBuffers\n */\n\n/**\n * Creates sphere vertices.\n *\n * The created sphere has position, normal, and texcoord data\n *\n * @param {number} radius radius of the sphere.\n * @param {number} subdivisionsAxis number of steps around the sphere.\n * @param {number} subdivisionsHeight number of vertically on the sphere.\n * @param {number} [opt_startLatitudeInRadians] where to start the\n *     top of the sphere. Default = 0.\n * @param {number} [opt_endLatitudeInRadians] Where to end the\n *     bottom of the sphere. Default = Math.PI.\n * @param {number} [opt_startLongitudeInRadians] where to start\n *     wrapping the sphere. Default = 0.\n * @param {number} [opt_endLongitudeInRadians] where to end\n *     wrapping the sphere. Default = 2 * Math.PI.\n * @return {Object.<string, TypedArray>} The created sphere vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createSphereVertices(\n    radius,\n    subdivisionsAxis,\n    subdivisionsHeight,\n    opt_startLatitudeInRadians,\n    opt_endLatitudeInRadians,\n    opt_startLongitudeInRadians,\n    opt_endLongitudeInRadians) {\n  if (subdivisionsAxis <= 0 || subdivisionsHeight <= 0) {\n    throw new Error('subdivisionAxis and subdivisionHeight must be > 0');\n  }\n\n  opt_startLatitudeInRadians = opt_startLatitudeInRadians || 0;\n  opt_endLatitudeInRadians = opt_endLatitudeInRadians || Math.PI;\n  opt_startLongitudeInRadians = opt_startLongitudeInRadians || 0;\n  opt_endLongitudeInRadians = opt_endLongitudeInRadians || (Math.PI * 2);\n\n  const latRange = opt_endLatitudeInRadians - opt_startLatitudeInRadians;\n  const longRange = opt_endLongitudeInRadians - opt_startLongitudeInRadians;\n\n  // We are going to generate our sphere by iterating through its\n  // spherical coordinates and generating 2 triangles for each quad on a\n  // ring of the sphere.\n  const numVertices = (subdivisionsAxis + 1) * (subdivisionsHeight + 1);\n  const positions = createAugmentedTypedArray(3, numVertices);\n  const normals   = createAugmentedTypedArray(3, numVertices);\n  const texcoords = createAugmentedTypedArray(2, numVertices);\n\n  // Generate the individual vertices in our vertex buffer.\n  for (let y = 0; y <= subdivisionsHeight; y++) {\n    for (let x = 0; x <= subdivisionsAxis; x++) {\n      // Generate a vertex based on its spherical coordinates\n      const u = x / subdivisionsAxis;\n      const v = y / subdivisionsHeight;\n      const theta = longRange * u + opt_startLongitudeInRadians;\n      const phi = latRange * v + opt_startLatitudeInRadians;\n      const sinTheta = Math.sin(theta);\n      const cosTheta = Math.cos(theta);\n      const sinPhi = Math.sin(phi);\n      const cosPhi = Math.cos(phi);\n      const ux = cosTheta * sinPhi;\n      const uy = cosPhi;\n      const uz = sinTheta * sinPhi;\n      positions.push(radius * ux, radius * uy, radius * uz);\n      normals.push(ux, uy, uz);\n      texcoords.push(1 - u, v);\n    }\n  }\n\n  const numVertsAround = subdivisionsAxis + 1;\n  const indices = createAugmentedTypedArray(3, subdivisionsAxis * subdivisionsHeight * 2, Uint16Array);\n  for (let x = 0; x < subdivisionsAxis; x++) {  // eslint-disable-line\n    for (let y = 0; y < subdivisionsHeight; y++) {  // eslint-disable-line\n      // Make triangle 1 of quad.\n      indices.push(\n          (y + 0) * numVertsAround + x,\n          (y + 0) * numVertsAround + x + 1,\n          (y + 1) * numVertsAround + x);\n\n      // Make triangle 2 of quad.\n      indices.push(\n          (y + 1) * numVertsAround + x,\n          (y + 0) * numVertsAround + x + 1,\n          (y + 1) * numVertsAround + x + 1);\n    }\n  }\n\n  return {\n    position: positions,\n    normal: normals,\n    texcoord: texcoords,\n    indices: indices,\n  };\n}\n\n/**\n * Array of the indices of corners of each face of a cube.\n * @type {Array.<number[]>}\n * @private\n */\nconst CUBE_FACE_INDICES = [\n  [3, 7, 5, 1],  // right\n  [6, 2, 0, 4],  // left\n  [6, 7, 3, 2],  // ??\n  [0, 1, 5, 4],  // ??\n  [7, 6, 4, 5],  // front\n  [2, 3, 1, 0],  // back\n];\n\n/**\n * Creates a BufferInfo for a cube.\n *\n * The cube is created around the origin. (-size / 2, size / 2).\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [size] width, height and depth of the cube.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createCubeBufferInfo\n */\n\n/**\n * Creates the buffers and indices for a cube.\n *\n * The cube is created around the origin. (-size / 2, size / 2).\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} [size] width, height and depth of the cube.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function createCubeBuffers\n */\n\n/**\n * Creates the vertices and indices for a cube.\n *\n * The cube is created around the origin. (-size / 2, size / 2).\n *\n * @param {number} [size] width, height and depth of the cube.\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createCubeVertices(size) {\n  size = size || 1;\n  const k = size / 2;\n\n  const cornerVertices = [\n    [-k, -k, -k],\n    [+k, -k, -k],\n    [-k, +k, -k],\n    [+k, +k, -k],\n    [-k, -k, +k],\n    [+k, -k, +k],\n    [-k, +k, +k],\n    [+k, +k, +k],\n  ];\n\n  const faceNormals = [\n    [+1, +0, +0],\n    [-1, +0, +0],\n    [+0, +1, +0],\n    [+0, -1, +0],\n    [+0, +0, +1],\n    [+0, +0, -1],\n  ];\n\n  const uvCoords = [\n    [1, 0],\n    [0, 0],\n    [0, 1],\n    [1, 1],\n  ];\n\n  const numVertices = 6 * 4;\n  const positions = createAugmentedTypedArray(3, numVertices);\n  const normals   = createAugmentedTypedArray(3, numVertices);\n  const texcoords = createAugmentedTypedArray(2 , numVertices);\n  const indices   = createAugmentedTypedArray(3, 6 * 2, Uint16Array);\n\n  for (let f = 0; f < 6; ++f) {\n    const faceIndices = CUBE_FACE_INDICES[f];\n    for (let v = 0; v < 4; ++v) {\n      const position = cornerVertices[faceIndices[v]];\n      const normal = faceNormals[f];\n      const uv = uvCoords[v];\n\n      // Each face needs all four vertices because the normals and texture\n      // coordinates are not all the same.\n      positions.push(position);\n      normals.push(normal);\n      texcoords.push(uv);\n\n    }\n    // Two triangles make a square face.\n    const offset = 4 * f;\n    indices.push(offset + 0, offset + 1, offset + 2);\n    indices.push(offset + 0, offset + 2, offset + 3);\n  }\n\n  return {\n    position: positions,\n    normal: normals,\n    texcoord: texcoords,\n    indices: indices,\n  };\n}\n\n/**\n * Creates a BufferInfo for a truncated cone, which is like a cylinder\n * except that it has different top and bottom radii. A truncated cone\n * can also be used to create cylinders and regular cones. The\n * truncated cone will be created centered about the origin, with the\n * y axis as its vertical axis.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} bottomRadius Bottom radius of truncated cone.\n * @param {number} topRadius Top radius of truncated cone.\n * @param {number} height Height of truncated cone.\n * @param {number} radialSubdivisions The number of subdivisions around the\n *     truncated cone.\n * @param {number} verticalSubdivisions The number of subdivisions down the\n *     truncated cone.\n * @param {boolean} [opt_topCap] Create top cap. Default = true.\n * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true.\n * @return {module:twgl.BufferInfo} The created cone BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createTruncatedConeBufferInfo\n */\n\n/**\n * Creates buffers for a truncated cone, which is like a cylinder\n * except that it has different top and bottom radii. A truncated cone\n * can also be used to create cylinders and regular cones. The\n * truncated cone will be created centered about the origin, with the\n * y axis as its vertical axis.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} bottomRadius Bottom radius of truncated cone.\n * @param {number} topRadius Top radius of truncated cone.\n * @param {number} height Height of truncated cone.\n * @param {number} radialSubdivisions The number of subdivisions around the\n *     truncated cone.\n * @param {number} verticalSubdivisions The number of subdivisions down the\n *     truncated cone.\n * @param {boolean} [opt_topCap] Create top cap. Default = true.\n * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true.\n * @return {Object.<string, WebGLBuffer>} The created cone buffers.\n * @memberOf module:twgl/primitives\n * @function createTruncatedConeBuffers\n */\n\n/**\n * Creates vertices for a truncated cone, which is like a cylinder\n * except that it has different top and bottom radii. A truncated cone\n * can also be used to create cylinders and regular cones. The\n * truncated cone will be created centered about the origin, with the\n * y axis as its vertical axis. .\n *\n * @param {number} bottomRadius Bottom radius of truncated cone.\n * @param {number} topRadius Top radius of truncated cone.\n * @param {number} height Height of truncated cone.\n * @param {number} radialSubdivisions The number of subdivisions around the\n *     truncated cone.\n * @param {number} verticalSubdivisions The number of subdivisions down the\n *     truncated cone.\n * @param {boolean} [opt_topCap] Create top cap. Default = true.\n * @param {boolean} [opt_bottomCap] Create bottom cap. Default = true.\n * @return {Object.<string, TypedArray>} The created cone vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createTruncatedConeVertices(\n    bottomRadius,\n    topRadius,\n    height,\n    radialSubdivisions,\n    verticalSubdivisions,\n    opt_topCap,\n    opt_bottomCap) {\n  if (radialSubdivisions < 3) {\n    throw new Error('radialSubdivisions must be 3 or greater');\n  }\n\n  if (verticalSubdivisions < 1) {\n    throw new Error('verticalSubdivisions must be 1 or greater');\n  }\n\n  const topCap = (opt_topCap === undefined) ? true : opt_topCap;\n  const bottomCap = (opt_bottomCap === undefined) ? true : opt_bottomCap;\n\n  const extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n\n  const numVertices = (radialSubdivisions + 1) * (verticalSubdivisions + 1 + extra);\n  const positions = createAugmentedTypedArray(3, numVertices);\n  const normals   = createAugmentedTypedArray(3, numVertices);\n  const texcoords = createAugmentedTypedArray(2, numVertices);\n  const indices   = createAugmentedTypedArray(3, radialSubdivisions * (verticalSubdivisions + extra / 2) * 2, Uint16Array);\n\n  const vertsAroundEdge = radialSubdivisions + 1;\n\n  // The slant of the cone is constant across its surface\n  const slant = Math.atan2(bottomRadius - topRadius, height);\n  const cosSlant = Math.cos(slant);\n  const sinSlant = Math.sin(slant);\n\n  const start = topCap ? -2 : 0;\n  const end = verticalSubdivisions + (bottomCap ? 2 : 0);\n\n  for (let yy = start; yy <= end; ++yy) {\n    let v = yy / verticalSubdivisions;\n    let y = height * v;\n    let ringRadius;\n    if (yy < 0) {\n      y = 0;\n      v = 1;\n      ringRadius = bottomRadius;\n    } else if (yy > verticalSubdivisions) {\n      y = height;\n      v = 1;\n      ringRadius = topRadius;\n    } else {\n      ringRadius = bottomRadius +\n        (topRadius - bottomRadius) * (yy / verticalSubdivisions);\n    }\n    if (yy === -2 || yy === verticalSubdivisions + 2) {\n      ringRadius = 0;\n      v = 0;\n    }\n    y -= height / 2;\n    for (let ii = 0; ii < vertsAroundEdge; ++ii) {\n      const sin = Math.sin(ii * Math.PI * 2 / radialSubdivisions);\n      const cos = Math.cos(ii * Math.PI * 2 / radialSubdivisions);\n      positions.push(sin * ringRadius, y, cos * ringRadius);\n      if (yy < 0) {\n        normals.push(0, -1, 0);\n      } else if (yy > verticalSubdivisions) {\n        normals.push(0, 1, 0);\n      } else if (ringRadius === 0.0) {\n        normals.push(0, 0, 0);\n      } else {\n        normals.push(sin * cosSlant, sinSlant, cos * cosSlant);\n      }\n      texcoords.push((ii / radialSubdivisions), 1 - v);\n    }\n  }\n\n  for (let yy = 0; yy < verticalSubdivisions + extra; ++yy) {  // eslint-disable-line\n    if (yy === 1 && topCap || yy === verticalSubdivisions + extra - 2 && bottomCap) {\n      continue;\n    }\n    for (let ii = 0; ii < radialSubdivisions; ++ii) {  // eslint-disable-line\n      indices.push(vertsAroundEdge * (yy + 0) + 0 + ii,\n                   vertsAroundEdge * (yy + 0) + 1 + ii,\n                   vertsAroundEdge * (yy + 1) + 1 + ii);\n      indices.push(vertsAroundEdge * (yy + 0) + 0 + ii,\n                   vertsAroundEdge * (yy + 1) + 1 + ii,\n                   vertsAroundEdge * (yy + 1) + 0 + ii);\n    }\n  }\n\n  return {\n    position: positions,\n    normal: normals,\n    texcoord: texcoords,\n    indices: indices,\n  };\n}\n\n/**\n * Expands RLE data\n * @param {number[]} rleData data in format of run-length, x, y, z, run-length, x, y, z\n * @param {number[]} [padding] value to add each entry with.\n * @return {number[]} the expanded rleData\n * @private\n */\nfunction expandRLEData(rleData, padding) {\n  padding = padding || [];\n  const data = [];\n  for (let ii = 0; ii < rleData.length; ii += 4) {\n    const runLength = rleData[ii];\n    const element = rleData.slice(ii + 1, ii + 4);\n    element.push.apply(element, padding);\n    for (let jj = 0; jj < runLength; ++jj) {\n      data.push.apply(data, element);\n    }\n  }\n  return data;\n}\n\n/**\n * Creates 3D 'F' BufferInfo.\n * An 'F' is useful because you can easily tell which way it is oriented.\n * The created 'F' has position, normal, texcoord, and color buffers.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function create3DFBufferInfo\n */\n\n/**\n * Creates 3D 'F' buffers.\n * An 'F' is useful because you can easily tell which way it is oriented.\n * The created 'F' has position, normal, texcoord, and color buffers.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function create3DFBuffers\n */\n\n/**\n * Creates 3D 'F' vertices.\n * An 'F' is useful because you can easily tell which way it is oriented.\n * The created 'F' has position, normal, texcoord, and color arrays.\n *\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n */\nfunction create3DFVertices() {\n\n  const positions = [\n    // left column front\n    0,   0,  0,\n    0, 150,  0,\n    30,   0,  0,\n    0, 150,  0,\n    30, 150,  0,\n    30,   0,  0,\n\n    // top rung front\n    30,   0,  0,\n    30,  30,  0,\n    100,   0,  0,\n    30,  30,  0,\n    100,  30,  0,\n    100,   0,  0,\n\n    // middle rung front\n    30,  60,  0,\n    30,  90,  0,\n    67,  60,  0,\n    30,  90,  0,\n    67,  90,  0,\n    67,  60,  0,\n\n    // left column back\n      0,   0,  30,\n     30,   0,  30,\n      0, 150,  30,\n      0, 150,  30,\n     30,   0,  30,\n     30, 150,  30,\n\n    // top rung back\n     30,   0,  30,\n    100,   0,  30,\n     30,  30,  30,\n     30,  30,  30,\n    100,   0,  30,\n    100,  30,  30,\n\n    // middle rung back\n     30,  60,  30,\n     67,  60,  30,\n     30,  90,  30,\n     30,  90,  30,\n     67,  60,  30,\n     67,  90,  30,\n\n    // top\n      0,   0,   0,\n    100,   0,   0,\n    100,   0,  30,\n      0,   0,   0,\n    100,   0,  30,\n      0,   0,  30,\n\n    // top rung front\n    100,   0,   0,\n    100,  30,   0,\n    100,  30,  30,\n    100,   0,   0,\n    100,  30,  30,\n    100,   0,  30,\n\n    // under top rung\n    30,   30,   0,\n    30,   30,  30,\n    100,  30,  30,\n    30,   30,   0,\n    100,  30,  30,\n    100,  30,   0,\n\n    // between top rung and middle\n    30,   30,   0,\n    30,   60,  30,\n    30,   30,  30,\n    30,   30,   0,\n    30,   60,   0,\n    30,   60,  30,\n\n    // top of middle rung\n    30,   60,   0,\n    67,   60,  30,\n    30,   60,  30,\n    30,   60,   0,\n    67,   60,   0,\n    67,   60,  30,\n\n    // front of middle rung\n    67,   60,   0,\n    67,   90,  30,\n    67,   60,  30,\n    67,   60,   0,\n    67,   90,   0,\n    67,   90,  30,\n\n    // bottom of middle rung.\n    30,   90,   0,\n    30,   90,  30,\n    67,   90,  30,\n    30,   90,   0,\n    67,   90,  30,\n    67,   90,   0,\n\n    // front of bottom\n    30,   90,   0,\n    30,  150,  30,\n    30,   90,  30,\n    30,   90,   0,\n    30,  150,   0,\n    30,  150,  30,\n\n    // bottom\n    0,   150,   0,\n    0,   150,  30,\n    30,  150,  30,\n    0,   150,   0,\n    30,  150,  30,\n    30,  150,   0,\n\n    // left side\n    0,   0,   0,\n    0,   0,  30,\n    0, 150,  30,\n    0,   0,   0,\n    0, 150,  30,\n    0, 150,   0,\n  ];\n\n  const texcoords = [\n    // left column front\n    0.22, 0.19,\n    0.22, 0.79,\n    0.34, 0.19,\n    0.22, 0.79,\n    0.34, 0.79,\n    0.34, 0.19,\n\n    // top rung front\n    0.34, 0.19,\n    0.34, 0.31,\n    0.62, 0.19,\n    0.34, 0.31,\n    0.62, 0.31,\n    0.62, 0.19,\n\n    // middle rung front\n    0.34, 0.43,\n    0.34, 0.55,\n    0.49, 0.43,\n    0.34, 0.55,\n    0.49, 0.55,\n    0.49, 0.43,\n\n    // left column back\n    0, 0,\n    1, 0,\n    0, 1,\n    0, 1,\n    1, 0,\n    1, 1,\n\n    // top rung back\n    0, 0,\n    1, 0,\n    0, 1,\n    0, 1,\n    1, 0,\n    1, 1,\n\n    // middle rung back\n    0, 0,\n    1, 0,\n    0, 1,\n    0, 1,\n    1, 0,\n    1, 1,\n\n    // top\n    0, 0,\n    1, 0,\n    1, 1,\n    0, 0,\n    1, 1,\n    0, 1,\n\n    // top rung front\n    0, 0,\n    1, 0,\n    1, 1,\n    0, 0,\n    1, 1,\n    0, 1,\n\n    // under top rung\n    0, 0,\n    0, 1,\n    1, 1,\n    0, 0,\n    1, 1,\n    1, 0,\n\n    // between top rung and middle\n    0, 0,\n    1, 1,\n    0, 1,\n    0, 0,\n    1, 0,\n    1, 1,\n\n    // top of middle rung\n    0, 0,\n    1, 1,\n    0, 1,\n    0, 0,\n    1, 0,\n    1, 1,\n\n    // front of middle rung\n    0, 0,\n    1, 1,\n    0, 1,\n    0, 0,\n    1, 0,\n    1, 1,\n\n    // bottom of middle rung.\n    0, 0,\n    0, 1,\n    1, 1,\n    0, 0,\n    1, 1,\n    1, 0,\n\n    // front of bottom\n    0, 0,\n    1, 1,\n    0, 1,\n    0, 0,\n    1, 0,\n    1, 1,\n\n    // bottom\n    0, 0,\n    0, 1,\n    1, 1,\n    0, 0,\n    1, 1,\n    1, 0,\n\n    // left side\n    0, 0,\n    0, 1,\n    1, 1,\n    0, 0,\n    1, 1,\n    1, 0,\n  ];\n\n  const normals = expandRLEData([\n    // left column front\n    // top rung front\n    // middle rung front\n    18, 0, 0, 1,\n\n    // left column back\n    // top rung back\n    // middle rung back\n    18, 0, 0, -1,\n\n    // top\n    6, 0, 1, 0,\n\n    // top rung front\n    6, 1, 0, 0,\n\n    // under top rung\n    6, 0, -1, 0,\n\n    // between top rung and middle\n    6, 1, 0, 0,\n\n    // top of middle rung\n    6, 0, 1, 0,\n\n    // front of middle rung\n    6, 1, 0, 0,\n\n    // bottom of middle rung.\n    6, 0, -1, 0,\n\n    // front of bottom\n    6, 1, 0, 0,\n\n    // bottom\n    6, 0, -1, 0,\n\n    // left side\n    6, -1, 0, 0,\n  ]);\n\n  const colors = expandRLEData([\n        // left column front\n        // top rung front\n        // middle rung front\n      18, 200,  70, 120,\n\n        // left column back\n        // top rung back\n        // middle rung back\n      18, 80, 70, 200,\n\n        // top\n      6, 70, 200, 210,\n\n        // top rung front\n      6, 200, 200, 70,\n\n        // under top rung\n      6, 210, 100, 70,\n\n        // between top rung and middle\n      6, 210, 160, 70,\n\n        // top of middle rung\n      6, 70, 180, 210,\n\n        // front of middle rung\n      6, 100, 70, 210,\n\n        // bottom of middle rung.\n      6, 76, 210, 100,\n\n        // front of bottom\n      6, 140, 210, 80,\n\n        // bottom\n      6, 90, 130, 110,\n\n        // left side\n      6, 160, 160, 220,\n  ], [255]);\n\n  const numVerts = positions.length / 3;\n\n  const arrays = {\n    position: createAugmentedTypedArray(3, numVerts),\n    texcoord: createAugmentedTypedArray(2,  numVerts),\n    normal: createAugmentedTypedArray(3, numVerts),\n    color: createAugmentedTypedArray(4, numVerts, Uint8Array),\n    indices: createAugmentedTypedArray(3, numVerts / 3, Uint16Array),\n  };\n\n  arrays.position.push(positions);\n  arrays.texcoord.push(texcoords);\n  arrays.normal.push(normals);\n  arrays.color.push(colors);\n\n  for (let ii = 0; ii < numVerts; ++ii) {\n    arrays.indices.push(ii);\n  }\n\n  return arrays;\n}\n\n/**\n * Creates crescent BufferInfo.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createCresentBufferInfo\n */\n\n/**\n * Creates crescent buffers.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function createCresentBuffers\n */\n\n/**\n * Creates crescent vertices.\n *\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n * @function createCresentBuffers\n */\n\n/**\n * Creates crescent BufferInfo.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createCrescentBufferInfo\n */\n\n/**\n * Creates crescent buffers.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function createCrescentBuffers\n */\n\n/**\n * Creates crescent vertices.\n *\n * @param {number} verticalRadius The vertical radius of the crescent.\n * @param {number} outerRadius The outer radius of the crescent.\n * @param {number} innerRadius The inner radius of the crescent.\n * @param {number} thickness The thickness of the crescent.\n * @param {number} subdivisionsDown number of steps around the crescent.\n * @param {number} [startOffset] Where to start arc. Default 0.\n * @param {number} [endOffset] Where to end arg. Default 1.\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n */\n function createCrescentVertices(\n    verticalRadius,\n    outerRadius,\n    innerRadius,\n    thickness,\n    subdivisionsDown,\n    startOffset,\n    endOffset) {\n  if (subdivisionsDown <= 0) {\n    throw new Error('subdivisionDown must be > 0');\n  }\n\n  startOffset = startOffset || 0;\n  endOffset   = endOffset || 1;\n\n  const subdivisionsThick = 2;\n\n  const offsetRange = endOffset - startOffset;\n  const numVertices = (subdivisionsDown + 1) * 2 * (2 + subdivisionsThick);\n  const positions   = createAugmentedTypedArray(3, numVertices);\n  const normals     = createAugmentedTypedArray(3, numVertices);\n  const texcoords   = createAugmentedTypedArray(2, numVertices);\n\n  function lerp(a, b, s) {\n    return a + (b - a) * s;\n  }\n\n  function createArc(arcRadius, x, normalMult, normalAdd, uMult, uAdd) {\n    for (let z = 0; z <= subdivisionsDown; z++) {\n      const uBack = x / (subdivisionsThick - 1);\n      const v = z / subdivisionsDown;\n      const xBack = (uBack - 0.5) * 2;\n      const angle = (startOffset + (v * offsetRange)) * Math.PI;\n      const s = Math.sin(angle);\n      const c = Math.cos(angle);\n      const radius = lerp(verticalRadius, arcRadius, s);\n      const px = xBack * thickness;\n      const py = c * verticalRadius;\n      const pz = s * radius;\n      positions.push(px, py, pz);\n      const n = add(multiply$1([0, s, c], normalMult), normalAdd);\n      normals.push(n);\n      texcoords.push(uBack * uMult + uAdd, v);\n    }\n  }\n\n  // Generate the individual vertices in our vertex buffer.\n  for (let x = 0; x < subdivisionsThick; x++) {\n    const uBack = (x / (subdivisionsThick - 1) - 0.5) * 2;\n    createArc(outerRadius, x, [1, 1, 1], [0,     0, 0], 1, 0);\n    createArc(outerRadius, x, [0, 0, 0], [uBack, 0, 0], 0, 0);\n    createArc(innerRadius, x, [1, 1, 1], [0,     0, 0], 1, 0);\n    createArc(innerRadius, x, [0, 0, 0], [uBack, 0, 0], 0, 1);\n  }\n\n  // Do outer surface.\n  const indices = createAugmentedTypedArray(3, (subdivisionsDown * 2) * (2 + subdivisionsThick), Uint16Array);\n\n  function createSurface(leftArcOffset, rightArcOffset) {\n    for (let z = 0; z < subdivisionsDown; ++z) {\n      // Make triangle 1 of quad.\n      indices.push(\n          leftArcOffset + z + 0,\n          leftArcOffset + z + 1,\n          rightArcOffset + z + 0);\n\n      // Make triangle 2 of quad.\n      indices.push(\n          leftArcOffset + z + 1,\n          rightArcOffset + z + 1,\n          rightArcOffset + z + 0);\n    }\n  }\n\n  const numVerticesDown = subdivisionsDown + 1;\n  // front\n  createSurface(numVerticesDown * 0, numVerticesDown * 4);\n  // right\n  createSurface(numVerticesDown * 5, numVerticesDown * 7);\n  // back\n  createSurface(numVerticesDown * 6, numVerticesDown * 2);\n  // left\n  createSurface(numVerticesDown * 3, numVerticesDown * 1);\n\n  return {\n    position: positions,\n    normal:   normals,\n    texcoord: texcoords,\n    indices:  indices,\n  };\n}\n\n/**\n * Creates cylinder BufferInfo. The cylinder will be created around the origin\n * along the y-axis.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius Radius of cylinder.\n * @param {number} height Height of cylinder.\n * @param {number} radialSubdivisions The number of subdivisions around the cylinder.\n * @param {number} verticalSubdivisions The number of subdivisions down the cylinder.\n * @param {boolean} [topCap] Create top cap. Default = true.\n * @param {boolean} [bottomCap] Create bottom cap. Default = true.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createCylinderBufferInfo\n */\n\n /**\n  * Creates cylinder buffers. The cylinder will be created around the origin\n  * along the y-axis.\n  *\n  * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n  * @param {number} radius Radius of cylinder.\n  * @param {number} height Height of cylinder.\n  * @param {number} radialSubdivisions The number of subdivisions around the cylinder.\n  * @param {number} verticalSubdivisions The number of subdivisions down the cylinder.\n  * @param {boolean} [topCap] Create top cap. Default = true.\n  * @param {boolean} [bottomCap] Create bottom cap. Default = true.\n  * @return {Object.<string, WebGLBuffer>} The created buffers.\n  * @memberOf module:twgl/primitives\n  * @function createCylinderBuffers\n  */\n\n /**\n  * Creates cylinder vertices. The cylinder will be created around the origin\n  * along the y-axis.\n  *\n  * @param {number} radius Radius of cylinder.\n  * @param {number} height Height of cylinder.\n  * @param {number} radialSubdivisions The number of subdivisions around the cylinder.\n  * @param {number} verticalSubdivisions The number of subdivisions down the cylinder.\n  * @param {boolean} [topCap] Create top cap. Default = true.\n  * @param {boolean} [bottomCap] Create bottom cap. Default = true.\n  * @return {Object.<string, TypedArray>} The created vertices.\n  * @memberOf module:twgl/primitives\n  */\nfunction createCylinderVertices(\n    radius,\n    height,\n    radialSubdivisions,\n    verticalSubdivisions,\n    topCap,\n    bottomCap) {\n  return createTruncatedConeVertices(\n      radius,\n      radius,\n      height,\n      radialSubdivisions,\n      verticalSubdivisions,\n      topCap,\n      bottomCap);\n}\n\n/**\n * Creates BufferInfo for a torus\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius radius of center of torus circle.\n * @param {number} thickness radius of torus ring.\n * @param {number} radialSubdivisions The number of subdivisions around the torus.\n * @param {number} bodySubdivisions The number of subdivisions around the body torus.\n * @param {boolean} [startAngle] start angle in radians. Default = 0.\n * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createTorusBufferInfo\n */\n\n/**\n * Creates buffers for a torus\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius radius of center of torus circle.\n * @param {number} thickness radius of torus ring.\n * @param {number} radialSubdivisions The number of subdivisions around the torus.\n * @param {number} bodySubdivisions The number of subdivisions around the body torus.\n * @param {boolean} [startAngle] start angle in radians. Default = 0.\n * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function createTorusBuffers\n */\n\n/**\n * Creates vertices for a torus\n *\n * @param {number} radius radius of center of torus circle.\n * @param {number} thickness radius of torus ring.\n * @param {number} radialSubdivisions The number of subdivisions around the torus.\n * @param {number} bodySubdivisions The number of subdivisions around the body torus.\n * @param {boolean} [startAngle] start angle in radians. Default = 0.\n * @param {boolean} [endAngle] end angle in radians. Default = Math.PI * 2.\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createTorusVertices(\n    radius,\n    thickness,\n    radialSubdivisions,\n    bodySubdivisions,\n    startAngle,\n    endAngle) {\n  if (radialSubdivisions < 3) {\n    throw new Error('radialSubdivisions must be 3 or greater');\n  }\n\n  if (bodySubdivisions < 3) {\n    throw new Error('verticalSubdivisions must be 3 or greater');\n  }\n\n  startAngle = startAngle || 0;\n  endAngle = endAngle || Math.PI * 2;\n  const range = endAngle - startAngle;\n\n  const radialParts = radialSubdivisions + 1;\n  const bodyParts   = bodySubdivisions + 1;\n  const numVertices = radialParts * bodyParts;\n  const positions   = createAugmentedTypedArray(3, numVertices);\n  const normals     = createAugmentedTypedArray(3, numVertices);\n  const texcoords   = createAugmentedTypedArray(2, numVertices);\n  const indices     = createAugmentedTypedArray(3, (radialSubdivisions) * (bodySubdivisions) * 2, Uint16Array);\n\n  for (let slice = 0; slice < bodyParts; ++slice) {\n    const v = slice / bodySubdivisions;\n    const sliceAngle = v * Math.PI * 2;\n    const sliceSin = Math.sin(sliceAngle);\n    const ringRadius = radius + sliceSin * thickness;\n    const ny = Math.cos(sliceAngle);\n    const y = ny * thickness;\n    for (let ring = 0; ring < radialParts; ++ring) {\n      const u = ring / radialSubdivisions;\n      const ringAngle = startAngle + u * range;\n      const xSin = Math.sin(ringAngle);\n      const zCos = Math.cos(ringAngle);\n      const x = xSin * ringRadius;\n      const z = zCos * ringRadius;\n      const nx = xSin * sliceSin;\n      const nz = zCos * sliceSin;\n      positions.push(x, y, z);\n      normals.push(nx, ny, nz);\n      texcoords.push(u, 1 - v);\n    }\n  }\n\n  for (let slice = 0; slice < bodySubdivisions; ++slice) {  // eslint-disable-line\n    for (let ring = 0; ring < radialSubdivisions; ++ring) {  // eslint-disable-line\n      const nextRingIndex  = 1 + ring;\n      const nextSliceIndex = 1 + slice;\n      indices.push(radialParts * slice          + ring,\n                   radialParts * nextSliceIndex + ring,\n                   radialParts * slice          + nextRingIndex);\n      indices.push(radialParts * nextSliceIndex + ring,\n                   radialParts * nextSliceIndex + nextRingIndex,\n                   radialParts * slice          + nextRingIndex);\n    }\n  }\n\n  return {\n    position: positions,\n    normal:   normals,\n    texcoord: texcoords,\n    indices:  indices,\n  };\n}\n\n\n/**\n * Creates a disc BufferInfo. The disc will be in the xz plane, centered at\n * the origin. When creating, at least 3 divisions, or pie\n * pieces, need to be specified, otherwise the triangles making\n * up the disc will be degenerate. You can also specify the\n * number of radial pieces `stacks`. A value of 1 for\n * stacks will give you a simple disc of pie pieces.  If you\n * want to create an annulus you can set `innerRadius` to a\n * value > 0. Finally, `stackPower` allows you to have the widths\n * increase or decrease as you move away from the center. This\n * is particularly useful when using the disc as a ground plane\n * with a fixed camera such that you don't need the resolution\n * of small triangles near the perimeter. For example, a value\n * of 2 will produce stacks whose outside radius increases with\n * the square of the stack index. A value of 1 will give uniform\n * stacks.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius Radius of the ground plane.\n * @param {number} divisions Number of triangles in the ground plane (at least 3).\n * @param {number} [stacks] Number of radial divisions (default=1).\n * @param {number} [innerRadius] Default 0.\n * @param {number} [stackPower] Power to raise stack size to for decreasing width.\n * @return {module:twgl.BufferInfo} The created BufferInfo.\n * @memberOf module:twgl/primitives\n * @function createDiscBufferInfo\n */\n\n/**\n * Creates disc buffers. The disc will be in the xz plane, centered at\n * the origin. When creating, at least 3 divisions, or pie\n * pieces, need to be specified, otherwise the triangles making\n * up the disc will be degenerate. You can also specify the\n * number of radial pieces `stacks`. A value of 1 for\n * stacks will give you a simple disc of pie pieces.  If you\n * want to create an annulus you can set `innerRadius` to a\n * value > 0. Finally, `stackPower` allows you to have the widths\n * increase or decrease as you move away from the center. This\n * is particularly useful when using the disc as a ground plane\n * with a fixed camera such that you don't need the resolution\n * of small triangles near the perimeter. For example, a value\n * of 2 will produce stacks whose outside radius increases with\n * the square of the stack index. A value of 1 will give uniform\n * stacks.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext.\n * @param {number} radius Radius of the ground plane.\n * @param {number} divisions Number of triangles in the ground plane (at least 3).\n * @param {number} [stacks] Number of radial divisions (default=1).\n * @param {number} [innerRadius] Default 0.\n * @param {number} [stackPower] Power to raise stack size to for decreasing width.\n * @return {Object.<string, WebGLBuffer>} The created buffers.\n * @memberOf module:twgl/primitives\n * @function createDiscBuffers\n */\n\n/**\n * Creates disc vertices. The disc will be in the xz plane, centered at\n * the origin. When creating, at least 3 divisions, or pie\n * pieces, need to be specified, otherwise the triangles making\n * up the disc will be degenerate. You can also specify the\n * number of radial pieces `stacks`. A value of 1 for\n * stacks will give you a simple disc of pie pieces.  If you\n * want to create an annulus you can set `innerRadius` to a\n * value > 0. Finally, `stackPower` allows you to have the widths\n * increase or decrease as you move away from the center. This\n * is particularly useful when using the disc as a ground plane\n * with a fixed camera such that you don't need the resolution\n * of small triangles near the perimeter. For example, a value\n * of 2 will produce stacks whose outside radius increases with\n * the square of the stack index. A value of 1 will give uniform\n * stacks.\n *\n * @param {number} radius Radius of the ground plane.\n * @param {number} divisions Number of triangles in the ground plane (at least 3).\n * @param {number} [stacks] Number of radial divisions (default=1).\n * @param {number} [innerRadius] Default 0.\n * @param {number} [stackPower] Power to raise stack size to for decreasing width.\n * @return {Object.<string, TypedArray>} The created vertices.\n * @memberOf module:twgl/primitives\n */\nfunction createDiscVertices(\n    radius,\n    divisions,\n    stacks,\n    innerRadius,\n    stackPower) {\n  if (divisions < 3) {\n    throw new Error('divisions must be at least 3');\n  }\n\n  stacks = stacks ? stacks : 1;\n  stackPower = stackPower ? stackPower : 1;\n  innerRadius = innerRadius ? innerRadius : 0;\n\n  // Note: We don't share the center vertex because that would\n  // mess up texture coordinates.\n  const numVertices = (divisions + 1) * (stacks + 1);\n\n  const positions = createAugmentedTypedArray(3, numVertices);\n  const normals   = createAugmentedTypedArray(3, numVertices);\n  const texcoords = createAugmentedTypedArray(2, numVertices);\n  const indices   = createAugmentedTypedArray(3, stacks * divisions * 2, Uint16Array);\n\n  let firstIndex = 0;\n  const radiusSpan = radius - innerRadius;\n  const pointsPerStack = divisions + 1;\n\n  // Build the disk one stack at a time.\n  for (let stack = 0; stack <= stacks; ++stack) {\n    const stackRadius = innerRadius + radiusSpan * Math.pow(stack / stacks, stackPower);\n\n    for (let i = 0; i <= divisions; ++i) {\n      const theta = 2.0 * Math.PI * i / divisions;\n      const x = stackRadius * Math.cos(theta);\n      const z = stackRadius * Math.sin(theta);\n\n      positions.push(x, 0, z);\n      normals.push(0, 1, 0);\n      texcoords.push(1 - (i / divisions), stack / stacks);\n      if (stack > 0 && i !== divisions) {\n        // a, b, c and d are the indices of the vertices of a quad.  unless\n        // the current stack is the one closest to the center, in which case\n        // the vertices a and b connect to the center vertex.\n        const a = firstIndex + (i + 1);\n        const b = firstIndex + i;\n        const c = firstIndex + i - pointsPerStack;\n        const d = firstIndex + (i + 1) - pointsPerStack;\n\n        // Make a quad of the vertices a, b, c, d.\n        indices.push(a, b, c);\n        indices.push(a, c, d);\n      }\n    }\n\n    firstIndex += divisions + 1;\n  }\n\n  return {\n    position: positions,\n    normal: normals,\n    texcoord: texcoords,\n    indices: indices,\n  };\n}\n\n/**\n * creates a random integer between 0 and range - 1 inclusive.\n * @param {number} range\n * @return {number} random value between 0 and range - 1 inclusive.\n * @private\n */\nfunction randInt(range) {\n  return Math.random() * range | 0;\n}\n\n/**\n * Used to supply random colors\n * @callback RandomColorFunc\n * @param {number} ndx index of triangle/quad if unindexed or index of vertex if indexed\n * @param {number} channel 0 = red, 1 = green, 2 = blue, 3 = alpha\n * @return {number} a number from 0 to 255\n * @memberOf module:twgl/primitives\n */\n\n/**\n * @typedef {Object} RandomVerticesOptions\n * @property {number} [vertsPerColor] Defaults to 3 for non-indexed vertices\n * @property {module:twgl/primitives.RandomColorFunc} [rand] A function to generate random numbers\n * @memberOf module:twgl/primitives\n */\n\n/**\n * Creates an augmentedTypedArray of random vertex colors.\n * If the vertices are indexed (have an indices array) then will\n * just make random colors. Otherwise assumes they are triangles\n * and makes one random color for every 3 vertices.\n * @param {Object.<string, AugmentedTypedArray>} vertices Vertices as returned from one of the createXXXVertices functions.\n * @param {module:twgl/primitives.RandomVerticesOptions} [options] options.\n * @return {Object.<string, AugmentedTypedArray>} same vertices as passed in with `color` added.\n * @memberOf module:twgl/primitives\n */\nfunction makeRandomVertexColors(vertices, options) {\n  options = options || {};\n  const numElements = vertices.position.numElements;\n  const vColors = createAugmentedTypedArray(4, numElements, Uint8Array);\n  const rand = options.rand || function(ndx, channel) {\n    return channel < 3 ? randInt(256) : 255;\n  };\n  vertices.color = vColors;\n  if (vertices.indices) {\n    // just make random colors if index\n    for (let ii = 0; ii < numElements; ++ii) {\n      vColors.push(rand(ii, 0), rand(ii, 1), rand(ii, 2), rand(ii, 3));\n    }\n  } else {\n    // make random colors per triangle\n    const numVertsPerColor = options.vertsPerColor || 3;\n    const numSets = numElements / numVertsPerColor;\n    for (let ii = 0; ii < numSets; ++ii) {  // eslint-disable-line\n      const color = [rand(ii, 0), rand(ii, 1), rand(ii, 2), rand(ii, 3)];\n      for (let jj = 0; jj < numVertsPerColor; ++jj) {\n        vColors.push(color);\n      }\n    }\n  }\n  return vertices;\n}\n\n/**\n * creates a function that calls fn to create vertices and then\n * creates a buffers for them\n * @private\n */\nfunction createBufferFunc(fn) {\n  return function(gl) {\n    const arrays = fn.apply(this, Array.prototype.slice.call(arguments, 1));\n    return createBuffersFromArrays(gl, arrays);\n  };\n}\n\n/**\n * creates a function that calls fn to create vertices and then\n * creates a bufferInfo object for them\n * @private\n */\nfunction createBufferInfoFunc(fn) {\n  return function(gl) {\n    const arrays = fn.apply(null,  Array.prototype.slice.call(arguments, 1));\n    return createBufferInfoFromArrays(gl, arrays);\n  };\n}\n\nconst arraySpecPropertyNames = [\n  \"numComponents\",\n  \"size\",\n  \"type\",\n  \"normalize\",\n  \"stride\",\n  \"offset\",\n  \"attrib\",\n  \"name\",\n  \"attribName\",\n];\n\n/**\n * Copy elements from one array to another\n *\n * @param {Array|TypedArray} src source array\n * @param {Array|TypedArray} dst dest array\n * @param {number} dstNdx index in dest to copy src\n * @param {number} [offset] offset to add to copied values\n * @private\n */\nfunction copyElements(src, dst, dstNdx, offset) {\n  offset = offset || 0;\n  const length = src.length;\n  for (let ii = 0; ii < length; ++ii) {\n    dst[dstNdx + ii] = src[ii] + offset;\n  }\n}\n\n/**\n * Creates an array of the same time\n *\n * @param {(number[]|ArrayBufferView|module:twgl.FullArraySpec)} srcArray array who's type to copy\n * @param {number} length size of new array\n * @return {(number[]|ArrayBufferView|module:twgl.FullArraySpec)} array with same type as srcArray\n * @private\n */\nfunction createArrayOfSameType(srcArray, length) {\n  const arraySrc = getArray(srcArray);\n  const newArray = new arraySrc.constructor(length);\n  let newArraySpec = newArray;\n  // If it appears to have been augmented make new one augmented\n  if (arraySrc.numComponents && arraySrc.numElements) {\n    augmentTypedArray(newArray, arraySrc.numComponents);\n  }\n  // If it was a full spec make new one a full spec\n  if (srcArray.data) {\n    newArraySpec = {\n      data: newArray,\n    };\n    copyNamedProperties(arraySpecPropertyNames, srcArray, newArraySpec);\n  }\n  return newArraySpec;\n}\n\n/**\n * Concatenates sets of vertices\n *\n * Assumes the vertices match in composition. For example\n * if one set of vertices has positions, normals, and indices\n * all sets of vertices must have positions, normals, and indices\n * and of the same type.\n *\n * Example:\n *\n *      const cubeVertices = twgl.primitives.createCubeVertices(2);\n *      const sphereVertices = twgl.primitives.createSphereVertices(1, 10, 10);\n *      // move the sphere 2 units up\n *      twgl.primitives.reorientVertices(\n *          sphereVertices, twgl.m4.translation([0, 2, 0]));\n *      // merge the sphere with the cube\n *      const cubeSphereVertices = twgl.primitives.concatVertices(\n *          [cubeVertices, sphereVertices]);\n *      // turn them into WebGL buffers and attrib data\n *      const bufferInfo = twgl.createBufferInfoFromArrays(gl, cubeSphereVertices);\n *\n * @param {module:twgl.Arrays[]} arrays Array of arrays of vertices\n * @return {module:twgl.Arrays} The concatenated vertices.\n * @memberOf module:twgl/primitives\n */\nfunction concatVertices(arrayOfArrays) {\n  const names = {};\n  let baseName;\n  // get names of all arrays.\n  // and numElements for each set of vertices\n  for (let ii = 0; ii < arrayOfArrays.length; ++ii) {\n    const arrays = arrayOfArrays[ii];\n    Object.keys(arrays).forEach(function(name) {  // eslint-disable-line\n      if (!names[name]) {\n        names[name] = [];\n      }\n      if (!baseName && name !== 'indices') {\n        baseName = name;\n      }\n      const arrayInfo = arrays[name];\n      const numComponents = getNumComponents(arrayInfo, name);\n      const array = getArray(arrayInfo);\n      const numElements = array.length / numComponents;\n      names[name].push(numElements);\n    });\n  }\n\n  // compute length of combined array\n  // and return one for reference\n  function getLengthOfCombinedArrays(name) {\n    let length = 0;\n    let arraySpec;\n    for (let ii = 0; ii < arrayOfArrays.length; ++ii) {\n      const arrays = arrayOfArrays[ii];\n      const arrayInfo = arrays[name];\n      const array = getArray(arrayInfo);\n      length += array.length;\n      if (!arraySpec || arrayInfo.data) {\n        arraySpec = arrayInfo;\n      }\n    }\n    return {\n      length: length,\n      spec: arraySpec,\n    };\n  }\n\n  function copyArraysToNewArray(name, base, newArray) {\n    let baseIndex = 0;\n    let offset = 0;\n    for (let ii = 0; ii < arrayOfArrays.length; ++ii) {\n      const arrays = arrayOfArrays[ii];\n      const arrayInfo = arrays[name];\n      const array = getArray(arrayInfo);\n      if (name === 'indices') {\n        copyElements(array, newArray, offset, baseIndex);\n        baseIndex += base[ii];\n      } else {\n        copyElements(array, newArray, offset);\n      }\n      offset += array.length;\n    }\n  }\n\n  const base = names[baseName];\n\n  const newArrays = {};\n  Object.keys(names).forEach(function(name) {\n    const info = getLengthOfCombinedArrays(name);\n    const newArraySpec = createArrayOfSameType(info.spec, info.length);\n    copyArraysToNewArray(name, base, getArray(newArraySpec));\n    newArrays[name] = newArraySpec;\n  });\n  return newArrays;\n}\n\n/**\n * Creates a duplicate set of vertices\n *\n * This is useful for calling reorientVertices when you\n * also want to keep the original available\n *\n * @param {module:twgl.Arrays} arrays of vertices\n * @return {module:twgl.Arrays} The duplicated vertices.\n * @memberOf module:twgl/primitives\n */\nfunction duplicateVertices(arrays) {\n  const newArrays = {};\n  Object.keys(arrays).forEach(function(name) {\n    const arraySpec = arrays[name];\n    const srcArray = getArray(arraySpec);\n    const newArraySpec = createArrayOfSameType(arraySpec, srcArray.length);\n    copyElements(srcArray, getArray(newArraySpec), 0);\n    newArrays[name] = newArraySpec;\n  });\n  return newArrays;\n}\n\nconst create3DFBufferInfo = createBufferInfoFunc(create3DFVertices);\nconst create3DFBuffers = createBufferFunc(create3DFVertices);\nconst createCubeBufferInfo = createBufferInfoFunc(createCubeVertices);\nconst createCubeBuffers = createBufferFunc(createCubeVertices);\nconst createPlaneBufferInfo = createBufferInfoFunc(createPlaneVertices);\nconst createPlaneBuffers = createBufferFunc(createPlaneVertices);\nconst createSphereBufferInfo = createBufferInfoFunc(createSphereVertices);\nconst createSphereBuffers = createBufferFunc(createSphereVertices);\nconst createTruncatedConeBufferInfo = createBufferInfoFunc(createTruncatedConeVertices);\nconst createTruncatedConeBuffers = createBufferFunc(createTruncatedConeVertices);\nconst createXYQuadBufferInfo = createBufferInfoFunc(createXYQuadVertices);\nconst createXYQuadBuffers = createBufferFunc(createXYQuadVertices);\nconst createCrescentBufferInfo = createBufferInfoFunc(createCrescentVertices);\nconst createCrescentBuffers = createBufferFunc(createCrescentVertices);\nconst createCylinderBufferInfo = createBufferInfoFunc(createCylinderVertices);\nconst createCylinderBuffers = createBufferFunc(createCylinderVertices);\nconst createTorusBufferInfo = createBufferInfoFunc(createTorusVertices);\nconst createTorusBuffers = createBufferFunc(createTorusVertices);\nconst createDiscBufferInfo = createBufferInfoFunc(createDiscVertices);\nconst createDiscBuffers = createBufferFunc(createDiscVertices);\n\n// these were mis-spelled until 4.12\nconst createCresentBufferInfo = createCrescentBufferInfo;\nconst createCresentBuffers = createCrescentBuffers;\nconst createCresentVertices = createCrescentVertices;\n\nvar primitives = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  create3DFBufferInfo: create3DFBufferInfo,\n  create3DFBuffers: create3DFBuffers,\n  create3DFVertices: create3DFVertices,\n  createAugmentedTypedArray: createAugmentedTypedArray,\n  createCubeBufferInfo: createCubeBufferInfo,\n  createCubeBuffers: createCubeBuffers,\n  createCubeVertices: createCubeVertices,\n  createPlaneBufferInfo: createPlaneBufferInfo,\n  createPlaneBuffers: createPlaneBuffers,\n  createPlaneVertices: createPlaneVertices,\n  createSphereBufferInfo: createSphereBufferInfo,\n  createSphereBuffers: createSphereBuffers,\n  createSphereVertices: createSphereVertices,\n  createTruncatedConeBufferInfo: createTruncatedConeBufferInfo,\n  createTruncatedConeBuffers: createTruncatedConeBuffers,\n  createTruncatedConeVertices: createTruncatedConeVertices,\n  createXYQuadBufferInfo: createXYQuadBufferInfo,\n  createXYQuadBuffers: createXYQuadBuffers,\n  createXYQuadVertices: createXYQuadVertices,\n  createCresentBufferInfo: createCresentBufferInfo,\n  createCresentBuffers: createCresentBuffers,\n  createCresentVertices: createCresentVertices,\n  createCrescentBufferInfo: createCrescentBufferInfo,\n  createCrescentBuffers: createCrescentBuffers,\n  createCrescentVertices: createCrescentVertices,\n  createCylinderBufferInfo: createCylinderBufferInfo,\n  createCylinderBuffers: createCylinderBuffers,\n  createCylinderVertices: createCylinderVertices,\n  createTorusBufferInfo: createTorusBufferInfo,\n  createTorusBuffers: createTorusBuffers,\n  createTorusVertices: createTorusVertices,\n  createDiscBufferInfo: createDiscBufferInfo,\n  createDiscBuffers: createDiscBuffers,\n  createDiscVertices: createDiscVertices,\n  deindexVertices: deindexVertices,\n  flattenNormals: flattenNormals,\n  makeRandomVertexColors: makeRandomVertexColors,\n  reorientDirections: reorientDirections,\n  reorientNormals: reorientNormals,\n  reorientPositions: reorientPositions,\n  reorientVertices: reorientVertices,\n  concatVertices: concatVertices,\n  duplicateVertices: duplicateVertices\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * Gets the gl version as a number\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @return {number} version of gl\n * @private\n */\n//function getVersionAsNumber(gl) {\n//  return parseFloat(gl.getParameter(gl.VERSION).substr(6));\n//}\n\n/**\n * Check if context is WebGL 2.0\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @return {bool} true if it's WebGL 2.0\n * @memberOf module:twgl\n */\nfunction isWebGL2(gl) {\n  // This is the correct check but it's slow\n  //  return gl.getParameter(gl.VERSION).indexOf(\"WebGL 2.0\") === 0;\n  // This might also be the correct check but I'm assuming it's slow-ish\n  // return gl instanceof WebGL2RenderingContext;\n  return !!gl.texStorage2D;\n}\n\n/**\n * Check if context is WebGL 1.0\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @return {bool} true if it's WebGL 1.0\n * @memberOf module:twgl\n */\nfunction isWebGL1(gl) {\n  // This is the correct check but it's slow\n  // const version = getVersionAsNumber(gl);\n  // return version <= 1.0 && version > 0.0;  // because as of 2016/5 Edge returns 0.96\n  // This might also be the correct check but I'm assuming it's slow-ish\n  // return gl instanceof WebGLRenderingContext;\n  return !gl.texStorage2D;\n}\n\n/**\n * Gets a string for WebGL enum\n *\n * Note: Several enums are the same. Without more\n * context (which function) it's impossible to always\n * give the correct enum. As it is, for matching values\n * it gives all enums. Checking the WebGL2RenderingContext\n * that means\n *\n *      0     = ZERO | POINT | NONE | NO_ERROR\n *      1     = ONE | LINES | SYNC_FLUSH_COMMANDS_BIT\n *      32777 = BLEND_EQUATION_RGB | BLEND_EQUATION_RGB\n *      36662 = COPY_READ_BUFFER | COPY_READ_BUFFER_BINDING\n *      36663 = COPY_WRITE_BUFFER | COPY_WRITE_BUFFER_BINDING\n *      36006 = FRAMEBUFFER_BINDING | DRAW_FRAMEBUFFER_BINDING\n *\n * It's also not useful for bits really unless you pass in individual bits.\n * In other words\n *\n *     const bits = gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT;\n *     twgl.glEnumToString(gl, bits);  // not going to work\n *\n * Note that some enums only exist on extensions. If you\n * want them to show up you need to pass the extension at least\n * once. For example\n *\n *     const ext = gl.getExtension('WEBGL_compressed_texture_s3tc');\n *     if (ext) {\n *        twgl.glEnumToString(ext, 0);  // just prime the function\n *\n *        ..later..\n *\n *        const internalFormat = ext.COMPRESSED_RGB_S3TC_DXT1_EXT;\n *        console.log(twgl.glEnumToString(gl, internalFormat));\n *\n * Notice I didn't have to pass the extension the second time. This means\n * you can have place that generically gets an enum for texture formats for example.\n * and as long as you primed the function with the extensions\n *\n * If you're using `twgl.addExtensionsToContext` to enable your extensions\n * then twgl will automatically get the extension's enums.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext or any extension object\n * @param {number} value the value of the enum you want to look up.\n * @return {string} enum string or hex value\n * @memberOf module:twgl\n * @function glEnumToString\n */\nconst glEnumToString = (function() {\n  const haveEnumsForType = {};\n  const enums = {};\n\n  function addEnums(gl) {\n    const type = gl.constructor.name;\n    if (!haveEnumsForType[type]) {\n      for (const key in gl) {\n        if (typeof gl[key] === 'number') {\n          const existing = enums[gl[key]];\n          enums[gl[key]] = existing ? `${existing} | ${key}` : key;\n        }\n      }\n      haveEnumsForType[type] = true;\n    }\n  }\n\n  return function glEnumToString(gl, value) {\n    addEnums(gl);\n    return enums[value] || (typeof value === 'number' ? `0x${value.toString(16)}` : value);\n  };\n}());\n\nvar utils = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  glEnumToString: glEnumToString,\n  isWebGL1: isWebGL1,\n  isWebGL2: isWebGL2\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * Low level texture related functions\n *\n * You should generally not need to use these functions. They are provided\n * for those cases where you're doing something out of the ordinary\n * and you need lower level access.\n *\n * For backward compatibility they are available at both `twgl.textures` and `twgl`\n * itself\n *\n * See {@link module:twgl} for core functions\n *\n * @module twgl/textures\n */\n\n// make sure we don't see a global gl\nconst gl = undefined;  /* eslint-disable-line */\nconst defaults$1 = {\n  textureColor: new Uint8Array([128, 192, 255, 255]),\n  textureOptions: {},\n  crossOrigin: undefined,\n};\nconst isArrayBuffer = isArrayBuffer$1;\n\n// Should we make this on demand?\nconst getShared2DContext = function() {\n  let s_ctx;\n  return function getShared2DContext() {\n    s_ctx = s_ctx ||\n        ((typeof document !== 'undefined' && document.createElement)\n          ? document.createElement(\"canvas\").getContext(\"2d\")\n          : null);\n    return s_ctx;\n  };\n}();\n\n// NOTE: Chrome supports 2D canvas in a Worker (behind flag as of v64 but\n//       not only does Firefox NOT support it but Firefox freezes immediately\n//       if you try to create one instead of just returning null and continuing.\n//  : (global.OffscreenCanvas && (new global.OffscreenCanvas(1, 1)).getContext(\"2d\"));  // OffscreenCanvas may not support 2d\n\n// NOTE: We can maybe remove some of the need for the 2d canvas. In WebGL2\n// we can use the various unpack settings. Otherwise we could try using\n// the ability of an ImageBitmap to be cut. Unfortunately cutting an ImageBitmap\n// is async and the current TWGL code expects a non-Async result though that\n// might not be a problem. ImageBitmap though is not available in Edge or Safari\n// as of 2018-01-02\n\n/* PixelFormat */\nconst ALPHA                          = 0x1906;\nconst RGB                            = 0x1907;\nconst RGBA$1                           = 0x1908;\nconst LUMINANCE                      = 0x1909;\nconst LUMINANCE_ALPHA                = 0x190A;\nconst DEPTH_COMPONENT$1                = 0x1902;\nconst DEPTH_STENCIL$1                  = 0x84F9;\n\n/* TextureWrapMode */\n// const REPEAT                         = 0x2901;\n// const MIRRORED_REPEAT                = 0x8370;\nconst CLAMP_TO_EDGE$1                  = 0x812f;\n\n/* TextureMagFilter */\nconst NEAREST                        = 0x2600;\nconst LINEAR$1                         = 0x2601;\nconst NEAREST_MIPMAP_LINEAR          = 0x2702;\n\n/* TextureMinFilter */\n// const NEAREST_MIPMAP_NEAREST         = 0x2700;\n// const LINEAR_MIPMAP_NEAREST          = 0x2701;\n// const NEAREST_MIPMAP_LINEAR          = 0x2702;\n// const LINEAR_MIPMAP_LINEAR           = 0x2703;\n\n/* Texture Target */\nconst TEXTURE_2D$2                     = 0x0de1;\nconst TEXTURE_CUBE_MAP$1               = 0x8513;\nconst TEXTURE_3D$1                     = 0x806f;\nconst TEXTURE_2D_ARRAY$1               = 0x8c1a;\n\n/* Cubemap Targets */\nconst TEXTURE_CUBE_MAP_POSITIVE_X    = 0x8515;\nconst TEXTURE_CUBE_MAP_NEGATIVE_X    = 0x8516;\nconst TEXTURE_CUBE_MAP_POSITIVE_Y    = 0x8517;\nconst TEXTURE_CUBE_MAP_NEGATIVE_Y    = 0x8518;\nconst TEXTURE_CUBE_MAP_POSITIVE_Z    = 0x8519;\nconst TEXTURE_CUBE_MAP_NEGATIVE_Z    = 0x851a;\n\n/* Texture Parameters */\nconst TEXTURE_MIN_FILTER             = 0x2801;\nconst TEXTURE_MAG_FILTER             = 0x2800;\nconst TEXTURE_WRAP_S                 = 0x2802;\nconst TEXTURE_WRAP_T                 = 0x2803;\nconst TEXTURE_WRAP_R                 = 0x8072;\nconst TEXTURE_MIN_LOD                = 0x813a;\nconst TEXTURE_MAX_LOD                = 0x813b;\nconst TEXTURE_BASE_LEVEL             = 0x813c;\nconst TEXTURE_MAX_LEVEL              = 0x813d;\nconst TEXTURE_COMPARE_MODE           = 0x884C;\nconst TEXTURE_COMPARE_FUNC           = 0x884D;\n\n/* Pixel store */\nconst UNPACK_ALIGNMENT                   = 0x0cf5;\nconst UNPACK_ROW_LENGTH                  = 0x0cf2;\nconst UNPACK_IMAGE_HEIGHT                = 0x806e;\nconst UNPACK_SKIP_PIXELS                 = 0x0cf4;\nconst UNPACK_SKIP_ROWS                   = 0x0cf3;\nconst UNPACK_SKIP_IMAGES                 = 0x806d;\nconst UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\nconst UNPACK_PREMULTIPLY_ALPHA_WEBGL     = 0x9241;\nconst UNPACK_FLIP_Y_WEBGL                = 0x9240;\n\nconst R8                           = 0x8229;\nconst R8_SNORM                     = 0x8F94;\nconst R16F                         = 0x822D;\nconst R32F                         = 0x822E;\nconst R8UI                         = 0x8232;\nconst R8I                          = 0x8231;\nconst RG16UI                       = 0x823A;\nconst RG16I                        = 0x8239;\nconst RG32UI                       = 0x823C;\nconst RG32I                        = 0x823B;\nconst RG8                          = 0x822B;\nconst RG8_SNORM                    = 0x8F95;\nconst RG16F                        = 0x822F;\nconst RG32F                        = 0x8230;\nconst RG8UI                        = 0x8238;\nconst RG8I                         = 0x8237;\nconst R16UI                        = 0x8234;\nconst R16I                         = 0x8233;\nconst R32UI                        = 0x8236;\nconst R32I                         = 0x8235;\nconst RGB8                         = 0x8051;\nconst SRGB8                        = 0x8C41;\nconst RGB565$1                       = 0x8D62;\nconst RGB8_SNORM                   = 0x8F96;\nconst R11F_G11F_B10F               = 0x8C3A;\nconst RGB9_E5                      = 0x8C3D;\nconst RGB16F                       = 0x881B;\nconst RGB32F                       = 0x8815;\nconst RGB8UI                       = 0x8D7D;\nconst RGB8I                        = 0x8D8F;\nconst RGB16UI                      = 0x8D77;\nconst RGB16I                       = 0x8D89;\nconst RGB32UI                      = 0x8D71;\nconst RGB32I                       = 0x8D83;\nconst RGBA8                        = 0x8058;\nconst SRGB8_ALPHA8                 = 0x8C43;\nconst RGBA8_SNORM                  = 0x8F97;\nconst RGB5_A1$1                      = 0x8057;\nconst RGBA4$1                        = 0x8056;\nconst RGB10_A2                     = 0x8059;\nconst RGBA16F                      = 0x881A;\nconst RGBA32F                      = 0x8814;\nconst RGBA8UI                      = 0x8D7C;\nconst RGBA8I                       = 0x8D8E;\nconst RGB10_A2UI                   = 0x906F;\nconst RGBA16UI                     = 0x8D76;\nconst RGBA16I                      = 0x8D88;\nconst RGBA32I                      = 0x8D82;\nconst RGBA32UI                     = 0x8D70;\n\nconst DEPTH_COMPONENT16$1            = 0x81A5;\nconst DEPTH_COMPONENT24$1            = 0x81A6;\nconst DEPTH_COMPONENT32F$1           = 0x8CAC;\nconst DEPTH32F_STENCIL8$1            = 0x8CAD;\nconst DEPTH24_STENCIL8$1             = 0x88F0;\n\n/* DataType */\nconst BYTE                         = 0x1400;\nconst UNSIGNED_BYTE$1                = 0x1401;\nconst SHORT                        = 0x1402;\nconst UNSIGNED_SHORT$1               = 0x1403;\nconst INT$1                          = 0x1404;\nconst UNSIGNED_INT$1                 = 0x1405;\nconst FLOAT$1                        = 0x1406;\nconst UNSIGNED_SHORT_4_4_4_4       = 0x8033;\nconst UNSIGNED_SHORT_5_5_5_1       = 0x8034;\nconst UNSIGNED_SHORT_5_6_5         = 0x8363;\nconst HALF_FLOAT                   = 0x140B;\nconst HALF_FLOAT_OES               = 0x8D61;  // Thanks Khronos for making this different >:(\nconst UNSIGNED_INT_2_10_10_10_REV  = 0x8368;\nconst UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B;\nconst UNSIGNED_INT_5_9_9_9_REV     = 0x8C3E;\nconst FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD;\nconst UNSIGNED_INT_24_8            = 0x84FA;\n\nconst RG                           = 0x8227;\nconst RG_INTEGER                   = 0x8228;\nconst RED                          = 0x1903;\nconst RED_INTEGER                  = 0x8D94;\nconst RGB_INTEGER                  = 0x8D98;\nconst RGBA_INTEGER                 = 0x8D99;\n\n/* Compressed Texture Formats */\n// s3tc\nconst COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;\nconst COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;\nconst COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;\nconst COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;\n// s3tc_srgb\nconst COMPRESSED_SRGB_S3TC_DXT1_EXT       = 0x8C4C;\nconst COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D;\nconst COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E;\nconst COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F;\n// etc\nconst COMPRESSED_RGB_ETC1_WEBGL    = 0x8D64;\nconst COMPRESSED_R11_EAC = 0x9270;\nconst COMPRESSED_SIGNED_R11_EAC = 0x9271;\nconst COMPRESSED_RG11_EAC = 0x9272;\nconst COMPRESSED_SIGNED_RG11_EAC = 0x9273;\nconst COMPRESSED_RGB8_ETC2 = 0x9274;\nconst COMPRESSED_SRGB8_ETC2 = 0x9275;\nconst COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276;\nconst COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277;\nconst COMPRESSED_RGBA8_ETC2_EAC = 0x9278;\nconst COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279;\n// pvrtc\nconst COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;\nconst COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;\nconst COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;\nconst COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;\n// astc\nconst COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93B0;\nconst COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93B1;\nconst COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93B2;\nconst COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93B3;\nconst COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93B4;\nconst COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93B5;\nconst COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93B6;\nconst COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93B7;\nconst COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93B8;\nconst COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93B9;\nconst COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93BA;\nconst COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93BB;\nconst COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93BC;\nconst COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93BD;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93D0;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93D1;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93D2;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93D3;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93D4;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93D5;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93D6;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93D7;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93D8;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93D9;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93DA;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93DB;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93DC;\nconst COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93DD;\n// bptc\nconst COMPRESSED_RGBA_BPTC_UNORM_EXT = 0x8E8C;\nconst COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = 0x8E8D;\nconst COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT = 0x8E8E;\nconst COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT = 0x8E8F;\n// rgtc\nconst COMPRESSED_RED_RGTC1_EXT = 0x8DBB;\nconst COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC;\nconst COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD;\nconst COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE;\n\nconst formatInfo = {};\n{\n  // NOTE: this is named `numColorComponents` vs `numComponents` so we can let Uglify mangle\n  // the name.\n  const f = formatInfo;\n  f[ALPHA]           = { numColorComponents: 1, };\n  f[LUMINANCE]       = { numColorComponents: 1, };\n  f[LUMINANCE_ALPHA] = { numColorComponents: 2, };\n  f[RGB]             = { numColorComponents: 3, };\n  f[RGBA$1]            = { numColorComponents: 4, };\n  f[RED]             = { numColorComponents: 1, };\n  f[RED_INTEGER]     = { numColorComponents: 1, };\n  f[RG]              = { numColorComponents: 2, };\n  f[RG_INTEGER]      = { numColorComponents: 2, };\n  f[RGB]             = { numColorComponents: 3, };\n  f[RGB_INTEGER]     = { numColorComponents: 3, };\n  f[RGBA$1]            = { numColorComponents: 4, };\n  f[RGBA_INTEGER]    = { numColorComponents: 4, };\n  f[DEPTH_COMPONENT$1] = { numColorComponents: 1, };\n  f[DEPTH_STENCIL$1]   = { numColorComponents: 2, };\n}\n\n/**\n * @typedef {Object} BlockInfo\n * @property {number} bytes number of bytes in the block\n * @property {number} width width of the block\n * @property {number} height height of the block\n * @private\n */\n\n/**\n * @typedef {Object} TextureFormatDetails\n * @property {number} textureFormat format to pass texImage2D and similar functions.\n * @property {boolean} colorRenderable true if you can render to this format of texture.\n * @property {boolean} textureFilterable true if you can filter the texture, false if you can ony use `NEAREST`.\n * @property {number[]} type Array of possible types you can pass to texImage2D and similar function\n * @property {Object.<number,number>} [bytesPerElementMap] A map of types to bytes per element\n * @property {BlockInfo} [block] block size, only for compressed textures\n * @private\n */\n\nlet s_textureInternalFormatInfo;\nfunction getTextureInternalFormatInfo(internalFormat) {\n  if (!s_textureInternalFormatInfo) {\n    // NOTE: these properties need unique names so we can let Uglify mangle the name.\n    const t = {};\n    // unsized formats\n    t[ALPHA]              = { textureFormat: ALPHA,           colorRenderable: true,  textureFilterable: true,  bytesPerElement: [1, 2, 2, 4],        type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], };\n    t[LUMINANCE]          = { textureFormat: LUMINANCE,       colorRenderable: true,  textureFilterable: true,  bytesPerElement: [1, 2, 2, 4],        type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], };\n    t[LUMINANCE_ALPHA]    = { textureFormat: LUMINANCE_ALPHA, colorRenderable: true,  textureFilterable: true,  bytesPerElement: [2, 4, 4, 8],        type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1], };\n    t[RGB]                = { textureFormat: RGB,             colorRenderable: true,  textureFilterable: true,  bytesPerElement: [3, 6, 6, 12, 2],    type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1, UNSIGNED_SHORT_5_6_5], };\n    t[RGBA$1]               = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4, 8, 8, 16, 2, 2], type: [UNSIGNED_BYTE$1, HALF_FLOAT, HALF_FLOAT_OES, FLOAT$1, UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_5_5_5_1], };\n    t[DEPTH_COMPONENT$1]    = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true,  textureFilterable: false, bytesPerElement: [2, 4],              type: [UNSIGNED_INT$1, UNSIGNED_SHORT$1], };\n\n    // sized formats\n    t[R8]                 = { textureFormat: RED,             colorRenderable: true,  textureFilterable: true,  bytesPerElement: [1],        type: [UNSIGNED_BYTE$1], };\n    t[R8_SNORM]           = { textureFormat: RED,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [1],        type: [BYTE], };\n    t[R16F]               = { textureFormat: RED,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [4, 2],     type: [FLOAT$1, HALF_FLOAT], };\n    t[R32F]               = { textureFormat: RED,             colorRenderable: false, textureFilterable: false, bytesPerElement: [4],        type: [FLOAT$1], };\n    t[R8UI]               = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [1],        type: [UNSIGNED_BYTE$1], };\n    t[R8I]                = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [1],        type: [BYTE], };\n    t[R16UI]              = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [2],        type: [UNSIGNED_SHORT$1], };\n    t[R16I]               = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [2],        type: [SHORT], };\n    t[R32UI]              = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_INT$1], };\n    t[R32I]               = { textureFormat: RED_INTEGER,     colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [INT$1], };\n    t[RG8]                = { textureFormat: RG,              colorRenderable: true,  textureFilterable: true,  bytesPerElement: [2],        type: [UNSIGNED_BYTE$1], };\n    t[RG8_SNORM]          = { textureFormat: RG,              colorRenderable: false, textureFilterable: true,  bytesPerElement: [2],        type: [BYTE], };\n    t[RG16F]              = { textureFormat: RG,              colorRenderable: false, textureFilterable: true,  bytesPerElement: [8, 4],     type: [FLOAT$1, HALF_FLOAT], };\n    t[RG32F]              = { textureFormat: RG,              colorRenderable: false, textureFilterable: false, bytesPerElement: [8],        type: [FLOAT$1], };\n    t[RG8UI]              = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [2],        type: [UNSIGNED_BYTE$1], };\n    t[RG8I]               = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [2],        type: [BYTE], };\n    t[RG16UI]             = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_SHORT$1], };\n    t[RG16I]              = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [SHORT], };\n    t[RG32UI]             = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [8],        type: [UNSIGNED_INT$1], };\n    t[RG32I]              = { textureFormat: RG_INTEGER,      colorRenderable: true,  textureFilterable: false, bytesPerElement: [8],        type: [INT$1], };\n    t[RGB8]               = { textureFormat: RGB,             colorRenderable: true,  textureFilterable: true,  bytesPerElement: [3],        type: [UNSIGNED_BYTE$1], };\n    t[SRGB8]              = { textureFormat: RGB,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [3],        type: [UNSIGNED_BYTE$1], };\n    t[RGB565$1]             = { textureFormat: RGB,             colorRenderable: true,  textureFilterable: true,  bytesPerElement: [3, 2],     type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_5_6_5], };\n    t[RGB8_SNORM]         = { textureFormat: RGB,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [3],        type: [BYTE], };\n    t[R11F_G11F_B10F]     = { textureFormat: RGB,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [12, 6, 4], type: [FLOAT$1, HALF_FLOAT, UNSIGNED_INT_10F_11F_11F_REV], };\n    t[RGB9_E5]            = { textureFormat: RGB,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [12, 6, 4], type: [FLOAT$1, HALF_FLOAT, UNSIGNED_INT_5_9_9_9_REV], };\n    t[RGB16F]             = { textureFormat: RGB,             colorRenderable: false, textureFilterable: true,  bytesPerElement: [12, 6],    type: [FLOAT$1, HALF_FLOAT], };\n    t[RGB32F]             = { textureFormat: RGB,             colorRenderable: false, textureFilterable: false, bytesPerElement: [12],       type: [FLOAT$1], };\n    t[RGB8UI]             = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [3],        type: [UNSIGNED_BYTE$1], };\n    t[RGB8I]              = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [3],        type: [BYTE], };\n    t[RGB16UI]            = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [6],        type: [UNSIGNED_SHORT$1], };\n    t[RGB16I]             = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [6],        type: [SHORT], };\n    t[RGB32UI]            = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [12],       type: [UNSIGNED_INT$1], };\n    t[RGB32I]             = { textureFormat: RGB_INTEGER,     colorRenderable: false, textureFilterable: false, bytesPerElement: [12],       type: [INT$1], };\n    t[RGBA8]              = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4],        type: [UNSIGNED_BYTE$1], };\n    t[SRGB8_ALPHA8]       = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4],        type: [UNSIGNED_BYTE$1], };\n    t[RGBA8_SNORM]        = { textureFormat: RGBA$1,            colorRenderable: false, textureFilterable: true,  bytesPerElement: [4],        type: [BYTE], };\n    t[RGB5_A1$1]            = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4, 2, 4],  type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_5_5_5_1, UNSIGNED_INT_2_10_10_10_REV], };\n    t[RGBA4$1]              = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4, 2],     type: [UNSIGNED_BYTE$1, UNSIGNED_SHORT_4_4_4_4], };\n    t[RGB10_A2]           = { textureFormat: RGBA$1,            colorRenderable: true,  textureFilterable: true,  bytesPerElement: [4],        type: [UNSIGNED_INT_2_10_10_10_REV], };\n    t[RGBA16F]            = { textureFormat: RGBA$1,            colorRenderable: false, textureFilterable: true,  bytesPerElement: [16, 8],    type: [FLOAT$1, HALF_FLOAT], };\n    t[RGBA32F]            = { textureFormat: RGBA$1,            colorRenderable: false, textureFilterable: false, bytesPerElement: [16],       type: [FLOAT$1], };\n    t[RGBA8UI]            = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_BYTE$1], };\n    t[RGBA8I]             = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [BYTE], };\n    t[RGB10_A2UI]         = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_INT_2_10_10_10_REV], };\n    t[RGBA16UI]           = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [8],        type: [UNSIGNED_SHORT$1], };\n    t[RGBA16I]            = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [8],        type: [SHORT], };\n    t[RGBA32I]            = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [16],       type: [INT$1], };\n    t[RGBA32UI]           = { textureFormat: RGBA_INTEGER,    colorRenderable: true,  textureFilterable: false, bytesPerElement: [16],       type: [UNSIGNED_INT$1], };\n    // Sized Internal\n    t[DEPTH_COMPONENT16$1]  = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true,  textureFilterable: false, bytesPerElement: [2, 4],     type: [UNSIGNED_SHORT$1, UNSIGNED_INT$1], };\n    t[DEPTH_COMPONENT24$1]  = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_INT$1], };\n    t[DEPTH_COMPONENT32F$1] = { textureFormat: DEPTH_COMPONENT$1, colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [FLOAT$1], };\n    t[DEPTH24_STENCIL8$1]   = { textureFormat: DEPTH_STENCIL$1,   colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [UNSIGNED_INT_24_8], };\n    t[DEPTH32F_STENCIL8$1]  = { textureFormat: DEPTH_STENCIL$1,   colorRenderable: true,  textureFilterable: false, bytesPerElement: [4],        type: [FLOAT_32_UNSIGNED_INT_24_8_REV], };\n\n    Object.keys(t).forEach(function(internalFormat) {\n      const info = t[internalFormat];\n      info.bytesPerElementMap = {};\n      info.bytesPerElement.forEach(function(bytesPerElement, ndx) {\n        const type = info.type[ndx];\n        info.bytesPerElementMap[type] = bytesPerElement;\n      });\n    });\n\n    const block8_4_4 = { bytes:  8, width: 4, height: 4 };\n    const block16_4_4 = { bytes: 16, width: 4, height: 4 };\n\n    // compressed texture formats\n    // s3tc:https://registry.khronos.org/OpenGL/extensions/EXT/EXT_texture_compression_s3tc.txt\n    t[COMPRESSED_RGB_S3TC_DXT1_EXT]  = { textureFormat: COMPRESSED_RGB_S3TC_DXT1_EXT,  colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RGBA_S3TC_DXT1_EXT] = { textureFormat: COMPRESSED_RGBA_S3TC_DXT1_EXT, colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RGBA_S3TC_DXT3_EXT] = { textureFormat: COMPRESSED_RGBA_S3TC_DXT3_EXT, colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_RGBA_S3TC_DXT5_EXT] = { textureFormat: COMPRESSED_RGBA_S3TC_DXT5_EXT, colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    // https://registry.khronos.org/OpenGL/extensions/EXT/EXT_texture_compression_s3tc_srgb.txt\n    t[COMPRESSED_SRGB_S3TC_DXT1_EXT]       = { textureFormat: COMPRESSED_SRGB_S3TC_DXT1_EXT,       colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT] = { textureFormat: COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT] = { textureFormat: COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT] = { textureFormat: COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    // https://registry.khronos.org/OpenGL/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt\n    t[COMPRESSED_RGB_ETC1_WEBGL]                 = { textureFormat: COMPRESSED_RGB_ETC1_WEBGL,                 colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_R11_EAC]                        = { textureFormat: COMPRESSED_R11_EAC,                        colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SIGNED_R11_EAC]                 = { textureFormat: COMPRESSED_SIGNED_R11_EAC,                 colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RG11_EAC]                       = { textureFormat: COMPRESSED_RG11_EAC,                       colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_SIGNED_RG11_EAC]                = { textureFormat: COMPRESSED_SIGNED_RG11_EAC,                colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_RGB8_ETC2]                      = { textureFormat: COMPRESSED_RGB8_ETC2,                      colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SRGB8_ETC2]                     = { textureFormat: COMPRESSED_SRGB8_ETC2,                     colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2]  = { textureFormat: COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2] = { textureFormat: COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RGBA8_ETC2_EAC]                 = { textureFormat: COMPRESSED_RGBA8_ETC2_EAC,                 colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_SRGB8_ALPHA8_ETC2_EAC]          = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    // https://registry.khronos.org/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt\n    t[COMPRESSED_RGB_PVRTC_4BPPV1_IMG]  = { textureFormat: COMPRESSED_RGB_PVRTC_4BPPV1_IMG,  colorRenderable: false, textureFilterable: true, block: { bytes: 32, width:  8, height:  8, } };\n    t[COMPRESSED_RGB_PVRTC_2BPPV1_IMG]  = { textureFormat: COMPRESSED_RGB_PVRTC_2BPPV1_IMG,  colorRenderable: false, textureFilterable: true, block: { bytes: 32, width: 16, height:  8, } };\n    t[COMPRESSED_RGBA_PVRTC_4BPPV1_IMG] = { textureFormat: COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, colorRenderable: false, textureFilterable: true, block: { bytes: 32, width:  8, height:  8, } };\n    t[COMPRESSED_RGBA_PVRTC_2BPPV1_IMG] = { textureFormat: COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, colorRenderable: false, textureFilterable: true, block: { bytes: 32, width: 16, height:  8, } };\n    // https://registry.khronos.org/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt\n    t[COMPRESSED_RGBA_ASTC_4x4_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_4x4_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  4, height:  4, } };\n    t[COMPRESSED_RGBA_ASTC_5x4_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_5x4_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  5, height:  4, } };\n    t[COMPRESSED_RGBA_ASTC_5x5_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_5x5_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  5, height:  5, } };\n    t[COMPRESSED_RGBA_ASTC_6x5_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_6x5_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  6, height:  5, } };\n    t[COMPRESSED_RGBA_ASTC_6x6_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_6x6_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  6, height:  6, } };\n    t[COMPRESSED_RGBA_ASTC_8x5_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_8x5_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  5, } };\n    t[COMPRESSED_RGBA_ASTC_8x6_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_8x6_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  6, } };\n    t[COMPRESSED_RGBA_ASTC_8x8_KHR]           = { textureFormat: COMPRESSED_RGBA_ASTC_8x8_KHR,           colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  8, } };\n    t[COMPRESSED_RGBA_ASTC_10x5_KHR]          = { textureFormat: COMPRESSED_RGBA_ASTC_10x5_KHR,          colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  5, } };\n    t[COMPRESSED_RGBA_ASTC_10x6_KHR]          = { textureFormat: COMPRESSED_RGBA_ASTC_10x6_KHR,          colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  6, } };\n    t[COMPRESSED_RGBA_ASTC_10x8_KHR]          = { textureFormat: COMPRESSED_RGBA_ASTC_10x8_KHR,          colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  8, } };\n    t[COMPRESSED_RGBA_ASTC_10x10_KHR]         = { textureFormat: COMPRESSED_RGBA_ASTC_10x10_KHR,         colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height: 10, } };\n    t[COMPRESSED_RGBA_ASTC_12x10_KHR]         = { textureFormat: COMPRESSED_RGBA_ASTC_12x10_KHR,         colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 12, height: 10, } };\n    t[COMPRESSED_RGBA_ASTC_12x12_KHR]         = { textureFormat: COMPRESSED_RGBA_ASTC_12x12_KHR,         colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 12, height: 12, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  4, height:  4, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  5, height:  4, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  5, height:  5, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  6, height:  5, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  6, height:  6, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  5, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  6, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR]   = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,   colorRenderable: false, textureFilterable: true, block: { bytes: 16, width:  8, height:  8, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR]  = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,  colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  5, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR]  = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,  colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  6, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR]  = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,  colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height:  8, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR] = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 10, height: 10, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR] = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 12, height: 10, } };\n    t[COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR] = { textureFormat: COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, colorRenderable: false, textureFilterable: true, block: { bytes: 16, width: 12, height: 12, } };\n    // https://registry.khronos.org/OpenGL/extensions/EXT/EXT_texture_compression_bptc.txt\n    t[COMPRESSED_RGBA_BPTC_UNORM_EXT]         = { textureFormat: COMPRESSED_RGBA_BPTC_UNORM_EXT,         colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT]   = { textureFormat: COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT,   colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT]   = { textureFormat: COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT,   colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    t[COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT] = { textureFormat: COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, colorRenderable: false, textureFilterable: true, block: block16_4_4 };\n    // https://registry.khronos.org/OpenGL/extensions/EXT/EXT_texture_compression_rgtc.txt\n    t[COMPRESSED_RED_RGTC1_EXT]              = { textureFormat: COMPRESSED_RED_RGTC1_EXT,              colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SIGNED_RED_RGTC1_EXT]       = { textureFormat: COMPRESSED_SIGNED_RED_RGTC1_EXT,       colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_RED_GREEN_RGTC2_EXT]        = { textureFormat: COMPRESSED_RED_GREEN_RGTC2_EXT,        colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n    t[COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT] = { textureFormat: COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, colorRenderable: false, textureFilterable: true, block: block8_4_4 };\n\n    s_textureInternalFormatInfo = t;\n  }\n  const info = s_textureInternalFormatInfo[internalFormat];\n  if (!info) {\n    throw new Error(\"unknown internal format\");\n  }\n  return info;\n}\n\n/**\n * Gets the number of bytes per element for a given internalFormat / type\n * @param {number} internalFormat The internalFormat parameter from texImage2D etc..\n * @param {number} type The type parameter for texImage2D etc..\n * @return {number} the number of bytes per element for the given internalFormat, type combo\n * @memberOf module:twgl/textures\n */\nfunction getBytesPerElementForInternalFormat(internalFormat, type) {\n  const info = getTextureInternalFormatInfo(internalFormat);\n  const bytesPerElement = info.bytesPerElementMap[type];\n  if (bytesPerElement === undefined) {\n    throw new Error(\"type not supported for internal format\");\n  }\n  return bytesPerElement;\n}\n\n/**\n * Info related to a specific texture internalFormat as returned\n * from {@link module:twgl/textures.getFormatAndTypeForInternalFormat}.\n *\n * @typedef {Object} TextureFormatInfo\n * @property {number} format Format to pass to texImage2D and related functions\n * @property {number} type Type to pass to texImage2D and related functions\n * @memberOf module:twgl/textures\n */\n\n/**\n * Gets the format and type for a given internalFormat\n *\n * @param {number} internalFormat The internal format\n * @return {module:twgl/textures.TextureFormatInfo} the corresponding format and type,\n * @memberOf module:twgl/textures\n */\nfunction getFormatAndTypeForInternalFormat(internalFormat) {\n  const info = getTextureInternalFormatInfo(internalFormat);\n  if (!info) {\n    throw new Error(\"unknown internal format\");\n  }\n  return {\n    format: info.textureFormat,\n    type: info.type?.[0] ?? UNSIGNED_BYTE$1,\n  };\n}\n\n/**\n * @param {number} internalFormat The internal format\n * @returns if the internalFormat is a compressed format\n * @private\n */\nfunction isCompressedInternalFormat(internalFormat) {\n  const info = getTextureInternalFormatInfo(internalFormat);\n  return !!info.block;\n}\n\n/**\n * Gets the width, height, and bytes per block for the given internal format\n * @param {number} internalFormat\n * @param {number} type\n * @private\n */\nfunction getBlockInfoForInternalFormat(internalFormat, type) {\n  const info = getTextureInternalFormatInfo(internalFormat);\n  if (info.block) {\n    return { blockWidth: info.block.width, blockHeight: info.block.height, bytesPerBlock: info.block.bytes };\n  }\n  const bytesPerBlock = getBytesPerElementForInternalFormat(internalFormat, type);\n  return { blockWidth: 1, blockHeight: 1, bytesPerBlock };\n}\n\n/**\n * Returns true if value is power of 2\n * @param {number} value number to check.\n * @return true if value is power of 2\n * @private\n */\nfunction isPowerOf2(value) {\n  return (value & (value - 1)) === 0;\n}\n\n/**\n * Gets whether or not we can generate mips for the given\n * internal format.\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {number} width The width parameter from texImage2D etc..\n * @param {number} height The height parameter from texImage2D etc..\n * @param {number} internalFormat The internalFormat parameter from texImage2D etc..\n * @return {boolean} true if we can generate mips\n * @memberOf module:twgl/textures\n */\nfunction canGenerateMipmap(gl, width, height, internalFormat) {\n  if (!isWebGL2(gl)) {\n    return isPowerOf2(width) && isPowerOf2(height);\n  }\n  const info = getTextureInternalFormatInfo(internalFormat);\n  return info.colorRenderable && info.textureFilterable;\n}\n\n/**\n * Gets whether or not we can generate mips for the given format\n * @param {number} internalFormat The internalFormat parameter from texImage2D etc..\n * @return {boolean} true if we can generate mips\n * @memberOf module:twgl/textures\n */\nfunction canFilter(internalFormat) {\n  const info = getTextureInternalFormatInfo(internalFormat);\n  return info.textureFilterable;\n}\n\n/**\n * Gets the number of components for a given image format.\n * @param {number} format the format.\n * @return {number} the number of components for the format.\n * @memberOf module:twgl/textures\n */\nfunction getNumComponentsForFormat(format) {\n  const info = formatInfo[format];\n  return info.numColorComponents;\n}\n\n/**\n * Gets the texture type for a given array type.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @return {number} the gl texture type\n * @private\n */\nfunction getTextureTypeForArrayType(gl, src, defaultType) {\n  if (isArrayBuffer(src)) {\n    return getGLTypeForTypedArray(src);\n  }\n  return defaultType || UNSIGNED_BYTE$1;\n}\n\nfunction guessDimensions(gl, target, width, height, numElements) {\n  if (numElements % 1 !== 0) {\n    throw new Error(\"can't guess dimensions\");\n  }\n  if (!width && !height) {\n    const size = Math.sqrt(numElements / (target === TEXTURE_CUBE_MAP$1 ? 6 : 1));\n    if (size % 1 === 0) {\n      width = size;\n      height = size;\n    } else {\n      width = numElements;\n      height = 1;\n    }\n  } else if (!height) {\n    height = numElements / width;\n    if (height % 1) {\n      throw new Error(\"can't guess dimensions\");\n    }\n  } else if (!width) {\n    width = numElements / height;\n    if (width % 1) {\n      throw new Error(\"can't guess dimensions\");\n    }\n  }\n  return {\n    width: width,\n    height: height,\n  };\n}\n\n/**\n * Sets the default texture color.\n *\n * The default texture color is used when loading textures from\n * urls. Because the URL will be loaded async we'd like to be\n * able to use the texture immediately. By putting a 1x1 pixel\n * color in the texture we can start using the texture before\n * the URL has loaded.\n *\n * @param {number[]} color Array of 4 values in the range 0 to 1\n * @deprecated see {@link module:twgl.setDefaults}\n * @memberOf module:twgl/textures\n */\nfunction setDefaultTextureColor(color) {\n  defaults$1.textureColor = new Uint8Array([color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255]);\n}\n\nfunction setDefaults$1(newDefaults) {\n  copyExistingProperties(newDefaults, defaults$1);\n  if (newDefaults.textureColor) {\n    setDefaultTextureColor(newDefaults.textureColor);\n  }\n}\n\n/**\n * A function to generate the source for a texture.\n * @callback TextureFunc\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options the texture options\n * @return {*} Returns any of the things documented for `src` for {@link module:twgl.TextureOptions}.\n * @memberOf module:twgl\n */\n\n/**\n * Texture options passed to most texture functions. Each function will use whatever options\n * are appropriate for its needs. This lets you pass the same options to all functions.\n *\n * Note: A `TexImageSource` is defined in the WebGL spec as a `HTMLImageElement`, `HTMLVideoElement`,\n * `HTMLCanvasElement`, `ImageBitmap`, or `ImageData`.\n *\n * @typedef {Object} TextureOptions\n * @property {number} [target] the type of texture `gl.TEXTURE_2D` or `gl.TEXTURE_CUBE_MAP`. Defaults to `gl.TEXTURE_2D`.\n * @property {number} [level] the mip level to affect. Defaults to 0. Note, if set auto will be considered false unless explicitly set to true.\n * @property {number} [width] the width of the texture. Only used if src is an array or typed array or null.\n * @property {number} [height] the height of a texture. Only used if src is an array or typed array or null.\n * @property {number} [depth] the depth of a texture. Only used if src is an array or typed array or null and target is `TEXTURE_3D` .\n * @property {number} [min] the min filter setting (eg. `gl.LINEAR`). Defaults to `gl.NEAREST_MIPMAP_LINEAR`\n *     or if texture is not a power of 2 on both dimensions then defaults to `gl.LINEAR`.\n * @property {number} [mag] the mag filter setting (eg. `gl.LINEAR`). Defaults to `gl.LINEAR`\n * @property {number} [minMag] both the min and mag filter settings.\n * @property {number} [internalFormat] internal format for texture. Defaults to `gl.RGBA`\n * @property {number} [format] format for texture. Defaults to `gl.RGBA`.\n * @property {number} [type] type for texture. Defaults to `gl.UNSIGNED_BYTE` unless `src` is ArrayBufferView. If `src`\n *     is ArrayBufferView defaults to type that matches ArrayBufferView type.\n * @property {number} [wrap] Texture wrapping for both S and T (and R if TEXTURE_3D or WebGLSampler). Defaults to `gl.REPEAT` for 2D unless src is WebGL1 and src not npot and `gl.CLAMP_TO_EDGE` for cube\n * @property {number} [wrapS] Texture wrapping for S. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`.\n * @property {number} [wrapT] Texture wrapping for T. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`.\n * @property {number} [wrapR] Texture wrapping for R. Defaults to `gl.REPEAT` and `gl.CLAMP_TO_EDGE` for cube. If set takes precedence over `wrap`.\n * @property {number} [minLod] TEXTURE_MIN_LOD setting\n * @property {number} [maxLod] TEXTURE_MAX_LOD setting\n * @property {number} [baseLevel] TEXTURE_BASE_LEVEL setting\n * @property {number} [maxLevel] TEXTURE_MAX_LEVEL setting\n * @property {number} [compareFunc] TEXTURE_COMPARE_FUNC setting\n * @property {number} [compareMode] TEXTURE_COMPARE_MODE setting\n * @property {number} [unpackAlignment] The `gl.UNPACK_ALIGNMENT` used when uploading an array. Defaults to 1.\n * @property {number[]|ArrayBufferView} [color] Color to initialize this texture with if loading an image asynchronously.\n *     The default use a blue 1x1 pixel texture. You can set another default by calling `twgl.setDefaults`\n *     or you can set an individual texture's initial color by setting this property. Example: `[1, .5, .5, 1]` = pink\n * @property {number} [premultiplyAlpha] Whether or not to premultiply alpha. Defaults to whatever the current setting is.\n *     This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override\n *     the current setting for specific textures.\n * @property {number} [flipY] Whether or not to flip the texture vertically on upload. Defaults to whatever the current setting is.\n *     This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override\n *     the current setting for specific textures.\n * @property {number} [colorspaceConversion] Whether or not to let the browser do colorspace conversion of the texture on upload. Defaults to whatever the current setting is.\n *     This lets you set it once before calling `twgl.createTexture` or `twgl.createTextures` and only override\n *     the current setting for specific textures.\n * @property {boolean} [auto] If `undefined` or `true`, in WebGL1, texture filtering is set automatically for non-power of 2 images and\n *    mips are generated for power of 2 images. In WebGL2 mips are generated if they can be. Note: if `level` is set above\n *    then then `auto` is assumed to be `false` unless explicity set to `true`.\n * @property {number[]} [cubeFaceOrder] The order that cube faces are pulled out of an img or set of images. The default is\n *\n *     [gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n *      gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n *      gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n *      gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n *      gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n *      gl.TEXTURE_CUBE_MAP_NEGATIVE_Z]\n *\n * @property {(number[]|ArrayBufferView|TexImageSource|TexImageSource[]|string|string[]|module:twgl.TextureFunc)} [src] source for texture\n *\n *    If `string` then it's assumed to be a URL to an image. The image will be downloaded async. A usable\n *    1x1 pixel texture will be returned immediately. The texture will be updated once the image has downloaded.\n *    If `target` is `gl.TEXTURE_CUBE_MAP` will attempt to divide image into 6 square pieces. 1x6, 6x1, 3x2, 2x3.\n *    The pieces will be uploaded in `cubeFaceOrder`\n *\n *    If `string[]` or `TexImageSource[]` and target is `gl.TEXTURE_CUBE_MAP` then it must have 6 entries, one for each face of a cube map.\n *\n *    If `string[]` or `TexImageSource[]` and target is `gl.TEXTURE_2D_ARRAY` then each entry is a slice of the a 2d array texture\n *    and will be scaled to the specified width and height OR to the size of the first image that loads.\n *\n *    If `TexImageSource` then it wil be used immediately to create the contents of the texture. Examples `HTMLImageElement`,\n *    `HTMLCanvasElement`, `HTMLVideoElement`.\n *\n *    If `number[]` or `ArrayBufferView` it's assumed to be data for a texture.\n *\n *    *  If `width` or `height` is not specified it is guessed as follows.\n *\n *       First the number of elements is computed by `src.length / numComponents`\n *       where `numComponents` is derived from `format`. If `target` is `gl.TEXTURE_CUBE_MAP` then `numElements` is divided\n *       by 6. Then\n *\n *       *   If neither `width` nor `height` are specified and `sqrt(numElements)` is an integer then width and height\n *           are set to `sqrt(numElements)`. Otherwise `width = numElements` and `height = 1`.\n *\n *       *   If only one of `width` or `height` is specified then the other equals `numElements / specifiedDimension`.\n *\n *    * If both `width` and `height` is specified, then, the size of mip levels from `level` will be computed\n *      and data for consecutive mip levels will be uploaded until the data runs out.\n *\n *      In other words: `{ format: g.RGBA, width: 4, height: 4, src: Uint8Array((4 * 4 + 2 * 2 + 1) * 4) }`\n *      uploads 3 mip levels (4x4, 2x2, 1x1) because src is more than the data for the first mip level.\n *\n * If `number[]` will be converted to `type`.\n *\n * If `src` is a function it will be called with a `WebGLRenderingContext` and these options.\n * Whatever it returns is subject to these rules. So it can return a string url, an `HTMLElement`\n * an array etc...\n *\n * If `src` is undefined then an empty texture will be created of size `width` by `height`.\n *\n * @property {string} [crossOrigin] What to set the crossOrigin property of images when they are downloaded.\n *    default: undefined. Also see {@link module:twgl.setDefaults}.\n *\n * @memberOf module:twgl\n */\n\n/**\n * Saves the current packing state, sets the packing state as specified\n * then calls a function, after which the packing state will be restored.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @param {function():void} [fn] A function to call, after which the packing state will be restored.\n * @private\n */\nfunction scopedSetPackState(gl, options, fn) {\n  let colorspaceConversion;\n  let premultiplyAlpha;\n  let flipY;\n\n  if (options.colorspaceConversion !== undefined) {\n    colorspaceConversion = gl.getParameter(UNPACK_COLORSPACE_CONVERSION_WEBGL);\n    gl.pixelStorei(UNPACK_COLORSPACE_CONVERSION_WEBGL, options.colorspaceConversion);\n  }\n  if (options.premultiplyAlpha !== undefined) {\n    premultiplyAlpha = gl.getParameter(UNPACK_PREMULTIPLY_ALPHA_WEBGL);\n    gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, options.premultiplyAlpha);\n  }\n  if (options.flipY !== undefined) {\n    flipY = gl.getParameter(UNPACK_FLIP_Y_WEBGL);\n    gl.pixelStorei(UNPACK_FLIP_Y_WEBGL, options.flipY);\n  }\n\n  fn();\n\n  if (colorspaceConversion !== undefined) {\n    gl.pixelStorei(UNPACK_COLORSPACE_CONVERSION_WEBGL, colorspaceConversion);\n  }\n  if (premultiplyAlpha !== undefined) {\n    gl.pixelStorei(UNPACK_PREMULTIPLY_ALPHA_WEBGL, premultiplyAlpha);\n  }\n  if (flipY !== undefined) {\n    gl.pixelStorei(UNPACK_FLIP_Y_WEBGL, flipY);\n  }\n}\n\n/**\n * returns the property if set or the corresponding state if undefined\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options\n * @param {string} property the name of the property to copy\n * @param {number} pname\n * @return {module:twgl.TextureOptions}\n */\nfunction getPackStateOption(gl, options, property, pname) {\n  const v = options[property];\n  return {\n    [property]: v === undefined ? gl.getParameter(pname) : v,\n  };\n}\n\n/**\n * Copy the options object and apply pack state\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options\n * @return {module:twgl.TextureOptions}\n */\nfunction copyOptionsAndApplyPackState(gl, options) {\n  return {\n    ...options,\n    ...getPackStateOption(gl, options, 'flipY', UNPACK_FLIP_Y_WEBGL),\n    ...getPackStateOption(gl, options, 'premultiplyAlpha', UNPACK_PREMULTIPLY_ALPHA_WEBGL),\n    ...getPackStateOption(gl, options, 'colorspaceConversion', UNPACK_COLORSPACE_CONVERSION_WEBGL),\n  };\n}\n\n/**\n * Set skip state to defaults\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @private\n */\nfunction setSkipStateToDefault(gl) {\n  gl.pixelStorei(UNPACK_ALIGNMENT, 4);\n  if (isWebGL2(gl)) {\n    gl.pixelStorei(UNPACK_ROW_LENGTH, 0);\n    gl.pixelStorei(UNPACK_IMAGE_HEIGHT, 0);\n    gl.pixelStorei(UNPACK_SKIP_PIXELS, 0);\n    gl.pixelStorei(UNPACK_SKIP_ROWS, 0);\n    gl.pixelStorei(UNPACK_SKIP_IMAGES, 0);\n  }\n}\n\n/**\n * Sets the parameters of a texture or sampler\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {number|WebGLSampler} target texture target or sampler\n * @param {function()} parameteriFn texParameteri or samplerParameteri fn\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @private\n */\nfunction setTextureSamplerParameters(gl, target, parameteriFn, options) {\n  if (options.minMag) {\n    parameteriFn.call(gl, target, TEXTURE_MIN_FILTER, options.minMag);\n    parameteriFn.call(gl, target, TEXTURE_MAG_FILTER, options.minMag);\n  }\n  if (options.min) {\n    parameteriFn.call(gl, target, TEXTURE_MIN_FILTER, options.min);\n  }\n  if (options.mag) {\n    parameteriFn.call(gl, target, TEXTURE_MAG_FILTER, options.mag);\n  }\n  if (options.wrap) {\n    parameteriFn.call(gl, target, TEXTURE_WRAP_S, options.wrap);\n    parameteriFn.call(gl, target, TEXTURE_WRAP_T, options.wrap);\n    if (target === TEXTURE_3D$1 || isSampler(gl, target)) {\n      parameteriFn.call(gl, target, TEXTURE_WRAP_R, options.wrap);\n    }\n  }\n  if (options.wrapR) {\n    parameteriFn.call(gl, target, TEXTURE_WRAP_R, options.wrapR);\n  }\n  if (options.wrapS) {\n    parameteriFn.call(gl, target, TEXTURE_WRAP_S, options.wrapS);\n  }\n  if (options.wrapT) {\n    parameteriFn.call(gl, target, TEXTURE_WRAP_T, options.wrapT);\n  }\n  if (options.minLod !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_MIN_LOD, options.minLod);\n  }\n  if (options.maxLod !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_MAX_LOD, options.maxLod);\n  }\n  if (options.baseLevel !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_BASE_LEVEL, options.baseLevel);\n  }\n  if (options.maxLevel !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_MAX_LEVEL, options.maxLevel);\n  }\n  if (options.compareFunc !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_COMPARE_FUNC, options.compareFunc);\n  }\n  if (options.compareMode !== undefined) {\n    parameteriFn.call(gl, target, TEXTURE_COMPARE_MODE, options.compareMode);\n  }\n}\n\n/**\n * Sets the texture parameters of a texture.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @memberOf module:twgl/textures\n */\nfunction setTextureParameters(gl, tex, options) {\n  const target = options.target || TEXTURE_2D$2;\n  gl.bindTexture(target, tex);\n  setTextureSamplerParameters(gl, target, gl.texParameteri, options);\n}\n\n/**\n * Sets the sampler parameters of a sampler.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLSampler} sampler the WebGLSampler to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @memberOf module:twgl/textures\n */\nfunction setSamplerParameters(gl, sampler, options) {\n  setTextureSamplerParameters(gl, sampler, gl.samplerParameteri, options);\n}\n\n/**\n * Creates a new sampler object and sets parameters.\n *\n * Example:\n *\n *      const sampler = twgl.createSampler(gl, {\n *        minMag: gl.NEAREST,         // sets both TEXTURE_MIN_FILTER and TEXTURE_MAG_FILTER\n *        wrap: gl.CLAMP_TO_NEAREST,  // sets both TEXTURE_WRAP_S and TEXTURE_WRAP_T and TEXTURE_WRAP_R\n *      });\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string,module:twgl.TextureOptions>} options A object of TextureOptions one per sampler.\n * @return {Object.<string,WebGLSampler>} the created samplers by name\n * @private\n */\nfunction createSampler(gl, options) {\n  const sampler = gl.createSampler();\n  setSamplerParameters(gl, sampler, options);\n  return sampler;\n}\n\n/**\n * Creates a multiple sampler objects and sets parameters on each.\n *\n * Example:\n *\n *      const samplers = twgl.createSamplers(gl, {\n *        nearest: {\n *          minMag: gl.NEAREST,\n *        },\n *        nearestClampS: {\n *          minMag: gl.NEAREST,\n *          wrapS: gl.CLAMP_TO_NEAREST,\n *        },\n *        linear: {\n *          minMag: gl.LINEAR,\n *        },\n *        nearestClamp: {\n *          minMag: gl.NEAREST,\n *          wrap: gl.CLAMP_TO_EDGE,\n *        },\n *        linearClamp: {\n *          minMag: gl.LINEAR,\n *          wrap: gl.CLAMP_TO_EDGE,\n *        },\n *        linearClampT: {\n *          minMag: gl.LINEAR,\n *          wrapT: gl.CLAMP_TO_EDGE,\n *        },\n *      });\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set on the sampler\n * @private\n */\nfunction createSamplers(gl, samplerOptions) {\n  const samplers = {};\n  Object.keys(samplerOptions).forEach(function(name) {\n    samplers[name] = createSampler(gl, samplerOptions[name]);\n  });\n  return samplers;\n}\n\n/**\n * Makes a 1x1 pixel\n * If no color is passed in uses the default color which can be set by calling `setDefaultTextureColor`.\n * @param {(number[]|ArrayBufferView)} [color] The color using 0-1 values\n * @return {Uint8Array} Unit8Array with color.\n * @private\n */\nfunction make1Pixel(color) {\n  color = color || defaults$1.textureColor;\n  if (isArrayBuffer(color)) {\n    return color;\n  }\n  return new Uint8Array([color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255]);\n}\n\n/**\n * @typedef {Object} SetTextureFilteringInternalOptions\n * @property {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @property {number} [width] width of texture\n * @property {number} [height] height of texture\n * @property {number} [internalFormat] The internalFormat parameter from texImage2D etc..\n * @property {number} [lastMipLevelUploaded] The last mip level manually uploaded\n * @private\n */\n\n/**\n * Sets filtering or generates mips for texture based on width or height\n * If width or height is not passed in uses `options.width` and//or `options.height`\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {SetTextureFilteringInternalOptions} p\n * @private\n */\nfunction setTextureFilteringForSizeInternal(gl, tex, {options, width, height, internalFormat, lastMipLevelUploaded }) {\n  options = options || defaults$1.textureOptions;\n  internalFormat = internalFormat || RGBA$1;\n  const target = options.target || TEXTURE_2D$2;\n  width = width || options.width;\n  height = height || options.height;\n  gl.bindTexture(target, tex);\n  if (lastMipLevelUploaded > 1) {\n    const lastLevelWidth = Math.max(1, width >> lastMipLevelUploaded);\n    const lastLevelHeight = Math.max(1, height >> lastMipLevelUploaded);\n    // Note: This is a guess. The user can set maxLod etc...\n    const canUseMips = lastLevelWidth === 1 && lastLevelHeight === 1;\n    const magFiltering = canFilter(internalFormat) ? LINEAR$1 : NEAREST;\n    const minFiltering = canFilter(internalFormat)\n      ? canUseMips\n      ? NEAREST_MIPMAP_LINEAR\n      : LINEAR$1\n      : NEAREST;\n    gl.texParameteri(target, TEXTURE_MAG_FILTER, magFiltering);\n    gl.texParameteri(target, TEXTURE_MIN_FILTER, minFiltering);\n  } else if (canGenerateMipmap(gl, width, height, internalFormat)) {\n    gl.generateMipmap(target);\n  } else {\n    const filtering = canFilter(internalFormat) ? LINEAR$1 : NEAREST;\n    gl.texParameteri(target, TEXTURE_MIN_FILTER, filtering);\n    gl.texParameteri(target, TEXTURE_MAG_FILTER, filtering);\n    gl.texParameteri(target, TEXTURE_WRAP_S, CLAMP_TO_EDGE$1);\n    gl.texParameteri(target, TEXTURE_WRAP_T, CLAMP_TO_EDGE$1);\n  }\n}\n\n/**\n * Sets filtering or generates mips for texture based on width or height\n * If width or height is not passed in uses `options.width` and//or `options.height`\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @param {number} [width] width of texture\n * @param {number} [height] height of texture\n * @param {number} [internalFormat] The internalFormat parameter from texImage2D etc..\n * @memberOf module:twgl/textures\n */\nfunction setTextureFilteringForSize(gl, tex, options, width, height, internalFormat) {\n  setTextureFilteringForSizeInternal(gl, tex, { options, width, height, internalFormat });\n}\n\nfunction shouldAutomaticallySetTextureFilteringForSize(options) {\n  return options.auto === true || (options.auto === undefined && options.level === undefined);\n}\n\n/**\n * Gets an array of cubemap face enums\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @return {number[]} cubemap face enums\n * @private\n */\nfunction getCubeFaceOrder(gl, options) {\n  options = options || {};\n  return options.cubeFaceOrder || [\n      TEXTURE_CUBE_MAP_POSITIVE_X,\n      TEXTURE_CUBE_MAP_NEGATIVE_X,\n      TEXTURE_CUBE_MAP_POSITIVE_Y,\n      TEXTURE_CUBE_MAP_NEGATIVE_Y,\n      TEXTURE_CUBE_MAP_POSITIVE_Z,\n      TEXTURE_CUBE_MAP_NEGATIVE_Z,\n    ];\n}\n\n/**\n * @typedef {Object} FaceInfo\n * @property {number} face gl enum for texImage2D\n * @property {number} ndx face index (0 - 5) into source data\n * @ignore\n */\n\n/**\n * Gets an array of FaceInfos\n * There's a bug in some NVidia drivers that will crash the driver if\n * `gl.TEXTURE_CUBE_MAP_POSITIVE_X` is not uploaded first. So, we take\n * the user's desired order from his faces to WebGL and make sure we\n * do the faces in WebGL order\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @return {FaceInfo[]} cubemap face infos. Arguably the `face` property of each element is redundant but\n *    it's needed internally to sort the array of `ndx` properties by `face`.\n * @private\n */\nfunction getCubeFacesWithNdx(gl, options) {\n  const faces = getCubeFaceOrder(gl, options);\n  // work around bug in NVidia drivers. We have to upload the first face first else the driver crashes :(\n  const facesWithNdx = faces.map(function(face, ndx) {\n    return { face: face, ndx: ndx };\n  });\n  facesWithNdx.sort(function(a, b) {\n    return a.face - b.face;\n  });\n  return facesWithNdx;\n}\n\n/**\n * Set a texture from the contents of an element. Will also set\n * texture filtering or generate mips based on the dimensions of the element\n * unless `options.auto === false`. If `target === gl.TEXTURE_CUBE_MAP` will\n * attempt to slice image into 1x6, 2x3, 3x2, or 6x1 images, one for each face.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {HTMLElement} element a canvas, img, or video element.\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @memberOf module:twgl/textures\n * @kind function\n */\nfunction setTextureFromElement(gl, tex, element, options) {\n  options = options || defaults$1.textureOptions;\n  const target = options.target || TEXTURE_2D$2;\n  const level = options.level || 0;\n  let width = element.width;\n  let height = element.height;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  const type = options.type || formatType.type;\n  gl.bindTexture(target, tex);\n  if (target === TEXTURE_CUBE_MAP$1) {\n    // guess the parts\n    const imgWidth  = element.width;\n    const imgHeight = element.height;\n    let size;\n    let slices;\n    if (imgWidth / 6 === imgHeight) {\n      // It's 6x1\n      size = imgHeight;\n      slices = [0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0];\n    } else if (imgHeight / 6 === imgWidth) {\n      // It's 1x6\n      size = imgWidth;\n      slices = [0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5];\n    } else if (imgWidth / 3 === imgHeight / 2) {\n      // It's 3x2\n      size = imgWidth / 3;\n      slices = [0, 0, 1, 0, 2, 0, 0, 1, 1, 1, 2, 1];\n    } else if (imgWidth / 2 === imgHeight / 3) {\n      // It's 2x3\n      size = imgWidth / 2;\n      slices = [0, 0, 1, 0, 0, 1, 1, 1, 0, 2, 1, 2];\n    } else {\n      throw new Error(`can't figure out cube map from element: ${element.src ? element.src : element.nodeName}`);\n    }\n    const ctx = getShared2DContext();\n    if (ctx) {\n      ctx.canvas.width = size;\n      ctx.canvas.height = size;\n      width = size;\n      height = size;\n      scopedSetPackState(gl, options, () => {\n        getCubeFacesWithNdx(gl, options).forEach(function(f) {\n          const xOffset = slices[f.ndx * 2 + 0] * size;\n          const yOffset = slices[f.ndx * 2 + 1] * size;\n          ctx.drawImage(element, xOffset, yOffset, size, size, 0, 0, size, size);\n          gl.texImage2D(f.face, level, internalFormat, format, type, ctx.canvas);\n        });\n        // Free up the canvas memory\n        ctx.canvas.width = 1;\n        ctx.canvas.height = 1;\n      });\n    } else if (typeof createImageBitmap !== 'undefined') {\n      // NOTE: It seems like we should prefer ImageBitmap because unlike canvas it's\n      // note lossy? (alpha is not premultiplied? although I'm not sure what\n      width = size;\n      height = size;\n      getCubeFacesWithNdx(gl, options).forEach(function(f) {\n        const xOffset = slices[f.ndx * 2 + 0] * size;\n        const yOffset = slices[f.ndx * 2 + 1] * size;\n        // We can't easily use a default texture color here as it would have to match\n        // the type across all faces where as with a 2D one there's only one face\n        // so we're replacing everything all at once. It also has to be the correct size.\n        // On the other hand we need all faces to be the same size so as one face loads\n        // the rest match else the texture will be un-renderable.\n        gl.texImage2D(f.face, level, internalFormat, size, size, 0, format, type, null);\n        createImageBitmap(element, xOffset, yOffset, size, size, {\n          premultiplyAlpha: 'none',\n          colorSpaceConversion: 'none',\n        })\n        .then(function(imageBitmap) {\n          scopedSetPackState(gl, options, () => {\n            gl.bindTexture(target, tex);\n            gl.texImage2D(f.face, level, internalFormat, format, type, imageBitmap);\n            if (shouldAutomaticallySetTextureFilteringForSize(options)) {\n              setTextureFilteringForSize(gl, tex, options, width, height, internalFormat);\n            }\n          });\n        });\n      });\n    }\n  } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n    scopedSetPackState(gl, options, () => {\n      const smallest = Math.min(element.width, element.height);\n      const largest = Math.max(element.width, element.height);\n      const depth = largest / smallest;\n      if (depth % 1 !== 0) {\n        throw new Error(\"can not compute 3D dimensions of element\");\n      }\n      const xMult = element.width  === largest ? 1 : 0;\n      const yMult = element.height === largest ? 1 : 0;\n      gl.pixelStorei(UNPACK_ALIGNMENT, 1);\n      gl.pixelStorei(UNPACK_ROW_LENGTH, element.width);\n      gl.pixelStorei(UNPACK_IMAGE_HEIGHT, 0);\n      gl.pixelStorei(UNPACK_SKIP_IMAGES, 0);\n      gl.texImage3D(target, level, internalFormat, smallest, smallest, smallest, 0, format, type, null);\n      for (let d = 0; d < depth; ++d) {\n        const srcX = d * smallest * xMult;\n        const srcY = d * smallest * yMult;\n        gl.pixelStorei(UNPACK_SKIP_PIXELS, srcX);\n        gl.pixelStorei(UNPACK_SKIP_ROWS, srcY);\n        gl.texSubImage3D(target, level, 0, 0, d, smallest, smallest, 1, format, type, element);\n      }\n      setSkipStateToDefault(gl);\n    });\n  } else {\n    scopedSetPackState(gl, options, () => {\n      gl.texImage2D(target, level, internalFormat, format, type, element);\n    });\n  }\n  if (shouldAutomaticallySetTextureFilteringForSize(options)) {\n    setTextureFilteringForSize(gl, tex, options, width, height, internalFormat);\n  }\n  setTextureParameters(gl, tex, options);\n}\n\nfunction noop() {\n}\n\n/**\n * Checks whether the url's origin is the same so that we can set the `crossOrigin`\n * @param {string} url url to image\n * @returns {boolean} true if the window's origin is the same as image's url\n * @private\n */\nfunction urlIsSameOrigin(url) {\n  if (typeof document !== 'undefined') {\n    // for IE really\n    const a = document.createElement('a');\n    a.href = url;\n    return a.hostname === location.hostname &&\n           a.port     === location.port &&\n           a.protocol === location.protocol;\n  } else {\n    const localOrigin = (new URL(location.href)).origin;\n    const urlOrigin = (new URL(url, location.href)).origin;\n    return urlOrigin === localOrigin;\n  }\n}\n\nfunction setToAnonymousIfUndefinedAndURLIsNotSameOrigin(url, crossOrigin) {\n  return crossOrigin === undefined && !urlIsSameOrigin(url)\n     ? 'anonymous'\n     : crossOrigin;\n}\n\n/**\n * Loads an image\n * @param {string} url url to image\n * @param {string} crossOrigin\n * @param {function(err, img)} [callback] a callback that's passed an error and the image. The error will be non-null\n *     if there was an error\n * @return {HTMLImageElement} the image being loaded.\n * @private\n */\nfunction loadImage(url, crossOrigin, callback) {\n  callback = callback || noop;\n  let img;\n  crossOrigin = crossOrigin !== undefined ? crossOrigin : defaults$1.crossOrigin;\n  crossOrigin = setToAnonymousIfUndefinedAndURLIsNotSameOrigin(url, crossOrigin);\n  if (typeof Image !== 'undefined') {\n    img = new Image();\n    if (crossOrigin !== undefined) {\n      img.crossOrigin = crossOrigin;\n    }\n\n    const clearEventHandlers = function clearEventHandlers() {\n      img.removeEventListener('error', onError);  // eslint-disable-line\n      img.removeEventListener('load', onLoad);  // eslint-disable-line\n      img = null;\n    };\n\n    const onError = function onError() {\n      const msg = \"couldn't load image: \" + url;\n      error$1(msg);\n      callback(msg, img);\n      clearEventHandlers();\n    };\n\n    const onLoad = function onLoad() {\n      callback(null, img);\n      clearEventHandlers();\n    };\n\n    img.addEventListener('error', onError);\n    img.addEventListener('load', onLoad);\n    img.src = url;\n    return img;\n  } else if (typeof ImageBitmap !== 'undefined') {\n    let err;\n    let bm;\n    const cb = function cb() {\n      callback(err, bm);\n    };\n\n    const options = {};\n    if (crossOrigin) {\n      options.mode = 'cors'; // TODO: not sure how to translate image.crossOrigin\n    }\n    fetch(url, options).then(function(response) {\n      if (!response.ok) {\n        throw response;\n      }\n      return response.blob();\n    }).then(function(blob) {\n      return createImageBitmap(blob, {\n        premultiplyAlpha: 'none',\n        colorSpaceConversion: 'none',\n      });\n    }).then(function(bitmap) {\n      // not sure if this works. We don't want\n      // to catch the user's error. So, call\n      // the callback in a timeout so we're\n      // not in this scope inside the promise.\n      bm = bitmap;\n      setTimeout(cb);\n    }).catch(function(e) {\n      err = e;\n      setTimeout(cb);\n    });\n    img = null;\n  }\n  return img;\n}\n\n/**\n * check if object is a TexImageSource\n *\n * @param {Object} obj Object to test\n * @return {boolean} true if object is a TexImageSource\n * @private\n */\nfunction isTexImageSource(obj) {\n  return (typeof ImageBitmap !== 'undefined' && obj instanceof ImageBitmap) ||\n         (typeof ImageData !== 'undefined'  && obj instanceof ImageData) ||\n         (typeof HTMLElement !== 'undefined'  && obj instanceof HTMLElement);\n}\n\n/**\n * if obj is an TexImageSource then just\n * uses it otherwise if obj is a string\n * then load it first.\n *\n * @param {string|TexImageSource} obj\n * @param {string} crossOrigin\n * @param {function(err, img)} [callback] a callback that's passed an error and the image. The error will be non-null\n *     if there was an error\n * @private\n */\nfunction loadAndUseImage(obj, crossOrigin, callback) {\n  if (isTexImageSource(obj)) {\n    setTimeout(function() {\n      callback(null, obj);\n    });\n    return obj;\n  }\n\n  return loadImage(obj, crossOrigin, callback);\n}\n\n/**\n * Sets a texture to a 1x1 pixel color. If `options.color === false` is nothing happens. If it's not set\n * the default texture color is used which can be set by calling `setDefaultTextureColor`.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @memberOf module:twgl/textures\n * @private\n */\nfunction setTextureTo1PixelColor(gl, tex, options) {\n  options = options || defaults$1.textureOptions;\n  const target = options.target || TEXTURE_2D$2;\n  gl.bindTexture(target, tex);\n  if (options.color === false) {\n    return;\n  }\n  // Assume it's a URL\n  // Put 1x1 pixels in texture. That makes it renderable immediately regardless of filtering.\n  const color = make1Pixel(options.color);\n  if (target === TEXTURE_CUBE_MAP$1) {\n    for (let ii = 0; ii < 6; ++ii) {\n      gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, 0, RGBA$1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color);\n    }\n  } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n    gl.texImage3D(target, 0, RGBA$1, 1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color);\n  } else {\n    gl.texImage2D(target, 0, RGBA$1, 1, 1, 0, RGBA$1, UNSIGNED_BYTE$1, color);\n  }\n}\n\n/**\n * The src image(s) used to create a texture.\n *\n * When you call {@link module:twgl.createTexture} or {@link module:twgl.createTextures}\n * you can pass in urls for images to load into the textures. If it's a single url\n * then this will be a single HTMLImageElement. If it's an array of urls used for a cubemap\n * this will be a corresponding array of images for the cubemap.\n *\n * @typedef {HTMLImageElement|HTMLImageElement[]} TextureSrc\n * @memberOf module:twgl\n */\n\n/**\n * A callback for when an image finished downloading and been uploaded into a texture\n * @callback TextureReadyCallback\n * @param {*} err If truthy there was an error.\n * @param {WebGLTexture} texture the texture.\n * @param {module:twgl.TextureSrc} source image(s) used to as the src for the texture\n * @memberOf module:twgl\n */\n\n/**\n * A callback for when all images have finished downloading and been uploaded into their respective textures\n * @callback TexturesReadyCallback\n * @param {*} err If truthy there was an error.\n * @param {Object.<string, WebGLTexture>} textures the created textures by name. Same as returned by {@link module:twgl.createTextures}.\n * @param {Object.<string, module:twgl.TextureSrc>} sources the image(s) used for the texture by name.\n * @memberOf module:twgl\n */\n\n/**\n * A callback for when an image finished downloading and been uploaded into a texture\n * @callback CubemapReadyCallback\n * @param {*} err If truthy there was an error.\n * @param {WebGLTexture} tex the texture.\n * @param {HTMLImageElement[]} imgs the images for each face.\n * @memberOf module:twgl\n */\n\n/**\n * A callback for when an image finished downloading and been uploaded into a texture\n * @callback ThreeDReadyCallback\n * @param {*} err If truthy there was an error.\n * @param {WebGLTexture} tex the texture.\n * @param {HTMLImageElement[]} imgs the images for each slice.\n * @memberOf module:twgl\n */\n\n/**\n * Loads a texture from an image from a Url as specified in `options.src`\n * If `options.color !== false` will set the texture to a 1x1 pixel color so that the texture is\n * immediately useable. It will be updated with the contents of the image once the image has finished\n * downloading. Filtering options will be set as appropriate for image unless `options.auto === false`.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n * @param {module:twgl.TextureReadyCallback} [callback] A function to be called when the image has finished loading. err will\n *    be non null if there was an error.\n * @return {HTMLImageElement} the image being downloaded.\n * @memberOf module:twgl/textures\n */\nfunction loadTextureFromUrl(gl, tex, options, callback) {\n  callback = callback || noop;\n  options = options || defaults$1.textureOptions;\n  setTextureTo1PixelColor(gl, tex, options);\n  // Because it's async we need to copy the options.\n  options = copyOptionsAndApplyPackState(gl, options);\n  const img = loadAndUseImage(options.src, options.crossOrigin, function(err, img) {\n    if (err) {\n      callback(err, tex, img);\n    } else {\n      setTextureFromElement(gl, tex, img, options);\n      callback(null, tex, img);\n    }\n  });\n  return img;\n}\n\n/**\n * Loads a cubemap from 6 urls or TexImageSources as specified in `options.src`. Will set the cubemap to a 1x1 pixel color\n * so that it is usable immediately unless `option.color === false`.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @param {module:twgl.CubemapReadyCallback} [callback] A function to be called when all the images have finished loading. err will\n *    be non null if there was an error.\n * @memberOf module:twgl/textures\n * @private\n */\nfunction loadCubemapFromUrls(gl, tex, options, callback) {\n  callback = callback || noop;\n  const urls = options.src;\n  if (urls.length !== 6) {\n    throw new Error(\"there must be 6 urls for a cubemap\");\n  }\n  const level = options.level || 0;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  const type = options.type || UNSIGNED_BYTE$1;\n  const target = options.target || TEXTURE_2D$2;\n  if (target !== TEXTURE_CUBE_MAP$1) {\n    throw new Error(\"target must be TEXTURE_CUBE_MAP\");\n  }\n  setTextureTo1PixelColor(gl, tex, options);\n  // Because it's async we need to copy the options.\n  options = copyOptionsAndApplyPackState(gl, options);\n  let numToLoad = 6;\n  const errors = [];\n  const faces = getCubeFaceOrder(gl, options);\n  let imgs;  // eslint-disable-line\n\n  function uploadImg(faceTarget) {\n    return function(err, img) {\n      --numToLoad;\n      if (err) {\n        errors.push(err);\n      } else {\n        if (img.width !== img.height) {\n          errors.push(\"cubemap face img is not a square: \" + img.src);\n        } else {\n          scopedSetPackState(gl, options, () => {\n            gl.bindTexture(target, tex);\n\n            // So assuming this is the first image we now have one face that's img sized\n            // and 5 faces that are 1x1 pixel so size the other faces\n            if (numToLoad === 5) {\n              // use the default order\n              getCubeFaceOrder().forEach(function(otherTarget) {\n                // Should we re-use the same face or a color?\n                gl.texImage2D(otherTarget, level, internalFormat, format, type, img);\n              });\n            } else {\n              gl.texImage2D(faceTarget, level, internalFormat, format, type, img);\n            }\n\n            if (shouldAutomaticallySetTextureFilteringForSize(options)) {\n              gl.generateMipmap(target);\n            }\n          });\n        }\n      }\n\n      if (numToLoad === 0) {\n        callback(errors.length ? errors : undefined, tex, imgs);\n      }\n    };\n  }\n\n  imgs = urls.map(function(url, ndx) {\n    return loadAndUseImage(url, options.crossOrigin, uploadImg(faces[ndx]));\n  });\n}\n\n/**\n * Loads a 2d array or 3d texture from urls OR TexImageSources as specified in `options.src`.\n * Will set the texture to a 1x1 pixel color\n * so that it is usable immediately unless `option.color === false`.\n *\n * If the width and height is not specified the width and height of the first\n * image loaded will be used. Note that since images are loaded async\n * which image downloads first is unknown.\n *\n * If an image is not the same size as the width and height it will be scaled\n * to that width and height.\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @param {module:twgl.ThreeDReadyCallback} [callback] A function to be called when all the images have finished loading. err will\n *    be non null if there was an error.\n * @memberOf module:twgl/textures\n * @private\n */\nfunction loadSlicesFromUrls(gl, tex, options, callback) {\n  callback = callback || noop;\n  const urls = options.src;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  const type = options.type || UNSIGNED_BYTE$1;\n  const target = options.target || TEXTURE_2D_ARRAY$1;\n  if (target !== TEXTURE_3D$1 && target !== TEXTURE_2D_ARRAY$1) {\n    throw new Error(\"target must be TEXTURE_3D or TEXTURE_2D_ARRAY\");\n  }\n  setTextureTo1PixelColor(gl, tex, options);\n  // Because it's async we need to copy the options.\n  options = copyOptionsAndApplyPackState(gl, options);\n  let numToLoad = urls.length;\n  const errors = [];\n  let imgs;  // eslint-disable-line\n  const level = options.level || 0;\n  let width = options.width;\n  let height = options.height;\n  const depth = urls.length;\n  let firstImage = true;\n\n  function uploadImg(slice) {\n    return function(err, img) {\n      --numToLoad;\n      if (err) {\n        errors.push(err);\n      } else {\n        scopedSetPackState(gl, options, () => {\n          gl.bindTexture(target, tex);\n\n          if (firstImage) {\n            firstImage = false;\n            width = options.width || img.width;\n            height = options.height || img.height;\n            gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, type, null);\n\n            // put it in every slice otherwise some slices will be 0,0,0,0\n            for (let s = 0; s < depth; ++s) {\n              gl.texSubImage3D(target, level, 0, 0, s, width, height, 1, format, type, img);\n            }\n          } else {\n            let src = img;\n            let ctx;\n            if (img.width !== width || img.height !== height) {\n              // Size the image to fix\n              ctx = getShared2DContext();\n              src = ctx.canvas;\n              ctx.canvas.width = width;\n              ctx.canvas.height = height;\n              ctx.drawImage(img, 0, 0, width, height);\n            }\n\n            gl.texSubImage3D(target, level, 0, 0, slice, width, height, 1, format, type, src);\n\n            // free the canvas memory\n            if (ctx && src === ctx.canvas) {\n              ctx.canvas.width = 0;\n              ctx.canvas.height = 0;\n            }\n          }\n\n          if (shouldAutomaticallySetTextureFilteringForSize(options)) {\n            gl.generateMipmap(target);\n          }\n        });\n      }\n\n      if (numToLoad === 0) {\n        callback(errors.length ? errors : undefined, tex, imgs);\n      }\n    };\n  }\n\n  imgs = urls.map(function(url, ndx) {\n    return loadAndUseImage(url, options.crossOrigin, uploadImg(ndx));\n  });\n}\n\n/**\n * Sets a texture from an array or typed array. If the width or height is not provided will attempt to\n * guess the size. See {@link module:twgl.TextureOptions}.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {(number[]|ArrayBufferView)} src An array or typed arry with texture data.\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n *   This is often the same options you passed in when you created the texture.\n * @memberOf module:twgl/textures\n */\nfunction setTextureFromArray(gl, tex, src, options) {\n  options = options || defaults$1.textureOptions;\n  const target = options.target || TEXTURE_2D$2;\n  gl.bindTexture(target, tex);\n  const level = options.level || 0;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  const type = options.type || getTextureTypeForArrayType(gl, src, formatType.type);\n  if (!isArrayBuffer(src)) {\n    const Type = getTypedArrayTypeForGLType(type);\n    src = new Type(src);\n  } else if (src instanceof Uint8ClampedArray) {\n    src = new Uint8Array(src.buffer);\n  }\n\n  const { width, height, depth } = getTextureSize(target, src, options, internalFormat, format, type);\n  const compressed = isCompressedInternalFormat(internalFormat);\n\n  setSkipStateToDefault(gl);\n  gl.pixelStorei(UNPACK_ALIGNMENT, options.unpackAlignment || 1);\n  let mipLevelOffset = 0;  // this is in addition to level\n  scopedSetPackState(gl, options, () => {\n    let mipLevelByteOffset = 0;\n    const { blockWidth, blockHeight, bytesPerBlock } = getBlockInfoForInternalFormat(internalFormat, type);\n    while (mipLevelByteOffset < src.byteLength) {\n      const mipWidth = Math.max(1, width >> mipLevelOffset);\n      const mipHeight = Math.max(1, height >> mipLevelOffset);\n      const mipDepth = target === TEXTURE_2D$2 ? Math.max(1, depth >> mipLevelOffset) : depth;\n      const blocksAcross = Math.ceil(mipWidth / blockWidth);\n      const blocksDown = Math.ceil(mipHeight / blockHeight);\n      const numFaces = target === TEXTURE_CUBE_MAP$1 ? 6 : 1;\n      const bytesPerMipLevel = blocksAcross * blocksDown * bytesPerBlock * mipDepth * numFaces;\n      if (mipLevelByteOffset + bytesPerMipLevel > src.byteLength) {\n        throw new Error('src size does not match number of mip levels');\n      }\n      const mipSource = src.subarray(mipLevelByteOffset / src.BYTES_PER_ELEMENT, (mipLevelByteOffset + bytesPerMipLevel) / src.BYTES_PER_ELEMENT);\n      const mipLevel = level + mipLevelOffset;\n\n      if (target === TEXTURE_CUBE_MAP$1) {\n        const faceSize = mipSource.length / 6;\n        getCubeFacesWithNdx(gl, options).forEach(f => {\n          const offset = faceSize * f.ndx;\n          const data = mipSource.subarray(offset, offset + faceSize);\n          if (compressed) {\n            gl.compressedTexImage2D(f.face, mipLevel, internalFormat, mipWidth, mipHeight, 0, data);\n          } else {\n            gl.texImage2D(f.face, mipLevel, internalFormat, mipWidth, mipHeight, 0, format, type, data);\n          }\n        });\n      } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n        gl.texImage3D(target, mipLevel, internalFormat, mipWidth, mipHeight, mipDepth, 0, format, type, mipSource);\n      } else {\n        if (compressed) {\n          gl.compressedTexImage2D(target, mipLevel, internalFormat, mipWidth, mipHeight, 0, mipSource);\n        } else {\n          gl.texImage2D(target, mipLevel, internalFormat, mipWidth, mipHeight, 0, format, type, mipSource);\n        }\n      }\n      ++mipLevelOffset;\n      mipLevelByteOffset += bytesPerMipLevel;\n      if (mipWidth === 1 && mipHeight === 1 && mipDepth === 1 && mipLevelByteOffset !== src.byteLength) {\n        throw new Error('src size has more data than can fit in mip levels');\n      }\n    }\n  });\n  return { width, height, depth, type, lastMipLevelUploaded: level + mipLevelOffset - 1 };\n}\n\nfunction getTextureSize(target, src, options, internalFormat, format, type) {\n  let width = options.width;\n  let height = options.height;\n  let depth = options.depth;\n\n  const compressed = isCompressedInternalFormat(internalFormat);\n\n  if (compressed) {\n    if (!width || !height) {\n      throw new Error(\"compressed texture needs to set width and height!\");\n    }\n    depth = depth || 1;\n  } else {\n    const bytesPerElement = getBytesPerElementForInternalFormat(internalFormat, type);\n    const numElements = src.byteLength / bytesPerElement;  // TODO: check UNPACK_ALIGNMENT?\n    if (numElements % 1) {\n      throw new Error(`length wrong size for format: ${glEnumToString(gl, format)}`);\n    }\n    if (compressed && (!width || !height)) {\n      throw new Error(\"compressed texture needs to set width and height!\");\n    }\n    let dimensions;\n    if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n      if (!width && !height && !depth) {\n        const size = Math.cbrt(numElements);\n        if (size % 1 !== 0) {\n          throw new Error(`can't guess cube size of array of numElements: ${numElements}`);\n        }\n        width = size;\n        height = size;\n        depth = size;\n      } else if (width && (!height || !depth)) {\n        dimensions = guessDimensions(gl, target, height, depth, numElements / width);\n        height = dimensions.width;\n        depth = dimensions.height;\n      } else if (height && (!width || !depth)) {\n        dimensions = guessDimensions(gl, target, width, depth, numElements / height);\n        width = dimensions.width;\n        depth = dimensions.height;\n      } else {\n        dimensions = guessDimensions(gl, target, width, height, numElements / depth);\n        width = dimensions.width;\n        height = dimensions.height;\n      }\n    } else {\n      dimensions = guessDimensions(gl, target, width, height, numElements);\n      width = dimensions.width;\n      height = dimensions.height;\n    }\n  }\n\n  return {\n    width,\n    height,\n    depth,\n  };\n}\n\n/**\n * Sets a texture with no contents of a certain size. In other words calls `gl.texImage2D` with `null`.\n * You must set `options.width` and `options.height`.\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the WebGLTexture to set parameters for\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @memberOf module:twgl/textures\n */\nfunction setEmptyTexture(gl, tex, options) {\n  const target = options.target || TEXTURE_2D$2;\n  gl.bindTexture(target, tex);\n  const level = options.level || 0;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  const type = options.type || formatType.type;\n  scopedSetPackState(gl, options, () => {\n    if (target === TEXTURE_CUBE_MAP$1) {\n      for (let ii = 0; ii < 6; ++ii) {\n        gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, level, internalFormat, options.width, options.height, 0, format, type, null);\n      }\n    } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n      gl.texImage3D(target, level, internalFormat, options.width, options.height, options.depth, 0, format, type, null);\n    } else {\n      gl.texImage2D(target, level, internalFormat, options.width, options.height, 0, format, type, null);\n    }\n  });\n}\n\n/**\n * Creates a texture based on the options passed in.\n *\n * See {@link module:twgl.TextureOptions}\n *\n * Note: may reset UNPACK_ALIGNMENT, UNPACK_ROW_LENGTH, UNPACK_IMAGE_HEIGHT, UNPACK_SKIP_IMAGES\n * UNPACK_SKIP_PIXELS, and UNPACK_SKIP_ROWS\n *\n * UNPACK_FLIP_Y_WEBGL, UNPACK_PREMULTIPLY_ALPHA_WEBGL, UNPACK_COLORSPACE_CONVERSION_WEBGL\n * are left as is though you can pass in options for flipY, premultiplyAlpha, and colorspaceConversion\n * to override them.\n *\n * As for the behavior of these settings\n *\n * ```js\n * gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n * t1 = twgl.createTexture({src: someImage }); // flipped\n * t2 = twgl.createTexture({src: someImage, flipY: true }); // flipped\n * t3 = twgl.createTexture({src: someImage, flipY: false }); // not flipped\n * t4 = twgl.createTexture({src: someImage }); // flipped\n * ```\n *\n * * t1 is flipped because UNPACK_FLIP_Y_WEBGL is true\n * * t2 is flipped because it was requested\n * * t3 is not flipped because it was requested\n * * t4 is flipped because UNPACK_FLIP_Y_WEBGL has been restored to true\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n * @param {module:twgl.TextureReadyCallback} [callback] A callback called when an image has been downloaded and uploaded to the texture.\n * @return {WebGLTexture} the created texture.\n * @memberOf module:twgl/textures\n */\nfunction createTexture(gl, options, callback) {\n  callback = callback || noop;\n  options = options || defaults$1.textureOptions;\n  const tex = gl.createTexture();\n  const target = options.target || TEXTURE_2D$2;\n  let width  = options.width  || 1;\n  let height = options.height || 1;\n  let lastMipLevelUploaded = 0;\n  const internalFormat = options.internalFormat || RGBA$1;\n  gl.bindTexture(target, tex);\n  if (target === TEXTURE_CUBE_MAP$1) {\n    // this should have been the default for cubemaps :(\n    gl.texParameteri(target, TEXTURE_WRAP_S, CLAMP_TO_EDGE$1);\n    gl.texParameteri(target, TEXTURE_WRAP_T, CLAMP_TO_EDGE$1);\n  }\n  let src = options.src;\n  if (src) {\n    if (typeof src === \"function\") {\n      src = src(gl, options);\n    }\n    if (typeof (src) === \"string\") {\n      loadTextureFromUrl(gl, tex, options, callback);\n    } else if (isArrayBuffer(src) ||\n               (Array.isArray(src) && (\n                    typeof src[0] === 'number' ||\n                    Array.isArray(src[0]) ||\n                    isArrayBuffer(src[0]))\n               )\n              ) {\n      const dimensions = setTextureFromArray(gl, tex, src, options);\n      width  = dimensions.width;\n      height = dimensions.height;\n      lastMipLevelUploaded = dimensions.lastMipLevelUploaded;\n    } else if (Array.isArray(src) && (typeof (src[0]) === 'string' || isTexImageSource(src[0]))) {\n      if (target === TEXTURE_CUBE_MAP$1) {\n        loadCubemapFromUrls(gl, tex, options, callback);\n      } else {\n        loadSlicesFromUrls(gl, tex, options, callback);\n      }\n    } else { // if (isTexImageSource(src))\n      setTextureFromElement(gl, tex, src, options);\n      width  = src.width;\n      height = src.height;\n    }\n  } else {\n    setEmptyTexture(gl, tex, options);\n  }\n  if (shouldAutomaticallySetTextureFilteringForSize(options)) {\n    setTextureFilteringForSizeInternal(gl, tex, { options, width, height, internalFormat, lastMipLevelUploaded });\n  }\n  setTextureParameters(gl, tex, options);\n  return tex;\n}\n\n/**\n * Value returned by createTextureAsync\n *\n * @typedef {Object} CreateTextureInfo\n * @param {WebGLTexture} texture the texture.\n * @param {module:twgl.TextureSrc} source image(s) used to as the src for the texture\n * @memberOf module:twgl\n */\n\n/**\n * Creates a texture based on the options passed in.\n *\n * see {@link module:twgl/textures.createTexture}.\n * The only difference is this function returns a promise\n * where as the other returns a texture and takes a callback.\n *\n * Note: this is here for completeness. It is probably better to use\n * the non-async version as it returns a usable texture immediately\n * where as this one you have to wait for it to load.\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.TextureOptions} [options] A TextureOptions object with whatever parameters you want set.\n * @return {Promise<CreateTextureInfo>} The created texture and source.\n */\nfunction createTextureAsync(gl, options) {\n  return new Promise((resolve, reject) => {\n    createTexture(gl, options, (err, texture, source) => {\n      if (err) {\n        reject(err);\n      } else {\n        resolve({ texture, source });\n      }\n    });\n  });\n}\n\n/**\n * Resizes a texture based on the options passed in.\n *\n * Note: This is not a generic resize anything function.\n * It's mostly used by {@link module:twgl.resizeFramebufferInfo}\n * It will use `options.src` if it exists to try to determine a `type`\n * otherwise it will assume `gl.UNSIGNED_BYTE`. No data is provided\n * for the texture. Texture parameters will be set accordingly\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {WebGLTexture} tex the texture to resize\n * @param {module:twgl.TextureOptions} options A TextureOptions object with whatever parameters you want set.\n * @param {number} [width] the new width. If not passed in will use `options.width`\n * @param {number} [height] the new height. If not passed in will use `options.height`\n * @param {number} [depth] the new depth. If not passed in will use `options.depth`\n * @memberOf module:twgl/textures\n */\nfunction resizeTexture(gl, tex, options, width, height, depth) {\n  width = width || options.width;\n  height = height || options.height;\n  depth = depth || options.depth;\n  const target = options.target || TEXTURE_2D$2;\n  gl.bindTexture(target, tex);\n  const level = options.level || 0;\n  const internalFormat = options.internalFormat || options.format || RGBA$1;\n  const formatType = getFormatAndTypeForInternalFormat(internalFormat);\n  const format = options.format || formatType.format;\n  let type;\n  const src = options.src;\n  if (!src) {\n    type = options.type || formatType.type;\n  } else if (isArrayBuffer(src) || (Array.isArray(src) && typeof (src[0]) === 'number')) {\n    type = options.type || getTextureTypeForArrayType(gl, src, formatType.type);\n  } else {\n    type = options.type || formatType.type;\n  }\n  if (target === TEXTURE_CUBE_MAP$1) {\n    for (let ii = 0; ii < 6; ++ii) {\n      gl.texImage2D(TEXTURE_CUBE_MAP_POSITIVE_X + ii, level, internalFormat, width, height, 0, format, type, null);\n    }\n  } else if (target === TEXTURE_3D$1 || target === TEXTURE_2D_ARRAY$1) {\n    gl.texImage3D(target, level, internalFormat, width, height, depth, 0, format, type, null);\n  } else {\n    gl.texImage2D(target, level, internalFormat, width, height, 0, format, type, null);\n  }\n}\n\n/**\n * Check if a src is an async request.\n * if src is a string we're going to download an image\n * if src is an array of strings we're going to download cubemap images\n * @param {*} src The src from a TextureOptions\n * @returns {bool} true if src is async.\n * @private\n */\nfunction isAsyncSrc(src) {\n  return typeof src === 'string' ||\n         (Array.isArray(src) && typeof src[0] === 'string');\n}\n\n/**\n * Creates a bunch of textures based on the passed in options.\n *\n * Example:\n *\n *     const textures = twgl.createTextures(gl, {\n *       // a power of 2 image\n *       hftIcon: { src: \"images/hft-icon-16.png\", mag: gl.NEAREST },\n *       // a non-power of 2 image\n *       clover: { src: \"images/clover.jpg\" },\n *       // From a canvas\n *       fromCanvas: { src: ctx.canvas },\n *       // A cubemap from 6 images\n *       yokohama: {\n *         target: gl.TEXTURE_CUBE_MAP,\n *         src: [\n *           'images/yokohama/posx.jpg',\n *           'images/yokohama/negx.jpg',\n *           'images/yokohama/posy.jpg',\n *           'images/yokohama/negy.jpg',\n *           'images/yokohama/posz.jpg',\n *           'images/yokohama/negz.jpg',\n *         ],\n *       },\n *       // A cubemap from 1 image (can be 1x6, 2x3, 3x2, 6x1)\n *       goldengate: {\n *         target: gl.TEXTURE_CUBE_MAP,\n *         src: 'images/goldengate.jpg',\n *       },\n *       // A 2x2 pixel texture from a JavaScript array\n *       checker: {\n *         mag: gl.NEAREST,\n *         min: gl.LINEAR,\n *         src: [\n *           255,255,255,255,\n *           192,192,192,255,\n *           192,192,192,255,\n *           255,255,255,255,\n *         ],\n *       },\n *       // a 1x2 pixel texture from a typed array.\n *       stripe: {\n *         mag: gl.NEAREST,\n *         min: gl.LINEAR,\n *         format: gl.LUMINANCE,\n *         src: new Uint8Array([\n *           255,\n *           128,\n *           255,\n *           128,\n *           255,\n *           128,\n *           255,\n *           128,\n *         ]),\n *         width: 1,\n *       },\n *     });\n *\n * Now\n *\n * *   `textures.hftIcon` will be a 2d texture\n * *   `textures.clover` will be a 2d texture\n * *   `textures.fromCanvas` will be a 2d texture\n * *   `textures.yohohama` will be a cubemap texture\n * *   `textures.goldengate` will be a cubemap texture\n * *   `textures.checker` will be a 2d texture\n * *   `textures.stripe` will be a 2d texture\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string,module:twgl.TextureOptions>} options A object of TextureOptions one per texture.\n * @param {module:twgl.TexturesReadyCallback} [callback] A callback called when all textures have been downloaded.\n * @return {Object.<string,WebGLTexture>} the created textures by name\n * @memberOf module:twgl/textures\n */\nfunction createTextures(gl, textureOptions, callback) {\n  callback = callback || noop;\n  let numDownloading = 0;\n  const errors = [];\n  const textures = {};\n  const images = {};\n\n  function callCallbackIfReady() {\n    if (numDownloading === 0) {\n      setTimeout(function() {\n        callback(errors.length ? errors : undefined, textures, images);\n      }, 0);\n    }\n  }\n\n  Object.keys(textureOptions).forEach(function(name) {\n    const options = textureOptions[name];\n    let onLoadFn;\n    if (isAsyncSrc(options.src)) {\n      onLoadFn = function(err, tex, img) {\n        images[name] = img;\n        --numDownloading;\n        if (err) {\n          errors.push(err);\n        }\n        callCallbackIfReady();\n      };\n      ++numDownloading;\n    }\n    textures[name] = createTexture(gl, options, onLoadFn);\n  });\n\n  // queue the callback if there are no images to download.\n  // We do this because if your code is structured to wait for\n  // images to download but then you comment out all the async\n  // images your code would break.\n  callCallbackIfReady();\n\n  return textures;\n}\n\n/**\n * Value returned by createTextureAsync\n *\n * @typedef {Object} CreateTexturesInfo\n * @param {Object.<string, WebGLTexture>} textures the created textures by name. Same as returned by {@link module:twgl.createTextures}.\n * @param {Object.<string, module:twgl.TextureSrc>} sources the image(s) used for the texture by name.\n * @memberOf module:twgl\n */\n\n/**\n * Creates textures based on the options passed in.\n *\n * see {@link module:twgl/textures.createTextures}.\n * The only difference is this function returns a promise\n * where as the other returns a texture and takes a callback.\n *\n * Note: this is here for completeness. It is probably better to use\n * the non-async version as it returns usable textures immediately\n * where as this one you have to wait for them to load.\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string,module:twgl.TextureOptions>} options A object of TextureOptions one per texture.\n * @return {Promise<CreateTexturesInfo>} The created textures and sources.\n */\nfunction createTexturesAsync(gl, options) {\n  return new Promise((resolve, reject) => {\n    createTexture(gl, options, (err, textures, sources) => {\n      if (err) {\n        reject(err);\n      } else {\n        resolve({ textures, sources });\n      }\n    });\n  });\n}\n\nvar textures = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  setTextureDefaults_: setDefaults$1,\n  createSampler: createSampler,\n  createSamplers: createSamplers,\n  setSamplerParameters: setSamplerParameters,\n  createTexture: createTexture,\n  createTextureAsync: createTextureAsync,\n  setEmptyTexture: setEmptyTexture,\n  setTextureFromArray: setTextureFromArray,\n  loadTextureFromUrl: loadTextureFromUrl,\n  setTextureFromElement: setTextureFromElement,\n  setTextureFilteringForSize: setTextureFilteringForSize,\n  setTextureParameters: setTextureParameters,\n  setDefaultTextureColor: setDefaultTextureColor,\n  createTextures: createTextures,\n  createTexturesAsync: createTexturesAsync,\n  resizeTexture: resizeTexture,\n  canGenerateMipmap: canGenerateMipmap,\n  canFilter: canFilter,\n  getNumComponentsForFormat: getNumComponentsForFormat,\n  getBytesPerElementForInternalFormat: getBytesPerElementForInternalFormat,\n  getFormatAndTypeForInternalFormat: getFormatAndTypeForInternalFormat\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * Low level shader program related functions\n *\n * You should generally not need to use these functions. They are provided\n * for those cases where you're doing something out of the ordinary\n * and you need lower level access.\n *\n * For backward compatibility they are available at both `twgl.programs` and `twgl`\n * itself\n *\n * See {@link module:twgl} for core functions\n *\n * @module twgl/programs\n */\n\nconst error = error$1;\nconst warn = warn$1;\nfunction getElementById(id) {\n  return (typeof document !== 'undefined' && document.getElementById)\n      ? document.getElementById(id)\n      : null;\n}\n\nconst TEXTURE0                       = 0x84c0;\nconst DYNAMIC_DRAW                   = 0x88e8;\n\nconst ARRAY_BUFFER                   = 0x8892;\nconst ELEMENT_ARRAY_BUFFER$1           = 0x8893;\nconst UNIFORM_BUFFER                 = 0x8a11;\nconst TRANSFORM_FEEDBACK_BUFFER      = 0x8c8e;\n\nconst TRANSFORM_FEEDBACK             = 0x8e22;\n\nconst COMPILE_STATUS                 = 0x8b81;\nconst LINK_STATUS                    = 0x8b82;\nconst FRAGMENT_SHADER                = 0x8b30;\nconst VERTEX_SHADER                  = 0x8b31;\nconst SEPARATE_ATTRIBS               = 0x8c8d;\n\nconst ACTIVE_UNIFORMS                = 0x8b86;\nconst ACTIVE_ATTRIBUTES              = 0x8b89;\nconst TRANSFORM_FEEDBACK_VARYINGS    = 0x8c83;\nconst ACTIVE_UNIFORM_BLOCKS          = 0x8a36;\nconst UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER   = 0x8a44;\nconst UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8a46;\nconst UNIFORM_BLOCK_DATA_SIZE                     = 0x8a40;\nconst UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES        = 0x8a43;\n\nconst FLOAT                         = 0x1406;\nconst FLOAT_VEC2                    = 0x8B50;\nconst FLOAT_VEC3                    = 0x8B51;\nconst FLOAT_VEC4                    = 0x8B52;\nconst INT                           = 0x1404;\nconst INT_VEC2                      = 0x8B53;\nconst INT_VEC3                      = 0x8B54;\nconst INT_VEC4                      = 0x8B55;\nconst BOOL                          = 0x8B56;\nconst BOOL_VEC2                     = 0x8B57;\nconst BOOL_VEC3                     = 0x8B58;\nconst BOOL_VEC4                     = 0x8B59;\nconst FLOAT_MAT2                    = 0x8B5A;\nconst FLOAT_MAT3                    = 0x8B5B;\nconst FLOAT_MAT4                    = 0x8B5C;\nconst SAMPLER_2D                    = 0x8B5E;\nconst SAMPLER_CUBE                  = 0x8B60;\nconst SAMPLER_3D                    = 0x8B5F;\nconst SAMPLER_2D_SHADOW             = 0x8B62;\nconst FLOAT_MAT2x3                  = 0x8B65;\nconst FLOAT_MAT2x4                  = 0x8B66;\nconst FLOAT_MAT3x2                  = 0x8B67;\nconst FLOAT_MAT3x4                  = 0x8B68;\nconst FLOAT_MAT4x2                  = 0x8B69;\nconst FLOAT_MAT4x3                  = 0x8B6A;\nconst SAMPLER_2D_ARRAY              = 0x8DC1;\nconst SAMPLER_2D_ARRAY_SHADOW       = 0x8DC4;\nconst SAMPLER_CUBE_SHADOW           = 0x8DC5;\nconst UNSIGNED_INT                  = 0x1405;\nconst UNSIGNED_INT_VEC2             = 0x8DC6;\nconst UNSIGNED_INT_VEC3             = 0x8DC7;\nconst UNSIGNED_INT_VEC4             = 0x8DC8;\nconst INT_SAMPLER_2D                = 0x8DCA;\nconst INT_SAMPLER_3D                = 0x8DCB;\nconst INT_SAMPLER_CUBE              = 0x8DCC;\nconst INT_SAMPLER_2D_ARRAY          = 0x8DCF;\nconst UNSIGNED_INT_SAMPLER_2D       = 0x8DD2;\nconst UNSIGNED_INT_SAMPLER_3D       = 0x8DD3;\nconst UNSIGNED_INT_SAMPLER_CUBE     = 0x8DD4;\nconst UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8DD7;\n\nconst TEXTURE_2D$1                    = 0x0DE1;\nconst TEXTURE_CUBE_MAP              = 0x8513;\nconst TEXTURE_3D                    = 0x806F;\nconst TEXTURE_2D_ARRAY              = 0x8C1A;\n\nconst typeMap = {};\n\n/**\n * Returns the corresponding bind point for a given sampler type\n * @private\n */\nfunction getBindPointForSamplerType(gl, type) {\n  return typeMap[type].bindPoint;\n}\n\n// This kind of sucks! If you could compose functions as in `var fn = gl[name];`\n// this code could be a lot smaller but that is sadly really slow (T_T)\n\nfunction floatSetter(gl, location) {\n  return function(v) {\n    gl.uniform1f(location, v);\n  };\n}\n\nfunction floatArraySetter(gl, location) {\n  return function(v) {\n    gl.uniform1fv(location, v);\n  };\n}\n\nfunction floatVec2Setter(gl, location) {\n  return function(v) {\n    gl.uniform2fv(location, v);\n  };\n}\n\nfunction floatVec3Setter(gl, location) {\n  return function(v) {\n    gl.uniform3fv(location, v);\n  };\n}\n\nfunction floatVec4Setter(gl, location) {\n  return function(v) {\n    gl.uniform4fv(location, v);\n  };\n}\n\nfunction intSetter(gl, location) {\n  return function(v) {\n    gl.uniform1i(location, v);\n  };\n}\n\nfunction intArraySetter(gl, location) {\n  return function(v) {\n    gl.uniform1iv(location, v);\n  };\n}\n\nfunction intVec2Setter(gl, location) {\n  return function(v) {\n    gl.uniform2iv(location, v);\n  };\n}\n\nfunction intVec3Setter(gl, location) {\n  return function(v) {\n    gl.uniform3iv(location, v);\n  };\n}\n\nfunction intVec4Setter(gl, location) {\n  return function(v) {\n    gl.uniform4iv(location, v);\n  };\n}\n\nfunction uintSetter(gl, location) {\n  return function(v) {\n    gl.uniform1ui(location, v);\n  };\n}\n\nfunction uintArraySetter(gl, location) {\n  return function(v) {\n    gl.uniform1uiv(location, v);\n  };\n}\n\nfunction uintVec2Setter(gl, location) {\n  return function(v) {\n    gl.uniform2uiv(location, v);\n  };\n}\n\nfunction uintVec3Setter(gl, location) {\n  return function(v) {\n    gl.uniform3uiv(location, v);\n  };\n}\n\nfunction uintVec4Setter(gl, location) {\n  return function(v) {\n    gl.uniform4uiv(location, v);\n  };\n}\n\nfunction floatMat2Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix2fv(location, false, v);\n  };\n}\n\nfunction floatMat3Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix3fv(location, false, v);\n  };\n}\n\nfunction floatMat4Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix4fv(location, false, v);\n  };\n}\n\nfunction floatMat23Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix2x3fv(location, false, v);\n  };\n}\n\nfunction floatMat32Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix3x2fv(location, false, v);\n  };\n}\n\nfunction floatMat24Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix2x4fv(location, false, v);\n  };\n}\n\nfunction floatMat42Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix4x2fv(location, false, v);\n  };\n}\n\nfunction floatMat34Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix3x4fv(location, false, v);\n  };\n}\n\nfunction floatMat43Setter(gl, location) {\n  return function(v) {\n    gl.uniformMatrix4x3fv(location, false, v);\n  };\n}\n\nfunction samplerSetter(gl, type, unit, location) {\n  const bindPoint = getBindPointForSamplerType(gl, type);\n  return isWebGL2(gl) ? function(textureOrPair) {\n    let texture;\n    let sampler;\n    if (!textureOrPair || isTexture(gl, textureOrPair)) {\n      texture = textureOrPair;\n      sampler = null;\n    } else {\n      texture = textureOrPair.texture;\n      sampler = textureOrPair.sampler;\n    }\n    gl.uniform1i(location, unit);\n    gl.activeTexture(TEXTURE0 + unit);\n    gl.bindTexture(bindPoint, texture);\n    gl.bindSampler(unit, sampler);\n  } : function(texture) {\n    gl.uniform1i(location, unit);\n    gl.activeTexture(TEXTURE0 + unit);\n    gl.bindTexture(bindPoint, texture);\n  };\n}\n\nfunction samplerArraySetter(gl, type, unit, location, size) {\n  const bindPoint = getBindPointForSamplerType(gl, type);\n  const units = new Int32Array(size);\n  for (let ii = 0; ii < size; ++ii) {\n    units[ii] = unit + ii;\n  }\n\n  return isWebGL2(gl) ? function(textures) {\n    gl.uniform1iv(location, units);\n    textures.forEach(function(textureOrPair, index) {\n      gl.activeTexture(TEXTURE0 + units[index]);\n      let texture;\n      let sampler;\n      if (!textureOrPair || isTexture(gl, textureOrPair)) {\n        texture = textureOrPair;\n        sampler = null;\n      } else {\n        texture = textureOrPair.texture;\n        sampler = textureOrPair.sampler;\n      }\n      gl.bindSampler(unit, sampler);\n      gl.bindTexture(bindPoint, texture);\n    });\n  } : function(textures) {\n    gl.uniform1iv(location, units);\n    textures.forEach(function(texture, index) {\n      gl.activeTexture(TEXTURE0 + units[index]);\n      gl.bindTexture(bindPoint, texture);\n    });\n  };\n}\n\ntypeMap[FLOAT]                         = { Type: Float32Array, size:  4, setter: floatSetter,      arraySetter: floatArraySetter, };\ntypeMap[FLOAT_VEC2]                    = { Type: Float32Array, size:  8, setter: floatVec2Setter,  cols: 2, };\ntypeMap[FLOAT_VEC3]                    = { Type: Float32Array, size: 12, setter: floatVec3Setter,  cols: 3, };\ntypeMap[FLOAT_VEC4]                    = { Type: Float32Array, size: 16, setter: floatVec4Setter,  cols: 4, };\ntypeMap[INT]                           = { Type: Int32Array,   size:  4, setter: intSetter,        arraySetter: intArraySetter, };\ntypeMap[INT_VEC2]                      = { Type: Int32Array,   size:  8, setter: intVec2Setter,    cols: 2, };\ntypeMap[INT_VEC3]                      = { Type: Int32Array,   size: 12, setter: intVec3Setter,    cols: 3, };\ntypeMap[INT_VEC4]                      = { Type: Int32Array,   size: 16, setter: intVec4Setter,    cols: 4, };\ntypeMap[UNSIGNED_INT]                  = { Type: Uint32Array,  size:  4, setter: uintSetter,       arraySetter: uintArraySetter, };\ntypeMap[UNSIGNED_INT_VEC2]             = { Type: Uint32Array,  size:  8, setter: uintVec2Setter,   cols: 2, };\ntypeMap[UNSIGNED_INT_VEC3]             = { Type: Uint32Array,  size: 12, setter: uintVec3Setter,   cols: 3, };\ntypeMap[UNSIGNED_INT_VEC4]             = { Type: Uint32Array,  size: 16, setter: uintVec4Setter,   cols: 4, };\ntypeMap[BOOL]                          = { Type: Uint32Array,  size:  4, setter: intSetter,        arraySetter: intArraySetter, };\ntypeMap[BOOL_VEC2]                     = { Type: Uint32Array,  size:  8, setter: intVec2Setter,    cols: 2, };\ntypeMap[BOOL_VEC3]                     = { Type: Uint32Array,  size: 12, setter: intVec3Setter,    cols: 3, };\ntypeMap[BOOL_VEC4]                     = { Type: Uint32Array,  size: 16, setter: intVec4Setter,    cols: 4, };\ntypeMap[FLOAT_MAT2]                    = { Type: Float32Array, size: 32, setter: floatMat2Setter,  rows: 2, cols: 2, };\ntypeMap[FLOAT_MAT3]                    = { Type: Float32Array, size: 48, setter: floatMat3Setter,  rows: 3, cols: 3, };\ntypeMap[FLOAT_MAT4]                    = { Type: Float32Array, size: 64, setter: floatMat4Setter,  rows: 4, cols: 4, };\ntypeMap[FLOAT_MAT2x3]                  = { Type: Float32Array, size: 32, setter: floatMat23Setter, rows: 2, cols: 3, };\ntypeMap[FLOAT_MAT2x4]                  = { Type: Float32Array, size: 32, setter: floatMat24Setter, rows: 2, cols: 4, };\ntypeMap[FLOAT_MAT3x2]                  = { Type: Float32Array, size: 48, setter: floatMat32Setter, rows: 3, cols: 2, };\ntypeMap[FLOAT_MAT3x4]                  = { Type: Float32Array, size: 48, setter: floatMat34Setter, rows: 3, cols: 4, };\ntypeMap[FLOAT_MAT4x2]                  = { Type: Float32Array, size: 64, setter: floatMat42Setter, rows: 4, cols: 2, };\ntypeMap[FLOAT_MAT4x3]                  = { Type: Float32Array, size: 64, setter: floatMat43Setter, rows: 4, cols: 3, };\ntypeMap[SAMPLER_2D]                    = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1,       };\ntypeMap[SAMPLER_CUBE]                  = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, };\ntypeMap[SAMPLER_3D]                    = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D,       };\ntypeMap[SAMPLER_2D_SHADOW]             = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1,       };\ntypeMap[SAMPLER_2D_ARRAY]              = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, };\ntypeMap[SAMPLER_2D_ARRAY_SHADOW]       = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, };\ntypeMap[SAMPLER_CUBE_SHADOW]           = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, };\ntypeMap[INT_SAMPLER_2D]                = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1,       };\ntypeMap[INT_SAMPLER_3D]                = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D,       };\ntypeMap[INT_SAMPLER_CUBE]              = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, };\ntypeMap[INT_SAMPLER_2D_ARRAY]          = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, };\ntypeMap[UNSIGNED_INT_SAMPLER_2D]       = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D$1,       };\ntypeMap[UNSIGNED_INT_SAMPLER_3D]       = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_3D,       };\ntypeMap[UNSIGNED_INT_SAMPLER_CUBE]     = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_CUBE_MAP, };\ntypeMap[UNSIGNED_INT_SAMPLER_2D_ARRAY] = { Type: null,         size:  0, setter: samplerSetter,    arraySetter: samplerArraySetter, bindPoint: TEXTURE_2D_ARRAY, };\n\nfunction floatAttribSetter(gl, index) {\n  return function(b) {\n    if (b.value) {\n      gl.disableVertexAttribArray(index);\n      switch (b.value.length) {\n        case 4:\n          gl.vertexAttrib4fv(index, b.value);\n          break;\n        case 3:\n          gl.vertexAttrib3fv(index, b.value);\n          break;\n        case 2:\n          gl.vertexAttrib2fv(index, b.value);\n          break;\n        case 1:\n          gl.vertexAttrib1fv(index, b.value);\n          break;\n        default:\n          throw new Error('the length of a float constant value must be between 1 and 4!');\n      }\n    } else {\n      gl.bindBuffer(ARRAY_BUFFER, b.buffer);\n      gl.enableVertexAttribArray(index);\n      gl.vertexAttribPointer(\n          index, b.numComponents || b.size, b.type || FLOAT, b.normalize || false, b.stride || 0, b.offset || 0);\n      if (gl.vertexAttribDivisor) {\n        gl.vertexAttribDivisor(index, b.divisor || 0);\n      }\n    }\n  };\n}\n\nfunction intAttribSetter(gl, index) {\n  return function(b) {\n    if (b.value) {\n      gl.disableVertexAttribArray(index);\n      if (b.value.length === 4) {\n        gl.vertexAttrib4iv(index, b.value);\n      } else {\n        throw new Error('The length of an integer constant value must be 4!');\n      }\n    } else {\n      gl.bindBuffer(ARRAY_BUFFER, b.buffer);\n      gl.enableVertexAttribArray(index);\n      gl.vertexAttribIPointer(\n          index, b.numComponents || b.size, b.type || INT, b.stride || 0, b.offset || 0);\n      if (gl.vertexAttribDivisor) {\n        gl.vertexAttribDivisor(index, b.divisor || 0);\n      }\n    }\n  };\n}\n\nfunction uintAttribSetter(gl, index) {\n  return function(b) {\n    if (b.value) {\n      gl.disableVertexAttribArray(index);\n      if (b.value.length === 4) {\n        gl.vertexAttrib4uiv(index, b.value);\n      } else {\n        throw new Error('The length of an unsigned integer constant value must be 4!');\n      }\n    } else {\n      gl.bindBuffer(ARRAY_BUFFER, b.buffer);\n      gl.enableVertexAttribArray(index);\n      gl.vertexAttribIPointer(\n          index, b.numComponents || b.size, b.type || UNSIGNED_INT, b.stride || 0, b.offset || 0);\n      if (gl.vertexAttribDivisor) {\n        gl.vertexAttribDivisor(index, b.divisor || 0);\n      }\n    }\n  };\n}\n\nfunction matAttribSetter(gl, index, typeInfo) {\n  const defaultSize = typeInfo.size;\n  const count = typeInfo.count;\n\n  return function(b) {\n    gl.bindBuffer(ARRAY_BUFFER, b.buffer);\n    const numComponents = b.size || b.numComponents || defaultSize;\n    const size = numComponents / count;\n    const type = b.type || FLOAT;\n    const typeInfo = typeMap[type];\n    const stride = typeInfo.size * numComponents;\n    const normalize = b.normalize || false;\n    const offset = b.offset || 0;\n    const rowOffset = stride / count;\n    for (let i = 0; i < count; ++i) {\n      gl.enableVertexAttribArray(index + i);\n      gl.vertexAttribPointer(\n          index + i, size, type, normalize, stride, offset + rowOffset * i);\n      if (gl.vertexAttribDivisor) {\n        gl.vertexAttribDivisor(index + i, b.divisor || 0);\n      }\n    }\n  };\n}\n\n\n\nconst attrTypeMap = {};\nattrTypeMap[FLOAT]             = { size:  4, setter: floatAttribSetter, };\nattrTypeMap[FLOAT_VEC2]        = { size:  8, setter: floatAttribSetter, };\nattrTypeMap[FLOAT_VEC3]        = { size: 12, setter: floatAttribSetter, };\nattrTypeMap[FLOAT_VEC4]        = { size: 16, setter: floatAttribSetter, };\nattrTypeMap[INT]               = { size:  4, setter: intAttribSetter,   };\nattrTypeMap[INT_VEC2]          = { size:  8, setter: intAttribSetter,   };\nattrTypeMap[INT_VEC3]          = { size: 12, setter: intAttribSetter,   };\nattrTypeMap[INT_VEC4]          = { size: 16, setter: intAttribSetter,   };\nattrTypeMap[UNSIGNED_INT]      = { size:  4, setter: uintAttribSetter,  };\nattrTypeMap[UNSIGNED_INT_VEC2] = { size:  8, setter: uintAttribSetter,  };\nattrTypeMap[UNSIGNED_INT_VEC3] = { size: 12, setter: uintAttribSetter,  };\nattrTypeMap[UNSIGNED_INT_VEC4] = { size: 16, setter: uintAttribSetter,  };\nattrTypeMap[BOOL]              = { size:  4, setter: intAttribSetter,   };\nattrTypeMap[BOOL_VEC2]         = { size:  8, setter: intAttribSetter,   };\nattrTypeMap[BOOL_VEC3]         = { size: 12, setter: intAttribSetter,   };\nattrTypeMap[BOOL_VEC4]         = { size: 16, setter: intAttribSetter,   };\nattrTypeMap[FLOAT_MAT2]        = { size:  4, setter: matAttribSetter,   count: 2, };\nattrTypeMap[FLOAT_MAT3]        = { size:  9, setter: matAttribSetter,   count: 3, };\nattrTypeMap[FLOAT_MAT4]        = { size: 16, setter: matAttribSetter,   count: 4, };\n\nconst errorRE = /ERROR:\\s*\\d+:(\\d+)/gi;\nfunction addLineNumbersWithError(src, log = '', lineOffset = 0) {\n  // Note: Error message formats are not defined by any spec so this may or may not work.\n  const matches = [...log.matchAll(errorRE)];\n  const lineNoToErrorMap = new Map(matches.map((m, ndx) => {\n    const lineNo = parseInt(m[1]);\n    const next = matches[ndx + 1];\n    const end = next ? next.index : log.length;\n    const msg = log.substring(m.index, end);\n    return [lineNo - 1, msg];\n  }));\n  return src.split('\\n').map((line, lineNo) => {\n    const err = lineNoToErrorMap.get(lineNo);\n    return `${lineNo + 1 + lineOffset}: ${line}${err ? `\\n\\n^^^ ${err}` : ''}`;\n  }).join('\\n');\n}\n\n/**\n * Error Callback\n * @callback ErrorCallback\n * @param {string} msg error message.\n * @param {number} [lineOffset] amount to add to line number\n * @memberOf module:twgl\n */\n\n/**\n * Program Callback\n * @callback ProgramCallback\n * @param {string} [err] error message, falsy if no error\n * @param {WebGLProgram|module:twgl.ProgramInfo} [result] the program or programInfo\n */\n\nconst spaceRE = /^[ \\t]*\\n/;\n\n/**\n * Remove the first end of line because WebGL 2.0 requires\n * #version 300 es\n * as the first line. No whitespace allowed before that line\n * so\n *\n * <script>\n * #version 300 es\n * </script>\n *\n * Has one line before it which is invalid according to GLSL ES 3.00\n *\n * @param {string} shaderSource The source of the shader\n * @returns {{shaderSource: string, lineOffset: number}}\n * @private\n */\nfunction prepShaderSource(shaderSource) {\n  let lineOffset = 0;\n  if (spaceRE.test(shaderSource)) {\n    lineOffset = 1;\n    shaderSource = shaderSource.replace(spaceRE, '');\n  }\n  return {lineOffset, shaderSource};\n}\n\n/**\n * @param {module:twgl.ProgramOptions} progOptions\n * @param {string} msg\n * @return null\n * @private\n */\nfunction reportError(progOptions, msg) {\n  progOptions.errorCallback(msg);\n  if (progOptions.callback) {\n    setTimeout(() => {\n      progOptions.callback(`${msg}\\n${progOptions.errors.join('\\n')}`);\n    });\n  }\n  return null;\n}\n\n/**\n * Check Shader status\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {number} shaderType The shader type\n * @param {WebGLShader} shader The shader\n * @param {ErrorCallback} [errFn] function to receive error message.\n * @return {string} errors or empty string\n * @private\n */\nfunction checkShaderStatus(gl, shaderType, shader, errFn) {\n  errFn = errFn || error;\n  // Check the compile status\n  const compiled = gl.getShaderParameter(shader, COMPILE_STATUS);\n  if (!compiled) {\n    // Something went wrong during compilation; get the error\n    const lastError = gl.getShaderInfoLog(shader);\n    const {lineOffset, shaderSource} = prepShaderSource(gl.getShaderSource(shader));\n    const error = `${addLineNumbersWithError(shaderSource, lastError, lineOffset)}\\nError compiling ${glEnumToString(gl, shaderType)}: ${lastError}`;\n    errFn(error);\n    return error;\n  }\n  return '';\n}\n\n/**\n * @typedef {Object} FullProgramSpec\n * @property {string[]} shaders the shader source or element ids.\n * @property {function(string)} [errorCallback] callback for errors\n * @property {Object.<string,number>|string[]} [attribLocations] a attribute name to location map, or array of attribute names where index = location.\n * @property {(module:twgl.BufferInfo|Object.<string,module:twgl.AttribInfo>|string[])} [transformFeedbackVaryings] If passed\n *   a BufferInfo will use the attribs names inside. If passed an object of AttribInfos will use the names from that object. Otherwise\n *   you can pass an array of names.\n * @property {number} [transformFeedbackMode] the mode to pass `gl.transformFeedbackVaryings`. Defaults to `SEPARATE_ATTRIBS`.\n * @property {ProgramCallback} [callback] callback for async program compilation.\n * @memberOf module:twgl\n */\n\n/**\n * @typedef {string[]|module:twgl.FullProgramSpec} ProgramSpec\n * @memberOf module:twgl\n */\n\n/**\n * @typedef {Object} ProgramOptions\n * @property {function(string)} [errorCallback] callback for errors\n * @property {Object.<string,number>|string[]} [attribLocations] a attribute name to location map, or array of attribute names where index = location.\n * @property {(module:twgl.BufferInfo|Object.<string,module:twgl.AttribInfo>|string[])} [transformFeedbackVaryings] If passed\n *   a BufferInfo will use the attribs names inside. If passed an object of AttribInfos will use the names from that object. Otherwise\n *   you can pass an array of names.\n * @property {number} [transformFeedbackMode] the mode to pass `gl.transformFeedbackVaryings`. Defaults to `SEPARATE_ATTRIBS`.\n * @property {ProgramCallback} [callback] callback for async program compilation.\n * @memberOf module:twgl\n */\n\n/**\n * Gets the program options based on all these optional arguments\n * @param {module:twgl.ProgramOptions|string[]} [opt_attribs] Options for the program or an array of attribs names. Locations will be assigned by index if not passed in\n * @param {number[]} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {module:twgl.ProgramOptions} an instance of ProgramOptions based on the arguments passed in\n * @private\n */\nfunction getProgramOptions(opt_attribs, opt_locations, opt_errorCallback) {\n  let transformFeedbackVaryings;\n  let transformFeedbackMode;\n  let callback;\n  if (typeof opt_locations === 'function') {\n    opt_errorCallback = opt_locations;\n    opt_locations = undefined;\n  }\n  if (typeof opt_attribs === 'function') {\n    opt_errorCallback = opt_attribs;\n    opt_attribs = undefined;\n  } else if (opt_attribs && !Array.isArray(opt_attribs)) {\n    const opt = opt_attribs;\n    opt_errorCallback = opt.errorCallback;\n    opt_attribs = opt.attribLocations;\n    transformFeedbackVaryings = opt.transformFeedbackVaryings;\n    transformFeedbackMode = opt.transformFeedbackMode;\n    callback = opt.callback;\n  }\n\n  const errorCallback = opt_errorCallback || error;\n  const errors = [];\n  const options = {\n    errorCallback(msg, ...args) {\n      errors.push(msg);\n      errorCallback(msg, ...args);\n    },\n    transformFeedbackVaryings,\n    transformFeedbackMode,\n    callback,\n    errors,\n  };\n\n  {\n    let attribLocations = {};\n    if (Array.isArray(opt_attribs)) {\n      opt_attribs.forEach(function(attrib,  ndx) {\n        attribLocations[attrib] = opt_locations ? opt_locations[ndx] : ndx;\n      });\n    } else {\n      attribLocations = opt_attribs || {};\n    }\n    options.attribLocations = attribLocations;\n  }\n\n  return options;\n}\n\nconst defaultShaderType = [\n  \"VERTEX_SHADER\",\n  \"FRAGMENT_SHADER\",\n];\n\nfunction getShaderTypeFromScriptType(gl, scriptType) {\n  if (scriptType.indexOf(\"frag\") >= 0) {\n    return FRAGMENT_SHADER;\n  } else if (scriptType.indexOf(\"vert\") >= 0) {\n    return VERTEX_SHADER;\n  }\n  return undefined;\n}\n\nfunction deleteProgramAndShaders(gl, program, notThese) {\n  const shaders = gl.getAttachedShaders(program);\n  for (const shader of shaders) {\n    if (!notThese.has(shader)) {\n      gl.deleteShader(shader);\n    }\n  }\n  gl.deleteProgram(program);\n}\n\nconst wait = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));\n\nfunction createProgramNoCheck(gl, shaders, programOptions) {\n  const program = gl.createProgram();\n  const {\n    attribLocations,\n    transformFeedbackVaryings,\n    transformFeedbackMode,\n  } = getProgramOptions(programOptions);\n\n  for (let ndx = 0; ndx < shaders.length; ++ndx) {\n    let shader = shaders[ndx];\n    if (typeof shader === 'string') {\n      const elem = getElementById(shader);\n      const src = elem ? elem.text : shader;\n      let type = gl[defaultShaderType[ndx]];\n      if (elem && elem.type) {\n        type = getShaderTypeFromScriptType(gl, elem.type) || type;\n      }\n      shader = gl.createShader(type);\n      gl.shaderSource(shader, prepShaderSource(src).shaderSource);\n      gl.compileShader(shader);\n    }\n    gl.attachShader(program, shader);\n  }\n\n  Object.entries(attribLocations).forEach(([attrib, loc]) => gl.bindAttribLocation(program, loc, attrib));\n\n  {\n    let varyings = transformFeedbackVaryings;\n    if (varyings) {\n      if (varyings.attribs) {\n        varyings = varyings.attribs;\n      }\n      if (!Array.isArray(varyings)) {\n        varyings = Object.keys(varyings);\n      }\n      gl.transformFeedbackVaryings(program, varyings, transformFeedbackMode || SEPARATE_ATTRIBS);\n    }\n  }\n\n  gl.linkProgram(program);\n  return program;\n}\n\n/**\n * Creates a program, attaches (and/or compiles) shaders, binds attrib locations, links the\n * program.\n *\n * NOTE: There are 4 signatures for this function\n *\n *     twgl.createProgram(gl, [vs, fs], options);\n *     twgl.createProgram(gl, [vs, fs], opt_errFunc);\n *     twgl.createProgram(gl, [vs, fs], opt_attribs, opt_errFunc);\n *     twgl.createProgram(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLShader[]|string[]} shaders The shaders to attach, or element ids for their source, or strings that contain their source\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {WebGLProgram?} the created program or null if error of a callback was provided.\n * @memberOf module:twgl/programs\n */\nfunction createProgram(\n    gl, shaders, opt_attribs, opt_locations, opt_errorCallback) {\n  // This code is really convoluted, because it may or may not be async\n  // Maybe it would be better to have a separate function\n  const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback);\n  const shaderSet = new Set(shaders);\n  const program = createProgramNoCheck(gl, shaders, progOptions);\n\n  function hasErrors(gl, program) {\n    const errors = getProgramErrors(gl, program, progOptions.errorCallback);\n    if (errors) {\n      deleteProgramAndShaders(gl, program, shaderSet);\n    }\n    return errors;\n  }\n\n  if (progOptions.callback) {\n    waitForProgramLinkCompletionAsync(gl, program).then(() => {\n      const errors = hasErrors(gl, program);\n      progOptions.callback(errors, errors ? undefined : program);\n    });\n    return undefined;\n  }\n\n  return hasErrors(gl, program) ? undefined : program;\n}\n\n/**\n * This only works because the functions it wraps the first 2 arguments\n * are gl and any, followed by things that become programOptions\n * @private\n */\nfunction wrapCallbackFnToAsyncFn(fn) {\n  return function(gl, arg1, ...args) {\n    return new Promise((resolve, reject) => {\n      const programOptions = getProgramOptions(...args);\n      programOptions.callback = (err, program) => {\n        if (err) {\n          reject(err);\n        } else {\n          resolve(program);\n        }\n      };\n      fn(gl, arg1, programOptions);\n    });\n  };\n}\n\n/**\n * Same as createProgram but returns a promise\n *\n * NOTE: There are 4 signatures for this function\n *\n *     twgl.createProgramAsync(gl, [vs, fs], options);\n *     twgl.createProgramAsync(gl, [vs, fs], opt_errFunc);\n *     twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_errFunc);\n *     twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);\n *\n * @function\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLShader[]|string[]} shaders The shaders to attach, or element ids for their source, or strings that contain their source\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {Promise<WebGLProgram>} The created program\n * @memberOf module:twgl/programs\n */\nconst createProgramAsync = wrapCallbackFnToAsyncFn(createProgram);\n\n/**\n * Same as createProgramInfo but returns a promise\n * @function\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {string[]} shaderSources Array of sources for the\n *        shaders or ids. The first is assumed to be the vertex shader,\n *        the second the fragment shader.\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {Promise<module:twgl.ProgramInfo>} The created ProgramInfo\n * @memberOf module:twgl/programs\n */\nconst createProgramInfoAsync = wrapCallbackFnToAsyncFn(createProgramInfo);\n\nasync function waitForProgramLinkCompletionAsync(gl, program) {\n  const ext = gl.getExtension('KHR_parallel_shader_compile');\n  const checkFn = ext\n      ? (gl, program) => gl.getProgramParameter(program, ext.COMPLETION_STATUS_KHR)\n      : () => true;\n\n  let waitTime = 0;\n  do {\n    await wait(waitTime);  // must wait at least once\n    waitTime = 1000 / 60;\n  } while (!checkFn(gl, program));\n}\n\nasync function waitForAllProgramsLinkCompletionAsync(gl, programs) {\n  for (const program of Object.values(programs)) {\n    await waitForProgramLinkCompletionAsync(gl, program);\n  }\n}\n\n/**\n * Check a program's link status\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLProgram} program Program to check\n * @param {ErrorCallback} [errFn] func for errors\n * @return {string?} errors if program is failed, else undefined\n * @private\n */\nfunction getProgramErrors(gl, program, errFn) {\n  errFn = errFn || error;\n  // Check the link status\n  const linked = gl.getProgramParameter(program, LINK_STATUS);\n  if (!linked) {\n    // something went wrong with the link\n    const lastError = gl.getProgramInfoLog(program);\n    errFn(`Error in program linking: ${lastError}`);\n    // print any errors from these shaders\n    const shaders = gl.getAttachedShaders(program);\n    const errors = shaders.map(shader => checkShaderStatus(gl, gl.getShaderParameter(shader, gl.SHADER_TYPE), shader, errFn));\n    return `${lastError}\\n${errors.filter(_ => _).join('\\n')}`;\n  }\n  return undefined;\n}\n\n/**\n * Creates a program from 2 script tags.\n *\n * NOTE: There are 4 signatures for this function\n *\n *     twgl.createProgramFromScripts(gl, [vs, fs], opt_options);\n *     twgl.createProgramFromScripts(gl, [vs, fs], opt_errFunc);\n *     twgl.createProgramFromScripts(gl, [vs, fs], opt_attribs, opt_errFunc);\n *     twgl.createProgramFromScripts(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {string[]} shaderScriptIds Array of ids of the script\n *        tags for the shaders. The first is assumed to be the\n *        vertex shader, the second the fragment shader.\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {WebGLProgram?} the created program or null if error or a callback was provided.\n * @memberOf module:twgl/programs\n */\nfunction createProgramFromScripts(\n    gl, shaderScriptIds, opt_attribs, opt_locations, opt_errorCallback) {\n  const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback);\n  const shaders = [];\n  for (const scriptId of shaderScriptIds) {\n    const shaderScript = getElementById(scriptId);\n    if (!shaderScript) {\n      return reportError(progOptions, `unknown script element: ${scriptId}`);\n    }\n    shaders.push(shaderScript.text);\n  }\n  return createProgram(gl, shaders, progOptions);\n}\n\n/**\n * Creates a program from 2 sources.\n *\n * NOTE: There are 4 signatures for this function\n *\n *     twgl.createProgramFromSource(gl, [vs, fs], opt_options);\n *     twgl.createProgramFromSource(gl, [vs, fs], opt_errFunc);\n *     twgl.createProgramFromSource(gl, [vs, fs], opt_attribs, opt_errFunc);\n *     twgl.createProgramFromSource(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {string[]} shaderSources Array of sources for the\n *        shaders. The first is assumed to be the vertex shader,\n *        the second the fragment shader.\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {WebGLProgram?} the created program or null if error or a callback was provided.\n * @memberOf module:twgl/programs\n */\nfunction createProgramFromSources(\n    gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) {\n  return createProgram(gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback);\n}\n\n/**\n * Returns true if attribute/uniform is a reserved/built in\n *\n * It makes no sense to me why GL returns these because it's\n * illegal to call `gl.getUniformLocation` and `gl.getAttribLocation`\n * with names that start with `gl_` (and `webgl_` in WebGL)\n *\n * I can only assume they are there because they might count\n * when computing the number of uniforms/attributes used when you want to\n * know if you are near the limit. That doesn't really make sense\n * to me but the fact that these get returned are in the spec.\n *\n * @param {WebGLActiveInfo} info As returned from `gl.getActiveUniform` or\n *    `gl.getActiveAttrib`.\n * @return {bool} true if it's reserved\n * @private\n */\nfunction isBuiltIn(info) {\n  const name = info.name;\n  return name.startsWith(\"gl_\") || name.startsWith(\"webgl_\");\n}\n\nconst tokenRE = /(\\.|\\[|]|\\w+)/g;\nconst isDigit = s => s >= '0' && s <= '9';\nfunction addSetterToUniformTree(fullPath, setter, node, uniformSetters) {\n  const tokens = fullPath.split(tokenRE).filter(s => s !== '');\n  let tokenNdx = 0;\n  let path = '';\n\n  for (;;) {\n    const token = tokens[tokenNdx++];  // has to be name or number\n    path += token;\n    const isArrayIndex = isDigit(token[0]);\n    const accessor = isArrayIndex\n        ? parseInt(token)\n        : token;\n    if (isArrayIndex) {\n      path += tokens[tokenNdx++];  // skip ']'\n    }\n    const isLastToken = tokenNdx === tokens.length;\n    if (isLastToken) {\n      node[accessor] = setter;\n      break;\n    } else {\n      const token = tokens[tokenNdx++];  // has to be . or [\n      const isArray = token === '[';\n      const child = node[accessor] || (isArray ? [] : {});\n      node[accessor] = child;\n      node = child;\n      uniformSetters[path] = uniformSetters[path] || function(node) {\n        return function(value) {\n          setUniformTree(node, value);\n        };\n      }(child);\n      path += token;\n    }\n  }\n}\n\n/**\n * Creates setter functions for all uniforms of a shader\n * program.\n *\n * @see {@link module:twgl.setUniforms}\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLProgram} program the program to create setters for.\n * @returns {Object.<string, function>} an object with a setter by name for each uniform\n * @memberOf module:twgl/programs\n */\nfunction createUniformSetters(gl, program) {\n  let textureUnit = 0;\n\n  /**\n   * Creates a setter for a uniform of the given program with it's\n   * location embedded in the setter.\n   * @param {WebGLProgram} program\n   * @param {WebGLUniformInfo} uniformInfo\n   * @returns {function} the created setter.\n   */\n  function createUniformSetter(program, uniformInfo, location) {\n    const isArray = uniformInfo.name.endsWith(\"[0]\");\n    const type = uniformInfo.type;\n    const typeInfo = typeMap[type];\n    if (!typeInfo) {\n      throw new Error(`unknown type: 0x${type.toString(16)}`); // we should never get here.\n    }\n    let setter;\n    if (typeInfo.bindPoint) {\n      // it's a sampler\n      const unit = textureUnit;\n      textureUnit += uniformInfo.size;\n      if (isArray) {\n        setter = typeInfo.arraySetter(gl, type, unit, location, uniformInfo.size);\n      } else {\n        setter = typeInfo.setter(gl, type, unit, location, uniformInfo.size);\n      }\n    } else {\n      if (typeInfo.arraySetter && isArray) {\n        setter = typeInfo.arraySetter(gl, location);\n      } else {\n        setter = typeInfo.setter(gl, location);\n      }\n    }\n    setter.location = location;\n    return setter;\n  }\n\n  const uniformSetters = {};\n  const uniformTree = {};\n  const numUniforms = gl.getProgramParameter(program, ACTIVE_UNIFORMS);\n\n  for (let ii = 0; ii < numUniforms; ++ii) {\n    const uniformInfo = gl.getActiveUniform(program, ii);\n    if (isBuiltIn(uniformInfo)) {\n      continue;\n    }\n    let name = uniformInfo.name;\n    // remove the array suffix.\n    if (name.endsWith(\"[0]\")) {\n      name = name.substr(0, name.length - 3);\n    }\n    const location = gl.getUniformLocation(program, uniformInfo.name);\n    // the uniform will have no location if it's in a uniform block\n    if (location) {\n      const setter = createUniformSetter(program, uniformInfo, location);\n      uniformSetters[name] = setter;\n      addSetterToUniformTree(name, setter, uniformTree, uniformSetters);\n    }\n  }\n\n  return uniformSetters;\n}\n\n/**\n * @typedef {Object} TransformFeedbackInfo\n * @property {number} index index of transform feedback\n * @property {number} type GL type\n * @property {number} size 1 - 4\n * @memberOf module:twgl\n */\n\n/**\n * Create TransformFeedbackInfo for passing to bindTransformFeedbackInfo.\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLProgram} program an existing WebGLProgram.\n * @return {Object<string, module:twgl.TransformFeedbackInfo>}\n * @memberOf module:twgl\n */\nfunction createTransformFeedbackInfo(gl, program) {\n  const info = {};\n  const numVaryings = gl.getProgramParameter(program, TRANSFORM_FEEDBACK_VARYINGS);\n  for (let ii = 0; ii < numVaryings; ++ii) {\n    const varying = gl.getTransformFeedbackVarying(program, ii);\n    info[varying.name] = {\n      index: ii,\n      type: varying.type,\n      size: varying.size,\n    };\n  }\n  return info;\n}\n\n/**\n * Binds buffers for transform feedback.\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {(module:twgl.ProgramInfo|Object<string, module:twgl.TransformFeedbackInfo>)} transformFeedbackInfo A ProgramInfo or TransformFeedbackInfo.\n * @param {(module:twgl.BufferInfo|Object<string, module:twgl.AttribInfo>)} [bufferInfo] A BufferInfo or set of AttribInfos.\n * @memberOf module:twgl\n */\nfunction bindTransformFeedbackInfo(gl, transformFeedbackInfo, bufferInfo) {\n  if (transformFeedbackInfo.transformFeedbackInfo) {\n    transformFeedbackInfo = transformFeedbackInfo.transformFeedbackInfo;\n  }\n  if (bufferInfo.attribs) {\n    bufferInfo = bufferInfo.attribs;\n  }\n  for (const name in bufferInfo) {\n    const varying = transformFeedbackInfo[name];\n    if (varying) {\n      const buf = bufferInfo[name];\n      if (buf.offset) {\n        gl.bindBufferRange(TRANSFORM_FEEDBACK_BUFFER, varying.index, buf.buffer, buf.offset, buf.size);\n      } else {\n        gl.bindBufferBase(TRANSFORM_FEEDBACK_BUFFER, varying.index, buf.buffer);\n      }\n    }\n  }\n}\n\n/**\n * Creates a transform feedback and sets the buffers\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {module:twgl.ProgramInfo} programInfo A ProgramInfo as returned from {@link module:twgl.createProgramInfo}\n * @param {(module:twgl.BufferInfo|Object<string, module:twgl.AttribInfo>)} [bufferInfo] A BufferInfo or set of AttribInfos.\n * @return {WebGLTransformFeedback} the created transform feedback\n * @memberOf module:twgl\n */\nfunction createTransformFeedback(gl, programInfo, bufferInfo) {\n  const tf = gl.createTransformFeedback();\n  gl.bindTransformFeedback(TRANSFORM_FEEDBACK, tf);\n  gl.useProgram(programInfo.program);\n  bindTransformFeedbackInfo(gl, programInfo, bufferInfo);\n  gl.bindTransformFeedback(TRANSFORM_FEEDBACK, null);\n  return tf;\n}\n\n/**\n * @typedef {Object} UniformData\n * @property {string} name The name of the uniform\n * @property {number} type The WebGL type enum for this uniform\n * @property {number} size The number of elements for this uniform\n * @property {number} blockNdx The block index this uniform appears in\n * @property {number} offset The byte offset in the block for this uniform's value\n * @memberOf module:twgl\n */\n\n/**\n * The specification for one UniformBlockObject\n *\n * @typedef {Object} BlockSpec\n * @property {number} index The index of the block.\n * @property {number} size The size in bytes needed for the block\n * @property {number[]} uniformIndices The indices of the uniforms used by the block. These indices\n *    correspond to entries in a UniformData array in the {@link module:twgl.UniformBlockSpec}.\n * @property {bool} usedByVertexShader Self explanatory\n * @property {bool} usedByFragmentShader Self explanatory\n * @property {bool} used Self explanatory\n * @memberOf module:twgl\n */\n\n/**\n * A `UniformBlockSpec` represents the data needed to create and bind\n * UniformBlockObjects for a given program\n *\n * @typedef {Object} UniformBlockSpec\n * @property {Object.<string, module:twgl.BlockSpec>} blockSpecs The BlockSpec for each block by block name\n * @property {UniformData[]} uniformData An array of data for each uniform by uniform index.\n * @memberOf module:twgl\n */\n\n/**\n * Creates a UniformBlockSpec for the given program.\n *\n * A UniformBlockSpec represents the data needed to create and bind\n * UniformBlockObjects\n *\n * @param {WebGL2RenderingContext} gl A WebGL2 Rendering Context\n * @param {WebGLProgram} program A WebGLProgram for a successfully linked program\n * @return {module:twgl.UniformBlockSpec} The created UniformBlockSpec\n * @memberOf module:twgl/programs\n */\nfunction createUniformBlockSpecFromProgram(gl, program) {\n  const numUniforms = gl.getProgramParameter(program, ACTIVE_UNIFORMS);\n  const uniformData = [];\n  const uniformIndices = [];\n\n  for (let ii = 0; ii < numUniforms; ++ii) {\n    uniformIndices.push(ii);\n    uniformData.push({});\n    const uniformInfo = gl.getActiveUniform(program, ii);\n    uniformData[ii].name = uniformInfo.name;\n  }\n\n  [\n    [ \"UNIFORM_TYPE\", \"type\" ],\n    [ \"UNIFORM_SIZE\", \"size\" ],  // num elements\n    [ \"UNIFORM_BLOCK_INDEX\", \"blockNdx\" ],\n    [ \"UNIFORM_OFFSET\", \"offset\", ],\n  ].forEach(function(pair) {\n    const pname = pair[0];\n    const key = pair[1];\n    gl.getActiveUniforms(program, uniformIndices, gl[pname]).forEach(function(value, ndx) {\n      uniformData[ndx][key] = value;\n    });\n  });\n\n  const blockSpecs = {};\n\n  const numUniformBlocks = gl.getProgramParameter(program, ACTIVE_UNIFORM_BLOCKS);\n  for (let ii = 0; ii < numUniformBlocks; ++ii) {\n    const name = gl.getActiveUniformBlockName(program, ii);\n    const blockSpec = {\n      index: gl.getUniformBlockIndex(program, name),\n      usedByVertexShader: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n      usedByFragmentShader: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n      size: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_DATA_SIZE),\n      uniformIndices: gl.getActiveUniformBlockParameter(program, ii, UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES),\n    };\n    blockSpec.used = blockSpec.usedByVertexShader || blockSpec.usedByFragmentShader;\n    blockSpecs[name] = blockSpec;\n  }\n\n  return {\n    blockSpecs: blockSpecs,\n    uniformData: uniformData,\n  };\n}\n\nconst arraySuffixRE = /\\[\\d+\\]\\.$/;  // better way to check?\n\nconst pad = (v, padding) => ((v + (padding - 1)) / padding | 0) * padding;\n\nfunction createUniformBlockUniformSetter(view, isArray, rows, cols) {\n  if (isArray || rows) {\n    cols = cols || 1;\n    const numElements = view.length;\n    const totalRows = numElements / 4;\n    return function(value) {\n      let dst = 0;\n      let src = 0;\n      for (let row = 0; row < totalRows; ++row) {\n        for (let col = 0; col < cols; ++col) {\n          view[dst++] = value[src++];\n        }\n        dst += 4 - cols;\n      }\n    };\n  } else {\n    return function(value) {\n      if (value.length) {\n        view.set(value);\n      } else {\n        view[0] = value;\n      }\n    };\n  }\n}\n\n/**\n * Represents a UniformBlockObject including an ArrayBuffer with all the uniform values\n * and a corresponding WebGLBuffer to hold those values on the GPU\n *\n * @typedef {Object} UniformBlockInfo\n * @property {string} name The name of the block\n * @property {ArrayBuffer} array The array buffer that contains the uniform values\n * @property {Float32Array} asFloat A float view on the array buffer. This is useful\n *    inspecting the contents of the buffer in the debugger.\n * @property {Uint8Array} asUint8t A uint8 view on the array buffer.\n * @property {WebGLBuffer} buffer A WebGL buffer that will hold a copy of the uniform values for rendering.\n * @property {number} [offset] offset into buffer\n * @property {Object<string, ArrayBufferView>} uniforms A uniform name to ArrayBufferView map.\n *   each Uniform has a correctly typed `ArrayBufferView` into array at the correct offset\n *   and length of that uniform. So for example a float uniform would have a 1 float `Float32Array`\n *   view. A single mat4 would have a 16 element `Float32Array` view. An ivec2 would have an\n *   `Int32Array` view, etc.\n * @property {Object<string, function>} setters A setter for this uniform.\n *   The reason to use setters is elements of arrays are padded to vec4 sizes which\n *   means if you want to set an array of 4 floats you'd need to set 16 values\n *   (or set elements 0, 4, 8, 12). In other words\n *   `someBlockInfo.uniforms.some4FloatArrayUniform.set([0, , , , 1, , , , 2, , , , 3])`\n *   where as the setter handles just passing in [0, 1, 2, 3] either directly as in\n *   `someBlockInfo.setter.some4FloatArrayUniform.set([0, 1, 2, 3])` (not recommended)\n *   or via {@link module:twgl.setBlockUniforms}\n * @memberOf module:twgl\n */\n\n/**\n * Options to allow createUniformBlockInfo to use an existing buffer and arrayBuffer at an offset\n * @typedef {Object} UniformBlockInfoOptions\n * @property {ArrayBuffer} [array] an existing array buffer to use for values\n * @property {number} [offset] the offset in bytes to use in the array buffer (default = 0)\n * @property {WebGLBuffer} [buffer] the buffer to use for this uniform block info\n * @property {number} [bufferOffset] the offset in bytes in the buffer to use (default = use offset above)\n */\n\n/**\n * Creates a `UniformBlockInfo` for the specified block\n *\n * Note: **If the blockName matches no existing blocks a warning is printed to the console and a dummy\n * `UniformBlockInfo` is returned**. This is because when debugging GLSL\n * it is common to comment out large portions of a shader or for example set\n * the final output to a constant. When that happens blocks get optimized out.\n * If this function did not create dummy blocks your code would crash when debugging.\n *\n * @param {WebGL2RenderingContext} gl A WebGL2RenderingContext\n * @param {WebGLProgram} program A WebGLProgram\n * @param {module:twgl.UniformBlockSpec} uniformBlockSpec. A UniformBlockSpec as returned\n *     from {@link module:twgl.createUniformBlockSpecFromProgram}.\n * @param {string} blockName The name of the block.\n * @param {module:twgl.UniformBlockInfoOptions} [options] Optional options for using existing an existing buffer and arrayBuffer\n * @return {module:twgl.UniformBlockInfo} The created UniformBlockInfo\n * @memberOf module:twgl/programs\n */\nfunction createUniformBlockInfoFromProgram(gl, program, uniformBlockSpec, blockName, options = {}) {\n  const blockSpecs = uniformBlockSpec.blockSpecs;\n  const uniformData = uniformBlockSpec.uniformData;\n  const blockSpec = blockSpecs[blockName];\n  if (!blockSpec) {\n    warn(\"no uniform block object named:\", blockName);\n    return {\n      name: blockName,\n      uniforms: {},\n    };\n  }\n  const offset = options.offset ?? 0;\n  const array = options.array ?? new ArrayBuffer(blockSpec.size);\n  const buffer = options.buffer ?? gl.createBuffer();\n  const uniformBufferIndex = blockSpec.index;\n  gl.bindBuffer(UNIFORM_BUFFER, buffer);\n  if (!options.buffer) {\n    gl.bufferData(UNIFORM_BUFFER, array.byteLength, DYNAMIC_DRAW);\n  }\n  gl.uniformBlockBinding(program, blockSpec.index, uniformBufferIndex);\n\n  let prefix = blockName + \".\";\n  if (arraySuffixRE.test(prefix)) {\n    prefix = prefix.replace(arraySuffixRE, \".\");\n  }\n  const uniforms = {};\n  const setters = {};\n  const setterTree = {};\n  blockSpec.uniformIndices.forEach(function(uniformNdx) {\n    const data = uniformData[uniformNdx];\n    let name = data.name;\n    if (name.startsWith(prefix)) {\n      name = name.substr(prefix.length);\n    }\n    const isArray = name.endsWith('[0]');\n    if (isArray) {\n      name = name.substr(0, name.length - 3);\n    }\n    const typeInfo = typeMap[data.type];\n    const Type = typeInfo.Type;\n    const byteLength = isArray\n        ? pad(typeInfo.size, 16) * data.size\n        : typeInfo.size * data.size;\n    const uniformView = new Type(array, offset + data.offset, byteLength / Type.BYTES_PER_ELEMENT);\n    uniforms[name] = uniformView;\n    // Note: I'm not sure what to do here. The original\n    // idea was to create TypedArray views into each part\n    // of the block. This is useful, for example if you have\n    // a block with { mat4: model; mat4 view; mat4 projection; }\n    // you'll get a Float32Array for each one suitable for\n    // passing to most JS math libraries including twgl's and glMatrix.js.\n    //\n    // But, if you have a an array of structures, especially if that\n    // array is large, you get a whole bunch of TypedArray views.\n    // Every one of them has overhead and switching between them all\n    // is probably a cache miss. In that case it would really be better\n    // to just have one view (asFloat) and have all the setters\n    // just reference the correct portion. But, then you can't easily\n    // treat a matrix, or a vec4, as a standalone thing like you can\n    // with all the views.\n    //\n    // Another problem with the views is they are not shared. With\n    // uniforms you have one set of setters. With UniformBlockInfo\n    // you have a set of setters *pre block instance*. That's because\n    // TypedArray views can't be mapped to different buffers.\n    //\n    // My gut right now is if you really want the speed and compactness\n    // then you should probably roll your own solution. TWGL's goal\n    // here is ease of use as AFAICT there is no simple generic efficient\n    // solution.\n    const setter = createUniformBlockUniformSetter(uniformView, isArray, typeInfo.rows, typeInfo.cols);\n    setters[name] = setter;\n    addSetterToUniformTree(name, setter, setterTree, setters);\n  });\n  return {\n    name: blockName,\n    array,\n    asFloat: new Float32Array(array),  // for debugging\n    asUint8: new Uint8Array(array),  // needed for gl.bufferSubData because it doesn't take an array buffer\n    buffer,\n    uniforms,\n    setters,\n    offset: options.bufferOffset ?? offset,\n    size: blockSpec.size,\n  };\n}\n\n/**\n * Creates a `UniformBlockInfo` for the specified block\n *\n * Note: **If the blockName matches no existing blocks a warning is printed to the console and a dummy\n * `UniformBlockInfo` is returned**. This is because when debugging GLSL\n * it is common to comment out large portions of a shader or for example set\n * the final output to a constant. When that happens blocks get optimized out.\n * If this function did not create dummy blocks your code would crash when debugging.\n *\n * @param {WebGL2RenderingContext} gl A WebGL2RenderingContext\n * @param {module:twgl.ProgramInfo} programInfo a `ProgramInfo`\n *     as returned from {@link module:twgl.createProgramInfo}\n * @param {string} blockName The name of the block.\n * @param {module:twgl.UniformBlockInfoOptions} [options] Optional options for using existing an existing buffer and arrayBuffer\n * @return {module:twgl.UniformBlockInfo} The created UniformBlockInfo\n * @memberOf module:twgl/programs\n */\nfunction createUniformBlockInfo(gl, programInfo, blockName, options = {}) {\n  return createUniformBlockInfoFromProgram(gl, programInfo.program, programInfo.uniformBlockSpec, blockName, options);\n}\n\n/**\n * Binds a uniform block to the matching uniform block point.\n * Matches by blocks by name so blocks must have the same name not just the same\n * structure.\n *\n * If you have changed any values and you upload the values into the corresponding WebGLBuffer\n * call {@link module:twgl.setUniformBlock} instead.\n *\n * @param {WebGL2RenderingContext} gl A WebGL 2 rendering context.\n * @param {(module:twgl.ProgramInfo|module:twgl.UniformBlockSpec)} programInfo a `ProgramInfo`\n *     as returned from {@link module:twgl.createProgramInfo} or or `UniformBlockSpec` as\n *     returned from {@link module:twgl.createUniformBlockSpecFromProgram}.\n * @param {module:twgl.UniformBlockInfo} uniformBlockInfo a `UniformBlockInfo` as returned from\n *     {@link module:twgl.createUniformBlockInfo}.\n * @return {bool} true if buffer was bound. If the programInfo has no block with the same block name\n *     no buffer is bound.\n * @memberOf module:twgl/programs\n */\nfunction bindUniformBlock(gl, programInfo, uniformBlockInfo) {\n  const uniformBlockSpec = programInfo.uniformBlockSpec || programInfo;\n  const blockSpec = uniformBlockSpec.blockSpecs[uniformBlockInfo.name];\n  if (blockSpec) {\n    const bufferBindIndex = blockSpec.index;\n    gl.bindBufferRange(UNIFORM_BUFFER, bufferBindIndex, uniformBlockInfo.buffer, uniformBlockInfo.offset || 0, uniformBlockInfo.size ?? uniformBlockInfo.array.byteLength);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Uploads the current uniform values to the corresponding WebGLBuffer\n * and binds that buffer to the program's corresponding bind point for the uniform block object.\n *\n * If you haven't changed any values and you only need to bind the uniform block object\n * call {@link module:twgl.bindUniformBlock} instead.\n *\n * @param {WebGL2RenderingContext} gl A WebGL 2 rendering context.\n * @param {(module:twgl.ProgramInfo|module:twgl.UniformBlockSpec)} programInfo a `ProgramInfo`\n *     as returned from {@link module:twgl.createProgramInfo} or or `UniformBlockSpec` as\n *     returned from {@link module:twgl.createUniformBlockSpecFromProgram}.\n * @param {module:twgl.UniformBlockInfo} uniformBlockInfo a `UniformBlockInfo` as returned from\n *     {@link module:twgl.createUniformBlockInfo}.\n * @memberOf module:twgl/programs\n */\nfunction setUniformBlock(gl, programInfo, uniformBlockInfo) {\n  if (bindUniformBlock(gl, programInfo, uniformBlockInfo)) {\n    gl.bufferSubData(UNIFORM_BUFFER, 0, uniformBlockInfo.asUint8, uniformBlockInfo.offset || 0, uniformBlockInfo.size || 0);\n  }\n}\n\n/**\n * Sets values of a uniform block object\n *\n * @param {module:twgl.UniformBlockInfo} uniformBlockInfo A UniformBlockInfo as returned by {@link module:twgl.createUniformBlockInfo}.\n * @param {Object.<string, ?>} values A uniform name to value map where the value is correct for the given\n *    type of uniform. So for example given a block like\n *\n *       uniform SomeBlock {\n *         float someFloat;\n *         vec2 someVec2;\n *         vec3 someVec3Array[2];\n *         int someInt;\n *       }\n *\n *  You can set the values of the uniform block with\n *\n *       twgl.setBlockUniforms(someBlockInfo, {\n *          someFloat: 12.3,\n *          someVec2: [1, 2],\n *          someVec3Array: [1, 2, 3, 4, 5, 6],\n *          someInt: 5,\n *       }\n *\n *  Arrays can be JavaScript arrays or typed arrays\n *\n *  You can also fill out structure and array values either via\n *  shortcut. Example\n *\n *     // -- in shader --\n *     struct Light {\n *       float intensity;\n *       vec4 color;\n *       float nearFar[2];\n *     };\n *     uniform Lights {\n *       Light lights[2];\n *     };\n *\n *     // in JavaScript\n *\n *     twgl.setBlockUniforms(someBlockInfo, {\n *       lights: [\n *         { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.1, 10] },\n *         { intensity: 2.0, color: [0, 0, 1, 1], nearFar[0.2, 15] },\n *       ],\n *     });\n *\n *   or the more traditional way\n *\n *     twgl.setBlockUniforms(someBlockInfo, {\n *       \"lights[0].intensity\": 5.0,\n *       \"lights[0].color\": [1, 0, 0, 1],\n *       \"lights[0].nearFar\": [0.1, 10],\n *       \"lights[1].intensity\": 2.0,\n *       \"lights[1].color\": [0, 0, 1, 1],\n *       \"lights[1].nearFar\": [0.2, 15],\n *     });\n *\n *   You can also specify partial paths\n *\n *     twgl.setBlockUniforms(someBlockInfo, {\n *       'lights[1]': { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.2, 15] },\n *     });\n *\n *   But you can not specify leaf array indices.\n *\n *     twgl.setBlockUniforms(someBlockInfo, {\n *       'lights[1].nearFar[1]': 15,     // BAD! nearFar is a leaf\n *       'lights[1].nearFar': [0.2, 15], // GOOD\n *     });\n *\n *  **IMPORTANT!**, packing in a UniformBlock is unintuitive.\n *  For example the actual layout of `someVec3Array` above in memory\n *  is `1, 2, 3, unused, 4, 5, 6, unused`. twgl takes in 6 values\n *  as shown about and copies them, skipping the padding. This might\n *  be confusing if you're already familiar with Uniform blocks.\n *\n *  If you want to deal with the padding yourself you can access the array\n *  buffer views directly. eg:\n *\n *      someBlockInfo.someVec3Array.set([1, 2, 3, 0, 4, 5, 6, 0]);\n *\n *  Any name that doesn't match will be ignored\n * @memberOf module:twgl/programs\n */\nfunction setBlockUniforms(uniformBlockInfo, values) {\n  const setters = uniformBlockInfo.setters;\n  for (const name in values) {\n    const setter = setters[name];\n    if (setter) {\n      const value = values[name];\n      setter(value);\n    }\n  }\n}\n\nfunction setUniformTree(tree, values) {\n  for (const name in values) {\n    const prop = tree[name];\n    if (typeof prop === 'function') {\n      prop(values[name]);\n    } else {\n      setUniformTree(tree[name], values[name]);\n    }\n  }\n}\n\n/**\n * Set uniforms and binds related textures.\n *\n * example:\n *\n *     const programInfo = createProgramInfo(\n *         gl, [\"some-vs\", \"some-fs\"]);\n *\n *     const tex1 = gl.createTexture();\n *     const tex2 = gl.createTexture();\n *\n *     ... assume we setup the textures with data ...\n *\n *     const uniforms = {\n *       u_someSampler: tex1,\n *       u_someOtherSampler: tex2,\n *       u_someColor: [1,0,0,1],\n *       u_somePosition: [0,1,1],\n *       u_someMatrix: [\n *         1,0,0,0,\n *         0,1,0,0,\n *         0,0,1,0,\n *         0,0,0,0,\n *       ],\n *     };\n *\n *     gl.useProgram(programInfo.program);\n *\n * This will automatically bind the textures AND set the\n * uniforms.\n *\n *     twgl.setUniforms(programInfo, uniforms);\n *\n * For the example above it is equivalent to\n *\n *     let texUnit = 0;\n *     gl.activeTexture(gl.TEXTURE0 + texUnit);\n *     gl.bindTexture(gl.TEXTURE_2D, tex1);\n *     gl.uniform1i(u_someSamplerLocation, texUnit++);\n *     gl.activeTexture(gl.TEXTURE0 + texUnit);\n *     gl.bindTexture(gl.TEXTURE_2D, tex2);\n *     gl.uniform1i(u_someSamplerLocation, texUnit++);\n *     gl.uniform4fv(u_someColorLocation, [1, 0, 0, 1]);\n *     gl.uniform3fv(u_somePositionLocation, [0, 1, 1]);\n *     gl.uniformMatrix4fv(u_someMatrix, false, [\n *         1,0,0,0,\n *         0,1,0,0,\n *         0,0,1,0,\n *         0,0,0,0,\n *       ]);\n *\n * Note it is perfectly reasonable to call `setUniforms` multiple times. For example\n *\n *     const uniforms = {\n *       u_someSampler: tex1,\n *       u_someOtherSampler: tex2,\n *     };\n *\n *     const moreUniforms {\n *       u_someColor: [1,0,0,1],\n *       u_somePosition: [0,1,1],\n *       u_someMatrix: [\n *         1,0,0,0,\n *         0,1,0,0,\n *         0,0,1,0,\n *         0,0,0,0,\n *       ],\n *     };\n *\n *     twgl.setUniforms(programInfo, uniforms);\n *     twgl.setUniforms(programInfo, moreUniforms);\n *\n * You can also add WebGLSamplers to uniform samplers as in\n *\n *     const uniforms = {\n *       u_someSampler: {\n *         texture: someWebGLTexture,\n *         sampler: someWebGLSampler,\n *       },\n *     };\n *\n * In which case both the sampler and texture will be bound to the\n * same unit.\n *\n * @param {(module:twgl.ProgramInfo|Object.<string, function>)} setters a `ProgramInfo` as returned from `createProgramInfo` or the setters returned from\n *        `createUniformSetters`.\n * @param {Object.<string, ?>} values an object with values for the\n *        uniforms.\n *   You can pass multiple objects by putting them in an array or by calling with more arguments.For example\n *\n *     const sharedUniforms = {\n *       u_fogNear: 10,\n *       u_projection: ...\n *       ...\n *     };\n *\n *     const localUniforms = {\n *       u_world: ...\n *       u_diffuseColor: ...\n *     };\n *\n *     twgl.setUniforms(programInfo, sharedUniforms, localUniforms);\n *\n *     // is the same as\n *\n *     twgl.setUniforms(programInfo, [sharedUniforms, localUniforms]);\n *\n *     // is the same as\n *\n *     twgl.setUniforms(programInfo, sharedUniforms);\n *     twgl.setUniforms(programInfo, localUniforms};\n *\n *   You can also fill out structure and array values either via\n *   shortcut. Example\n *\n *     // -- in shader --\n *     struct Light {\n *       float intensity;\n *       vec4 color;\n *       float nearFar[2];\n *     };\n *     uniform Light lights[2];\n *\n *     // in JavaScript\n *\n *     twgl.setUniforms(programInfo, {\n *       lights: [\n *         { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.1, 10] },\n *         { intensity: 2.0, color: [0, 0, 1, 1], nearFar[0.2, 15] },\n *       ],\n *     });\n *\n *   or the more traditional way\n *\n *     twgl.setUniforms(programInfo, {\n *       \"lights[0].intensity\": 5.0,\n *       \"lights[0].color\": [1, 0, 0, 1],\n *       \"lights[0].nearFar\": [0.1, 10],\n *       \"lights[1].intensity\": 2.0,\n *       \"lights[1].color\": [0, 0, 1, 1],\n *       \"lights[1].nearFar\": [0.2, 15],\n *     });\n *\n *   You can also specify partial paths\n *\n *     twgl.setUniforms(programInfo, {\n *       'lights[1]': { intensity: 5.0, color: [1, 0, 0, 1], nearFar[0.2, 15] },\n *     });\n *\n *   But you can not specify leaf array indices\n *\n *     twgl.setUniforms(programInfo, {\n *       'lights[1].nearFar[1]': 15,     // BAD! nearFar is a leaf\n *       'lights[1].nearFar': [0.2, 15], // GOOD\n *     });\n *\n * @memberOf module:twgl/programs\n */\nfunction setUniforms(setters, ...args) {  // eslint-disable-line\n  const actualSetters = setters.uniformSetters || setters;\n  const numArgs = args.length;\n  for (let aNdx = 0; aNdx < numArgs; ++aNdx) {\n    const values = args[aNdx];\n    if (Array.isArray(values)) {\n      const numValues = values.length;\n      for (let ii = 0; ii < numValues; ++ii) {\n        setUniforms(actualSetters, values[ii]);\n      }\n    } else {\n      for (const name in values) {\n        const setter = actualSetters[name];\n        if (setter) {\n          setter(values[name]);\n        }\n      }\n    }\n  }\n}\n\n/**\n * Alias for `setUniforms`\n * @function\n * @param {(module:twgl.ProgramInfo|Object.<string, function>)} setters a `ProgramInfo` as returned from `createProgramInfo` or the setters returned from\n *        `createUniformSetters`.\n * @param {Object.<string, ?>} values an object with values for the\n * @memberOf module:twgl/programs\n */\nconst setUniformsAndBindTextures = setUniforms;\n\n/**\n * Creates setter functions for all attributes of a shader\n * program. You can pass this to {@link module:twgl.setBuffersAndAttributes} to set all your buffers and attributes.\n *\n * @see {@link module:twgl.setAttributes} for example\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {WebGLProgram} program the program to create setters for.\n * @return {Object.<string, function>} an object with a setter for each attribute by name.\n * @memberOf module:twgl/programs\n */\nfunction createAttributeSetters(gl, program) {\n  const attribSetters = {\n  };\n\n  const numAttribs = gl.getProgramParameter(program, ACTIVE_ATTRIBUTES);\n  for (let ii = 0; ii < numAttribs; ++ii) {\n    const attribInfo = gl.getActiveAttrib(program, ii);\n    if (isBuiltIn(attribInfo)) {\n      continue;\n    }\n    const index = gl.getAttribLocation(program, attribInfo.name);\n    const typeInfo = attrTypeMap[attribInfo.type];\n    const setter = typeInfo.setter(gl, index, typeInfo);\n    setter.location = index;\n    attribSetters[attribInfo.name] = setter;\n  }\n\n  return attribSetters;\n}\n\n/**\n * Sets attributes and binds buffers (deprecated... use {@link module:twgl.setBuffersAndAttributes})\n *\n * Example:\n *\n *     const program = createProgramFromScripts(\n *         gl, [\"some-vs\", \"some-fs\");\n *\n *     const attribSetters = createAttributeSetters(program);\n *\n *     const positionBuffer = gl.createBuffer();\n *     const texcoordBuffer = gl.createBuffer();\n *\n *     const attribs = {\n *       a_position: {buffer: positionBuffer, numComponents: 3},\n *       a_texcoord: {buffer: texcoordBuffer, numComponents: 2},\n *     };\n *\n *     gl.useProgram(program);\n *\n * This will automatically bind the buffers AND set the\n * attributes.\n *\n *     setAttributes(attribSetters, attribs);\n *\n * Properties of attribs. For each attrib you can add\n * properties:\n *\n * *   type: the type of data in the buffer. Default = gl.FLOAT\n * *   normalize: whether or not to normalize the data. Default = false\n * *   stride: the stride. Default = 0\n * *   offset: offset into the buffer. Default = 0\n * *   divisor: the divisor for instances. Default = undefined\n *\n * For example if you had 3 value float positions, 2 value\n * float texcoord and 4 value uint8 colors you'd setup your\n * attribs like this\n *\n *     const attribs = {\n *       a_position: {buffer: positionBuffer, numComponents: 3},\n *       a_texcoord: {buffer: texcoordBuffer, numComponents: 2},\n *       a_color: {\n *         buffer: colorBuffer,\n *         numComponents: 4,\n *         type: gl.UNSIGNED_BYTE,\n *         normalize: true,\n *       },\n *     };\n *\n * @param {Object.<string, function>} setters Attribute setters as returned from createAttributeSetters\n * @param {Object.<string, module:twgl.AttribInfo>} buffers AttribInfos mapped by attribute name.\n * @memberOf module:twgl/programs\n * @deprecated use {@link module:twgl.setBuffersAndAttributes}\n * @private\n */\nfunction setAttributes(setters, buffers) {\n  for (const name in buffers) {\n    const setter = setters[name];\n    if (setter) {\n      setter(buffers[name]);\n    }\n  }\n}\n\n/**\n * Sets attributes and buffers including the `ELEMENT_ARRAY_BUFFER` if appropriate\n *\n * Example:\n *\n *     const programInfo = createProgramInfo(\n *         gl, [\"some-vs\", \"some-fs\");\n *\n *     const arrays = {\n *       position: { numComponents: 3, data: [0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0], },\n *       texcoord: { numComponents: 2, data: [0, 0, 0, 1, 1, 0, 1, 1],                 },\n *     };\n *\n *     const bufferInfo = createBufferInfoFromArrays(gl, arrays);\n *\n *     gl.useProgram(programInfo.program);\n *\n * This will automatically bind the buffers AND set the\n * attributes.\n *\n *     setBuffersAndAttributes(gl, programInfo, bufferInfo);\n *\n * For the example above it is equivalent to\n *\n *     gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n *     gl.enableVertexAttribArray(a_positionLocation);\n *     gl.vertexAttribPointer(a_positionLocation, 3, gl.FLOAT, false, 0, 0);\n *     gl.bindBuffer(gl.ARRAY_BUFFER, texcoordBuffer);\n *     gl.enableVertexAttribArray(a_texcoordLocation);\n *     gl.vertexAttribPointer(a_texcoordLocation, 4, gl.FLOAT, false, 0, 0);\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext.\n * @param {(module:twgl.ProgramInfo|Object.<string, function>)} setters A `ProgramInfo` as returned from {@link module:twgl.createProgramInfo} or Attribute setters as returned from {@link module:twgl.createAttributeSetters}\n * @param {(module:twgl.BufferInfo|module:twgl.VertexArrayInfo)} buffers a `BufferInfo` as returned from {@link module:twgl.createBufferInfoFromArrays}.\n *   or a `VertexArrayInfo` as returned from {@link module:twgl.createVertexArrayInfo}\n * @memberOf module:twgl/programs\n */\nfunction setBuffersAndAttributes(gl, programInfo, buffers) {\n  if (buffers.vertexArrayObject) {\n    gl.bindVertexArray(buffers.vertexArrayObject);\n  } else {\n    setAttributes(programInfo.attribSetters || programInfo, buffers.attribs);\n    if (buffers.indices) {\n      gl.bindBuffer(ELEMENT_ARRAY_BUFFER$1, buffers.indices);\n    }\n  }\n}\n\n/**\n * @typedef {Object} ProgramInfo\n * @property {WebGLProgram} program A shader program\n * @property {Object<string, WebGLUniformLocation>} uniformLocations The uniform locations of each uniform\n * @property {Object<string, number>} attribLocations The locations of each attribute\n * @property {Object<string, function>} uniformSetters object of setters as returned from createUniformSetters,\n * @property {Object<string, function>} attribSetters object of setters as returned from createAttribSetters,\n * @property {module:twgl.UniformBlockSpec} [uniformBlockSpec] a uniform block spec for making UniformBlockInfos with createUniformBlockInfo etc..\n * @property {Object<string, module:twgl.TransformFeedbackInfo>} [transformFeedbackInfo] info for transform feedbacks\n * @memberOf module:twgl\n */\n\n/**\n * Creates a ProgramInfo from an existing program.\n *\n * A ProgramInfo contains\n *\n *     programInfo = {\n *        program: WebGLProgram,\n *        uniformSetters: object of setters as returned from createUniformSetters,\n *        attribSetters: object of setters as returned from createAttribSetters,\n *     }\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {WebGLProgram} program an existing WebGLProgram.\n * @return {module:twgl.ProgramInfo} The created ProgramInfo.\n * @memberOf module:twgl/programs\n */\nfunction createProgramInfoFromProgram(gl, program) {\n  const uniformSetters = createUniformSetters(gl, program);\n  const attribSetters = createAttributeSetters(gl, program);\n  const programInfo = {\n    program,\n    uniformSetters,\n    attribSetters,\n    uniformLocations: Object.fromEntries(Object.entries(uniformSetters).map(([k, v]) => [k, v.location])),\n    attribLocations: Object.fromEntries(Object.entries(attribSetters).map(([k, v]) => [k, v.location])),\n  };\n\n  if (isWebGL2(gl)) {\n    programInfo.uniformBlockSpec = createUniformBlockSpecFromProgram(gl, program);\n    programInfo.transformFeedbackInfo = createTransformFeedbackInfo(gl, program);\n  }\n\n  return programInfo;\n}\n\nconst notIdRE = /\\s|{|}|;/;\n\n/**\n * Creates a ProgramInfo from 2 sources.\n *\n * A ProgramInfo contains\n *\n *     programInfo = {\n *        program: WebGLProgram,\n *        uniformSetters: object of setters as returned from createUniformSetters,\n *        attribSetters: object of setters as returned from createAttribSetters,\n *     }\n *\n * NOTE: There are 4 signatures for this function\n *\n *     twgl.createProgramInfo(gl, [vs, fs], options);\n *     twgl.createProgramInfo(gl, [vs, fs], opt_errFunc);\n *     twgl.createProgramInfo(gl, [vs, fs], opt_attribs, opt_errFunc);\n *     twgl.createProgramInfo(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {string[]} shaderSources Array of sources for the\n *        shaders or ids. The first is assumed to be the vertex shader,\n *        the second the fragment shader.\n * @param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in\n * @param {number[]|module:twgl.ErrorCallback} [opt_locations] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.\n * @param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console\n *        on error. If you want something else pass an callback. It's passed an error message.\n * @return {module:twgl.ProgramInfo?} The created ProgramInfo or null if it failed to link or compile\n * @memberOf module:twgl/programs\n */\nfunction createProgramInfo(\n    gl, shaderSources, opt_attribs, opt_locations, opt_errorCallback) {\n  const progOptions = getProgramOptions(opt_attribs, opt_locations, opt_errorCallback);\n  const errors = [];\n  shaderSources = shaderSources.map(function(source) {\n    // Lets assume if there is no \\n it's an id\n    if (!notIdRE.test(source)) {\n      const script = getElementById(source);\n      if (!script) {\n        const err = `no element with id: ${source}`;\n        progOptions.errorCallback(err);\n        errors.push(err);\n      } else {\n        source = script.text;\n      }\n    }\n    return source;\n  });\n\n  if (errors.length) {\n    return reportError(progOptions, '');\n  }\n\n  const origCallback = progOptions.callback;\n  if (origCallback) {\n    progOptions.callback = (err, program) => {\n      origCallback(err, err ? undefined : createProgramInfoFromProgram(gl, program));\n    };\n  }\n\n  const program = createProgramFromSources(gl, shaderSources, progOptions);\n  if (!program) {\n    return null;\n  }\n\n  return createProgramInfoFromProgram(gl, program);\n}\n\nfunction checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions) {\n  // check errors for everything.\n  for (const [name, program] of Object.entries(programs)) {\n    const options = {...programOptions};\n    const spec = programSpecs[name];\n    if (!Array.isArray(spec)) {\n      Object.assign(options, spec);\n    }\n    const errors = getProgramErrors(gl, program, options.errorCallback);\n    if (errors) {\n      // delete everything we created\n      for (const program of Object.values(programs)) {\n        const shaders = gl.getAttachedShaders(program);\n        gl.deleteProgram(program);\n        for (const shader of shaders) {\n          // Don't delete it if we didn't create it.\n          if (!noDeleteShadersSet.has(shader)) {\n            gl.deleteShader(shader);\n          }\n        }\n      }\n      return errors;\n    }\n  }\n\n  return undefined;\n}\n\n/**\n * Creates multiple programs\n *\n * Note: the reason this function exists is because the fastest way to create multiple\n * programs in WebGL is to create and compile all shaders and link all programs and only\n * afterwards check if they succeeded. In that way, giving all your shaders\n *\n * @see {@link module:twgl.createProgram}\n *\n * Example:\n *\n *     const programs = twgl.createPrograms(gl, {\n *       lambert: [lambertVS, lambertFS],\n *       phong: [phongVS, phoneFS],\n *       particles: {\n *         shaders: [particlesVS, particlesFS],\n *         transformFeedbackVaryings: ['position', 'velocity'],\n *       },\n *     });\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string, module:twgl.ProgramSpec>} programSpecs An object of ProgramSpecs, one per program.\n * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs\n * @return {Object.<string, WebGLProgram>?} the created programInfos by name\n */\nfunction createPrograms(gl, programSpecs, programOptions = {}) {\n  // Remember existing shaders so that if there is an error we don't delete them\n  const noDeleteShadersSet = new Set();\n\n  // compile and link everything\n  const programs = Object.fromEntries(Object.entries(programSpecs).map(([name, spec]) => {\n    const options = {...programOptions};\n    const shaders = Array.isArray(spec) ? spec : spec.shaders;\n    if (!Array.isArray(spec)) {\n      Object.assign(options, spec);\n    }\n    shaders.forEach(noDeleteShadersSet.add, noDeleteShadersSet);\n    return [name, createProgramNoCheck(gl, shaders, options)];\n  }));\n\n  if (programOptions.callback) {\n    waitForAllProgramsLinkCompletionAsync(gl, programs).then(() => {\n      const errors = checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions);\n      programOptions.callback(errors, errors ? undefined : programs);\n    });\n    return undefined;\n  }\n\n  const errors = checkAllPrograms(gl, programs, programSpecs, noDeleteShadersSet, programOptions);\n  return errors ? undefined : programs;\n}\n\n/**\n * Creates multiple programInfos\n *\n * Note: the reason this function exists is because the fastest way to create multiple\n * programs in WebGL is to create and compile all shaders and link all programs and only\n * afterwards check if they succeeded. In that way, giving all your shaders\n *\n * @see {@link module:twgl.createProgramInfo}\n *\n * Examples:\n *\n *     const programInfos = twgl.createProgramInfos(gl, {\n *       lambert: [lambertVS, lambertFS],\n *       phong: [phongVS, phoneFS],\n *       particles: {\n *         shaders: [particlesVS, particlesFS],\n *         transformFeedbackVaryings: ['position', 'velocity'],\n *       },\n *     });\n *\n * or\n *\n *     const {lambert, phong, particles} = twgl.createProgramInfos(gl, {\n *       lambert: [lambertVS, lambertFS],\n *       phong: [phongVS, phoneFS],\n *       particles: {\n *         shaders: [particlesVS, particlesFS],\n *         transformFeedbackVaryings: ['position', 'velocity'],\n *       },\n *     });\n *\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string, module:twgl.ProgramSpec>} programSpecs An object of ProgramSpecs, one per program.\n * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs\n * @return {Object.<string, module:twgl.ProgramInfo>?} the created programInfos by name\n */\nfunction createProgramInfos(gl, programSpecs, programOptions) {\n  programOptions = getProgramOptions(programOptions);\n\n  function createProgramInfosForPrograms(gl, programs) {\n    return Object.fromEntries(Object.entries(programs).map(([name, program]) =>\n      [name, createProgramInfoFromProgram(gl, program)]\n    ));\n  }\n\n  const origCallback = programOptions.callback;\n  if (origCallback) {\n    programOptions.callback = (err, programs) => {\n      origCallback(err, err ? undefined : createProgramInfosForPrograms(gl, programs));\n    };\n  }\n\n  const programs = createPrograms(gl, programSpecs, programOptions);\n  if (origCallback || !programs) {\n    return undefined;\n  }\n\n  return createProgramInfosForPrograms(gl, programs);\n}\n\n/**\n * Creates multiple programs asynchronously\n *\n * @see {@link module:twgl.createProgramAsync}\n *\n * Example:\n *\n *     const programs = await twgl.createProgramsAsync(gl, {\n *       lambert: [lambertVS, lambertFS],\n *       phong: [phongVS, phoneFS],\n *       particles: {\n *         shaders: [particlesVS, particlesFS],\n *         transformFeedbackVaryings: ['position', 'velocity'],\n *       },\n *     });\n *\n * @function\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string, module:twgl.ProgramSpec>} programSpecs An object of ProgramSpecs, one per program.\n * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs\n * @return {Object.<string, WebGLProgram>?} the created programInfos by name\n */\nconst createProgramsAsync = wrapCallbackFnToAsyncFn(createPrograms);\n\n/**\n * Creates multiple programInfos asynchronously\n *\n * @see {@link module:twgl.createProgramInfoAsync}\n *\n * Example:\n *\n *     const programInfos = await twgl.createProgramInfosAsync(gl, {\n *       lambert: [lambertVS, lambertFS],\n *       phong: [phongVS, phoneFS],\n *       particles: {\n *         shaders: [particlesVS, particlesFS],\n *         transformFeedbackVaryings: ['position', 'velocity'],\n *       },\n *     });\n *\n * @function\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {Object.<string, module:twgl.ProgramSpec>} programSpecs An object of ProgramSpecs, one per program.\n * @param {module:twgl.ProgramOptions} [programOptions] options to apply to all programs\n * @return {Promise<Object.<string, module:twgl.ProgramInfo>>} the created programInfos by name\n */\nconst createProgramInfosAsync = wrapCallbackFnToAsyncFn(createProgramInfos);\n\nvar programs = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  createAttributeSetters: createAttributeSetters,\n  createProgram: createProgram,\n  createProgramAsync: createProgramAsync,\n  createPrograms: createPrograms,\n  createProgramsAsync: createProgramsAsync,\n  createProgramFromScripts: createProgramFromScripts,\n  createProgramFromSources: createProgramFromSources,\n  createProgramInfo: createProgramInfo,\n  createProgramInfoAsync: createProgramInfoAsync,\n  createProgramInfos: createProgramInfos,\n  createProgramInfosAsync: createProgramInfosAsync,\n  createProgramInfoFromProgram: createProgramInfoFromProgram,\n  createUniformSetters: createUniformSetters,\n  createUniformBlockSpecFromProgram: createUniformBlockSpecFromProgram,\n  createUniformBlockInfoFromProgram: createUniformBlockInfoFromProgram,\n  createUniformBlockInfo: createUniformBlockInfo,\n  createTransformFeedback: createTransformFeedback,\n  createTransformFeedbackInfo: createTransformFeedbackInfo,\n  bindTransformFeedbackInfo: bindTransformFeedbackInfo,\n  setAttributes: setAttributes,\n  setBuffersAndAttributes: setBuffersAndAttributes,\n  setUniforms: setUniforms,\n  setUniformsAndBindTextures: setUniformsAndBindTextures,\n  setUniformBlock: setUniformBlock,\n  setBlockUniforms: setBlockUniforms,\n  bindUniformBlock: bindUniformBlock\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nconst TRIANGLES                      = 0x0004;\nconst UNSIGNED_SHORT                 = 0x1403;\n\n/**\n * Drawing related functions\n *\n * For backward compatibility they are available at both `twgl.draw` and `twgl`\n * itself\n *\n * See {@link module:twgl} for core functions\n *\n * @module twgl/draw\n */\n\n/**\n * Calls `gl.drawElements` or `gl.drawArrays`, whichever is appropriate\n *\n * normally you'd call `gl.drawElements` or `gl.drawArrays` yourself\n * but calling this means if you switch from indexed data to non-indexed\n * data you don't have to remember to update your draw call.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {(module:twgl.BufferInfo|module:twgl.VertexArrayInfo)} bufferInfo A BufferInfo as returned from {@link module:twgl.createBufferInfoFromArrays} or\n *   a VertexArrayInfo as returned from {@link module:twgl.createVertexArrayInfo}\n * @param {number} [type] eg (gl.TRIANGLES, gl.LINES, gl.POINTS, gl.TRIANGLE_STRIP, ...). Defaults to `gl.TRIANGLES`\n * @param {number} [count] An optional count. Defaults to bufferInfo.numElements\n * @param {number} [offset] An optional offset. Defaults to 0.\n * @param {number} [instanceCount] An optional instanceCount. if set then `drawArraysInstanced` or `drawElementsInstanced` will be called\n * @memberOf module:twgl/draw\n */\nfunction drawBufferInfo(gl, bufferInfo, type, count, offset, instanceCount) {\n  type = type === undefined ? TRIANGLES : type;\n  const indices = bufferInfo.indices;\n  const elementType = bufferInfo.elementType;\n  const numElements = count === undefined ? bufferInfo.numElements : count;\n  offset = offset === undefined ? 0 : offset;\n  if (elementType || indices) {\n    if (instanceCount !== undefined) {\n      gl.drawElementsInstanced(type, numElements, elementType === undefined ? UNSIGNED_SHORT : bufferInfo.elementType, offset, instanceCount);\n    } else {\n      gl.drawElements(type, numElements, elementType === undefined ? UNSIGNED_SHORT : bufferInfo.elementType, offset);\n    }\n  } else {\n    if (instanceCount !== undefined) {\n      gl.drawArraysInstanced(type, offset, numElements, instanceCount);\n    } else {\n      gl.drawArrays(type, offset, numElements);\n    }\n  }\n}\n\n/**\n * A DrawObject is useful for putting objects in to an array and passing them to {@link module:twgl.drawObjectList}.\n *\n * You need either a `BufferInfo` or a `VertexArrayInfo`.\n *\n * @typedef {Object} DrawObject\n * @property {boolean} [active] whether or not to draw. Default = `true` (must be `false` to be not true). In other words `undefined` = `true`\n * @property {number} [type] type to draw eg. `gl.TRIANGLES`, `gl.LINES`, etc...\n * @property {module:twgl.ProgramInfo} programInfo A ProgramInfo as returned from {@link module:twgl.createProgramInfo}\n * @property {module:twgl.BufferInfo} [bufferInfo] A BufferInfo as returned from {@link module:twgl.createBufferInfoFromArrays}\n * @property {module:twgl.VertexArrayInfo} [vertexArrayInfo] A VertexArrayInfo as returned from {@link module:twgl.createVertexArrayInfo}\n * @property {Object<string, ?>} uniforms The values for the uniforms.\n *   You can pass multiple objects by putting them in an array. For example\n *\n *     var sharedUniforms = {\n *       u_fogNear: 10,\n *       u_projection: ...\n *       ...\n *     };\n *\n *     var localUniforms = {\n *       u_world: ...\n *       u_diffuseColor: ...\n *     };\n *\n *     var drawObj = {\n *       ...\n *       uniforms: [sharedUniforms, localUniforms],\n *     };\n *\n * @property {number} [offset] the offset to pass to `gl.drawArrays` or `gl.drawElements`. Defaults to 0.\n * @property {number} [count] the count to pass to `gl.drawArrays` or `gl.drawElements`. Defaults to bufferInfo.numElements.\n * @property {number} [instanceCount] the number of instances. Defaults to undefined.\n * @memberOf module:twgl\n */\n\n/**\n * Draws a list of objects\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {DrawObject[]} objectsToDraw an array of objects to draw.\n * @memberOf module:twgl/draw\n */\nfunction drawObjectList(gl, objectsToDraw) {\n  let lastUsedProgramInfo = null;\n  let lastUsedBufferInfo = null;\n\n  objectsToDraw.forEach(function(object) {\n    if (object.active === false) {\n      return;\n    }\n\n    const programInfo = object.programInfo;\n    const bufferInfo = object.vertexArrayInfo || object.bufferInfo;\n    let bindBuffers = false;\n    const type = object.type === undefined ? TRIANGLES : object.type;\n\n    if (programInfo !== lastUsedProgramInfo) {\n      lastUsedProgramInfo = programInfo;\n      gl.useProgram(programInfo.program);\n\n      // We have to rebind buffers when changing programs because we\n      // only bind buffers the program uses. So if 2 programs use the same\n      // bufferInfo but the 1st one uses only positions the when the\n      // we switch to the 2nd one some of the attributes will not be on.\n      bindBuffers = true;\n    }\n\n    // Setup all the needed attributes.\n    if (bindBuffers || bufferInfo !== lastUsedBufferInfo) {\n      if (lastUsedBufferInfo && lastUsedBufferInfo.vertexArrayObject && !bufferInfo.vertexArrayObject) {\n        gl.bindVertexArray(null);\n      }\n      lastUsedBufferInfo = bufferInfo;\n      setBuffersAndAttributes(gl, programInfo, bufferInfo);\n    }\n\n    // Set the uniforms.\n    setUniforms(programInfo, object.uniforms);\n\n    // Draw\n    drawBufferInfo(gl, bufferInfo, type, object.count, object.offset, object.instanceCount);\n  });\n\n  if (lastUsedBufferInfo && lastUsedBufferInfo.vertexArrayObject) {\n    gl.bindVertexArray(null);\n  }\n}\n\nvar draw = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  drawBufferInfo: drawBufferInfo,\n  drawObjectList: drawObjectList\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nconst FRAMEBUFFER                    = 0x8d40;\nconst RENDERBUFFER                   = 0x8d41;\nconst TEXTURE_2D                     = 0x0de1;\n\nconst UNSIGNED_BYTE                  = 0x1401;\n\n/* PixelFormat */\nconst DEPTH_COMPONENT                = 0x1902;\nconst RGBA                           = 0x1908;\nconst DEPTH_COMPONENT24              = 0x81a6;\nconst DEPTH_COMPONENT32F             = 0x8cac;\nconst DEPTH24_STENCIL8               = 0x88f0;\nconst DEPTH32F_STENCIL8              = 0x8cad;\n\n/* Framebuffer Object. */\nconst RGBA4                          = 0x8056;\nconst RGB5_A1                        = 0x8057;\nconst RGB565                         = 0x8D62;\nconst DEPTH_COMPONENT16              = 0x81A5;\nconst STENCIL_INDEX                  = 0x1901;\nconst STENCIL_INDEX8                 = 0x8D48;\nconst DEPTH_STENCIL                  = 0x84F9;\nconst COLOR_ATTACHMENT0              = 0x8CE0;\nconst DEPTH_ATTACHMENT               = 0x8D00;\nconst STENCIL_ATTACHMENT             = 0x8D20;\nconst DEPTH_STENCIL_ATTACHMENT       = 0x821A;\n\n/* TextureWrapMode */\nconst CLAMP_TO_EDGE                  = 0x812F;\n\n/* TextureMagFilter */\nconst LINEAR                         = 0x2601;\n\n/**\n * The options for a framebuffer attachment.\n *\n * Note: For a `format` that is a texture include all the texture\n * options from {@link module:twgl.TextureOptions} for example\n * `min`, `mag`, `clamp`, etc... Note that unlike {@link module:twgl.TextureOptions}\n * `auto` defaults to `false` for attachment textures but `min` and `mag` default\n * to `gl.LINEAR` and `wrap` defaults to `CLAMP_TO_EDGE`\n *\n * @typedef {Object} AttachmentOptions\n * @property {number} [attachmentPoint] The attachment point. Defaults\n *   to `gl.COLOR_ATTACHMENT0 + ndx` unless type is a depth or stencil type\n *   then it's gl.DEPTH_ATTACHMENT or `gl.DEPTH_STENCIL_ATTACHMENT` depending\n *   on the format or attachment type.\n * @property {number} [format] The format. If one of `gl.RGBA4`,\n *   `gl.RGB565`, `gl.RGB5_A1`, `gl.DEPTH_COMPONENT16`,\n *   `gl.STENCIL_INDEX8` or `gl.DEPTH_STENCIL` then will create a\n *   renderbuffer. Otherwise will create a texture. Default = `gl.RGBA`\n * @property {number} [type] The type. Used for texture. Default = `gl.UNSIGNED_BYTE`.\n * @property {number} [target] The texture target for `gl.framebufferTexture2D`.\n *   Defaults to `gl.TEXTURE_2D`. Set to appropriate face for cube maps.\n * @property {number} [samples] The number of samples. Default = 1\n * @property {number} [level] level for `gl.framebufferTexture2D`. Defaults to 0.\n * @property {number} [layer] layer for `gl.framebufferTextureLayer`. Defaults to undefined.\n *   If set then `gl.framebufferTextureLayer` is called, if not then `gl.framebufferTexture2D`\n * @property {(WebGLRenderbuffer | WebGLTexture)} [attachment] An existing renderbuffer or texture.\n *    If provided will attach this Object. This allows you to share\n *    attachments across framebuffers.\n * @memberOf module:twgl\n * @mixes module:twgl.TextureOptions\n */\n\nconst defaultAttachments = [\n  { format: RGBA, type: UNSIGNED_BYTE, min: LINEAR, wrap: CLAMP_TO_EDGE, },\n  { format: DEPTH_STENCIL, },\n];\n\nconst attachmentsByFormat = {};\nattachmentsByFormat[DEPTH_STENCIL] = DEPTH_STENCIL_ATTACHMENT;\nattachmentsByFormat[STENCIL_INDEX] = STENCIL_ATTACHMENT;\nattachmentsByFormat[STENCIL_INDEX8] = STENCIL_ATTACHMENT;\nattachmentsByFormat[DEPTH_COMPONENT] = DEPTH_ATTACHMENT;\nattachmentsByFormat[DEPTH_COMPONENT16] = DEPTH_ATTACHMENT;\nattachmentsByFormat[DEPTH_COMPONENT24] = DEPTH_ATTACHMENT;\nattachmentsByFormat[DEPTH_COMPONENT32F] = DEPTH_ATTACHMENT;\nattachmentsByFormat[DEPTH24_STENCIL8] = DEPTH_STENCIL_ATTACHMENT;\nattachmentsByFormat[DEPTH32F_STENCIL8] = DEPTH_STENCIL_ATTACHMENT;\n\nfunction getAttachmentPointForFormat(format, internalFormat) {\n  return attachmentsByFormat[format] || attachmentsByFormat[internalFormat];\n}\n\nconst renderbufferFormats = {};\nrenderbufferFormats[RGBA4] = true;\nrenderbufferFormats[RGB5_A1] = true;\nrenderbufferFormats[RGB565] = true;\nrenderbufferFormats[DEPTH_STENCIL] = true;\nrenderbufferFormats[DEPTH_COMPONENT16] = true;\nrenderbufferFormats[STENCIL_INDEX] = true;\nrenderbufferFormats[STENCIL_INDEX8] = true;\n\nfunction isRenderbufferFormat(format) {\n  return renderbufferFormats[format];\n}\n\nconst MAX_COLOR_ATTACHMENT_POINTS = 32;  // even an 3090 only supports 8 but WebGL/OpenGL ES define constants for 32\n\nfunction isColorAttachmentPoint(attachmentPoint) {\n  return attachmentPoint >= COLOR_ATTACHMENT0 && attachmentPoint < COLOR_ATTACHMENT0 + MAX_COLOR_ATTACHMENT_POINTS;\n}\n\n/**\n * @typedef {Object} FramebufferInfo\n * @property {WebGLFramebuffer} framebuffer The WebGLFramebuffer for this framebufferInfo\n * @property {Array.<(WebGLRenderbuffer | WebGLTexture)>} attachments The created attachments in the same order as passed in to {@link module:twgl.createFramebufferInfo}.\n * @property {number} width The width of the framebuffer and its attachments\n * @property {number} height The width of the framebuffer and its attachments\n * @memberOf module:twgl\n */\n\n/**\n * Creates a framebuffer and attachments.\n *\n * This returns a {@link module:twgl.FramebufferInfo} because it needs to return the attachments as well as the framebuffer.\n * It also leaves the framebuffer it just created as the currently bound `FRAMEBUFFER`.\n * Note: If this is WebGL2 or if you called {@link module:twgl.addExtensionsToContext} then it will set the drawBuffers\n * to `[COLOR_ATTACHMENT0, COLOR_ATTACHMENT1, ...]` for how ever many color attachments were created.\n *\n * The simplest usage\n *\n *     // create an RGBA/UNSIGNED_BYTE texture and DEPTH_STENCIL renderbuffer\n *     const fbi = twgl.createFramebufferInfo(gl);\n *\n * More complex usage\n *\n *     // create an RGB565 renderbuffer and a STENCIL_INDEX8 renderbuffer\n *     const attachments = [\n *       { format: RGB565, mag: NEAREST },\n *       { format: STENCIL_INDEX8 },\n *     ]\n *     const fbi = twgl.createFramebufferInfo(gl, attachments);\n *\n * Passing in a specific size\n *\n *     const width = 256;\n *     const height = 256;\n *     const fbi = twgl.createFramebufferInfo(gl, attachments, width, height);\n *\n * **Note!!** It is up to you to check if the framebuffer is renderable by calling `gl.checkFramebufferStatus`.\n * [WebGL1 only guarantees 3 combinations of attachments work](https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.6).\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.AttachmentOptions[]} [attachments] which attachments to create. If not provided the default is a framebuffer with an\n *    `RGBA`, `UNSIGNED_BYTE` texture `COLOR_ATTACHMENT0` and a `DEPTH_STENCIL` renderbuffer `DEPTH_STENCIL_ATTACHMENT`.\n * @param {number} [width] the width for the attachments. Default = size of drawingBuffer\n * @param {number} [height] the height for the attachments. Default = size of drawingBuffer\n * @return {module:twgl.FramebufferInfo} the framebuffer and attachments.\n * @memberOf module:twgl/framebuffers\n */\nfunction createFramebufferInfo(gl, attachments, width, height) {\n  const target = FRAMEBUFFER;\n  const fb = gl.createFramebuffer();\n  gl.bindFramebuffer(target, fb);\n  width  = width  || gl.drawingBufferWidth;\n  height = height || gl.drawingBufferHeight;\n  attachments = attachments || defaultAttachments;\n  const usedColorAttachmentsPoints = [];\n  const framebufferInfo = {\n    framebuffer: fb,\n    attachments: [],\n    width: width,\n    height: height,\n  };\n\n  attachments.forEach(function(attachmentOptions, i) {\n    let attachment = attachmentOptions.attachment;\n    const samples = attachmentOptions.samples;\n    const format = attachmentOptions.format;\n    let attachmentPoint = attachmentOptions.attachmentPoint || getAttachmentPointForFormat(format, attachmentOptions.internalFormat);\n    if (!attachmentPoint) {\n      attachmentPoint = COLOR_ATTACHMENT0 + i;\n    }\n    if (isColorAttachmentPoint(attachmentPoint)) {\n      usedColorAttachmentsPoints.push(attachmentPoint);\n    }\n    if (!attachment) {\n      if (samples !== undefined || isRenderbufferFormat(format)) {\n        attachment = gl.createRenderbuffer();\n        gl.bindRenderbuffer(RENDERBUFFER, attachment);\n        if (samples > 1) {\n          gl.renderbufferStorageMultisample(RENDERBUFFER, samples, format, width, height);\n        } else {\n          gl.renderbufferStorage(RENDERBUFFER, format, width, height);\n        }\n      } else {\n        const textureOptions = Object.assign({}, attachmentOptions);\n        textureOptions.width = width;\n        textureOptions.height = height;\n        if (textureOptions.auto === undefined) {\n          textureOptions.auto = false;\n          textureOptions.min = textureOptions.min || textureOptions.minMag || LINEAR;\n          textureOptions.mag = textureOptions.mag || textureOptions.minMag || LINEAR;\n          textureOptions.wrapS = textureOptions.wrapS || textureOptions.wrap || CLAMP_TO_EDGE;\n          textureOptions.wrapT = textureOptions.wrapT || textureOptions.wrap || CLAMP_TO_EDGE;\n        }\n        attachment = createTexture(gl, textureOptions);\n      }\n    }\n    if (isRenderbuffer(gl, attachment)) {\n      gl.framebufferRenderbuffer(target, attachmentPoint, RENDERBUFFER, attachment);\n    } else if (isTexture(gl, attachment)) {\n      if (attachmentOptions.layer !== undefined) {\n        gl.framebufferTextureLayer(\n          target,\n          attachmentPoint,\n          attachment,\n          attachmentOptions.level || 0,\n          attachmentOptions.layer);\n      } else {\n        gl.framebufferTexture2D(\n            target,\n            attachmentPoint,\n            attachmentOptions.target || TEXTURE_2D,\n            attachment,\n            attachmentOptions.level || 0);\n      }\n    } else {\n      throw new Error('unknown attachment type');\n    }\n    framebufferInfo.attachments.push(attachment);\n  });\n  if (gl.drawBuffers) {\n    gl.drawBuffers(usedColorAttachmentsPoints);\n  }\n  return framebufferInfo;\n}\n\n/**\n * Resizes the attachments of a framebuffer.\n *\n * You need to pass in the same `attachments` as you passed in {@link module:twgl.createFramebufferInfo}\n * because TWGL has no idea the format/type of each attachment.\n *\n * The simplest usage\n *\n *     // create an RGBA/UNSIGNED_BYTE texture and DEPTH_STENCIL renderbuffer\n *     const fbi = twgl.createFramebufferInfo(gl);\n *\n *     ...\n *\n *     function render() {\n *       if (twgl.resizeCanvasToDisplaySize(gl.canvas)) {\n *         // resize the attachments\n *         twgl.resizeFramebufferInfo(gl, fbi);\n *       }\n *\n * More complex usage\n *\n *     // create an RGB565 renderbuffer and a STENCIL_INDEX8 renderbuffer\n *     const attachments = [\n *       { format: RGB565, mag: NEAREST },\n *       { format: STENCIL_INDEX8 },\n *     ]\n *     const fbi = twgl.createFramebufferInfo(gl, attachments);\n *\n *     ...\n *\n *     function render() {\n *       if (twgl.resizeCanvasToDisplaySize(gl.canvas)) {\n *         // resize the attachments to match\n *         twgl.resizeFramebufferInfo(gl, fbi, attachments);\n *       }\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.FramebufferInfo} framebufferInfo a framebufferInfo as returned from {@link module:twgl.createFramebufferInfo}.\n * @param {module:twgl.AttachmentOptions[]} [attachments] the same attachments options as passed to {@link module:twgl.createFramebufferInfo}.\n * @param {number} [width] the width for the attachments. Default = size of drawingBuffer\n * @param {number} [height] the height for the attachments. Default = size of drawingBuffer\n * @memberOf module:twgl/framebuffers\n */\nfunction resizeFramebufferInfo(gl, framebufferInfo, attachments, width, height) {\n  width  = width  || gl.drawingBufferWidth;\n  height = height || gl.drawingBufferHeight;\n  framebufferInfo.width = width;\n  framebufferInfo.height = height;\n  attachments = attachments || defaultAttachments;\n  attachments.forEach(function(attachmentOptions, ndx) {\n    const attachment = framebufferInfo.attachments[ndx];\n    const format = attachmentOptions.format;\n    const samples = attachmentOptions.samples;\n    if (samples !== undefined || isRenderbuffer(gl, attachment)) {\n      gl.bindRenderbuffer(RENDERBUFFER, attachment);\n      if (samples > 1) {\n        gl.renderbufferStorageMultisample(RENDERBUFFER, samples, format, width, height);\n      } else {\n        gl.renderbufferStorage(RENDERBUFFER, format, width, height);\n      }\n    } else if (isTexture(gl, attachment)) {\n      resizeTexture(gl, attachment, attachmentOptions, width, height);\n    } else {\n      throw new Error('unknown attachment type');\n    }\n  });\n}\n\n/**\n * Binds a framebuffer\n *\n * This function pretty much solely exists because I spent hours\n * trying to figure out why something I wrote wasn't working only\n * to realize I forget to set the viewport dimensions.\n * My hope is this function will fix that.\n *\n * It is effectively the same as\n *\n *     gl.bindFramebuffer(gl.FRAMEBUFFER, someFramebufferInfo.framebuffer);\n *     gl.viewport(0, 0, someFramebufferInfo.width, someFramebufferInfo.height);\n *\n * @param {WebGLRenderingContext} gl the WebGLRenderingContext\n * @param {module:twgl.FramebufferInfo|null} [framebufferInfo] a framebufferInfo as returned from {@link module:twgl.createFramebufferInfo}.\n *   If falsy will bind the canvas.\n * @param {number} [target] The target. If not passed `gl.FRAMEBUFFER` will be used.\n * @memberOf module:twgl/framebuffers\n */\n\nfunction bindFramebufferInfo(gl, framebufferInfo, target) {\n  target = target || FRAMEBUFFER;\n  if (framebufferInfo) {\n    gl.bindFramebuffer(target, framebufferInfo.framebuffer);\n    gl.viewport(0, 0, framebufferInfo.width, framebufferInfo.height);\n  } else {\n    gl.bindFramebuffer(target, null);\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n  }\n}\n\nvar framebuffers = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  bindFramebufferInfo: bindFramebufferInfo,\n  createFramebufferInfo: createFramebufferInfo,\n  resizeFramebufferInfo: resizeFramebufferInfo\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * vertex array object related functions\n *\n * You should generally not need to use these functions. They are provided\n * for those cases where you're doing something out of the ordinary\n * and you need lower level access.\n *\n * For backward compatibility they are available at both `twgl.attributes` and `twgl`\n * itself\n *\n * See {@link module:twgl} for core functions\n *\n * @module twgl/vertexArrays\n */\n\nconst ELEMENT_ARRAY_BUFFER           = 0x8893;\n\n/**\n * @typedef {Object} VertexArrayInfo\n * @property {number} numElements The number of elements to pass to `gl.drawArrays` or `gl.drawElements`.\n * @property {number} [elementType] The type of indices `UNSIGNED_BYTE`, `UNSIGNED_SHORT` etc..\n * @property {WebGLVertexArrayObject} [vertexArrayObject] a vertex array object\n * @memberOf module:twgl\n */\n\n/**\n * Creates a VertexArrayInfo from a BufferInfo and one or more ProgramInfos\n *\n * This can be passed to {@link module:twgl.setBuffersAndAttributes} and to\n * {@link module:twgl:drawBufferInfo}.\n *\n * > **IMPORTANT:** Vertex Array Objects are **not** a direct analog for a BufferInfo. Vertex Array Objects\n *   assign buffers to specific attributes at creation time. That means they can only be used with programs\n *   who's attributes use the same attribute locations for the same purposes.\n *\n * > Bind your attribute locations by passing an array of attribute names to {@link module:twgl.createProgramInfo}\n *   or use WebGL 2's GLSL ES 3's `layout(location = <num>)` to make sure locations match.\n *\n * also\n *\n * > **IMPORTANT:** After calling twgl.setBuffersAndAttribute with a BufferInfo that uses a Vertex Array Object\n *   that Vertex Array Object will be bound. That means **ANY MANIPULATION OF ELEMENT_ARRAY_BUFFER or ATTRIBUTES**\n *   will affect the Vertex Array Object state.\n *\n * > Call `gl.bindVertexArray(null)` to get back manipulating the global attributes and ELEMENT_ARRAY_BUFFER.\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @param {module:twgl.ProgramInfo|module:twgl.ProgramInfo[]} programInfo a programInfo or array of programInfos\n * @param {module:twgl.BufferInfo} bufferInfo BufferInfo as returned from createBufferInfoFromArrays etc...\n *\n *    You need to make sure every attribute that will be used is bound. So for example assume shader 1\n *    uses attributes A, B, C and shader 2 uses attributes A, B, D. If you only pass in the programInfo\n *    for shader 1 then only attributes A, B, and C will have their attributes set because TWGL doesn't\n *    now attribute D's location.\n *\n *    So, you can pass in both shader 1 and shader 2's programInfo\n *\n * @return {module:twgl.VertexArrayInfo} The created VertexArrayInfo\n *\n * @memberOf module:twgl/vertexArrays\n */\nfunction createVertexArrayInfo(gl, programInfos, bufferInfo) {\n  const vao = gl.createVertexArray();\n  gl.bindVertexArray(vao);\n  if (!programInfos.length) {\n    programInfos = [programInfos];\n  }\n  programInfos.forEach(function(programInfo) {\n    setBuffersAndAttributes(gl, programInfo, bufferInfo);\n  });\n  gl.bindVertexArray(null);\n  return {\n    numElements: bufferInfo.numElements,\n    elementType: bufferInfo.elementType,\n    vertexArrayObject: vao,\n  };\n}\n\n/**\n * Creates a vertex array object and then sets the attributes on it\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext to use.\n * @param {Object.<string, function>} setters Attribute setters as returned from createAttributeSetters\n * @param {Object.<string, module:twgl.AttribInfo>} attribs AttribInfos mapped by attribute name.\n * @param {WebGLBuffer} [indices] an optional ELEMENT_ARRAY_BUFFER of indices\n *\n * @return {WebGLVertexArrayObject|null} The created WebGLVertexArrayObject\n *\n * @memberOf module:twgl/vertexArrays\n */\nfunction createVAOAndSetAttributes(gl, setters, attribs, indices) {\n  const vao = gl.createVertexArray();\n  gl.bindVertexArray(vao);\n  setAttributes(setters, attribs);\n  if (indices) {\n    gl.bindBuffer(ELEMENT_ARRAY_BUFFER, indices);\n  }\n  // We unbind this because otherwise any change to ELEMENT_ARRAY_BUFFER\n  // like when creating buffers for other stuff will mess up this VAO's binding\n  gl.bindVertexArray(null);\n  return vao;\n}\n\n/**\n * Creates a vertex array object and then sets the attributes\n * on it\n *\n * @param {WebGLRenderingContext} gl The WebGLRenderingContext\n *        to use.\n * @param {Object.<string, function>| module:twgl.ProgramInfo} programInfo as returned from createProgramInfo or Attribute setters as returned from createAttributeSetters\n * @param {module:twgl.BufferInfo} bufferInfo BufferInfo as returned from createBufferInfoFromArrays etc...\n * @param {WebGLBuffer} [indices] an optional ELEMENT_ARRAY_BUFFER of indices\n *\n * @return {WebGLVertexArrayObject|null} The created WebGLVertexArrayObject\n *\n * @memberOf module:twgl/vertexArrays\n */\nfunction createVAOFromBufferInfo(gl, programInfo, bufferInfo) {\n  return createVAOAndSetAttributes(gl, programInfo.attribSetters || programInfo, bufferInfo.attribs, bufferInfo.indices);\n}\n\nvar vertexArrays = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  createVertexArrayInfo: createVertexArrayInfo,\n  createVAOAndSetAttributes: createVAOAndSetAttributes,\n  createVAOFromBufferInfo: createVAOFromBufferInfo\n});\n\n/*\n * Copyright 2019 Gregg Tavares\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\nconst defaults = {\n  addExtensionsToContext: true,\n};\n\n/**\n * Various default settings for twgl.\n *\n * Note: You can call this any number of times. Example:\n *\n *     twgl.setDefaults({ textureColor: [1, 0, 0, 1] });\n *     twgl.setDefaults({ attribPrefix: 'a_' });\n *\n * is equivalent to\n *\n *     twgl.setDefaults({\n *       textureColor: [1, 0, 0, 1],\n *       attribPrefix: 'a_',\n *     });\n *\n * @typedef {Object} Defaults\n * @property {string} [attribPrefix] The prefix to stick on attributes\n *\n *   When writing shaders I prefer to name attributes with `a_`, uniforms with `u_` and varyings with `v_`\n *   as it makes it clear where they came from. But, when building geometry I prefer using un-prefixed names.\n *\n *   In other words I'll create arrays of geometry like this\n *\n *       const arrays = {\n *         position: ...\n *         normal: ...\n *         texcoord: ...\n *       };\n *\n *   But need those mapped to attributes and my attributes start with `a_`.\n *\n *   Default: `\"\"`\n *\n * @property {number[]} [textureColor] Array of 4 values in the range 0 to 1\n *\n *   The default texture color is used when loading textures from\n *   urls. Because the URL will be loaded async we'd like to be\n *   able to use the texture immediately. By putting a 1x1 pixel\n *   color in the texture we can start using the texture before\n *   the URL has loaded.\n *\n *   Default: `[0.5, 0.75, 1, 1]`\n *\n * @property {string} [crossOrigin]\n *\n *   If not undefined sets the crossOrigin attribute on images\n *   that twgl creates when downloading images for textures.\n *\n *   Also see {@link module:twgl.TextureOptions}.\n *\n * @property {bool} [addExtensionsToContext]\n *\n *   If true, then, when twgl will try to add any supported WebGL extensions\n *   directly to the context under their normal GL names. For example\n *   if ANGLE_instances_arrays exists then twgl would enable it,\n *   add the functions `vertexAttribDivisor`, `drawArraysInstanced`,\n *   `drawElementsInstanced`, and the constant `VERTEX_ATTRIB_ARRAY_DIVISOR`\n *   to the `WebGLRenderingContext`.\n *\n * @memberOf module:twgl\n */\n\n/**\n * Sets various defaults for twgl.\n *\n * In the interest of terseness which is kind of the point\n * of twgl I've integrated a few of the older functions here\n *\n * @param {module:twgl.Defaults} newDefaults The default settings.\n * @memberOf module:twgl\n */\nfunction setDefaults(newDefaults) {\n  copyExistingProperties(newDefaults, defaults);\n  setDefaults$2(newDefaults);  // eslint-disable-line\n  setDefaults$1(newDefaults);  // eslint-disable-line\n}\n\nconst prefixRE = /^(.*?)_/;\nfunction addExtensionToContext(gl, extensionName) {\n  glEnumToString(gl, 0);\n  const ext = gl.getExtension(extensionName);\n  if (ext) {\n    const enums = {};\n    const fnSuffix = prefixRE.exec(extensionName)[1];\n    const enumSuffix = '_' + fnSuffix;\n    for (const key in ext) {\n      const value = ext[key];\n      const isFunc = typeof (value) === 'function';\n      const suffix = isFunc ? fnSuffix : enumSuffix;\n      let name = key;\n      // examples of where this is not true are WEBGL_compressed_texture_s3tc\n      // and WEBGL_compressed_texture_pvrtc\n      if (key.endsWith(suffix)) {\n        name = key.substring(0, key.length - suffix.length);\n      }\n      if (gl[name] !== undefined) {\n        if (!isFunc && gl[name] !== value) {\n          warn$1(name, gl[name], value, key);\n        }\n      } else {\n        if (isFunc) {\n          gl[name] = function(origFn) {\n            return function() {\n              return origFn.apply(ext, arguments);\n            };\n          }(value);\n        } else {\n          gl[name] = value;\n          enums[name] = value;\n        }\n      }\n    }\n    // pass the modified enums to glEnumToString\n    enums.constructor = {\n      name: ext.constructor.name,\n    };\n    glEnumToString(enums, 0);\n  }\n  return ext;\n}\n\n/*\n * If you're wondering why the code doesn't just iterate\n * over all extensions using `gl.getExtensions` is that it's possible\n * some future extension is incompatible with this code. Rather than\n * have thing suddenly break it seems better to manually add to this\n * list.\n *\n */\nconst supportedExtensions = [\n  'ANGLE_instanced_arrays',\n  'EXT_blend_minmax',\n  'EXT_color_buffer_float',\n  'EXT_color_buffer_half_float',\n  'EXT_disjoint_timer_query',\n  'EXT_disjoint_timer_query_webgl2',\n  'EXT_frag_depth',\n  'EXT_sRGB',\n  'EXT_shader_texture_lod',\n  'EXT_texture_compression_bptc',\n  'EXT_texture_compression_rgtc',\n  'EXT_texture_filter_anisotropic',\n  'OES_element_index_uint',\n  'OES_standard_derivatives',\n  'OES_texture_float',\n  'OES_texture_float_linear',\n  'OES_texture_half_float',\n  'OES_texture_half_float_linear',\n  'OES_vertex_array_object',\n  'WEBGL_color_buffer_float',\n  'WEBGL_compressed_texture_atc',\n  'WEBGL_compressed_texture_etc1',\n  'WEBGL_compressed_texture_etc',\n  'WEBGL_compressed_texture_pvrtc',\n  'WEBGL_compressed_texture_s3tc',\n  'WEBGL_compressed_texture_s3tc_srgb',\n  'WEBGL_depth_texture',\n  'WEBGL_draw_buffers',\n];\n\n/**\n * Attempts to enable all of the following extensions\n * and add their functions and constants to the\n * `WebGLRenderingContext` using their normal non-extension like names.\n *\n *      ANGLE_instanced_arrays\n *      EXT_blend_minmax\n *      EXT_color_buffer_float\n *      EXT_color_buffer_half_float\n *      EXT_disjoint_timer_query\n *      EXT_disjoint_timer_query_webgl2\n *      EXT_frag_depth\n *      EXT_sRGB\n *      EXT_shader_texture_lod\n *      EXT_texture_filter_anisotropic\n *      OES_element_index_uint\n *      OES_standard_derivatives\n *      OES_texture_float\n *      OES_texture_float_linear\n *      OES_texture_half_float\n *      OES_texture_half_float_linear\n *      OES_vertex_array_object\n *      WEBGL_color_buffer_float\n *      WEBGL_compressed_texture_atc\n *      WEBGL_compressed_texture_etc1\n *      WEBGL_compressed_texture_pvrtc\n *      WEBGL_compressed_texture_s3tc\n *      WEBGL_compressed_texture_s3tc_srgb\n *      WEBGL_depth_texture\n *      WEBGL_draw_buffers\n *\n * For example if `ANGLE_instanced_arrays` exists then the functions\n * `drawArraysInstanced`, `drawElementsInstanced`, `vertexAttribDivisor`\n * and the constant `VERTEX_ATTRIB_ARRAY_DIVISOR` are added to the\n * `WebGLRenderingContext`.\n *\n * Note that if you want to know if the extension exists you should\n * probably call `gl.getExtension` for each extension. Alternatively\n * you can check for the existence of the functions or constants that\n * are expected to be added. For example\n *\n *    if (gl.drawBuffers) {\n *      // Either WEBGL_draw_buffers was enabled OR you're running in WebGL2\n *      ....\n *\n * @param {WebGLRenderingContext} gl A WebGLRenderingContext\n * @memberOf module:twgl\n */\nfunction addExtensionsToContext(gl) {\n  for (let ii = 0; ii < supportedExtensions.length; ++ii) {\n    addExtensionToContext(gl, supportedExtensions[ii]);\n  }\n}\n\n/**\n * Creates a webgl context.\n * @param {HTMLCanvasElement} canvas The canvas tag to get\n *     context from. If one is not passed in one will be\n *     created.\n * @return {WebGLRenderingContext} The created context.\n * @private\n */\nfunction create3DContext(canvas, opt_attribs) {\n  const names = [\"webgl\", \"experimental-webgl\"];\n  let context = null;\n  for (let ii = 0; ii < names.length; ++ii) {\n    context = canvas.getContext(names[ii], opt_attribs);\n    if (context) {\n      if (defaults.addExtensionsToContext) {\n        addExtensionsToContext(context);\n      }\n      break;\n    }\n  }\n  return context;\n}\n\n/**\n * Gets a WebGL1 context.\n *\n * Note: Will attempt to enable Vertex Array Objects\n * and add WebGL2 entry points. (unless you first set defaults with\n * `twgl.setDefaults({enableVertexArrayObjects: false})`;\n *\n * @param {HTMLCanvasElement} canvas a canvas element.\n * @param {WebGLContextAttributes} [opt_attribs] optional webgl context creation attributes\n * @return {WebGLRenderingContext} The created context.\n * @memberOf module:twgl\n * @deprecated\n * @private\n */\nfunction getWebGLContext(canvas, opt_attribs) {\n  const gl = create3DContext(canvas, opt_attribs);\n  return gl;\n}\n\n/**\n * Creates a webgl context.\n *\n * Will return a WebGL2 context if possible.\n *\n * You can check if it's WebGL2 with\n *\n *     twgl.isWebGL2(gl);\n *\n * @param {HTMLCanvasElement} canvas The canvas tag to get\n *     context from. If one is not passed in one will be\n *     created.\n * @return {WebGLRenderingContext} The created context.\n */\nfunction createContext(canvas, opt_attribs) {\n  const names = [\"webgl2\", \"webgl\", \"experimental-webgl\"];\n  let context = null;\n  for (let ii = 0; ii < names.length; ++ii) {\n    context = canvas.getContext(names[ii], opt_attribs);\n    if (context) {\n      if (defaults.addExtensionsToContext) {\n        addExtensionsToContext(context);\n      }\n      break;\n    }\n  }\n  return context;\n}\n\n/**\n * Gets a WebGL context.  Will create a WebGL2 context if possible.\n *\n * You can check if it's WebGL2 with\n *\n *    function isWebGL2(gl) {\n *      return gl.getParameter(gl.VERSION).indexOf(\"WebGL 2.0 \") == 0;\n *    }\n *\n * Note: For a WebGL1 context will attempt to enable Vertex Array Objects\n * and add WebGL2 entry points. (unless you first set defaults with\n * `twgl.setDefaults({enableVertexArrayObjects: false})`;\n *\n * @param {HTMLCanvasElement} canvas a canvas element.\n * @param {WebGLContextAttributes} [opt_attribs] optional webgl context creation attributes\n * @return {WebGLRenderingContext} The created context.\n * @memberOf module:twgl\n */\nfunction getContext(canvas, opt_attribs) {\n  const gl = createContext(canvas, opt_attribs);\n  return gl;\n}\n\n/**\n * Resize a canvas to match the size it's displayed.\n * @param {HTMLCanvasElement} canvas The canvas to resize.\n * @param {number} [multiplier] So you can pass in `window.devicePixelRatio` or other scale value if you want to.\n * @return {boolean} true if the canvas was resized.\n * @memberOf module:twgl\n */\nfunction resizeCanvasToDisplaySize(canvas, multiplier) {\n  multiplier = multiplier || 1;\n  multiplier = Math.max(0, multiplier);\n  const width  = canvas.clientWidth  * multiplier | 0;\n  const height = canvas.clientHeight * multiplier | 0;\n  if (canvas.width !== width || canvas.height !== height) {\n    canvas.width = width;\n    canvas.height = height;\n    return true;\n  }\n  return false;\n}\n\nexport { addExtensionsToContext, attributes, bindFramebufferInfo, bindTransformFeedbackInfo, bindUniformBlock, canFilter, canGenerateMipmap, createAttribsFromArrays, createAttributeSetters, createBufferFromArray, createBufferFromTypedArray, createBufferInfoFromArrays, createBuffersFromArrays, createFramebufferInfo, createProgram, createProgramAsync, createProgramFromScripts, createProgramFromSources, createProgramInfo, createProgramInfoAsync, createProgramInfoFromProgram, createProgramInfos, createProgramInfosAsync, createPrograms, createProgramsAsync, createSampler, createSamplers, createTexture, createTextureAsync, createTextures, createTexturesAsync, createTransformFeedback, createTransformFeedbackInfo, createUniformBlockInfo, createUniformBlockInfoFromProgram, createUniformBlockSpecFromProgram, createUniformSetters, createVAOAndSetAttributes, createVAOFromBufferInfo, createVertexArrayInfo, draw, drawBufferInfo, drawObjectList, framebuffers, getArray$1 as getArray_, getBytesPerElementForInternalFormat, getContext, getFormatAndTypeForInternalFormat, getGLTypeForTypedArray, getGLTypeForTypedArrayType, getNumComponentsForFormat, getNumComponents$1 as getNumComponents_, getTypedArrayTypeForGLType, getWebGLContext, glEnumToString, isArrayBuffer$1 as isArrayBuffer, isWebGL1, isWebGL2, loadTextureFromUrl, m4, primitives, programs, resizeCanvasToDisplaySize, resizeFramebufferInfo, resizeTexture, setAttribInfoBufferFromArray, setDefaults$2 as setAttributeDefaults_, setAttributePrefix, setAttributes, setBlockUniforms, setBuffersAndAttributes, setDefaultTextureColor, setDefaults, setEmptyTexture, setSamplerParameters, setDefaults$1 as setTextureDefaults_, setTextureFilteringForSize, setTextureFromArray, setTextureFromElement, setTextureParameters, setUniformBlock, setUniforms, setUniformsAndBindTextures, textures, typedarrays, utils, v3, vertexArrays };\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst EMPTY_PORTAL_ASSET_MANIFEST = Object.freeze({});\n\n/* Read the build-published asset manifest, or an empty identity fallback in dev/test contexts. */\nexport function portalAssetManifest() {\n    const manifest = globalThis.__PORTAL_STATIC_ASSET_MANIFEST__;\n    if (manifest && typeof manifest === 'object') {\n        return manifest;\n    }\n    return EMPTY_PORTAL_ASSET_MANIFEST;\n}\n\n/* Resolve one logical asset path to the build-published public URL path when available. */\nexport function resolvePortalAssetPath(path) {\n    const manifest = portalAssetManifest();\n    return manifest[path] ?? path;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { resolvePortalAssetPath } from './portal-asset-manifest.mjs';\n\nconst g_shaderSourcePromiseCache = new Map();\n\nconst DEFAULT_PORTAL_SHADER_PAIRS = Object.freeze([\n    ['lib/evilui/solid.vs.glsl', 'lib/evilui/solid.fs.glsl'],\n    ['lib/evilui/slab-anchor.vs.glsl', 'lib/evilui/slab-solid.fs.glsl'],\n    ['lib/evilui/tile-anchor.vs.glsl', 'lib/evilui/lit-tile.fs.glsl'],\n    ['lib/evilui/tile-anchor.vs.glsl', 'lib/evilui/beveled-tile.fs.glsl'],\n    ['lib/evilui/texture-tile-anchor.vs.glsl', 'lib/evilui/texture-tile.fs.glsl'],\n    ['lib/evilui/tile-anchor.vs.glsl', 'lib/evilui/icon-msdf.fs.glsl'],\n    ['lib/evilfont/evilfont.vs.glsl', 'lib/evilfont/evilfont.fs.glsl'],\n    ['lib/evilui/gl-picker.vs.glsl', 'lib/evilui/gl-picker.fs.glsl'],\n    ['lib/evilui/backdrop.vs.glsl', 'lib/evilui/backdrop.fs.glsl'],\n    ['lib/evilui/forward.vs.glsl', 'lib/evilui/viewport.fs.glsl'],\n    ['lib/evilui/solid.vs.glsl', 'lib/evilui/inner-shadow.fs.glsl'],\n    ['lib/evilui/forward.vs.glsl', 'lib/evilui/solid.fs.glsl'],\n    ['lib/evilui/scatterplot.vs.glsl', 'lib/evilui/scatterplot.fs.glsl'],\n    ['lib/evilui/scatterplot-picker.vs.glsl', 'lib/evilui/scatterplot-picker.fs.glsl'],\n    ['lib/evilui/scatterplot-tick.vs.glsl', 'lib/evilui/scatterplot-tick.fs.glsl'],\n    ['lib/evilui/mesh-instance.vs.glsl', 'lib/evilui/mesh-instance.fs.glsl'],\n    ['lib/evilui/damon.vs.glsl', 'lib/evilui/damon.fs.glsl'],\n]);\n\nconst SHADER_INCLUDE_RE = /^[ \\t]*#pragma[ \\t]+include[ \\t]+\"([^\"]+)\"[ \\t]*$/gm;\n\n/* Resolve one logical portal asset path against the document/app root after manifest remapping. */\nfunction resolvePortalAssetURL(filename) {\n    const resolvedPath = resolvePortalAssetPath(filename);\n    if (typeof document !== 'undefined' && document.baseURI) {\n        return new URL(resolvedPath, document.baseURI);\n    }\n    const moduleURL = new URL(import.meta.url);\n    const appRoot = moduleURL.pathname.includes('/lib/')\n        ? new URL('../', moduleURL)\n        : new URL('./', moduleURL);\n    return new URL(resolvedPath, appRoot);\n}\n\n/**\n    This is the standard way to find out the class of an object\n    (apparently...), but its a bit verbose, hence the wrapper.\n*/\nexport function typed(t) {\n    return Object.prototype.toString.call(t);\n}\n\nexport function dumpMatrix(label, m) {\n    console.log(label);\n    for (let r = 0; r < 4; r++) {\n        const cell0 = m[r * 4 + 0];\n        const cell1 = m[r * 4 + 1];\n        const cell2 = m[r * 4 + 2];\n        const cell3 = m[r * 4 + 3];\n\n        console.log(`    ${cell0}  ${cell1}  ${cell2}  ${cell3}`);\n    }\n}\n\n/* Fetch one raw text asset once and keep the pending fetch promise stable across callers. */\nasync function loadTextAsset(filename) {\n    const resolvedPath = resolvePortalAssetPath(filename);\n    const assetURL = resolvePortalAssetURL(filename);\n    const fetchOptions = resolvedPath === filename ? { cache: 'no-store' } : undefined;\n    const resp = await fetch(assetURL, fetchOptions);\n    if (!resp.ok) {\n        throw new Error(`Failed to fetch asset ${filename}: ${resp.status} ${resp.statusText}`);\n    }\n    return await resp.text();\n}\n\n/* Expand simple shader includes recursively so shared GLSL helpers can stay authoritative. */\nasync function expandShaderIncludes(filename, source, seen = new Set()) {\n    if (seen.has(filename)) {\n        throw new Error(`Shader include cycle detected at ${filename}.`);\n    }\n    seen.add(filename);\n    let out = '';\n    let last = 0;\n    for (const match of source.matchAll(SHADER_INCLUDE_RE)) {\n        const index = match.index ?? 0;\n        out += source.slice(last, index);\n        const includeName = match[1];\n        const includeSource = await loadTextAsset(includeName);\n        out += await expandShaderIncludes(includeName, includeSource, new Set(seen));\n        last = index + match[0].length;\n    }\n    out += source.slice(last);\n    return out;\n}\n\n\n// Read in two text files in parallel\nexport async function loadSource(vsFilename, fsFilename) {\n    const key = `${vsFilename}|${fsFilename}`;\n    let promise = g_shaderSourcePromiseCache.get(key);\n    if (!promise) {\n        promise = (async () => {\n            try {\n                const [vsSrc, fsSrc] = await Promise.all([\n                    loadTextAsset(vsFilename),\n                    loadTextAsset(fsFilename),\n                ]);\n                return await Promise.all([\n                    expandShaderIncludes(vsFilename, vsSrc),\n                    expandShaderIncludes(fsFilename, fsSrc),\n                ]);\n            } catch (error) {\n                g_shaderSourcePromiseCache.delete(key);\n                console.error('Error fetching text files:', error);\n                throw error;\n            }\n        })();\n        g_shaderSourcePromiseCache.set(key, promise);\n    }\n\n    return await promise;\n}\n\nexport async function preloadPortalShaders(pairs = DEFAULT_PORTAL_SHADER_PAIRS) {\n    await Promise.all(pairs.map(([vsFilename, fsFilename]) => loadSource(vsFilename, fsFilename)));\n}\n\n\nexport function downloadFileBuffer(buffer, filename) {\n    try {\n        /*\n            Create a blob with the already fetched buffer,\n            create a link/URL with the blob and click on it.\n        */\n        const blob = new Blob([buffer], { type: 'application/octet-stream' });\n\n        const objectUrl = window.URL.createObjectURL(blob);\n\n        const link = document.createElement('a');\n        link.href = objectUrl;\n        link.download = filename;\n        document.body.appendChild(link);\n        link.click();\n\n        // Clean up the DOM and memory\n        document.body.removeChild(link);\n        window.URL.revokeObjectURL(objectUrl);\n\n    } catch (error) {\n        console.error('There was an error downloading the file:', error);\n    }\n}\n\n\n/*\n    Recursively traverses a node tree and invokes a named method on each node that defines it.\n    The traversal is depth-first and propagates the call to all\n    descendant nodes, passing the provided arguments to each invocation.\n*/\nexport function propagateMethod(node, methodName, ...args) {\n    if (!node) return;\n\n    if (typeof node[methodName] === \"function\") {\n        node[methodName](...args);\n    }\n\n    if (node.children) {\n        for (const child of node.children) {\n            propagateMethod(child, methodName, ...args);\n        }\n    }\n}\n\n/**\n    Explore a matrix transformation by showing how the origin and some basis\n    vectors transform.\n*/\nexport function probeMatrix(label, m) {\n    let show = (what, x) => {\n        const y = twgl.m4.transformPoint(m, x);\n        console.log(`    ${what} [${x}] --> [${y}]`);\n    };\n\n    console.log(`${label} ${typed(m)}:`);\n    show('origin', [0, 0, 0, 1]);\n    show('highest', [1.0, 1.0, 0.0, 1]);\n    show('lowest', [-1.0, -1.0, 0.0, 1]);\n    show('out-of-page', [0.0, 0.0, 1.0, 1]);\n    show('in-to-page', [0.0, 0.0, -1.0, 1]);\n}\n\n/**\n    Explore a matrix transformation by showing how the origin and some basis\n    vectors transform.\n*/\nexport function probeStack(label, stack) {\n    console.log('raw mats\\n');\n    for (let i = 0; i < stack.length; i++) {\n        dumpMatrix(`${i} = `, stack[i]);\n    }\n\n    console.log('cooked mats\\n');\n    let soFar = twgl.m4.identity();\n    for (let i = stack.length - 1; i >= 0; i--) {\n        soFar = twgl.m4.multiply(stack[i], soFar);\n        probeMatrix(`${label} stack [${i}, ${stack.length - 1}]`, soFar);\n    }\n}\n\nfunction det2d(a, b, c, d) {\n    return a * d - b * c;\n}\n\n/**\n    Specialised matrix inverse for almost-orthogonal matrices.\n\n    Almost means an orthogonal upper-left 3x3 within a constant factor, plus a\n    pure translation. The last column (w divide) must be [0, 0, 0, 1].\n\n    Decompose matrix as product (a O X) where a is a real scalar, O is an\n    orthogonal matrix in the upper-left 3x3 block (with 0/1 in last row/col)\n    and X is a pure translation.\n\n        (a O X)^-1  ==  1/a  *  X^-1 O^-1\n                    ==  1/a  *  X^-1 O^T\n\n    NB: O and X both have determinant 1, so any determinant factor ends up in a.\n*/\nexport function matrixInverseOrthogonal(m) {\n    const m00 = m[0 * 4 + 0];\n    const m01 = m[0 * 4 + 1];\n    const m02 = m[0 * 4 + 2];\n    const m03 = m[0 * 4 + 3];\n    const m10 = m[1 * 4 + 0];\n    const m11 = m[1 * 4 + 1];\n    const m12 = m[1 * 4 + 2];\n    const m13 = m[1 * 4 + 3];\n    const m20 = m[2 * 4 + 0];\n    const m21 = m[2 * 4 + 1];\n    const m22 = m[2 * 4 + 2];\n    const m23 = m[2 * 4 + 3];\n    const m30 = m[3 * 4 + 0];\n    const m31 = m[3 * 4 + 1];\n    const m32 = m[3 * 4 + 2];\n    const m33 = m[3 * 4 + 3];\n\n    // Cofactor expansion along first row\n    let det = 0;\n    det += m00 * det2d(m11, m12,\n        m21, m22);\n    det += m01 * det2d(m10, m12,\n        m20, m22);\n    det += m02 * det2d(m10, m11,\n        m20, m21);\n    const s = 1 / det;\n\n    // 1) Transpose the upper left 3x3\n    // 2) Negate the translation\n    // 3) Divide through by determinant\n    return new Float32Array([\n        s * m00, s * m10, s * m20, 0,\n        s * m01, s * m11, s * m21, 0,\n        s * m02, s * m12, s * m22, 0,\n        -m30, -m31, -m32, s\n    ]);\n}\n\nexport function clamp(num, min, max) {\n    if (num < min) return min;\n    if (num > max) return max;\n    return num;\n}\n\nexport function normalize2(vec2){\n    let norm = norm2(vec2)\n    if(norm <= 0.00001){\n        return [0 , 0]\n    }\n    return [vec2[0] / norm, vec2[1] / norm] \n}\n\nexport function normalize3(vec3){\n    let norm = norm3(vec3);\n    if(norm <= 0.00001){\n        return [0 , 0 , 0]\n    }\n    return [vec3[0] / norm, vec3[1] / norm, vec3[2] / norm] \n}\n\nexport function norm2(vec2){\n    return Math.sqrt(vec2[0] * vec2[0] + vec2[1] * vec2[1]);\n}\n\nexport function norm3(vec3){\n    return Math.sqrt(vec3[0] * vec3[0] + vec3[1] * vec3[1] + vec3[2] * vec3[2]);\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const JS_MILLISECONDS_PER_SECOND = 1000.0;\nexport const SI_SECONDS_PER_DAY = 86400.0;\nconst JS_MILLISECONDS_PER_DAY = SI_SECONDS_PER_DAY * JS_MILLISECONDS_PER_SECOND;\nlet g_evilEpochJSMs = null;\n\n/* Fail fast on non-finite time inputs so animation and shader plumbing do not inherit silent junk. */\nfunction assertFiniteTime(value, label) {\n    if (!Number.isFinite(value)) {\n        throw new Error(`eviltime ${label} must be finite; got ${value}.`);\n    }\n}\n\n/* Use the previous UTC midnight as the moving epoch so SI seconds stay close to \"today\" for GPU-facing paths. */\nexport function currentEvilEpochJSTime(nowMs = Date.now()) {\n    assertFiniteTime(nowMs, 'nowMs');\n    const day = Math.floor(nowMs / JS_MILLISECONDS_PER_DAY);\n    return (day - 1) * JS_MILLISECONDS_PER_DAY;\n}\n\n/* Initialise the process-global Evil epoch once near startup so later time reads stay stable across midnight. */\nexport function initEvilEpoch(nowMs = Date.now()) {\n    g_evilEpochJSMs = currentEvilEpochJSTime(nowMs);\n    return g_evilEpochJSMs;\n}\n\n/* Return the startup-fixed Evil epoch, lazily seeding it only if startup has not done so yet. */\nexport function evilEpochJSTime(nowMs = Date.now()) {\n    if (g_evilEpochJSMs == null) {\n        return initEvilEpoch(nowMs);\n    }\n    return g_evilEpochJSMs;\n}\n\n/* Reset the global epoch in tests so each case can assert startup seeding deterministically. */\nexport function resetEvilEpochForTesting() {\n    g_evilEpochJSMs = null;\n}\n\n/* Convert absolute JS time in milliseconds since 1970 to Evil time in SI seconds from a recent epoch. */\nexport function evilFromJSTime(jsMs, epochMs = null) {\n    assertFiniteTime(jsMs, 'jsMs');\n    if (epochMs == null) {\n        epochMs = evilEpochJSTime(jsMs);\n    }\n    assertFiniteTime(epochMs, 'epochMs');\n    return (jsMs - epochMs) / JS_MILLISECONDS_PER_SECOND;\n}\n\n/* Convert Evil time in SI seconds back to absolute JS time in milliseconds using the matching epoch. */\nexport function jsTimeFromEvil(seconds, epochMs = evilEpochJSTime()) {\n    assertFiniteTime(seconds, 'seconds');\n    assertFiniteTime(epochMs, 'epochMs');\n    return epochMs + seconds * JS_MILLISECONDS_PER_SECOND;\n}\n\n/* Sample the current time once and return a stable snapshot containing both the recent epoch and the SI-seconds value. */\nexport function currentEvilSnapshot(nowMs = Date.now()) {\n    assertFiniteTime(nowMs, 'nowMs');\n    const epochMs = evilEpochJSTime(nowMs);\n    return {\n        now_js_ms: nowMs,\n        epoch_js_ms: epochMs,\n        now_s: evilFromJSTime(nowMs, epochMs),\n    };\n}\n\n/* Return the current Evil time as a scalar SI-seconds value from the recent moving epoch. */\nexport function currentEvil(nowMs = Date.now()) {\n    return currentEvilSnapshot(nowMs).now_s;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\n\n//very simple so far but needed to track active events\nexport class Controls {\n    activeEvents = new Set();\n    wheelDeltaX = 0;\n    wheelDeltaY = 0;\n    wheelDeltaMode = 0;\n    frameDeltaTime = 0;\n\n    [Symbol.iterator]() {\n        return this.activeEvents[Symbol.iterator]();\n    }\n\n    has(event) {\n        return this.activeEvents.has(event);\n    }\n\n    noteWheel(deltaX, deltaY, deltaMode) {\n        this.wheelDeltaX += deltaX;\n        this.wheelDeltaY += deltaY;\n        this.wheelDeltaMode = deltaMode;\n    }\n\n    clearFrame() {\n        this.activeEvents.clear();\n        this.wheelDeltaX = 0;\n        this.wheelDeltaY = 0;\n        this.wheelDeltaMode = 0;\n        this.frameDeltaTime = 0;\n    }\n}\n\nexport class Mouse {\n    // Mouse position on screen normalized (0.0 to 1.0)\n    static x = 0;\n    static y = 0;\n    static lastX = 0;\n    static lastY = 0;\n    static deltaX = 0;\n    static deltaY = 0;\n    static clientX = 0;\n    static clientY = 0;\n    static canvasRect = null;\n    \n    static inside = false;\n    static seq = 0;\n    static leftDown = false;\n    static rightDown = false;\n    static leftDownSeq = -1;\n    static rightDownSeq = -1;\n    static canvas = null;\n\n    // To execute on portal setup along with all callbacks\n    static bindCanvas(_canvas) {\n        Mouse.canvas = _canvas;\n    }\n\n    static toggleMouseLock(state) {\n        if (state) {\n            // Enter Pointer Lock\n            if (Mouse.canvas) {\n                const requestLock = Mouse.canvas.requestPointerLock || Mouse.canvas.mozRequestPointerLock;\n                requestLock?.call(Mouse.canvas);\n            }\n        } else {\n            // Exit Pointer Lock (This is always called on the document)\n            if (typeof document !== 'undefined') {\n                const exitLock = document.exitPointerLock || document.mozExitPointerLock;\n                exitLock?.call(document);\n            }\n        }\n    }\n\n    // Unified function to handle both locked and unlocked state while maintaining logic\n    static handleMouseMove(canvas, event) {\n        let nextX = Mouse.x;\n        let nextY = Mouse.y;\n\n        // 1. Check native pointer lock state safely\n        const isLocked = document.pointerLockElement === canvas || \n                         document.mozPointerLockElement === canvas;\n\n        // 2. Calculate the targeted next coordinates\n        if (isLocked) {\n            // POINTER LOCKED: Accumulate raw movement deltas\n            const mX = (event.movementX || event.mozMovementX || 0) / canvas.clientWidth;\n            const mY = (event.movementY || event.mozMovementY || 0) / canvas.clientHeight;\n            nextX += mX;\n            nextY += mY;\n        } else {\n            // STANDARD MODE: Calculate based on bounding rect\n            let rect = canvas.getBoundingClientRect();\n            Mouse.clientX = event.clientX;\n            Mouse.clientY = event.clientY;\n            Mouse.canvasRect = {\n                left: rect.left,\n                top: rect.top,\n                width: rect.width,\n                height: rect.height,\n            };\n            nextX = (event.clientX - rect.left) / rect.width;\n            nextY = (event.clientY - rect.top) / rect.height;\n        }\n\n        // 3. Process changes and maintain sequence/inside logic\n        const changed = Mouse.x !== nextX || Mouse.y !== nextY || !Mouse.inside;\n        \n        if (changed) {\n            Mouse.deltaX = nextX - Mouse.x;\n            Mouse.deltaY = nextY - Mouse.y;\n            Mouse.x = nextX;\n            Mouse.y = nextY;\n            Mouse.seq += 1;\n        } else {\n            Mouse.deltaX = 0;\n            Mouse.deltaY = 0;\n        }\n        \n        Mouse.inside = true;\n    }\n\n    static leave() {\n        if (!Mouse.inside) {\n            return;\n        }\n        Mouse.inside = false;\n        Mouse.seq += 1;\n    }\n\n    static setButtonDown(button, down) {\n        if (button === 0) {\n            Mouse.leftDown = down;\n            Mouse.leftDownSeq = down ? Mouse.seq : -1;\n            return;\n        }\n        if (button === 2) {\n            Mouse.rightDown = down;\n            Mouse.rightDownSeq = down ? Mouse.seq : -1;\n            return;\n        }\n        throw new Error(`Mouse.setButtonDown(${button}, ${down}): unsupported button.`);\n    }\n\n    static movedSinceButtonDown(button) {\n        if (button === 0) {\n            return Mouse.leftDown && Mouse.seq !== Mouse.leftDownSeq;\n        }\n        if (button === 2) {\n            return Mouse.rightDown && Mouse.seq !== Mouse.rightDownSeq;\n        }\n        throw new Error(`Mouse.movedSinceButtonDown(${button}): unsupported button.`);\n    }\n\n    static commitFrame() {\n        Mouse.lastX = Mouse.x;\n        Mouse.lastY = Mouse.y;\n    }\n\n    static mouseMoved() {\n        return Mouse.x !== Mouse.lastX || Mouse.y !== Mouse.lastY;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst GPU_BREADCRUMB_LIMIT = 256;\nconst GPU_DIAGNOSTICS_ENABLED = true;\nconst GPU_HEARTBEAT_MIN_INTERVAL_MS = 5000;\nconst GPU_DRAW_HEARTBEAT_MIN_INTERVAL_MS = 30000;\nconst GPU_SCATTERPLOT_LIMIT = 16;\nconst GPU_PICKER_EVENT_MIN_INTERVAL_MS = 5000;\nconst GPU_TEXT_GROUP_LIMIT = 16;\nconst GPU_TEXT_NODE_LIMIT = 64;\nconst GPU_BUTTON_VISUAL_LIMIT = 32;\nconst GPU_PICKER_RESOURCE_LIMIT = 32;\nconst GPU_TILE_GROUP_LIMIT = 32;\nconst GPU_DIRTY_RESOURCE_LIMIT = 64;\nconst GPU_SUMMARY_TOP_LIMIT = 5;\nconst GPU_RESOURCE_ORIGIN_LIMIT = 256;\nconst GPU_RESOURCE_TYPES = Object.freeze([\n    'buffer',\n    'texture',\n    'program',\n    'shader',\n    'framebuffer',\n    'renderbuffer',\n    'vertex_array',\n]);\nconst GPU_BYTE_TYPES = Object.freeze([\n    'buffer',\n    'texture',\n    'renderbuffer',\n]);\n\nconst g_gpuDiagnostics = {\n    seq: 1,\n    breadcrumbs: [],\n    context: {\n        id: null,\n        created_at_ms: null,\n        restored_at_ms: null,\n    },\n    frame: {\n        stamp: 0,\n        last_heartbeat_at_ms: 0,\n        last_heartbeat_draw_count: 0,\n        last_draw_at_ms: 0,\n        last_phase: '',\n        last_phase_at_ms: 0,\n        draw_count: 0,\n        activity: null,\n        activity_counts: {\n            frames: 0,\n            user_input: 0,\n            mouse_moved: 0,\n            direct_pick: 0,\n            passive_pick: 0,\n            camera_matrix_changed: 0,\n            camera_motion: 0,\n            renderless: 0,\n            scene_not_fully_rendered: 0,\n        },\n        activity_reason_counts: {\n            active_events: {},\n            direct_pick: {},\n            passive_pick: {},\n            camera_motion: {},\n            camera_mode: {},\n        },\n    },\n    gl: {\n        last_error: null,\n        draw_error_count: 0,\n    },\n    resources: {\n        current_context_id: null,\n        live: zeroCounts(),\n        high_water: zeroCounts(),\n        created: zeroCounts(),\n        deleted: zeroCounts(),\n        originStack: [],\n        origins: new Map(),\n    },\n    memory: {\n        live_bytes: zeroByteCounts(),\n        high_water_bytes: zeroByteCounts(),\n        uploaded_bytes: zeroByteCounts(),\n        upload_events: zeroByteCounts(),\n        readbacks: {\n            count: 0,\n            total_pixels: 0,\n            last_at_ms: 0,\n            last_duration_ms: 0,\n            max_duration_ms: 0,\n            picker_count: 0,\n            last_picker_id: 0,\n            last_read_width: 0,\n            last_read_height: 0,\n        },\n    },\n    picker: {\n        trigger_count: 0,\n        kind_counts: {},\n        reason_counts: {},\n        gl_fallback_attempt_count: 0,\n        gl_fallback_reason_counts: {},\n        last_kind: '',\n        last_reason: '',\n        last_trigger_at_ms: 0,\n        dirty_resources: new Map(),\n    },\n    dirty: {\n        resources: new Map(),\n    },\n    scene: {\n        presentation_revision: 0,\n        presentation_reason_counts: {},\n        last_presentation: null,\n    },\n    tile: {\n        groups: new Map(),\n    },\n    text: {\n        groups: new Map(),\n        nodes: new Map(),\n        buttons: new Map(),\n    },\n    scatterplot: {\n        by_key: new Map(),\n        draw_heartbeat_by_key: new Map(),\n        rebuild_count: 0,\n        draw_count: 0,\n    },\n};\n\nfunction nowMS() {\n    return Date.now();\n}\n\nfunction perfMS() {\n    return Math.round(performance.now() * 1000) / 1000;\n}\n\n/* Convert one absolute wall-clock timestamp into a compact relative age. */\nfunction ageMS(atMS, now = nowMS()) {\n    if (!Number.isFinite(atMS) || atMS <= 0) {\n        return null;\n    }\n    return Math.max(0, Math.round((now - atMS) * 1000) / 1000);\n}\n\n/* Rebase user-facing compact snapshot timestamps from absolute values to ages. */\nfunction compactTimingFields(value, now = nowMS()) {\n    if (Array.isArray(value)) {\n        return value.map((entry) => compactTimingFields(entry, now));\n    }\n    if (!value || typeof value !== 'object') {\n        return value;\n    }\n    const out = {};\n    for (const [key, entry] of Object.entries(value)) {\n        if (key === 'at_ms') {\n            out.age_ms = ageMS(entry, now);\n            continue;\n        }\n        if (key.endsWith('_at_ms')) {\n            out[`${key.slice(0, -6)}_age_ms`] = ageMS(entry, now);\n            continue;\n        }\n        out[key] = compactTimingFields(entry, now);\n    }\n    return out;\n}\n\nfunction zeroCounts() {\n    const counts = {};\n    for (const type of GPU_RESOURCE_TYPES) {\n        counts[type] = 0;\n    }\n    return counts;\n}\n\nfunction zeroByteCounts() {\n    const counts = {};\n    for (const type of GPU_BYTE_TYPES) {\n        counts[type] = 0;\n    }\n    return counts;\n}\n\nfunction cloneCounts(counts) {\n    const out = {};\n    for (const type of GPU_RESOURCE_TYPES) {\n        out[type] = counts?.[type] ?? 0;\n    }\n    return out;\n}\n\nfunction cloneByteCounts(counts) {\n    const out = {};\n    for (const type of GPU_BYTE_TYPES) {\n        out[type] = counts?.[type] ?? 0;\n    }\n    return out;\n}\n\nfunction diffCounts(after, before, keys) {\n    const out = {};\n    for (const key of keys) {\n        out[key] = (after?.[key] ?? 0) - (before?.[key] ?? 0);\n    }\n    return out;\n}\n\nfunction cloneKeyCounts(counts) {\n    return Object.fromEntries(\n        Object.entries(counts ?? {}).sort(([a], [b]) => a.localeCompare(b)),\n    );\n}\n\n/* Clone the current frame-activity payload into plain JSON-ready data. */\nfunction cloneFrameActivity(activity) {\n    if (!activity) {\n        return null;\n    }\n    return {\n        frame_stamp: activity.frame_stamp ?? 0,\n        raf_mode: activity.raf_mode ?? '',\n        renderless: !!activity.renderless,\n        scene_fully_rendered: !!activity.scene_fully_rendered,\n        user_input: !!activity.user_input,\n        direct_pick_input: !!activity.direct_pick_input,\n        mouse_inside: !!activity.mouse_inside,\n        mouse_moved: !!activity.mouse_moved,\n        active_event_count: activity.active_event_count ?? 0,\n        active_events: Array.isArray(activity.active_events) ? [...activity.active_events] : [],\n        click_events: Array.isArray(activity.click_events) ? [...activity.click_events] : [],\n        did_direct_pick: !!activity.did_direct_pick,\n        direct_pick_reason: activity.direct_pick_reason ?? '',\n        did_passive_pick: !!activity.did_passive_pick,\n        passive_pick_reason: activity.passive_pick_reason ?? '',\n        camera_matrix_changed: !!activity.camera_matrix_changed,\n        camera: activity.camera ? {\n            mode: activity.camera.mode ?? '',\n            moving: !!activity.camera.moving,\n            reasons: Array.isArray(activity.camera.reasons) ? [...activity.camera.reasons] : [],\n            velocity: Array.isArray(activity.camera.velocity) ? [...activity.camera.velocity] : [0, 0, 0],\n            current_throw_velocity: Array.isArray(activity.camera.current_throw_velocity)\n                ? [...activity.camera.current_throw_velocity]\n                : [0, 0, 0],\n            zoom_velocity: activity.camera.zoom_velocity ?? 0,\n            wheel_velocity_y: activity.camera.wheel_velocity_y ?? 0,\n            free_look_delta: Array.isArray(activity.camera.free_look_delta) ? [...activity.camera.free_look_delta] : [0, 0],\n            free_active_keys: Array.isArray(activity.camera.free_active_keys) ? [...activity.camera.free_active_keys] : [],\n        } : null,\n    };\n}\n\n/* Copy cumulative frame-activity counts into a stable sorted object for summaries. */\nfunction cloneFrameActivityCounts(counts) {\n    return {\n        frames: counts?.frames ?? 0,\n        user_input: counts?.user_input ?? 0,\n        mouse_moved: counts?.mouse_moved ?? 0,\n        direct_pick: counts?.direct_pick ?? 0,\n        passive_pick: counts?.passive_pick ?? 0,\n        camera_matrix_changed: counts?.camera_matrix_changed ?? 0,\n        camera_motion: counts?.camera_motion ?? 0,\n        renderless: counts?.renderless ?? 0,\n        scene_not_fully_rendered: counts?.scene_not_fully_rendered ?? 0,\n    };\n}\n\n/* Keep per-frame cause counters sorted so heartbeat diffs stay legible. */\nfunction cloneFrameActivityReasonCounts(reasonCounts) {\n    return {\n        active_events: cloneKeyCounts(reasonCounts?.active_events),\n        direct_pick: cloneKeyCounts(reasonCounts?.direct_pick),\n        passive_pick: cloneKeyCounts(reasonCounts?.passive_pick),\n        camera_motion: cloneKeyCounts(reasonCounts?.camera_motion),\n        camera_mode: cloneKeyCounts(reasonCounts?.camera_mode),\n    };\n}\n\n/* Diff two cumulative key-count objects into the same compact top-N shape used elsewhere. */\nfunction diffKeyCountObjects(first = {}, last = {}, limit = GPU_SUMMARY_TOP_LIMIT) {\n    return diffTopCountEntries(topCountEntries(first, Number.MAX_SAFE_INTEGER), topCountEntries(last, Number.MAX_SAFE_INTEGER), limit);\n}\n\nfunction bumpKeyCount(counts, key) {\n    const k = key || '<none>';\n    counts[k] = (counts[k] ?? 0) + 1;\n    return k;\n}\n\nfunction sumCounts(counts, keys) {\n    let total = 0;\n    for (const key of keys) {\n        total += counts?.[key] ?? 0;\n    }\n    return total;\n}\n\n/* Convert a key-count object into a sorted top-N list for compact heartbeat snapshots. */\nfunction topCountEntries(counts, limit = GPU_SUMMARY_TOP_LIMIT) {\n    return Object.entries(counts ?? {})\n        .filter(([, count]) => count > 0)\n        .sort(([aKey, aCount], [bKey, bCount]) => {\n            if (aCount !== bCount) {\n                return bCount - aCount;\n            }\n            return aKey.localeCompare(bKey);\n        })\n        .slice(0, limit)\n        .map(([key, count]) => ({ key, count }));\n}\n\n/* Diff two compact top-N snapshots by key so heartbeat windows still expose the main movers. */\nfunction diffTopCountEntries(first = [], last = [], limit = GPU_SUMMARY_TOP_LIMIT) {\n    const counts = new Map();\n    for (const entry of first ?? []) {\n        counts.set(entry.key, (counts.get(entry.key) ?? 0) - (entry.count ?? 0));\n    }\n    for (const entry of last ?? []) {\n        counts.set(entry.key, (counts.get(entry.key) ?? 0) + (entry.count ?? 0));\n    }\n    return Array.from(counts.entries())\n        .map(([key, delta]) => ({ key, delta }))\n        .filter((entry) => entry.delta !== 0)\n        .sort((a, b) => {\n            if (a.delta !== b.delta) {\n                return b.delta - a.delta;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, limit);\n}\n\nfunction ratePerMinute(delta, windowMS) {\n    if (!Number.isFinite(delta) || delta === 0 || !Number.isFinite(windowMS) || windowMS <= 0) {\n        return 0;\n    }\n    return Math.round((delta * 60000 / windowMS) * 100) / 100;\n}\n\n/* Clamp cumulative-counter diffs at zero so window summaries stay robust against reset boundaries. */\nfunction nonNegativeDelta(after, before) {\n    return Math.max(0, (after ?? 0) - (before ?? 0));\n}\n\n/* Snapshot Chromium heap counters when available so context-loss reports can distinguish JS drift from GL drift. */\nfunction snapshotHeapMemory() {\n    const mem = globalThis.performance?.memory ?? null;\n    if (!mem) {\n        return null;\n    }\n    return {\n        js_heap_size_limit: mem.jsHeapSizeLimit ?? null,\n        total_js_heap_size: mem.totalJSHeapSize ?? null,\n        used_js_heap_size: mem.usedJSHeapSize ?? null,\n    };\n}\n\nfunction currentOrigin() {\n    const stack = g_gpuDiagnostics.resources.originStack;\n    return stack.length > 0 ? stack[stack.length - 1] : '<unknown>';\n}\n\n/* Prefer evicting settled per-origin entries so active resource owners stay visible for longer. */\nfunction canEvictOriginState(state) {\n    return sumCounts(state?.live, GPU_RESOURCE_TYPES) === 0\n        && sumCounts(state?.live_bytes, GPU_BYTE_TYPES) === 0;\n}\n\n/* Keep per-origin diagnostics bounded so long scrolling sessions do not retain one entry per transient origin. */\nfunction trimOriginStates(limit = GPU_RESOURCE_ORIGIN_LIMIT) {\n    const origins = g_gpuDiagnostics.resources.origins;\n    if (origins.size <= limit) {\n        return;\n    }\n    for (const [origin, state] of origins) {\n        if (origins.size <= limit) {\n            return;\n        }\n        if (!canEvictOriginState(state)) {\n            continue;\n        }\n        origins.delete(origin);\n    }\n    while (origins.size > limit) {\n        const first = origins.keys().next();\n        if (first.done) {\n            return;\n        }\n        origins.delete(first.value);\n    }\n}\n\nfunction getOriginState(origin) {\n    let state = g_gpuDiagnostics.resources.origins.get(origin);\n    if (state) {\n        return state;\n    }\n    state = {\n        origin,\n        live: zeroCounts(),\n        high_water: zeroCounts(),\n        created: zeroCounts(),\n        deleted: zeroCounts(),\n        live_bytes: zeroByteCounts(),\n        high_water_bytes: zeroByteCounts(),\n        uploaded_bytes: zeroByteCounts(),\n        upload_events: zeroByteCounts(),\n    };\n    g_gpuDiagnostics.resources.origins.set(origin, state);\n    trimOriginStates();\n    return state;\n}\n\nfunction cloneOriginState(state) {\n    return {\n        origin: state.origin,\n        live: cloneCounts(state.live),\n        high_water: cloneCounts(state.high_water),\n        created: cloneCounts(state.created),\n        deleted: cloneCounts(state.deleted),\n        live_bytes: cloneByteCounts(state.live_bytes),\n        high_water_bytes: cloneByteCounts(state.high_water_bytes),\n        uploaded_bytes: cloneByteCounts(state.uploaded_bytes),\n        upload_events: cloneByteCounts(state.upload_events),\n    };\n}\n\nfunction sortOriginStates(states) {\n    return states.sort((a, b) => {\n        const aLive = sumCounts(a.live, GPU_RESOURCE_TYPES);\n        const bLive = sumCounts(b.live, GPU_RESOURCE_TYPES);\n        if (aLive !== bLive) {\n            return bLive - aLive;\n        }\n        const aLiveBytes = sumCounts(a.live_bytes, GPU_BYTE_TYPES);\n        const bLiveBytes = sumCounts(b.live_bytes, GPU_BYTE_TYPES);\n        if (aLiveBytes !== bLiveBytes) {\n            return bLiveBytes - aLiveBytes;\n        }\n        const aUploadedBytes = sumCounts(a.uploaded_bytes, GPU_BYTE_TYPES);\n        const bUploadedBytes = sumCounts(b.uploaded_bytes, GPU_BYTE_TYPES);\n        if (aUploadedBytes !== bUploadedBytes) {\n            return bUploadedBytes - aUploadedBytes;\n        }\n        const aCreated = sumCounts(a.created, GPU_RESOURCE_TYPES);\n        const bCreated = sumCounts(b.created, GPU_RESOURCE_TYPES);\n        if (aCreated !== bCreated) {\n            return bCreated - aCreated;\n        }\n        return a.origin.localeCompare(b.origin);\n    });\n}\n\nfunction trackCreate(type, origin) {\n    g_gpuDiagnostics.resources.created[type] += 1;\n    g_gpuDiagnostics.resources.live[type] += 1;\n    g_gpuDiagnostics.resources.high_water[type] = Math.max(\n        g_gpuDiagnostics.resources.high_water[type],\n        g_gpuDiagnostics.resources.live[type],\n    );\n    const state = getOriginState(origin);\n    state.created[type] += 1;\n    state.live[type] += 1;\n    state.high_water[type] = Math.max(state.high_water[type], state.live[type]);\n}\n\nfunction trackDelete(type, origin) {\n    g_gpuDiagnostics.resources.deleted[type] += 1;\n    g_gpuDiagnostics.resources.live[type] = Math.max(\n        0,\n        g_gpuDiagnostics.resources.live[type] - 1,\n    );\n    const state = getOriginState(origin);\n    state.deleted[type] += 1;\n    state.live[type] = Math.max(0, state.live[type] - 1);\n}\n\n/* Track both retained bytes and upload pressure so heartbeats can separate churn from leaks. */\nfunction trackBytes(type, origin, prevBytes, nextBytes, uploadedBytes = 0, uploadEvents = 0) {\n    const delta = nextBytes - prevBytes;\n    g_gpuDiagnostics.memory.live_bytes[type] = Math.max(0, g_gpuDiagnostics.memory.live_bytes[type] + delta);\n    g_gpuDiagnostics.memory.high_water_bytes[type] = Math.max(\n        g_gpuDiagnostics.memory.high_water_bytes[type],\n        g_gpuDiagnostics.memory.live_bytes[type],\n    );\n    g_gpuDiagnostics.memory.uploaded_bytes[type] += Math.max(0, uploadedBytes);\n    g_gpuDiagnostics.memory.upload_events[type] += Math.max(0, uploadEvents);\n\n    const state = getOriginState(origin);\n    state.live_bytes[type] = Math.max(0, state.live_bytes[type] + delta);\n    state.high_water_bytes[type] = Math.max(state.high_water_bytes[type], state.live_bytes[type]);\n    state.uploaded_bytes[type] += Math.max(0, uploadedBytes);\n    state.upload_events[type] += Math.max(0, uploadEvents);\n}\n\n/* Snapshot the current tracked GL resource state for loss reports and tests. */\nfunction resourceSummary() {\n    const origins = sortOriginStates(\n        Array.from(g_gpuDiagnostics.resources.origins.values()).map(cloneOriginState),\n    );\n    return {\n        live: cloneCounts(g_gpuDiagnostics.resources.live),\n        high_water: cloneCounts(g_gpuDiagnostics.resources.high_water),\n        created: cloneCounts(g_gpuDiagnostics.resources.created),\n        deleted: cloneCounts(g_gpuDiagnostics.resources.deleted),\n        current_context_id: g_gpuDiagnostics.resources.current_context_id,\n        bytes: {\n            live: cloneByteCounts(g_gpuDiagnostics.memory.live_bytes),\n            high_water: cloneByteCounts(g_gpuDiagnostics.memory.high_water_bytes),\n            uploaded: cloneByteCounts(g_gpuDiagnostics.memory.uploaded_bytes),\n            upload_events: cloneByteCounts(g_gpuDiagnostics.memory.upload_events),\n        },\n        readbacks: { ...g_gpuDiagnostics.memory.readbacks },\n        origins,\n    };\n}\n\n/* Keep heartbeats compact by storing only the main per-origin totals needed for later diffs. */\nfunction summarizeOriginSnapshot(origins, limit = 5) {\n    return (Array.isArray(origins) ? origins : [])\n        .slice(0, limit)\n        .map((state) => ({\n            origin: state.origin,\n            live_total: sumCounts(state.live, GPU_RESOURCE_TYPES),\n            live_bytes_total: sumCounts(state.live_bytes, GPU_BYTE_TYPES),\n            uploaded_bytes_total: sumCounts(state.uploaded_bytes, GPU_BYTE_TYPES),\n            uploaded_buffer_bytes: state.uploaded_bytes?.buffer ?? 0,\n            uploaded_texture_bytes: state.uploaded_bytes?.texture ?? 0,\n            upload_buffer_events: state.upload_events?.buffer ?? 0,\n            upload_texture_events: state.upload_events?.texture ?? 0,\n        }));\n}\n\n/* Diff per-origin heartbeat snapshots so the loss bundle can name the loudest churn sources. */\nfunction diffOriginSnapshots(first = [], last = []) {\n    const firstByOrigin = new Map(first.map((entry) => [entry.origin, entry]));\n    const lastByOrigin = new Map(last.map((entry) => [entry.origin, entry]));\n    const origins = new Set([...firstByOrigin.keys(), ...lastByOrigin.keys()]);\n    const out = [];\n    for (const origin of origins) {\n        const a = firstByOrigin.get(origin) ?? {};\n        const b = lastByOrigin.get(origin) ?? {};\n        out.push({\n            origin,\n            live_total_delta: (b.live_total ?? 0) - (a.live_total ?? 0),\n            live_bytes_total_delta: (b.live_bytes_total ?? 0) - (a.live_bytes_total ?? 0),\n            uploaded_bytes_total_delta: (b.uploaded_bytes_total ?? 0) - (a.uploaded_bytes_total ?? 0),\n            uploaded_buffer_bytes_delta: (b.uploaded_buffer_bytes ?? 0) - (a.uploaded_buffer_bytes ?? 0),\n            uploaded_texture_bytes_delta: (b.uploaded_texture_bytes ?? 0) - (a.uploaded_texture_bytes ?? 0),\n            upload_buffer_events_delta: (b.upload_buffer_events ?? 0) - (a.upload_buffer_events ?? 0),\n            upload_texture_events_delta: (b.upload_texture_events ?? 0) - (a.upload_texture_events ?? 0),\n        });\n    }\n    return out\n        .filter((entry) => entry.live_total_delta !== 0\n            || entry.live_bytes_total_delta !== 0\n            || entry.uploaded_bytes_total_delta !== 0\n            || entry.uploaded_buffer_bytes_delta !== 0\n            || entry.uploaded_texture_bytes_delta !== 0\n            || entry.upload_buffer_events_delta !== 0\n            || entry.upload_texture_events_delta !== 0)\n        .sort((a, b) => {\n            if (a.live_bytes_total_delta !== b.live_bytes_total_delta) {\n                return b.live_bytes_total_delta - a.live_bytes_total_delta;\n            }\n            if (a.uploaded_bytes_total_delta !== b.uploaded_bytes_total_delta) {\n                return b.uploaded_bytes_total_delta - a.uploaded_bytes_total_delta;\n            }\n            if (a.live_total_delta !== b.live_total_delta) {\n                return b.live_total_delta - a.live_total_delta;\n            }\n            return a.origin.localeCompare(b.origin);\n        });\n}\n\n/* Summarise text activity counters so context-loss reports can show sync/upload hot spots without the full raw map. */\nfunction summarizeTextSnapshot(text = g_gpuDiagnostics.text) {\n    const groups = Array.from(text?.groups?.values?.() ?? []);\n    const totals = {\n        dirty_count: 0,\n        sync_count: 0,\n        drop_count: 0,\n        span_upload_count: 0,\n        span_skip_count: 0,\n        unchanged_span_upload_count: 0,\n        unchanged_span_skip_count: 0,\n        unchanged_span_blocked_missing_texture_count: 0,\n        sync_needs_create_count: 0,\n        sync_full_dirty_count: 0,\n        sync_instance_dirty_count: 0,\n        sync_full_rebuild_count: 0,\n        sync_instance_only_count: 0,\n        transform_only_sync_count: 0,\n        transform_only_span_changed_count: 0,\n        instance_propagation_count: 0,\n    };\n    const syncReasonCounts = {};\n    const dropSourceCounts = {};\n    const spanBlockReasonCounts = {};\n    const instancePropagationSourceCounts = {};\n    const instancePropagationReasonCounts = {};\n    for (const entry of groups) {\n        totals.dirty_count += entry.dirty_count ?? 0;\n        totals.sync_count += entry.sync_count ?? 0;\n        totals.drop_count += entry.drop_count ?? 0;\n        totals.span_upload_count += entry.span_upload_count ?? 0;\n        totals.span_skip_count += entry.span_skip_count ?? 0;\n        totals.unchanged_span_upload_count += entry.unchanged_span_upload_count ?? 0;\n        totals.unchanged_span_skip_count += entry.unchanged_span_skip_count ?? 0;\n        totals.unchanged_span_blocked_missing_texture_count += entry.unchanged_span_blocked_missing_texture_count ?? 0;\n        totals.sync_needs_create_count += entry.sync_needs_create_count ?? 0;\n        totals.sync_full_dirty_count += entry.sync_full_dirty_count ?? 0;\n        totals.sync_instance_dirty_count += entry.sync_instance_dirty_count ?? 0;\n        totals.sync_full_rebuild_count += entry.sync_full_rebuild_count ?? 0;\n        totals.sync_instance_only_count += entry.sync_instance_only_count ?? 0;\n        totals.transform_only_sync_count += entry.transform_only_sync_count ?? 0;\n        totals.transform_only_span_changed_count += entry.transform_only_span_changed_count ?? 0;\n        totals.instance_propagation_count += sumCounts(\n            entry.instance_propagation_source_counts,\n            Object.keys(entry.instance_propagation_source_counts ?? {}),\n        );\n        for (const [key, count] of Object.entries(entry.sync_reason_counts ?? {})) {\n            syncReasonCounts[key] = (syncReasonCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.drop_source_counts ?? {})) {\n            dropSourceCounts[key] = (dropSourceCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.span_block_reason_counts ?? {})) {\n            spanBlockReasonCounts[key] = (spanBlockReasonCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.instance_propagation_source_counts ?? {})) {\n            instancePropagationSourceCounts[key] = (instancePropagationSourceCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.instance_propagation_reason_counts ?? {})) {\n            instancePropagationReasonCounts[key] = (instancePropagationReasonCounts[key] ?? 0) + count;\n        }\n    }\n    return {\n        totals,\n        sync_reason_counts: cloneKeyCounts(syncReasonCounts),\n        drop_source_counts: cloneKeyCounts(dropSourceCounts),\n        span_block_reason_counts: cloneKeyCounts(spanBlockReasonCounts),\n        instance_propagation_source_counts: cloneKeyCounts(instancePropagationSourceCounts),\n        instance_propagation_reason_counts: cloneKeyCounts(instancePropagationReasonCounts),\n        groups_by_span_skip_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.span_skip_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        groups_by_span_upload_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.span_upload_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        groups_by_sync_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.sync_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        groups_by_drop_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.drop_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        groups_by_instance_propagation_count: groups\n            .map((entry) => ({\n                key: entry.key,\n                count: sumCounts(entry.instance_propagation_source_counts, Object.keys(entry.instance_propagation_source_counts ?? {})),\n            }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n    };\n}\n\n/* Summarise tile sync mode counts so context-loss reports can distinguish fast-path use from rebuild churn. */\nfunction summarizeTileSnapshot(tile = g_gpuDiagnostics.tile) {\n    const groups = Array.from(tile?.groups?.values?.() ?? []);\n    const totals = {\n        sync_count: 0,\n        full_rebuild_count: 0,\n        instance_update_count: 0,\n        transform_only_sync_count: 0,\n        full_instance_sync_count: 0,\n        empty_batch_count: 0,\n        upload_bytes: 0,\n        transform_only_upload_bytes: 0,\n        full_instance_upload_bytes: 0,\n        rebuild_upload_bytes: 0,\n    };\n    const dirtyKindCounts = {};\n    const propagationReasonCounts = {};\n    for (const entry of groups) {\n        totals.sync_count += entry.sync_count ?? 0;\n        totals.full_rebuild_count += entry.full_rebuild_count ?? 0;\n        totals.instance_update_count += entry.instance_update_count ?? 0;\n        totals.transform_only_sync_count += entry.transform_only_sync_count ?? 0;\n        totals.full_instance_sync_count += entry.full_instance_sync_count ?? 0;\n        totals.empty_batch_count += entry.empty_batch_count ?? 0;\n        totals.upload_bytes += entry.upload_bytes ?? 0;\n        totals.transform_only_upload_bytes += entry.transform_only_upload_bytes ?? 0;\n        totals.full_instance_upload_bytes += entry.full_instance_upload_bytes ?? 0;\n        totals.rebuild_upload_bytes += entry.rebuild_upload_bytes ?? 0;\n        for (const [key, count] of Object.entries(entry.dirty_kind_counts ?? {})) {\n            dirtyKindCounts[key] = (dirtyKindCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.propagation_reason_counts ?? {})) {\n            propagationReasonCounts[key] = (propagationReasonCounts[key] ?? 0) + count;\n        }\n    }\n    return {\n        totals,\n        dirty_kind_counts: cloneKeyCounts(dirtyKindCounts),\n        propagation_reason_counts: cloneKeyCounts(propagationReasonCounts),\n        top_groups_by_full_rebuild_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.full_rebuild_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        top_groups_by_transform_only_sync_count: groups\n            .map((entry) => ({ key: entry.key, count: entry.transform_only_sync_count ?? 0 }))\n            .filter((entry) => entry.count > 0)\n            .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        top_groups_by_upload_bytes: groups\n            .map((entry) => ({ key: entry.key, bytes: entry.upload_bytes ?? 0 }))\n            .filter((entry) => entry.bytes > 0)\n            .sort((a, b) => b.bytes - a.bytes || a.key.localeCompare(b.key))\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n    };\n}\n\n/* Summarise picker cadence and the dirtiest resources for compact heartbeat snapshots. */\nfunction summarizePickerSnapshot(picker = g_gpuDiagnostics.picker) {\n    const dirtyResources = Array.from(picker?.dirty_resources?.values?.() ?? [])\n        .map((entry) => ({\n            key: entry.key,\n            outstanding: Math.max(0, (entry.batch_mark_count ?? 0) - (entry.batch_clear_count ?? 0))\n                + Math.max(0, (entry.pose_mark_count ?? 0) - (entry.pose_clear_count ?? 0)),\n            batch_mark_count: entry.batch_mark_count ?? 0,\n            pose_mark_count: entry.pose_mark_count ?? 0,\n            trigger_count: sumCounts(entry.trigger_reason_counts, Object.keys(entry.trigger_reason_counts ?? {})),\n        }))\n        .filter((entry) => entry.outstanding > 0 || entry.trigger_count > 0)\n        .sort((a, b) => {\n            if (a.outstanding !== b.outstanding) {\n                return b.outstanding - a.outstanding;\n            }\n            if (a.trigger_count !== b.trigger_count) {\n                return b.trigger_count - a.trigger_count;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, GPU_SUMMARY_TOP_LIMIT);\n    return {\n        trigger_count: picker?.trigger_count ?? 0,\n        kind_counts: cloneKeyCounts(picker?.kind_counts),\n        reason_counts: cloneKeyCounts(picker?.reason_counts),\n        gl_fallback_attempt_count: picker?.gl_fallback_attempt_count ?? 0,\n        gl_fallback_reason_counts: cloneKeyCounts(picker?.gl_fallback_reason_counts),\n        dirty_resources_top: dirtyResources,\n    };\n}\n\n/* Roll up who kept dirtying resources so loss reports can identify recurring invalidation paths. */\nfunction summarizeDirtySnapshot() {\n    const labelCounts = {};\n    const sourceCounts = {};\n    const sourcePathCounts = {};\n    const kindCounts = {};\n    const instancePropagationSourceCounts = {};\n    const instancePropagationReasonCounts = {};\n    let totalDirtyCount = 0;\n\n    for (const entry of g_gpuDiagnostics.dirty.resources.values()) {\n        totalDirtyCount += entry.dirty_count ?? 0;\n        labelCounts[entry.key] = (labelCounts[entry.key] ?? 0) + (entry.dirty_count ?? 0);\n        for (const [key, count] of Object.entries(entry.source_counts ?? {})) {\n            sourceCounts[key] = (sourceCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.source_path_counts ?? {})) {\n            sourcePathCounts[key] = (sourcePathCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.dirty_kind_counts ?? {})) {\n            kindCounts[key] = (kindCounts[key] ?? 0) + count;\n        }\n    }\n\n    for (const entry of g_gpuDiagnostics.text.groups.values()) {\n        for (const [key, count] of Object.entries(entry.instance_propagation_source_counts ?? {})) {\n            instancePropagationSourceCounts[key] = (instancePropagationSourceCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.instance_propagation_reason_counts ?? {})) {\n            instancePropagationReasonCounts[key] = (instancePropagationReasonCounts[key] ?? 0) + count;\n        }\n    }\n    for (const entry of g_gpuDiagnostics.text.nodes.values()) {\n        for (const [key, count] of Object.entries(entry.propagation_source_counts ?? {})) {\n            instancePropagationSourceCounts[key] = (instancePropagationSourceCounts[key] ?? 0) + count;\n        }\n        for (const [key, count] of Object.entries(entry.propagation_reason_counts ?? {})) {\n            instancePropagationReasonCounts[key] = (instancePropagationReasonCounts[key] ?? 0) + count;\n        }\n    }\n    return {\n        total_dirty_count: totalDirtyCount,\n        top_dirty_labels: topCountEntries(labelCounts),\n        top_dirty_sources: topCountEntries(sourceCounts),\n        top_dirty_source_paths: topCountEntries(sourcePathCounts),\n        top_dirty_kinds: topCountEntries(kindCounts),\n        top_instance_propagation_sources: topCountEntries(instancePropagationSourceCounts),\n        top_instance_propagation_reasons: topCountEntries(instancePropagationReasonCounts),\n    };\n}\n\n/* Summarise current frame cadence from heartbeat-local counters rather than only the last draw timestamp. */\nfunction summarizeFrameRuntimeSnapshot() {\n    return {\n        draw_count: g_gpuDiagnostics.frame.draw_count,\n        last_draw_at_ms: g_gpuDiagnostics.frame.last_draw_at_ms,\n        draw_gap_ms: Math.max(0, nowMS() - (g_gpuDiagnostics.frame.last_draw_at_ms ?? 0)),\n        last_phase: g_gpuDiagnostics.frame.last_phase,\n        frame_stamp: g_gpuDiagnostics.frame.stamp,\n        activity: cloneFrameActivity(g_gpuDiagnostics.frame.activity),\n        activity_counts: cloneFrameActivityCounts(g_gpuDiagnostics.frame.activity_counts),\n        activity_reason_counts: cloneFrameActivityReasonCounts(g_gpuDiagnostics.frame.activity_reason_counts),\n    };\n}\n\n/* Summarise current context churn so loss bundles expose create/delete/upload pressure at a glance. */\nfunction summarizeContextRuntimeSnapshot(contextCreatedAtMS = null, reportCount = 0) {\n    return {\n        context_age_ms: contextCreatedAtMS ? Math.max(0, nowMS() - contextCreatedAtMS) : null,\n        reports_this_context: reportCount ?? 0,\n        resource_creates: cloneCounts(g_gpuDiagnostics.resources.created),\n        resource_deletes: cloneCounts(g_gpuDiagnostics.resources.deleted),\n        upload_events: cloneByteCounts(g_gpuDiagnostics.memory.upload_events),\n    };\n}\n\n/* Summarise whether recent frame heartbeats show rising live resources or upload pressure. */\nfunction summarizeHeartbeatTrendFromBreadcrumbs(breadcrumbs) {\n    const heartbeats = (Array.isArray(breadcrumbs) ? breadcrumbs : []).filter((entry) => entry?.event === 'gpu_frame_heartbeat');\n    if (heartbeats.length === 0) {\n        return null;\n    }\n    const first = heartbeats[0];\n    const last = heartbeats[heartbeats.length - 1];\n    const windowMS = Math.max(0, (last.at_ms ?? 0) - (first.at_ms ?? 0));\n    const resourcesLiveDelta = diffCounts(last.resources_live, first.resources_live, GPU_RESOURCE_TYPES);\n    const resourceBytesLiveDelta = diffCounts(last.resource_bytes_live, first.resource_bytes_live, GPU_BYTE_TYPES);\n    const resourceUploadedBytesDelta = diffCounts(last.resource_uploaded_bytes, first.resource_uploaded_bytes, GPU_BYTE_TYPES);\n    const resourceUploadEventsDelta = diffCounts(last.resource_upload_events, first.resource_upload_events, GPU_BYTE_TYPES);\n    const originDeltas = diffOriginSnapshots(first.resource_origins_top, last.resource_origins_top);\n    const firstHeap = first.performance_memory ?? null;\n    const lastHeap = last.performance_memory ?? null;\n    const heapSamples = heartbeats\n        .map((entry) => entry.performance_memory?.used_js_heap_size ?? null)\n        .filter((value) => Number.isFinite(value));\n    const heapMin = heapSamples.length > 0 ? Math.min(...heapSamples) : null;\n    const heapMax = heapSamples.length > 0 ? Math.max(...heapSamples) : null;\n    let sawtoothDrops = 0;\n    for (let i = 1; i < heapSamples.length; i++) {\n        if (heapSamples[i] < heapSamples[i - 1]) {\n            sawtoothDrops += 1;\n        }\n    }\n    const pickerTriggerDelta = Math.max(0, (last.picker_summary?.trigger_count ?? 0) - (first.picker_summary?.trigger_count ?? 0));\n    const frameCountDelta = Math.max(0, (last.draw_count ?? 0) - (first.draw_count ?? 0));\n    const drawsSince = heartbeats.map((entry) => entry.draws_since_last_heartbeat ?? 0);\n    const heartbeatWithoutDrawCount = drawsSince.filter((count) => count === 0).length;\n    const drawGapSamples = heartbeats.map((entry) => entry.draw_gap_ms ?? 0);\n    const firstActivityCounts = first.frame_activity_counts ?? {};\n    const lastActivityCounts = last.frame_activity_counts ?? {};\n    const firstActivityReasons = first.frame_activity_reason_counts ?? {};\n    const lastActivityReasons = last.frame_activity_reason_counts ?? {};\n    return {\n        heartbeat_count: heartbeats.length,\n        first_at_ms: first.at_ms ?? null,\n        last_at_ms: last.at_ms ?? null,\n        window_ms: windowMS,\n        first_frame_stamp: first.frame_stamp ?? null,\n        last_frame_stamp: last.frame_stamp ?? null,\n        frame_stamp_delta: Math.max(0, (last.frame_stamp ?? 0) - (first.frame_stamp ?? 0)),\n        resources_live_delta: resourcesLiveDelta,\n        resource_bytes_live_delta: resourceBytesLiveDelta,\n        resource_uploaded_bytes_delta: resourceUploadedBytesDelta,\n        resource_upload_events_delta: resourceUploadEventsDelta,\n        readbacks_delta: {\n            count: Math.max(0, (last.readbacks?.count ?? 0) - (first.readbacks?.count ?? 0)),\n            total_pixels: Math.max(0, (last.readbacks?.total_pixels ?? 0) - (first.readbacks?.total_pixels ?? 0)),\n            picker_count: Math.max(0, (last.readbacks?.picker_count ?? 0) - (first.readbacks?.picker_count ?? 0)),\n        },\n        rising_live_resource_types: GPU_RESOURCE_TYPES.filter((type) => resourcesLiveDelta[type] > 0),\n        rising_live_byte_types: GPU_BYTE_TYPES.filter((type) => resourceBytesLiveDelta[type] > 0),\n        top_origin_deltas: originDeltas.slice(0, 5),\n        top_uploaded_byte_origins: [...originDeltas]\n            .sort((a, b) => b.uploaded_bytes_total_delta - a.uploaded_bytes_total_delta || a.origin.localeCompare(b.origin))\n            .filter((entry) => entry.uploaded_bytes_total_delta > 0)\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        top_buffer_upload_origins: [...originDeltas]\n            .sort((a, b) => b.uploaded_buffer_bytes_delta - a.uploaded_buffer_bytes_delta || a.origin.localeCompare(b.origin))\n            .filter((entry) => entry.uploaded_buffer_bytes_delta > 0 || entry.upload_buffer_events_delta > 0)\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        top_texture_upload_origins: [...originDeltas]\n            .sort((a, b) => b.uploaded_texture_bytes_delta - a.uploaded_texture_bytes_delta || a.origin.localeCompare(b.origin))\n            .filter((entry) => entry.uploaded_texture_bytes_delta > 0 || entry.upload_texture_events_delta > 0)\n            .slice(0, GPU_SUMMARY_TOP_LIMIT),\n        heap_summary: firstHeap && lastHeap ? {\n            js_heap_size_limit: lastHeap.js_heap_size_limit ?? firstHeap.js_heap_size_limit ?? null,\n            first_used_js_heap_size: firstHeap.used_js_heap_size ?? null,\n            last_used_js_heap_size: lastHeap.used_js_heap_size ?? null,\n            heap_used_delta: Math.max(0, (lastHeap.used_js_heap_size ?? 0) - (firstHeap.used_js_heap_size ?? 0)),\n            heap_peak: heapMax,\n            heap_floor: heapMin,\n            heap_growth_rate_per_min: ratePerMinute((lastHeap.used_js_heap_size ?? 0) - (firstHeap.used_js_heap_size ?? 0), windowMS),\n            gc_sawtooth: sawtoothDrops > 0,\n            trend_kind: sawtoothDrops > 0 ? 'sawtooth' : ((lastHeap.used_js_heap_size ?? 0) > (firstHeap.used_js_heap_size ?? 0) ? 'monotonic_growth' : 'flat_or_down'),\n        } : null,\n        text_summary: {\n            total_sync_delta: Math.max(0, (last.text_summary?.totals?.sync_count ?? 0) - (first.text_summary?.totals?.sync_count ?? 0)),\n            total_drop_delta: Math.max(0, (last.text_summary?.totals?.drop_count ?? 0) - (first.text_summary?.totals?.drop_count ?? 0)),\n            total_span_upload_delta: Math.max(0, (last.text_summary?.totals?.span_upload_count ?? 0) - (first.text_summary?.totals?.span_upload_count ?? 0)),\n            total_span_skip_delta: Math.max(0, (last.text_summary?.totals?.span_skip_count ?? 0) - (first.text_summary?.totals?.span_skip_count ?? 0)),\n            unchanged_span_upload_delta: Math.max(0, (last.text_summary?.totals?.unchanged_span_upload_count ?? 0) - (first.text_summary?.totals?.unchanged_span_upload_count ?? 0)),\n            unchanged_span_skip_delta: Math.max(0, (last.text_summary?.totals?.unchanged_span_skip_count ?? 0) - (first.text_summary?.totals?.unchanged_span_skip_count ?? 0)),\n            unchanged_span_blocked_missing_texture_delta: Math.max(0, (last.text_summary?.totals?.unchanged_span_blocked_missing_texture_count ?? 0) - (first.text_summary?.totals?.unchanged_span_blocked_missing_texture_count ?? 0)),\n            transform_only_sync_delta: Math.max(0, (last.text_summary?.totals?.transform_only_sync_count ?? 0) - (first.text_summary?.totals?.transform_only_sync_count ?? 0)),\n            transform_only_span_changed_delta: Math.max(0, (last.text_summary?.totals?.transform_only_span_changed_count ?? 0) - (first.text_summary?.totals?.transform_only_span_changed_count ?? 0)),\n            instance_propagation_delta: Math.max(0, (last.text_summary?.totals?.instance_propagation_count ?? 0) - (first.text_summary?.totals?.instance_propagation_count ?? 0)),\n            groups_by_span_skip_count: last.text_summary?.groups_by_span_skip_count ?? [],\n            groups_by_span_upload_count: last.text_summary?.groups_by_span_upload_count ?? [],\n            groups_by_sync_count: last.text_summary?.groups_by_sync_count ?? [],\n            groups_by_drop_count: last.text_summary?.groups_by_drop_count ?? [],\n            groups_by_instance_propagation_count: last.text_summary?.groups_by_instance_propagation_count ?? [],\n            sync_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.sync_reason_counts),\n                topCountEntries(last.text_summary?.sync_reason_counts),\n            ),\n            drop_source_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.drop_source_counts),\n                topCountEntries(last.text_summary?.drop_source_counts),\n            ),\n            span_block_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.span_block_reason_counts),\n                topCountEntries(last.text_summary?.span_block_reason_counts),\n            ),\n            instance_propagation_source_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.instance_propagation_source_counts),\n                topCountEntries(last.text_summary?.instance_propagation_source_counts),\n            ),\n            instance_propagation_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.instance_propagation_reason_counts),\n                topCountEntries(last.text_summary?.instance_propagation_reason_counts),\n            ),\n            sync_gate_deltas: {\n                needs_create: Math.max(0, (last.text_summary?.totals?.sync_needs_create_count ?? 0) - (first.text_summary?.totals?.sync_needs_create_count ?? 0)),\n                full_dirty: Math.max(0, (last.text_summary?.totals?.sync_full_dirty_count ?? 0) - (first.text_summary?.totals?.sync_full_dirty_count ?? 0)),\n                instance_dirty: Math.max(0, (last.text_summary?.totals?.sync_instance_dirty_count ?? 0) - (first.text_summary?.totals?.sync_instance_dirty_count ?? 0)),\n                full_rebuild: Math.max(0, (last.text_summary?.totals?.sync_full_rebuild_count ?? 0) - (first.text_summary?.totals?.sync_full_rebuild_count ?? 0)),\n                instance_only: Math.max(0, (last.text_summary?.totals?.sync_instance_only_count ?? 0) - (first.text_summary?.totals?.sync_instance_only_count ?? 0)),\n            },\n        },\n        picker_summary: {\n            trigger_count_delta: pickerTriggerDelta,\n            picker_triggers_per_min: ratePerMinute(pickerTriggerDelta, windowMS),\n            picker_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.picker_summary?.reason_counts),\n                topCountEntries(last.picker_summary?.reason_counts),\n            ),\n            top_picker_dirty_resources: last.picker_summary?.dirty_resources_top ?? [],\n        },\n        dirty_summary: {\n            total_dirty_delta: Math.max(0, (last.dirty_summary?.total_dirty_count ?? 0) - (first.dirty_summary?.total_dirty_count ?? 0)),\n            top_dirty_labels: diffTopCountEntries(first.dirty_summary?.top_dirty_labels, last.dirty_summary?.top_dirty_labels),\n            top_dirty_sources: diffTopCountEntries(first.dirty_summary?.top_dirty_sources, last.dirty_summary?.top_dirty_sources),\n            top_dirty_source_paths: diffTopCountEntries(first.dirty_summary?.top_dirty_source_paths, last.dirty_summary?.top_dirty_source_paths),\n            top_dirty_kinds: diffTopCountEntries(first.dirty_summary?.top_dirty_kinds, last.dirty_summary?.top_dirty_kinds),\n            top_instance_propagation_sources: diffTopCountEntries(\n                first.dirty_summary?.top_instance_propagation_sources,\n                last.dirty_summary?.top_instance_propagation_sources,\n            ),\n            top_instance_propagation_reasons: diffTopCountEntries(\n                first.dirty_summary?.top_instance_propagation_reasons,\n                last.dirty_summary?.top_instance_propagation_reasons,\n            ),\n        },\n        frame_summary: {\n            frames_in_window: frameCountDelta,\n            avg_frame_gap_ms: frameCountDelta > 0 ? Math.round((windowMS / frameCountDelta) * 100) / 100 : null,\n            max_frame_gap_ms: drawGapSamples.length > 0 ? Math.max(...drawGapSamples) : null,\n            heartbeat_without_draw_count: heartbeatWithoutDrawCount,\n        },\n        frame_activity_summary: {\n            counts_delta: {\n                frames: Math.max(0, (lastActivityCounts.frames ?? 0) - (firstActivityCounts.frames ?? 0)),\n                user_input: Math.max(0, (lastActivityCounts.user_input ?? 0) - (firstActivityCounts.user_input ?? 0)),\n                mouse_moved: Math.max(0, (lastActivityCounts.mouse_moved ?? 0) - (firstActivityCounts.mouse_moved ?? 0)),\n                direct_pick: Math.max(0, (lastActivityCounts.direct_pick ?? 0) - (firstActivityCounts.direct_pick ?? 0)),\n                passive_pick: Math.max(0, (lastActivityCounts.passive_pick ?? 0) - (firstActivityCounts.passive_pick ?? 0)),\n                camera_matrix_changed: Math.max(0, (lastActivityCounts.camera_matrix_changed ?? 0) - (firstActivityCounts.camera_matrix_changed ?? 0)),\n                camera_motion: Math.max(0, (lastActivityCounts.camera_motion ?? 0) - (firstActivityCounts.camera_motion ?? 0)),\n                renderless: Math.max(0, (lastActivityCounts.renderless ?? 0) - (firstActivityCounts.renderless ?? 0)),\n                scene_not_fully_rendered: Math.max(0, (lastActivityCounts.scene_not_fully_rendered ?? 0) - (firstActivityCounts.scene_not_fully_rendered ?? 0)),\n            },\n            last_activity: cloneFrameActivity(last.frame_activity),\n            active_event_deltas: diffKeyCountObjects(firstActivityReasons.active_events, lastActivityReasons.active_events),\n            direct_pick_reason_deltas: diffKeyCountObjects(firstActivityReasons.direct_pick, lastActivityReasons.direct_pick),\n            passive_pick_reason_deltas: diffKeyCountObjects(firstActivityReasons.passive_pick, lastActivityReasons.passive_pick),\n            camera_motion_reason_deltas: diffKeyCountObjects(firstActivityReasons.camera_motion, lastActivityReasons.camera_motion),\n            camera_mode_deltas: diffKeyCountObjects(firstActivityReasons.camera_mode, lastActivityReasons.camera_mode),\n        },\n        context_summary: {\n            context_age_ms: last.context_age_ms ?? null,\n            reports_this_context: last.context_reports ?? 0,\n            resource_creates_in_window: diffCounts(last.resources_created, first.resources_created, GPU_RESOURCE_TYPES),\n            resource_deletes_in_window: diffCounts(last.resources_deleted, first.resources_deleted, GPU_RESOURCE_TYPES),\n            upload_events_in_window: resourceUploadEventsDelta,\n        },\n    };\n}\n\nfunction trimScatterplotMap(map) {\n    while (map.size > GPU_SCATTERPLOT_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimTextMap(map) {\n    while (map.size > GPU_TEXT_GROUP_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimTextNodeMap(map) {\n    while (map.size > GPU_TEXT_NODE_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimButtonVisualMap(map) {\n    while (map.size > GPU_BUTTON_VISUAL_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimPickerResourceMap(map) {\n    while (map.size > GPU_PICKER_RESOURCE_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimTileMap(map) {\n    while (map.size > GPU_TILE_GROUP_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction trimDirtyResourceMap(map) {\n    while (map.size > GPU_DIRTY_RESOURCE_LIMIT) {\n        const oldest = map.keys().next().value;\n        map.delete(oldest);\n    }\n}\n\nfunction getTileEntry(key) {\n    let entry = g_gpuDiagnostics.tile.groups.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        sync_count: 0,\n        full_rebuild_count: 0,\n        instance_update_count: 0,\n        transform_only_sync_count: 0,\n        full_instance_sync_count: 0,\n        empty_batch_count: 0,\n        upload_bytes: 0,\n        transform_only_upload_bytes: 0,\n        full_instance_upload_bytes: 0,\n        rebuild_upload_bytes: 0,\n        dirty_kind_counts: {},\n        propagation_reason_counts: {},\n        owner_path_counts: {},\n        owner_class_counts: {},\n        owner_name_counts: {},\n        last_sync: null,\n    };\n    g_gpuDiagnostics.tile.groups.set(key, entry);\n    trimTileMap(g_gpuDiagnostics.tile.groups);\n    return entry;\n}\n\nfunction getDirtyResourceEntry(key) {\n    let entry = g_gpuDiagnostics.dirty.resources.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        dirty_count: 0,\n        dirty_kind_counts: {},\n        source_counts: {},\n        source_path_counts: {},\n        last_dirty: null,\n    };\n    g_gpuDiagnostics.dirty.resources.set(key, entry);\n    trimDirtyResourceMap(g_gpuDiagnostics.dirty.resources);\n    return entry;\n}\n\nfunction getTextEntry(key) {\n    let entry = g_gpuDiagnostics.text.groups.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        dirty_count: 0,\n        sync_count: 0,\n        drop_count: 0,\n        span_upload_count: 0,\n        span_skip_count: 0,\n        unchanged_span_upload_count: 0,\n        unchanged_span_skip_count: 0,\n        unchanged_span_blocked_missing_texture_count: 0,\n        dirty_source_counts: {},\n        dirty_kind_counts: {},\n        sync_reason_counts: {},\n        drop_source_counts: {},\n        span_block_reason_counts: {},\n        picker_flag_counts: {},\n        instance_propagation_source_counts: {},\n        instance_propagation_reason_counts: {},\n        sync_needs_create_count: 0,\n        sync_full_dirty_count: 0,\n        sync_instance_dirty_count: 0,\n        sync_full_rebuild_count: 0,\n        sync_instance_only_count: 0,\n        transform_only_sync_count: 0,\n        transform_only_span_changed_count: 0,\n        last_dirty: null,\n        last_instance_propagation: null,\n        last_sync: null,\n        last_drop: null,\n        last_span_upload: null,\n    };\n    g_gpuDiagnostics.text.groups.set(key, entry);\n    trimTextMap(g_gpuDiagnostics.text.groups);\n    return entry;\n}\n\nfunction getTextNodeEntry(key) {\n    let entry = g_gpuDiagnostics.text.nodes.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        dirty_count: 0,\n        dirty_kind_counts: {},\n        source_counts: {},\n        owner_path_counts: {},\n        owner_class_counts: {},\n        owner_name_counts: {},\n        propagation_source_counts: {},\n        propagation_reason_counts: {},\n        last_dirty: null,\n        last_instance_propagation: null,\n    };\n    g_gpuDiagnostics.text.nodes.set(key, entry);\n    trimTextNodeMap(g_gpuDiagnostics.text.nodes);\n    return entry;\n}\n\nfunction getButtonVisualEntry(key) {\n    let entry = g_gpuDiagnostics.text.buttons.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        transition_counts: {},\n        text_dirty_count: 0,\n        icon_dirty_count: 0,\n        tile_dirty_count: 0,\n        last_transition: null,\n    };\n    g_gpuDiagnostics.text.buttons.set(key, entry);\n    trimButtonVisualMap(g_gpuDiagnostics.text.buttons);\n    return entry;\n}\n\nfunction getPickerResourceEntry(key) {\n    let entry = g_gpuDiagnostics.picker.dirty_resources.get(key);\n    if (entry) {\n        return entry;\n    }\n    entry = {\n        key,\n        batch_mark_count: 0,\n        pose_mark_count: 0,\n        batch_clear_count: 0,\n        pose_clear_count: 0,\n        trigger_reason_counts: {},\n        source_counts: {},\n        last_mark: null,\n        last_clear: null,\n        last_trigger: null,\n    };\n    g_gpuDiagnostics.picker.dirty_resources.set(key, entry);\n    trimPickerResourceMap(g_gpuDiagnostics.picker.dirty_resources);\n    return entry;\n}\n\nfunction cloneTextEntry(entry) {\n    return {\n        key: entry.key,\n        dirty_count: entry.dirty_count,\n        sync_count: entry.sync_count,\n        drop_count: entry.drop_count,\n        span_upload_count: entry.span_upload_count,\n        span_skip_count: entry.span_skip_count,\n        unchanged_span_upload_count: entry.unchanged_span_upload_count,\n        unchanged_span_skip_count: entry.unchanged_span_skip_count,\n        unchanged_span_blocked_missing_texture_count: entry.unchanged_span_blocked_missing_texture_count,\n        dirty_source_counts: cloneKeyCounts(entry.dirty_source_counts),\n        dirty_kind_counts: cloneKeyCounts(entry.dirty_kind_counts),\n        sync_reason_counts: cloneKeyCounts(entry.sync_reason_counts),\n        drop_source_counts: cloneKeyCounts(entry.drop_source_counts),\n        span_block_reason_counts: cloneKeyCounts(entry.span_block_reason_counts),\n        picker_flag_counts: cloneKeyCounts(entry.picker_flag_counts),\n        instance_propagation_source_counts: cloneKeyCounts(entry.instance_propagation_source_counts),\n        instance_propagation_reason_counts: cloneKeyCounts(entry.instance_propagation_reason_counts),\n        sync_needs_create_count: entry.sync_needs_create_count,\n        sync_full_dirty_count: entry.sync_full_dirty_count,\n        sync_instance_dirty_count: entry.sync_instance_dirty_count,\n        sync_full_rebuild_count: entry.sync_full_rebuild_count,\n        sync_instance_only_count: entry.sync_instance_only_count,\n        transform_only_sync_count: entry.transform_only_sync_count,\n        transform_only_span_changed_count: entry.transform_only_span_changed_count,\n        last_dirty: entry.last_dirty ? { ...entry.last_dirty } : null,\n        last_instance_propagation: entry.last_instance_propagation ? { ...entry.last_instance_propagation } : null,\n        last_sync: entry.last_sync ? { ...entry.last_sync } : null,\n        last_drop: entry.last_drop ? { ...entry.last_drop } : null,\n        last_span_upload: entry.last_span_upload ? { ...entry.last_span_upload } : null,\n    };\n}\n\nfunction cloneTextNodeEntry(entry) {\n    return {\n        key: entry.key,\n        dirty_count: entry.dirty_count,\n        dirty_kind_counts: cloneKeyCounts(entry.dirty_kind_counts),\n        source_counts: cloneKeyCounts(entry.source_counts),\n        owner_path_counts: cloneKeyCounts(entry.owner_path_counts),\n        owner_class_counts: cloneKeyCounts(entry.owner_class_counts),\n        owner_name_counts: cloneKeyCounts(entry.owner_name_counts),\n        last_dirty: entry.last_dirty ? { ...entry.last_dirty } : null,\n        propagation_source_counts: cloneKeyCounts(entry.propagation_source_counts),\n        propagation_reason_counts: cloneKeyCounts(entry.propagation_reason_counts),\n        last_instance_propagation: entry.last_instance_propagation ? { ...entry.last_instance_propagation } : null,\n    };\n}\n\nfunction cloneButtonVisualEntry(entry) {\n    return {\n        key: entry.key,\n        transition_counts: cloneKeyCounts(entry.transition_counts),\n        text_dirty_count: entry.text_dirty_count,\n        icon_dirty_count: entry.icon_dirty_count,\n        tile_dirty_count: entry.tile_dirty_count,\n        last_transition: entry.last_transition ? { ...entry.last_transition } : null,\n    };\n}\n\nfunction cloneTileEntry(entry) {\n    return {\n        key: entry.key,\n        sync_count: entry.sync_count,\n        full_rebuild_count: entry.full_rebuild_count,\n        instance_update_count: entry.instance_update_count,\n        transform_only_sync_count: entry.transform_only_sync_count,\n        full_instance_sync_count: entry.full_instance_sync_count,\n        empty_batch_count: entry.empty_batch_count,\n        upload_bytes: entry.upload_bytes,\n        transform_only_upload_bytes: entry.transform_only_upload_bytes,\n        full_instance_upload_bytes: entry.full_instance_upload_bytes,\n        rebuild_upload_bytes: entry.rebuild_upload_bytes,\n        dirty_kind_counts: cloneKeyCounts(entry.dirty_kind_counts),\n        propagation_reason_counts: cloneKeyCounts(entry.propagation_reason_counts),\n        last_sync: entry.last_sync ? { ...entry.last_sync } : null,\n    };\n}\n\n/* Keep tile crash summaries small while still answering whether the fast path actually fired. */\nfunction compactTileEntry(entry) {\n    return {\n        key: entry.key,\n        sync_count: entry.sync_count,\n        full_rebuild_count: entry.full_rebuild_count,\n        instance_update_count: entry.instance_update_count,\n        transform_only_sync_count: entry.transform_only_sync_count,\n        full_instance_sync_count: entry.full_instance_sync_count,\n        empty_batch_count: entry.empty_batch_count,\n        upload_bytes: entry.upload_bytes,\n        transform_only_upload_bytes: entry.transform_only_upload_bytes,\n        full_instance_upload_bytes: entry.full_instance_upload_bytes,\n        rebuild_upload_bytes: entry.rebuild_upload_bytes,\n        dirty_kind_counts: topCountEntries(entry.dirty_kind_counts),\n        propagation_reason_counts: topCountEntries(entry.propagation_reason_counts),\n        owner_path_counts: topCountEntries(entry.owner_path_counts),\n        owner_class_counts: topCountEntries(entry.owner_class_counts),\n        owner_name_counts: topCountEntries(entry.owner_name_counts),\n        last_sync: entry.last_sync ? { ...entry.last_sync } : null,\n    };\n}\n\n/* Keep crash reports pasteable by projecting only the hottest per-group counters and latest sync/drop state. */\nfunction compactTextGroupEntry(entry) {\n    return {\n        key: entry.key,\n        dirty_count: entry.dirty_count,\n        sync_count: entry.sync_count,\n        drop_count: entry.drop_count,\n        span_upload_count: entry.span_upload_count,\n        span_skip_count: entry.span_skip_count,\n        unchanged_span_skip_count: entry.unchanged_span_skip_count,\n        sync_needs_create_count: entry.sync_needs_create_count,\n        sync_full_dirty_count: entry.sync_full_dirty_count,\n        sync_instance_dirty_count: entry.sync_instance_dirty_count,\n        sync_full_rebuild_count: entry.sync_full_rebuild_count,\n        sync_instance_only_count: entry.sync_instance_only_count,\n        transform_only_sync_count: entry.transform_only_sync_count,\n        transform_only_span_changed_count: entry.transform_only_span_changed_count,\n        dirty_source_counts: topCountEntries(entry.dirty_source_counts),\n        dirty_kind_counts: topCountEntries(entry.dirty_kind_counts),\n        sync_reason_counts: topCountEntries(entry.sync_reason_counts),\n        drop_source_counts: topCountEntries(entry.drop_source_counts),\n        picker_flag_counts: topCountEntries(entry.picker_flag_counts),\n        instance_propagation_source_counts: topCountEntries(entry.instance_propagation_source_counts),\n        instance_propagation_reason_counts: topCountEntries(entry.instance_propagation_reason_counts),\n        last_dirty: entry.last_dirty ? { ...entry.last_dirty } : null,\n        last_instance_propagation: entry.last_instance_propagation ? { ...entry.last_instance_propagation } : null,\n        last_sync: entry.last_sync ? { ...entry.last_sync } : null,\n        last_drop: entry.last_drop ? { ...entry.last_drop } : null,\n        last_span_upload: entry.last_span_upload ? { ...entry.last_span_upload } : null,\n    };\n}\n\n/* Collapse node churn to the hottest keys and their latest dirty context instead of the full node map. */\nfunction compactTextNodeEntry(entry) {\n    return {\n        key: entry.key,\n        dirty_count: entry.dirty_count,\n        dirty_kind_counts: topCountEntries(entry.dirty_kind_counts),\n        source_counts: topCountEntries(entry.source_counts),\n        owner_path_counts: topCountEntries(entry.owner_path_counts),\n        last_dirty: entry.last_dirty ? { ...entry.last_dirty } : null,\n        propagation_source_counts: topCountEntries(entry.propagation_source_counts),\n        propagation_reason_counts: topCountEntries(entry.propagation_reason_counts),\n        last_instance_propagation: entry.last_instance_propagation ? { ...entry.last_instance_propagation } : null,\n    };\n}\n\n/* Button visual churn is mostly useful as transition counts plus the latest visual state flip. */\nfunction compactButtonVisualEntry(entry) {\n    return {\n        key: entry.key,\n        transition_counts: topCountEntries(entry.transition_counts),\n        text_dirty_count: entry.text_dirty_count,\n        icon_dirty_count: entry.icon_dirty_count,\n        tile_dirty_count: entry.tile_dirty_count,\n        last_transition: entry.last_transition ? { ...entry.last_transition } : null,\n    };\n}\n\n/* Picker/resource churn fits in a compact top-N form; the full map is too noisy for crash pastes. */\nfunction compactPickerResourceEntry(entry) {\n    return {\n        key: entry.key,\n        batch_mark_count: entry.batch_mark_count,\n        pose_mark_count: entry.pose_mark_count,\n        batch_clear_count: entry.batch_clear_count,\n        pose_clear_count: entry.pose_clear_count,\n        trigger_reason_counts: topCountEntries(entry.trigger_reason_counts),\n        source_counts: topCountEntries(entry.source_counts),\n        last_mark: entry.last_mark ? { ...entry.last_mark } : null,\n        last_clear: entry.last_clear ? { ...entry.last_clear } : null,\n        last_trigger: entry.last_trigger ? { ...entry.last_trigger } : null,\n    };\n}\n\n/* Project only the highest-signal scatterplot entries into loss bundles. */\nfunction compactScatterplotEntry(entry) {\n    return {\n        key: entry.key,\n        kind: entry.kind,\n        at_ms: entry.at_ms,\n        ...Object.fromEntries(\n            Object.entries(entry).filter(([key]) => key !== 'key' && key !== 'kind' && key !== 'at_ms'),\n        ),\n    };\n}\n\nfunction clonePickerResourceEntry(entry) {\n    return {\n        key: entry.key,\n        batch_mark_count: entry.batch_mark_count,\n        pose_mark_count: entry.pose_mark_count,\n        batch_clear_count: entry.batch_clear_count,\n        pose_clear_count: entry.pose_clear_count,\n        trigger_reason_counts: cloneKeyCounts(entry.trigger_reason_counts),\n        source_counts: cloneKeyCounts(entry.source_counts),\n        last_mark: entry.last_mark ? { ...entry.last_mark } : null,\n        last_clear: entry.last_clear ? { ...entry.last_clear } : null,\n        last_trigger: entry.last_trigger ? { ...entry.last_trigger } : null,\n    };\n}\n\nfunction push(event, fields = {}) {\n    const entry = {\n        seq: g_gpuDiagnostics.seq++,\n        at_ms: nowMS(),\n        perf_ms: perfMS(),\n        event,\n        ...fields,\n    };\n    g_gpuDiagnostics.breadcrumbs.push(entry);\n    if (g_gpuDiagnostics.breadcrumbs.length > GPU_BREADCRUMB_LIMIT) {\n        g_gpuDiagnostics.breadcrumbs.splice(0, g_gpuDiagnostics.breadcrumbs.length - GPU_BREADCRUMB_LIMIT);\n    }\n    return entry;\n}\n\nexport function gpuDiagPush(event, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void event;\n        void fields;\n        return null;\n    }\n    return push(event, fields);\n}\n\nexport function gpuDiagNoteContext(kind, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void kind;\n        void fields;\n        return null;\n    }\n    if (fields.context_id !== undefined) {\n        g_gpuDiagnostics.context.id = fields.context_id;\n    }\n    if (kind === 'context_acquired') {\n        g_gpuDiagnostics.context.created_at_ms = nowMS();\n    }\n    if (kind === 'context_restored') {\n        g_gpuDiagnostics.context.restored_at_ms = nowMS();\n    }\n    return push(`gpu_${kind}`, fields);\n}\n\nexport function gpuDiagNoteFramePhase(phase, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void phase;\n        void fields;\n        return null;\n    }\n    g_gpuDiagnostics.frame.last_phase = phase;\n    g_gpuDiagnostics.frame.last_phase_at_ms = nowMS();\n    if (fields.frame_stamp !== undefined) {\n        g_gpuDiagnostics.frame.stamp = fields.frame_stamp;\n    }\n}\n\n/* Record why a frame stayed active so later heartbeats can explain sustained redraws. */\nexport function gpuDiagNoteFrameActivity(activity = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void activity;\n        return null;\n    }\n    const snap = cloneFrameActivity(activity);\n    g_gpuDiagnostics.frame.activity = snap;\n    if (snap?.frame_stamp !== undefined) {\n        g_gpuDiagnostics.frame.stamp = snap.frame_stamp;\n    }\n    const counts = g_gpuDiagnostics.frame.activity_counts;\n    const reasons = g_gpuDiagnostics.frame.activity_reason_counts;\n    counts.frames += 1;\n    if (snap?.user_input) {\n        counts.user_input += 1;\n    }\n    if (snap?.mouse_moved) {\n        counts.mouse_moved += 1;\n    }\n    if (snap?.did_direct_pick) {\n        counts.direct_pick += 1;\n    }\n    if (snap?.did_passive_pick) {\n        counts.passive_pick += 1;\n    }\n    if (snap?.camera_matrix_changed) {\n        counts.camera_matrix_changed += 1;\n    }\n    if (snap?.camera?.moving) {\n        counts.camera_motion += 1;\n    }\n    if (snap?.renderless) {\n        counts.renderless += 1;\n    }\n    if (snap && snap.scene_fully_rendered === false) {\n        counts.scene_not_fully_rendered += 1;\n    }\n    for (const key of snap?.active_events ?? []) {\n        bumpKeyCount(reasons.active_events, key);\n    }\n    if (snap?.direct_pick_reason) {\n        bumpKeyCount(reasons.direct_pick, snap.direct_pick_reason);\n    }\n    if (snap?.passive_pick_reason) {\n        bumpKeyCount(reasons.passive_pick, snap.passive_pick_reason);\n    }\n    if (snap?.camera?.mode) {\n        bumpKeyCount(reasons.camera_mode, snap.camera.mode);\n    }\n    for (const key of snap?.camera?.reasons ?? []) {\n        bumpKeyCount(reasons.camera_motion, key);\n    }\n}\n\nexport function gpuDiagMaybeHeartbeat(fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void fields;\n        return null;\n    }\n    const now = nowMS();\n    if (now - g_gpuDiagnostics.frame.last_heartbeat_at_ms < GPU_HEARTBEAT_MIN_INTERVAL_MS) {\n        return null;\n    }\n    const prevHeartbeatAtMS = g_gpuDiagnostics.frame.last_heartbeat_at_ms;\n    const drawsSinceLastHeartbeat = Math.max(0, g_gpuDiagnostics.frame.draw_count - (g_gpuDiagnostics.frame.last_heartbeat_draw_count ?? 0));\n    g_gpuDiagnostics.frame.last_heartbeat_at_ms = now;\n    g_gpuDiagnostics.frame.last_heartbeat_draw_count = g_gpuDiagnostics.frame.draw_count;\n    const resources = resourceSummary();\n    const drawGapMS = g_gpuDiagnostics.frame.last_draw_at_ms > 0 ? Math.max(0, now - g_gpuDiagnostics.frame.last_draw_at_ms) : null;\n    return push('gpu_frame_heartbeat', {\n        frame_stamp: g_gpuDiagnostics.frame.stamp,\n        draw_count: g_gpuDiagnostics.frame.draw_count,\n        last_phase: g_gpuDiagnostics.frame.last_phase,\n        last_draw_at_ms: g_gpuDiagnostics.frame.last_draw_at_ms,\n        draw_gap_ms: drawGapMS,\n        draws_since_last_heartbeat: drawsSinceLastHeartbeat,\n        frame_activity: cloneFrameActivity(g_gpuDiagnostics.frame.activity),\n        frame_activity_counts: cloneFrameActivityCounts(g_gpuDiagnostics.frame.activity_counts),\n        frame_activity_reason_counts: cloneFrameActivityReasonCounts(g_gpuDiagnostics.frame.activity_reason_counts),\n        heartbeat_elapsed_ms: prevHeartbeatAtMS > 0 ? Math.max(0, now - prevHeartbeatAtMS) : 0,\n        context_age_ms: g_gpuDiagnostics.context.created_at_ms ? Math.max(0, now - g_gpuDiagnostics.context.created_at_ms) : null,\n        context_reports: fields.context_reports ?? 0,\n        resources_live: cloneCounts(g_gpuDiagnostics.resources.live),\n        resources_created: cloneCounts(g_gpuDiagnostics.resources.created),\n        resources_deleted: cloneCounts(g_gpuDiagnostics.resources.deleted),\n        resource_bytes_live: cloneByteCounts(g_gpuDiagnostics.memory.live_bytes),\n        resource_uploaded_bytes: cloneByteCounts(g_gpuDiagnostics.memory.uploaded_bytes),\n        resource_upload_events: cloneByteCounts(g_gpuDiagnostics.memory.upload_events),\n        resource_origins_top: summarizeOriginSnapshot(resources.origins),\n        readbacks: { ...g_gpuDiagnostics.memory.readbacks },\n        performance_memory: snapshotHeapMemory(),\n        text_summary: summarizeTextSnapshot(),\n        picker_summary: summarizePickerSnapshot(),\n        dirty_summary: summarizeDirtySnapshot(),\n        picker: pickerSummary(),\n        ...fields,\n    });\n}\n\nexport function gpuDiagNoteDraw(fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void fields;\n        return null;\n    }\n    g_gpuDiagnostics.frame.draw_count += 1;\n    g_gpuDiagnostics.frame.last_draw_at_ms = nowMS();\n    if (fields.frame_stamp !== undefined) {\n        g_gpuDiagnostics.frame.stamp = fields.frame_stamp;\n    }\n}\n\nexport function gpuDiagNoteGlError(kind, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void kind;\n        void fields;\n        return null;\n    }\n    g_gpuDiagnostics.gl.draw_error_count += 1;\n    g_gpuDiagnostics.gl.last_error = {\n        kind,\n        at_ms: nowMS(),\n        ...fields,\n    };\n    return push(`gpu_gl_error_${kind}`, fields);\n}\n\nexport function gpuDiagNotePickerRead(fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void fields;\n        return null;\n    }\n    const width = fields.width ?? 0;\n    const height = fields.height ?? 0;\n    g_gpuDiagnostics.memory.readbacks.picker_count += 1;\n    if (fields.picked_id !== undefined) {\n        g_gpuDiagnostics.memory.readbacks.last_picker_id = fields.picked_id;\n    }\n    g_gpuDiagnostics.memory.readbacks.last_read_width = width;\n    g_gpuDiagnostics.memory.readbacks.last_read_height = height;\n}\n\nexport function gpuDiagNotePickerDirty(resourceKey, kind, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void resourceKey;\n        void kind;\n        void fields;\n        return null;\n    }\n    const key = resourceKey || '<unknown>';\n    const entry = getPickerResourceEntry(key);\n    const source = bumpKeyCount(entry.source_counts, fields.source ?? '<unknown>');\n    if (kind === 'pickerBatch') {\n        entry.batch_mark_count += 1;\n    } else if (kind === 'pickerPose') {\n        entry.pose_mark_count += 1;\n    }\n    entry.last_mark = {\n        at_ms: nowMS(),\n        kind,\n        source,\n        dirty_kinds: Array.isArray(fields.dirty_kinds) ? [...fields.dirty_kinds] : [],\n    };\n}\n\nexport function gpuDiagNotePickerClear(resourceKey, kind, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void resourceKey;\n        void kind;\n        void fields;\n        return null;\n    }\n    const key = resourceKey || '<unknown>';\n    const entry = getPickerResourceEntry(key);\n    if (kind === 'pickerBatch') {\n        entry.batch_clear_count += 1;\n    } else if (kind === 'pickerPose') {\n        entry.pose_clear_count += 1;\n    }\n    entry.last_clear = {\n        at_ms: nowMS(),\n        kind,\n        dirty_kinds: Array.isArray(fields.dirty_kinds) ? [...fields.dirty_kinds] : [],\n    };\n}\n\nexport function gpuDiagNotePickerTrigger(kind, reason, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void kind;\n        void reason;\n        void fields;\n        return null;\n    }\n    const kindKey = bumpKeyCount(g_gpuDiagnostics.picker.kind_counts, kind || '<unknown>');\n    const reasonKey = bumpKeyCount(g_gpuDiagnostics.picker.reason_counts, reason || '<none>');\n    g_gpuDiagnostics.picker.trigger_count += 1;\n    const now = nowMS();\n    const shouldPush = kindKey !== g_gpuDiagnostics.picker.last_kind\n        || reasonKey !== g_gpuDiagnostics.picker.last_reason\n        || now - g_gpuDiagnostics.picker.last_trigger_at_ms >= GPU_PICKER_EVENT_MIN_INTERVAL_MS;\n    g_gpuDiagnostics.picker.last_kind = kindKey;\n    g_gpuDiagnostics.picker.last_reason = reasonKey;\n    g_gpuDiagnostics.picker.last_trigger_at_ms = now;\n    if (reasonKey === 'picker_batch_dirty' || reasonKey === 'picker_pose_dirty') {\n        const entry = getPickerResourceEntry(fields.resource_key || '<unknown>');\n        bumpKeyCount(entry.trigger_reason_counts, reasonKey);\n        entry.last_trigger = {\n            at_ms: now,\n            reason: reasonKey,\n            kind: kindKey,\n            dirty_kinds: Array.isArray(fields.dirty_kinds) ? [...fields.dirty_kinds] : [],\n        };\n    }\n    if (!shouldPush) {\n        return null;\n    }\n    return push('gpu_picker_trigger', {\n        kind: kindKey,\n        reason: reasonKey,\n        trigger_count: g_gpuDiagnostics.picker.trigger_count,\n        ...fields,\n    });\n}\n\nexport function gpuDiagNotePickerGlFallbackAttempt(reason, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void reason;\n        void fields;\n        return null;\n    }\n    const reasonKey = bumpKeyCount(g_gpuDiagnostics.picker.gl_fallback_reason_counts, reason || '<none>');\n    g_gpuDiagnostics.picker.gl_fallback_attempt_count += 1;\n    return push('gpu_picker_gl_fallback_attempt', {\n        reason: reasonKey,\n        gl_fallback_attempt_count: g_gpuDiagnostics.picker.gl_fallback_attempt_count,\n        ...fields,\n    });\n}\n\nexport function gpuDiagNoteTileSync(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTileEntry(key || '<unknown>');\n    entry.sync_count += 1;\n    if (fields.full_rebuild) {\n        entry.full_rebuild_count += 1;\n    } else {\n        entry.instance_update_count += 1;\n        if (fields.transform_only) {\n            entry.transform_only_sync_count += 1;\n        } else {\n            entry.full_instance_sync_count += 1;\n        }\n    }\n    if (fields.empty_batch) {\n        entry.empty_batch_count += 1;\n    }\n    const uploadBytes = Math.max(0, fields.upload_bytes ?? 0);\n    entry.upload_bytes += uploadBytes;\n    if (fields.full_rebuild) {\n        entry.rebuild_upload_bytes += uploadBytes;\n    } else if (fields.transform_only) {\n        entry.transform_only_upload_bytes += uploadBytes;\n    } else {\n        entry.full_instance_upload_bytes += uploadBytes;\n    }\n    const dirtyKinds = Array.isArray(fields.dirty_kinds) ? fields.dirty_kinds : [];\n    for (const kind of dirtyKinds) {\n        bumpKeyCount(entry.dirty_kind_counts, kind);\n    }\n    const propagationReasons = Array.isArray(fields.propagation_reasons) ? fields.propagation_reasons : [];\n    for (const reason of propagationReasons) {\n        bumpKeyCount(entry.propagation_reason_counts, reason);\n    }\n    const ownerPaths = Array.isArray(fields.owner_paths) ? fields.owner_paths : [];\n    for (const path of ownerPaths) {\n        bumpKeyCount(entry.owner_path_counts, path || '<none>');\n    }\n    const ownerClasses = Array.isArray(fields.owner_classes) ? fields.owner_classes : [];\n    for (const ownerClass of ownerClasses) {\n        bumpKeyCount(entry.owner_class_counts, ownerClass || '<none>');\n    }\n    const ownerNames = Array.isArray(fields.owner_names) ? fields.owner_names : [];\n    for (const ownerName of ownerNames) {\n        bumpKeyCount(entry.owner_name_counts, ownerName || '<none>');\n    }\n    entry.last_sync = {\n        at_ms: nowMS(),\n        full_rebuild: !!fields.full_rebuild,\n        transform_only: !!fields.transform_only,\n        empty_batch: !!fields.empty_batch,\n        needs_full_rebuild: !!fields.needs_full_rebuild,\n        needs_instance_update: !!fields.needs_instance_update,\n        presentation_changed: !!fields.presentation_changed,\n        draw_scope_changed: !!fields.draw_scope_changed,\n        pending_transform_only: fields.pending_transform_only === true,\n        node_count: fields.node_count ?? 0,\n        instance_count: fields.instance_count ?? 0,\n        upload_bytes: uploadBytes,\n        dirty_kinds: [...dirtyKinds],\n        propagation_reasons: [...propagationReasons],\n        owner_paths: [...ownerPaths],\n        owner_classes: [...ownerClasses],\n        owner_names: [...ownerNames],\n    };\n}\n\nexport function gpuDiagNoteResourceDirty(resourceKey, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void resourceKey;\n        void fields;\n        return null;\n    }\n    const entry = getDirtyResourceEntry(resourceKey || '<unknown>');\n    entry.dirty_count += 1;\n    const source = bumpKeyCount(entry.source_counts, fields.source ?? '<unknown>');\n    const sourcePath = bumpKeyCount(entry.source_path_counts, fields.source_path ?? '<none>');\n    const kinds = Array.isArray(fields.kinds) ? fields.kinds : [];\n    for (const kind of kinds) {\n        bumpKeyCount(entry.dirty_kind_counts, kind);\n    }\n    entry.last_dirty = {\n        at_ms: nowMS(),\n        source,\n        source_path: sourcePath,\n        dirty_kinds: [...kinds],\n    };\n}\n\nexport function gpuDiagNoteTextDirty(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTextEntry(key || '<unknown>');\n    entry.dirty_count += 1;\n    const source = bumpKeyCount(entry.dirty_source_counts, fields.source ?? '<unknown>');\n    const kinds = Array.isArray(fields.kinds) ? fields.kinds : [];\n    for (const kind of kinds) {\n        bumpKeyCount(entry.dirty_kind_counts, kind);\n    }\n    entry.last_dirty = {\n        at_ms: nowMS(),\n        source,\n        kinds: [...kinds],\n        picker_batch_dirty: !!fields.picker_batch_dirty,\n        picker_pose_dirty: !!fields.picker_pose_dirty,\n    };\n    if (kinds.includes('instance') && fields.propagation_source_path) {\n        const propagationSource = bumpKeyCount(\n            entry.instance_propagation_source_counts,\n            fields.propagation_source_path,\n        );\n        const propagationReasons = Array.isArray(fields.propagation_reasons) ? fields.propagation_reasons : [];\n        for (const reason of propagationReasons) {\n            bumpKeyCount(entry.instance_propagation_reason_counts, reason);\n        }\n        entry.last_instance_propagation = {\n            at_ms: nowMS(),\n            source: propagationSource,\n            source_class: fields.propagation_source_class ?? '<none>',\n            source_name: fields.propagation_source_name ?? '<none>',\n            reasons: [...propagationReasons],\n        };\n    }\n}\n\nexport function gpuDiagNoteTextNodeDirty(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTextNodeEntry(key || '<unknown>');\n    entry.dirty_count += 1;\n    const source = bumpKeyCount(entry.source_counts, fields.source ?? '<unknown>');\n    bumpKeyCount(entry.owner_path_counts, fields.owner_path ?? '<none>');\n    const ownerClass = bumpKeyCount(entry.owner_class_counts, fields.owner_class ?? '<none>');\n    const ownerName = bumpKeyCount(entry.owner_name_counts, fields.owner_name ?? '<none>');\n    const kinds = Array.isArray(fields.kinds) ? fields.kinds : [];\n    for (const kind of kinds) {\n        bumpKeyCount(entry.dirty_kind_counts, kind);\n    }\n    entry.last_dirty = {\n        at_ms: nowMS(),\n        source,\n        owner_class: ownerClass,\n        owner_name: ownerName,\n        kinds: [...kinds],\n        text_preview: fields.text_preview ?? '',\n        visible: fields.visible !== false,\n        computed_visible: fields.computed_visible !== false,\n        computed_opacity: fields.computed_opacity ?? null,\n        owner_hovering: !!fields.owner_hovering,\n        owner_focus: !!fields.owner_focus,\n        owner_enabled: fields.owner_enabled !== false,\n        owner_path: fields.owner_path ?? '',\n    };\n    if (kinds.includes('instance') && fields.propagation_source_path) {\n        const propagationSource = bumpKeyCount(\n            entry.propagation_source_counts,\n            fields.propagation_source_path,\n        );\n        const propagationReasons = Array.isArray(fields.propagation_reasons) ? fields.propagation_reasons : [];\n        for (const reason of propagationReasons) {\n            bumpKeyCount(entry.propagation_reason_counts, reason);\n        }\n        entry.last_instance_propagation = {\n            at_ms: nowMS(),\n            source: propagationSource,\n            source_class: fields.propagation_source_class ?? '<none>',\n            source_name: fields.propagation_source_name ?? '<none>',\n            reasons: [...propagationReasons],\n        };\n    }\n}\n\nexport function gpuDiagNoteTextSync(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTextEntry(key || '<unknown>');\n    entry.sync_count += 1;\n    if (fields.needs_create) {\n        entry.sync_needs_create_count += 1;\n    }\n    if (fields.full_dirty) {\n        entry.sync_full_dirty_count += 1;\n    }\n    if (fields.instance_dirty) {\n        entry.sync_instance_dirty_count += 1;\n    }\n    if (fields.full_rebuild) {\n        entry.sync_full_rebuild_count += 1;\n    }\n    if (fields.instance_only) {\n        entry.sync_instance_only_count += 1;\n    }\n    if (fields.transform_only) {\n        entry.transform_only_sync_count += 1;\n    }\n    if (fields.transform_only && fields.span_changed) {\n        entry.transform_only_span_changed_count += 1;\n    }\n    const reasons = Array.isArray(fields.reasons) ? fields.reasons : [];\n    for (const reason of reasons) {\n        bumpKeyCount(entry.sync_reason_counts, reason);\n    }\n    if (fields.picker_batch_dirty) {\n        bumpKeyCount(entry.picker_flag_counts, 'picker_batch_dirty');\n    }\n    if (fields.picker_pose_dirty) {\n        bumpKeyCount(entry.picker_flag_counts, 'picker_pose_dirty');\n    }\n    entry.last_sync = {\n        at_ms: nowMS(),\n        reasons: [...reasons],\n        picker_batch_dirty: !!fields.picker_batch_dirty,\n        picker_pose_dirty: !!fields.picker_pose_dirty,\n        dirty_kinds: Array.isArray(fields.dirty_kinds) ? [...fields.dirty_kinds] : [],\n        span_count: fields.span_count ?? 0,\n        instance_count: fields.instance_count ?? 0,\n        presented_node_count: fields.presented_node_count ?? 0,\n        visible_node_count: fields.visible_node_count ?? 0,\n        draw_scope_changed: !!fields.draw_scope_changed,\n        presentation_changed: !!fields.presentation_changed,\n        needs_create: !!fields.needs_create,\n        full_dirty: !!fields.full_dirty,\n        instance_dirty: !!fields.instance_dirty,\n        full_rebuild: !!fields.full_rebuild,\n        instance_only: !!fields.instance_only,\n        transform_only: !!fields.transform_only,\n        scoped: !!fields.scoped,\n        scope_key: fields.scope_key ?? '',\n        span_changed: !!fields.span_changed,\n    };\n}\n\n/* Record why one text group dropped its GL cache so later reports can correlate churn with attach/release paths. */\nexport function gpuDiagNoteTextDrop(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTextEntry(key || '<unknown>');\n    entry.drop_count += 1;\n    const source = bumpKeyCount(entry.drop_source_counts, fields.source ?? '<unknown>');\n    entry.last_drop = {\n        at_ms: nowMS(),\n        source,\n        had_buffer: !!fields.had_buffer,\n        had_span_texture: !!fields.had_span_texture,\n        instance_count: fields.instance_count ?? 0,\n        span_count: fields.span_count ?? 0,\n    };\n}\n\nexport function gpuDiagNoteTextSpanUpload(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getTextEntry(key || '<unknown>');\n    if (fields.skipped) {\n        entry.span_skip_count += 1;\n    } else {\n        entry.span_upload_count += 1;\n    }\n    if (fields.data_changed === false && !fields.skipped) {\n        entry.unchanged_span_upload_count += 1;\n    }\n    if (fields.data_changed === false && fields.skipped) {\n        entry.unchanged_span_skip_count += 1;\n    }\n    const spanBlockReason = fields.skip_block_reason ?? '';\n    if (spanBlockReason) {\n        bumpKeyCount(entry.span_block_reason_counts, spanBlockReason);\n    }\n    if (fields.data_changed === false && spanBlockReason === 'missing_texture') {\n        entry.unchanged_span_blocked_missing_texture_count += 1;\n    }\n    entry.last_span_upload = {\n        at_ms: nowMS(),\n        span_count: fields.span_count ?? 0,\n        width: fields.width ?? 0,\n        height: fields.height ?? 0,\n        bytes: fields.bytes ?? 0,\n        hash: fields.hash ?? 0,\n        prev_hash: fields.prev_hash ?? 0,\n        data_changed: fields.data_changed !== false,\n        resized: !!fields.resized,\n        skipped: !!fields.skipped,\n        texture_present_before_sync: !!fields.texture_present_before_sync,\n        skip_block_reason: spanBlockReason,\n    };\n}\n\nexport function gpuDiagNoteButtonVisualTransition(key, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void key;\n        void fields;\n        return null;\n    }\n    const entry = getButtonVisualEntry(key || '<unknown>');\n    const transition = bumpKeyCount(entry.transition_counts, fields.transition ?? '<unknown>');\n    if (fields.text_dirty) {\n        entry.text_dirty_count += 1;\n    }\n    if (fields.icon_dirty) {\n        entry.icon_dirty_count += 1;\n    }\n    if (fields.tile_dirty) {\n        entry.tile_dirty_count += 1;\n    }\n    entry.last_transition = {\n        at_ms: nowMS(),\n        transition,\n        hovering: !!fields.hovering,\n        focus: !!fields.focus,\n        enabled: fields.enabled !== false,\n        text_dirty: !!fields.text_dirty,\n        icon_dirty: !!fields.icon_dirty,\n        tile_dirty: !!fields.tile_dirty,\n        tooltip_enabled: !!fields.tooltip_enabled,\n        text: fields.text ?? '',\n    };\n}\n\nexport function gpuDiagNotePresentationRevision(revision, reason, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void revision;\n        void reason;\n        void fields;\n        return null;\n    }\n    g_gpuDiagnostics.scene.presentation_revision = revision ?? g_gpuDiagnostics.scene.presentation_revision;\n    const reasonKey = bumpKeyCount(g_gpuDiagnostics.scene.presentation_reason_counts, reason || '<unknown>');\n    g_gpuDiagnostics.scene.last_presentation = {\n        at_ms: nowMS(),\n        revision: g_gpuDiagnostics.scene.presentation_revision,\n        reason: reasonKey,\n        ...fields,\n    };\n}\n\nfunction pickerSummary() {\n    const dirty_resources = Array.from(g_gpuDiagnostics.picker.dirty_resources.values())\n        .map(clonePickerResourceEntry)\n        .sort((a, b) => {\n            const aOutstanding = (a.batch_mark_count - a.batch_clear_count) + (a.pose_mark_count - a.pose_clear_count);\n            const bOutstanding = (b.batch_mark_count - b.batch_clear_count) + (b.pose_mark_count - b.pose_clear_count);\n            if (aOutstanding !== bOutstanding) {\n                return bOutstanding - aOutstanding;\n            }\n            const aTriggered = sumCounts(a.trigger_reason_counts, Object.keys(a.trigger_reason_counts));\n            const bTriggered = sumCounts(b.trigger_reason_counts, Object.keys(b.trigger_reason_counts));\n            if (aTriggered !== bTriggered) {\n                return bTriggered - aTriggered;\n            }\n            return a.key.localeCompare(b.key);\n        });\n    return {\n        trigger_count: g_gpuDiagnostics.picker.trigger_count,\n        last_kind: g_gpuDiagnostics.picker.last_kind,\n        last_reason: g_gpuDiagnostics.picker.last_reason,\n        kind_counts: cloneKeyCounts(g_gpuDiagnostics.picker.kind_counts),\n        reason_counts: cloneKeyCounts(g_gpuDiagnostics.picker.reason_counts),\n        last_trigger_at_ms: g_gpuDiagnostics.picker.last_trigger_at_ms,\n        dirty_resources,\n    };\n}\n\nfunction textSummary() {\n    const groups = Array.from(g_gpuDiagnostics.text.groups.values())\n        .map(cloneTextEntry)\n        .sort((a, b) => {\n            if (a.unchanged_span_skip_count !== b.unchanged_span_skip_count) {\n                return b.unchanged_span_skip_count - a.unchanged_span_skip_count;\n            }\n            if (a.span_skip_count !== b.span_skip_count) {\n                return b.span_skip_count - a.span_skip_count;\n            }\n            if (a.unchanged_span_upload_count !== b.unchanged_span_upload_count) {\n                return b.unchanged_span_upload_count - a.unchanged_span_upload_count;\n            }\n            if (a.span_upload_count !== b.span_upload_count) {\n                return b.span_upload_count - a.span_upload_count;\n            }\n            if (a.sync_count !== b.sync_count) {\n                return b.sync_count - a.sync_count;\n            }\n            return a.key.localeCompare(b.key);\n        });\n    const nodes = Array.from(g_gpuDiagnostics.text.nodes.values())\n        .map(cloneTextNodeEntry)\n        .sort((a, b) => {\n            if (a.dirty_count !== b.dirty_count) {\n                return b.dirty_count - a.dirty_count;\n            }\n            return a.key.localeCompare(b.key);\n        });\n    const buttons = Array.from(g_gpuDiagnostics.text.buttons.values())\n        .map(cloneButtonVisualEntry)\n        .sort((a, b) => {\n            const aTransitions = sumCounts(a.transition_counts, Object.keys(a.transition_counts));\n            const bTransitions = sumCounts(b.transition_counts, Object.keys(b.transition_counts));\n            if (aTransitions !== bTransitions) {\n                return bTransitions - aTransitions;\n            }\n            return a.key.localeCompare(b.key);\n        });\n    const propagationSummary = summarizeTextSnapshot({\n        groups: new Map(groups.map((entry) => [entry.key, entry])),\n    });\n    return {\n        groups,\n        nodes,\n        buttons,\n        propagation_summary: {\n            total_count: propagationSummary.totals.instance_propagation_count ?? 0,\n            top_sources: topCountEntries(propagationSummary.instance_propagation_source_counts),\n            top_reasons: topCountEntries(propagationSummary.instance_propagation_reason_counts),\n            groups_by_count: propagationSummary.groups_by_instance_propagation_count ?? [],\n        },\n    };\n}\n\nfunction sceneSummary() {\n    return {\n        presentation_revision: g_gpuDiagnostics.scene.presentation_revision,\n        presentation_reason_counts: cloneKeyCounts(g_gpuDiagnostics.scene.presentation_reason_counts),\n        last_presentation: g_gpuDiagnostics.scene.last_presentation ? { ...g_gpuDiagnostics.scene.last_presentation } : null,\n    };\n}\n\n/* Keep frame state explicit so compact snapshots can include activity without dumping every internal counter. */\nfunction frameState(compact = false) {\n    const base = {\n        stamp: g_gpuDiagnostics.frame.stamp,\n        last_heartbeat_at_ms: g_gpuDiagnostics.frame.last_heartbeat_at_ms,\n        last_heartbeat_draw_count: g_gpuDiagnostics.frame.last_heartbeat_draw_count,\n        last_draw_at_ms: g_gpuDiagnostics.frame.last_draw_at_ms,\n        last_phase: g_gpuDiagnostics.frame.last_phase,\n        last_phase_at_ms: g_gpuDiagnostics.frame.last_phase_at_ms,\n        draw_count: g_gpuDiagnostics.frame.draw_count,\n        activity: cloneFrameActivity(g_gpuDiagnostics.frame.activity),\n    };\n    if (compact) {\n        return base;\n    }\n    return {\n        ...base,\n        activity_counts: cloneFrameActivityCounts(g_gpuDiagnostics.frame.activity_counts),\n        activity_reason_counts: cloneFrameActivityReasonCounts(g_gpuDiagnostics.frame.activity_reason_counts),\n    };\n}\n\n/* Build a compact diagnostics snapshot for context-loss reports and manual pasting. */\nexport function gpuDiagCompactSnapshot() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return null;\n    }\n    const now = nowMS();\n    const resources = resourceSummary();\n    const picker = pickerSummary();\n    const tile = Array.from(g_gpuDiagnostics.tile.groups.values())\n        .map(cloneTileEntry)\n        .sort((a, b) => (b.upload_bytes ?? 0) - (a.upload_bytes ?? 0)\n            || (b.full_rebuild_count ?? 0) - (a.full_rebuild_count ?? 0)\n            || a.key.localeCompare(b.key))\n        .slice(0, GPU_SUMMARY_TOP_LIMIT)\n        .map(compactTileEntry);\n    const text = textSummary();\n    const scatterplot = Array.from(g_gpuDiagnostics.scatterplot.by_key.values())\n        .map((entry) => ({ ...entry }))\n        .sort((a, b) => (b.at_ms ?? 0) - (a.at_ms ?? 0) || a.key.localeCompare(b.key))\n        .slice(0, GPU_SUMMARY_TOP_LIMIT)\n        .map(compactScatterplotEntry);\n    return compactTimingFields({\n        context: { ...g_gpuDiagnostics.context },\n        frame: frameState(true),\n        gl: g_gpuDiagnostics.gl.last_error ? {\n            ...g_gpuDiagnostics.gl,\n            last_error: { ...g_gpuDiagnostics.gl.last_error },\n        } : { ...g_gpuDiagnostics.gl },\n        resources: {\n            live: resources.live,\n            high_water: resources.high_water,\n            created: resources.created,\n            deleted: resources.deleted,\n            current_context_id: resources.current_context_id,\n            bytes: resources.bytes,\n            readbacks: resources.readbacks,\n            top_origins_by_live_bytes: summarizeOriginSnapshot(resources.origins, GPU_SUMMARY_TOP_LIMIT),\n            top_origins_by_uploaded_bytes: summarizeOriginSnapshot(\n                [...resources.origins].sort((a, b) => {\n                    const aBytes = sumCounts(a.uploaded_bytes, GPU_BYTE_TYPES);\n                    const bBytes = sumCounts(b.uploaded_bytes, GPU_BYTE_TYPES);\n                    if (aBytes !== bBytes) {\n                        return bBytes - aBytes;\n                    }\n                    return a.origin.localeCompare(b.origin);\n                }),\n                GPU_SUMMARY_TOP_LIMIT,\n            ),\n        },\n        picker: {\n            trigger_count: picker.trigger_count,\n            last_kind: picker.last_kind,\n            last_reason: picker.last_reason,\n            kind_counts: picker.kind_counts,\n            reason_counts: picker.reason_counts,\n            last_trigger_at_ms: picker.last_trigger_at_ms,\n            dirty_resources_top: picker.dirty_resources\n                .slice(0, GPU_SUMMARY_TOP_LIMIT)\n                .map(compactPickerResourceEntry),\n        },\n        scene: sceneSummary(),\n        tile: {\n            groups: tile,\n            summary: summarizeTileSnapshot(),\n        },\n        text: {\n            groups: text.groups.slice(0, GPU_SUMMARY_TOP_LIMIT).map(compactTextGroupEntry),\n            nodes: text.nodes.slice(0, GPU_SUMMARY_TOP_LIMIT).map(compactTextNodeEntry),\n            buttons: text.buttons.slice(0, GPU_SUMMARY_TOP_LIMIT).map(compactButtonVisualEntry),\n            propagation_summary: text.propagation_summary ?? {\n                total_count: 0,\n                top_sources: [],\n                top_reasons: [],\n                groups_by_count: [],\n            },\n        },\n        scatterplot: {\n            rebuild_count: g_gpuDiagnostics.scatterplot.rebuild_count,\n            draw_count: g_gpuDiagnostics.scatterplot.draw_count,\n            plots: scatterplot,\n        },\n    }, now);\n}\n\nexport function gpuDiagNoteScatterplot(kind, resourceKey, fields = {}) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void kind;\n        void resourceKey;\n        void fields;\n        return null;\n    }\n    const key = resourceKey || '<unknown>';\n    const entry = {\n        key,\n        kind,\n        at_ms: nowMS(),\n        ...fields,\n    };\n    g_gpuDiagnostics.scatterplot.by_key.set(key, entry);\n    trimScatterplotMap(g_gpuDiagnostics.scatterplot.by_key);\n    if (kind === 'rebuild' || kind === 'tick_rebuild') {\n        g_gpuDiagnostics.scatterplot.rebuild_count += 1;\n        return push(`gpu_scatterplot_${kind}`, entry);\n    }\n    if (kind === 'draw') {\n        g_gpuDiagnostics.scatterplot.draw_count += 1;\n        const last = g_gpuDiagnostics.scatterplot.draw_heartbeat_by_key.get(key) ?? 0;\n        if (entry.at_ms - last < GPU_DRAW_HEARTBEAT_MIN_INTERVAL_MS) {\n            return null;\n        }\n        g_gpuDiagnostics.scatterplot.draw_heartbeat_by_key.set(key, entry.at_ms);\n        return push('gpu_scatterplot_draw_heartbeat', entry);\n    }\n    return push(`gpu_scatterplot_${kind}`, entry);\n}\n\nexport function gpuDiagSnapshot() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return null;\n    }\n    return {\n        context: { ...g_gpuDiagnostics.context },\n        frame: frameState(false),\n        gl: g_gpuDiagnostics.gl.last_error ? {\n            ...g_gpuDiagnostics.gl,\n            last_error: { ...g_gpuDiagnostics.gl.last_error },\n        } : { ...g_gpuDiagnostics.gl },\n        resources: resourceSummary(),\n        picker: pickerSummary(),\n        scene: sceneSummary(),\n        tile: {\n            groups: Array.from(g_gpuDiagnostics.tile.groups.values()).map(cloneTileEntry),\n            summary: summarizeTileSnapshot(),\n        },\n        text: textSummary(),\n        scatterplot: {\n            rebuild_count: g_gpuDiagnostics.scatterplot.rebuild_count,\n            draw_count: g_gpuDiagnostics.scatterplot.draw_count,\n            plots: Array.from(g_gpuDiagnostics.scatterplot.by_key.values()).map((entry) => ({ ...entry })),\n        },\n        breadcrumbs: g_gpuDiagnostics.breadcrumbs.map((entry) => ({ ...entry })),\n    };\n}\n\nexport function gpuDiagHeartbeatTrendSummary() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return null;\n    }\n    return summarizeHeartbeatTrendFromBreadcrumbs(g_gpuDiagnostics.breadcrumbs);\n}\n\n/* Capture only cumulative counters needed to diff one jitter window without cloning the full crash bundle. */\nexport function gpuDiagJitterSnapshot() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return null;\n    }\n    return {\n        at_ms: perfMS(),\n        context_id: g_gpuDiagnostics.context.id ?? null,\n        resource_uploaded_bytes: cloneByteCounts(g_gpuDiagnostics.memory.uploaded_bytes),\n        resource_upload_events: cloneByteCounts(g_gpuDiagnostics.memory.upload_events),\n        readbacks: { ...g_gpuDiagnostics.memory.readbacks },\n        frame_summary: summarizeFrameRuntimeSnapshot(),\n        picker_summary: summarizePickerSnapshot(),\n        dirty_summary: summarizeDirtySnapshot(),\n        scene_summary: sceneSummary(),\n        tile_summary: summarizeTileSnapshot(),\n        text_summary: summarizeTextSnapshot(),\n    };\n}\n\n/* Diff two jitter snapshots into the upload and propagation summary needed for uniform-only motion checks. */\nexport function gpuDiagSummarizeJitterWindow(first, last) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void first;\n        void last;\n        return null;\n    }\n    if (!first || !last) {\n        return null;\n    }\n    return {\n        window_ms: Math.max(0, (last.at_ms ?? 0) - (first.at_ms ?? 0)),\n        context_id: last.context_id ?? null,\n        context_changed: (first.context_id ?? null) !== (last.context_id ?? null),\n        resource_uploaded_bytes_delta: diffCounts(\n            last.resource_uploaded_bytes,\n            first.resource_uploaded_bytes,\n            GPU_BYTE_TYPES,\n        ),\n        resource_upload_events_delta: diffCounts(\n            last.resource_upload_events,\n            first.resource_upload_events,\n            GPU_BYTE_TYPES,\n        ),\n        frame: {\n            draw_count_delta: Math.max(0, (last.frame_summary?.draw_count ?? 0) - (first.frame_summary?.draw_count ?? 0)),\n            activity_count_deltas: diffCounts(\n                last.frame_summary?.activity_counts,\n                first.frame_summary?.activity_counts,\n                Object.keys(cloneFrameActivityCounts()),\n            ),\n            active_event_deltas: diffKeyCountObjects(\n                first.frame_summary?.activity_reason_counts?.active_events,\n                last.frame_summary?.activity_reason_counts?.active_events,\n            ),\n            direct_pick_reason_deltas: diffKeyCountObjects(\n                first.frame_summary?.activity_reason_counts?.direct_pick,\n                last.frame_summary?.activity_reason_counts?.direct_pick,\n            ),\n            passive_pick_reason_deltas: diffKeyCountObjects(\n                first.frame_summary?.activity_reason_counts?.passive_pick,\n                last.frame_summary?.activity_reason_counts?.passive_pick,\n            ),\n            camera_motion_reason_deltas: diffKeyCountObjects(\n                first.frame_summary?.activity_reason_counts?.camera_motion,\n                last.frame_summary?.activity_reason_counts?.camera_motion,\n            ),\n            camera_mode_deltas: diffKeyCountObjects(\n                first.frame_summary?.activity_reason_counts?.camera_mode,\n                last.frame_summary?.activity_reason_counts?.camera_mode,\n            ),\n        },\n        picker: {\n            trigger_count_delta: Math.max(0, (last.picker_summary?.trigger_count ?? 0) - (first.picker_summary?.trigger_count ?? 0)),\n            kind_deltas: diffKeyCountObjects(\n                first.picker_summary?.kind_counts,\n                last.picker_summary?.kind_counts,\n            ),\n            reason_deltas: diffKeyCountObjects(\n                first.picker_summary?.reason_counts,\n                last.picker_summary?.reason_counts,\n            ),\n            gl_fallback_attempt_count_delta: Math.max(\n                0,\n                (last.picker_summary?.gl_fallback_attempt_count ?? 0) - (first.picker_summary?.gl_fallback_attempt_count ?? 0),\n            ),\n            gl_fallback_reason_deltas: diffKeyCountObjects(\n                first.picker_summary?.gl_fallback_reason_counts,\n                last.picker_summary?.gl_fallback_reason_counts,\n            ),\n        },\n        readbacks_delta: {\n            count: Math.max(0, (last.readbacks?.count ?? 0) - (first.readbacks?.count ?? 0)),\n            total_pixels: Math.max(\n                0,\n                (last.readbacks?.total_pixels ?? 0) - (first.readbacks?.total_pixels ?? 0),\n            ),\n            picker_count: Math.max(\n                0,\n                (last.readbacks?.picker_count ?? 0) - (first.readbacks?.picker_count ?? 0),\n            ),\n        },\n        scene: {\n            presentation_revision_delta: Math.max(\n                0,\n                (last.scene_summary?.presentation_revision ?? 0) - (first.scene_summary?.presentation_revision ?? 0),\n            ),\n            presentation_reason_deltas: diffKeyCountObjects(\n                first.scene_summary?.presentation_reason_counts,\n                last.scene_summary?.presentation_reason_counts,\n            ),\n        },\n        tile: {\n            totals: {\n                sync_count: nonNegativeDelta(last.tile_summary?.totals?.sync_count, first.tile_summary?.totals?.sync_count),\n                full_rebuild_count: nonNegativeDelta(last.tile_summary?.totals?.full_rebuild_count, first.tile_summary?.totals?.full_rebuild_count),\n                instance_update_count: nonNegativeDelta(last.tile_summary?.totals?.instance_update_count, first.tile_summary?.totals?.instance_update_count),\n                transform_only_sync_count: nonNegativeDelta(last.tile_summary?.totals?.transform_only_sync_count, first.tile_summary?.totals?.transform_only_sync_count),\n                full_instance_sync_count: nonNegativeDelta(last.tile_summary?.totals?.full_instance_sync_count, first.tile_summary?.totals?.full_instance_sync_count),\n                empty_batch_count: nonNegativeDelta(last.tile_summary?.totals?.empty_batch_count, first.tile_summary?.totals?.empty_batch_count),\n                upload_bytes: nonNegativeDelta(last.tile_summary?.totals?.upload_bytes, first.tile_summary?.totals?.upload_bytes),\n                transform_only_upload_bytes: nonNegativeDelta(last.tile_summary?.totals?.transform_only_upload_bytes, first.tile_summary?.totals?.transform_only_upload_bytes),\n                full_instance_upload_bytes: nonNegativeDelta(last.tile_summary?.totals?.full_instance_upload_bytes, first.tile_summary?.totals?.full_instance_upload_bytes),\n                rebuild_upload_bytes: nonNegativeDelta(last.tile_summary?.totals?.rebuild_upload_bytes, first.tile_summary?.totals?.rebuild_upload_bytes),\n            },\n            propagation_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.tile_summary?.propagation_reason_counts),\n                topCountEntries(last.tile_summary?.propagation_reason_counts),\n            ),\n            dirty_kind_deltas: diffTopCountEntries(\n                topCountEntries(first.tile_summary?.dirty_kind_counts),\n                topCountEntries(last.tile_summary?.dirty_kind_counts),\n            ),\n        },\n        text: {\n            totals: {\n                dirty_count: nonNegativeDelta(last.text_summary?.totals?.dirty_count, first.text_summary?.totals?.dirty_count),\n                sync_count: nonNegativeDelta(last.text_summary?.totals?.sync_count, first.text_summary?.totals?.sync_count),\n                drop_count: nonNegativeDelta(last.text_summary?.totals?.drop_count, first.text_summary?.totals?.drop_count),\n                span_upload_count: nonNegativeDelta(last.text_summary?.totals?.span_upload_count, first.text_summary?.totals?.span_upload_count),\n                span_skip_count: nonNegativeDelta(last.text_summary?.totals?.span_skip_count, first.text_summary?.totals?.span_skip_count),\n                unchanged_span_upload_count: nonNegativeDelta(last.text_summary?.totals?.unchanged_span_upload_count, first.text_summary?.totals?.unchanged_span_upload_count),\n                unchanged_span_skip_count: nonNegativeDelta(last.text_summary?.totals?.unchanged_span_skip_count, first.text_summary?.totals?.unchanged_span_skip_count),\n                unchanged_span_blocked_missing_texture_count: nonNegativeDelta(\n                    last.text_summary?.totals?.unchanged_span_blocked_missing_texture_count,\n                    first.text_summary?.totals?.unchanged_span_blocked_missing_texture_count,\n                ),\n                sync_needs_create_count: nonNegativeDelta(last.text_summary?.totals?.sync_needs_create_count, first.text_summary?.totals?.sync_needs_create_count),\n                sync_full_dirty_count: nonNegativeDelta(last.text_summary?.totals?.sync_full_dirty_count, first.text_summary?.totals?.sync_full_dirty_count),\n                sync_instance_dirty_count: nonNegativeDelta(last.text_summary?.totals?.sync_instance_dirty_count, first.text_summary?.totals?.sync_instance_dirty_count),\n                sync_full_rebuild_count: nonNegativeDelta(last.text_summary?.totals?.sync_full_rebuild_count, first.text_summary?.totals?.sync_full_rebuild_count),\n                sync_instance_only_count: nonNegativeDelta(last.text_summary?.totals?.sync_instance_only_count, first.text_summary?.totals?.sync_instance_only_count),\n                transform_only_sync_count: nonNegativeDelta(last.text_summary?.totals?.transform_only_sync_count, first.text_summary?.totals?.transform_only_sync_count),\n                transform_only_span_changed_count: nonNegativeDelta(last.text_summary?.totals?.transform_only_span_changed_count, first.text_summary?.totals?.transform_only_span_changed_count),\n                instance_propagation_count: nonNegativeDelta(last.text_summary?.totals?.instance_propagation_count, first.text_summary?.totals?.instance_propagation_count),\n            },\n            sync_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.sync_reason_counts),\n                topCountEntries(last.text_summary?.sync_reason_counts),\n            ),\n            drop_source_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.drop_source_counts),\n                topCountEntries(last.text_summary?.drop_source_counts),\n            ),\n            span_block_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.span_block_reason_counts),\n                topCountEntries(last.text_summary?.span_block_reason_counts),\n            ),\n            instance_propagation_reason_deltas: diffTopCountEntries(\n                topCountEntries(first.text_summary?.instance_propagation_reason_counts),\n                topCountEntries(last.text_summary?.instance_propagation_reason_counts),\n            ),\n        },\n    };\n}\n\n/* Build a compact current-state summary for rare context-loss reports. */\nexport function gpuDiagContextLossSummary(contextCreatedAtMS = null, reportCount = 0) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void contextCreatedAtMS;\n        void reportCount;\n        return null;\n    }\n    return {\n        heap_summary: snapshotHeapMemory(),\n        tile_summary: summarizeTileSnapshot(),\n        text_summary: summarizeTextSnapshot(),\n        picker_summary: summarizePickerSnapshot(),\n        dirty_summary: summarizeDirtySnapshot(),\n        frame_summary: summarizeFrameRuntimeSnapshot(),\n        context_summary: summarizeContextRuntimeSnapshot(contextCreatedAtMS, reportCount),\n    };\n}\n\nexport function testingBuildHeartbeatTrendSummary(breadcrumbs) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void breadcrumbs;\n        return null;\n    }\n    return summarizeHeartbeatTrendFromBreadcrumbs(breadcrumbs);\n}\n\nexport function testingBuildCompactGpuSnapshot() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return null;\n    }\n    return gpuDiagCompactSnapshot();\n}\n\n/* Expose retained origin keys for focused diagnostics tests. */\nexport function testingGpuDiagOriginKeys() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return [];\n    }\n    return [...g_gpuDiagnostics.resources.origins.keys()];\n}\n\nexport function gpuDiagWithResourceOrigin(origin, fn) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        if (typeof fn !== 'function') {\n            throw new Error('gpuDiagWithResourceOrigin(origin, fn): fn must be a function.');\n        }\n        void origin;\n        return fn();\n    }\n    if (typeof fn !== 'function') {\n        throw new Error('gpuDiagWithResourceOrigin(origin, fn): fn must be a function.');\n    }\n    g_gpuDiagnostics.resources.originStack.push(origin || '<unknown>');\n    try {\n        return fn();\n    } finally {\n        g_gpuDiagnostics.resources.originStack.pop();\n    }\n}\n\nexport function gpuDiagInstallGlResourceTracker(gl, contextId = null) {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        void gl;\n        void contextId;\n        return false;\n    }\n    if (!gl) {\n        return false;\n    }\n    if (gl.__gpuDiagResourceTrackerInstalled === true) {\n        if (contextId !== null) {\n            g_gpuDiagnostics.resources.current_context_id = contextId;\n        }\n        return false;\n    }\n    const seen = {\n        buffer: new Map(),\n        texture: new Map(),\n        program: new Map(),\n        shader: new Map(),\n        framebuffer: new Map(),\n        renderbuffer: new Map(),\n        vertex_array: new Map(),\n    };\n    const bindings = {\n        buffer: new Map(),\n        texture: new Map(),\n        renderbuffer: null,\n    };\n    const metadata = {\n        buffer: new Map(),\n        texture: new Map(),\n        renderbuffer: new Map(),\n    };\n    const estimateBytes = (value) => {\n        if (typeof value === 'number' && Number.isFinite(value)) {\n            return Math.max(0, value);\n        }\n        if (value?.byteLength !== undefined) {\n            return Math.max(0, value.byteLength);\n        }\n        if (value?.length !== undefined && Number.isFinite(value.length)) {\n            return Math.max(0, value.length);\n        }\n        return 0;\n    };\n    const channelsForFormat = (value) => {\n        switch (value) {\n        case gl.RED:\n        case gl.RED_INTEGER:\n        case gl.ALPHA:\n        case gl.LUMINANCE:\n        case gl.DEPTH_COMPONENT:\n            return 1;\n        case gl.LUMINANCE_ALPHA:\n        case gl.RG:\n        case gl.RG_INTEGER:\n        case gl.DEPTH_STENCIL:\n            return 2;\n        case gl.RGB:\n        case gl.RGB_INTEGER:\n            return 3;\n        default:\n            return 4;\n        }\n    };\n    const bytesPerChannelForType = (value) => {\n        switch (value) {\n        case gl.UNSIGNED_BYTE:\n        case gl.BYTE:\n            return 1;\n        case gl.UNSIGNED_SHORT:\n        case gl.SHORT:\n        case gl.HALF_FLOAT:\n        case gl.HALF_FLOAT_OES:\n        case gl.UNSIGNED_SHORT_5_6_5:\n        case gl.UNSIGNED_SHORT_5_5_5_1:\n        case gl.UNSIGNED_SHORT_4_4_4_4:\n            return 2;\n        case gl.UNSIGNED_INT:\n        case gl.INT:\n        case gl.FLOAT:\n        case gl.UNSIGNED_INT_24_8:\n        case gl.UNSIGNED_INT_2_10_10_10_REV:\n        case gl.UNSIGNED_INT_10F_11F_11F_REV:\n        case gl.UNSIGNED_INT_5_9_9_9_REV:\n            return 4;\n        default:\n            return 1;\n        }\n    };\n    const estimateTextureBytes = (args) => {\n        if (args.length >= 9 && Number.isFinite(args[3]) && Number.isFinite(args[4])) {\n            const width = Math.max(0, args[3] ?? 0);\n            const height = Math.max(0, args[4] ?? 0);\n            const format = args[6];\n            const type = args[7];\n            return width * height * channelsForFormat(format) * bytesPerChannelForType(type);\n        }\n        const src = args[5];\n        if (src?.width !== undefined && src?.height !== undefined) {\n            return Math.max(0, src.width) * Math.max(0, src.height) * 4;\n        }\n        return 0;\n    };\n    const estimateTextureSubBytes = (args) => {\n        if (args.length >= 9 && Number.isFinite(args[4]) && Number.isFinite(args[5])) {\n            const width = Math.max(0, args[4] ?? 0);\n            const height = Math.max(0, args[5] ?? 0);\n            const format = args[6];\n            const type = args[7];\n            return width * height * channelsForFormat(format) * bytesPerChannelForType(type);\n        }\n        const src = args[6];\n        if (src?.width !== undefined && src?.height !== undefined) {\n            return Math.max(0, src.width) * Math.max(0, src.height) * 4;\n        }\n        return 0;\n    };\n    const textureDimensions = (args) => {\n        if (args.length >= 9 && Number.isFinite(args[3]) && Number.isFinite(args[4])) {\n            return { width: Math.max(0, args[3] ?? 0), height: Math.max(0, args[4] ?? 0) };\n        }\n        const src = args[5];\n        if (src?.width !== undefined && src?.height !== undefined) {\n            return { width: Math.max(0, src.width), height: Math.max(0, src.height) };\n        }\n        return { width: 0, height: 0 };\n    };\n    const estimateRenderbufferBytes = (internalFormat, width, height) => {\n        const px = Math.max(0, width) * Math.max(0, height);\n        switch (internalFormat) {\n        case gl.DEPTH_COMPONENT16:\n        case gl.RGB565:\n        case gl.RGBA4:\n        case gl.RGB5_A1:\n            return px * 2;\n        case gl.DEPTH_STENCIL:\n        case gl.DEPTH24_STENCIL8:\n        case gl.RGBA8:\n            return px * 4;\n        default:\n            return px * 4;\n        }\n    };\n    const noteBufferBytes = (obj, target, nextBytes) => {\n        const meta = metadata.buffer.get(obj);\n        if (!meta) {\n            return;\n        }\n        meta.target = target;\n        const prevBytes = meta.size_bytes ?? 0;\n        meta.size_bytes = nextBytes;\n        trackBytes('buffer', meta.origin, prevBytes, nextBytes, nextBytes, 1);\n    };\n    /* Buffer sub-data preserves retained size but still contributes upload pressure. */\n    const noteBufferSubBytes = (obj, target, uploadBytes) => {\n        const meta = metadata.buffer.get(obj);\n        if (!meta) {\n            return;\n        }\n        meta.target = target;\n        const sizeBytes = meta.size_bytes ?? 0;\n        trackBytes('buffer', meta.origin, sizeBytes, sizeBytes, Math.max(0, uploadBytes || 0), 1);\n    };\n    const noteTextureBytes = (obj, target, args) => {\n        const meta = metadata.texture.get(obj);\n        if (!meta) {\n            return;\n        }\n        const nextBytes = estimateTextureBytes(args);\n        const dims = textureDimensions(args);\n        meta.target = target;\n        meta.width = dims.width;\n        meta.height = dims.height;\n        const prevBytes = meta.size_bytes ?? 0;\n        meta.size_bytes = nextBytes;\n        trackBytes('texture', meta.origin, prevBytes, nextBytes, nextBytes, 1);\n        if (prevBytes !== nextBytes || meta.width !== dims.width || meta.height !== dims.height) {\n            push('gpu_tex_image', {\n                origin: meta.origin,\n                bytes: nextBytes,\n                width: dims.width,\n                height: dims.height,\n                target,\n            });\n        }\n    };\n    const noteTextureSubBytes = (obj, target, args) => {\n        const meta = metadata.texture.get(obj);\n        if (!meta) {\n            return;\n        }\n        const uploadBytes = estimateTextureSubBytes(args);\n        trackBytes('texture', meta.origin, meta.size_bytes ?? 0, meta.size_bytes ?? 0, uploadBytes, 1);\n        push('gpu_tex_sub_image', {\n            origin: meta.origin,\n            bytes: uploadBytes,\n            target,\n        });\n    };\n    const noteRenderbufferBytes = (obj, internalFormat, width, height) => {\n        const meta = metadata.renderbuffer.get(obj);\n        if (!meta) {\n            return;\n        }\n        const nextBytes = estimateRenderbufferBytes(internalFormat, width, height);\n        const prevBytes = meta.size_bytes ?? 0;\n        meta.internal_format = internalFormat;\n        meta.width = width;\n        meta.height = height;\n        meta.size_bytes = nextBytes;\n        trackBytes('renderbuffer', meta.origin, prevBytes, nextBytes, nextBytes, 1);\n        if (prevBytes !== nextBytes) {\n            push('gpu_renderbuffer_storage', {\n                origin: meta.origin,\n                bytes: nextBytes,\n                width,\n                height,\n                internal_format: internalFormat,\n            });\n        }\n    };\n    const wrapCreate = (name, type) => {\n        if (typeof gl[name] !== 'function') {\n            return;\n        }\n        const orig = gl[name].bind(gl);\n        gl[name] = (...args) => {\n            const out = orig(...args);\n            if (out) {\n                const origin = currentOrigin();\n                seen[type].set(out, origin);\n                trackCreate(type, origin);\n                if (type === 'buffer' || type === 'texture' || type === 'renderbuffer') {\n                    metadata[type].set(out, { origin, size_bytes: 0 });\n                }\n            }\n            return out;\n        };\n    };\n    const wrapDelete = (name, type) => {\n        if (typeof gl[name] !== 'function') {\n            return;\n        }\n        const orig = gl[name].bind(gl);\n        gl[name] = (obj, ...args) => {\n            if (obj && seen[type].has(obj)) {\n                const origin = seen[type].get(obj) ?? '<unknown>';\n                if ((type === 'buffer' || type === 'texture' || type === 'renderbuffer') && metadata[type].has(obj)) {\n                    const prevBytes = metadata[type].get(obj)?.size_bytes ?? 0;\n                    trackBytes(type, origin, prevBytes, 0, 0);\n                    metadata[type].delete(obj);\n                }\n                seen[type].delete(obj);\n                trackDelete(type, origin);\n            }\n            return orig(obj, ...args);\n        };\n    };\n    if (typeof gl.bindBuffer === 'function') {\n        const orig = gl.bindBuffer.bind(gl);\n        gl.bindBuffer = (target, obj) => {\n            bindings.buffer.set(target, obj ?? null);\n            return orig(target, obj);\n        };\n    }\n    if (typeof gl.bindTexture === 'function') {\n        const orig = gl.bindTexture.bind(gl);\n        gl.bindTexture = (target, obj) => {\n            bindings.texture.set(target, obj ?? null);\n            return orig(target, obj);\n        };\n    }\n    if (typeof gl.bindRenderbuffer === 'function') {\n        const orig = gl.bindRenderbuffer.bind(gl);\n        gl.bindRenderbuffer = (target, obj) => {\n            if (target === gl.RENDERBUFFER) {\n                bindings.renderbuffer = obj ?? null;\n            }\n            return orig(target, obj);\n        };\n    }\n    wrapCreate('createBuffer', 'buffer');\n    wrapDelete('deleteBuffer', 'buffer');\n    wrapCreate('createTexture', 'texture');\n    wrapDelete('deleteTexture', 'texture');\n    wrapCreate('createProgram', 'program');\n    wrapDelete('deleteProgram', 'program');\n    wrapCreate('createShader', 'shader');\n    wrapDelete('deleteShader', 'shader');\n    wrapCreate('createFramebuffer', 'framebuffer');\n    wrapDelete('deleteFramebuffer', 'framebuffer');\n    wrapCreate('createRenderbuffer', 'renderbuffer');\n    wrapDelete('deleteRenderbuffer', 'renderbuffer');\n    wrapCreate('createVertexArray', 'vertex_array');\n    wrapDelete('deleteVertexArray', 'vertex_array');\n    if (typeof gl.bufferData === 'function') {\n        const orig = gl.bufferData.bind(gl);\n        gl.bufferData = (target, srcOrSize, usage, ...args) => {\n            const out = orig(target, srcOrSize, usage, ...args);\n            const obj = bindings.buffer.get(target);\n            if (obj) {\n                noteBufferBytes(obj, target, estimateBytes(srcOrSize));\n            }\n            return out;\n        };\n    }\n    if (typeof gl.bufferSubData === 'function') {\n        const orig = gl.bufferSubData.bind(gl);\n        gl.bufferSubData = (target, dstByteOffset, srcData, ...args) => {\n            const out = orig(target, dstByteOffset, srcData, ...args);\n            const obj = bindings.buffer.get(target);\n            if (obj) {\n                noteBufferSubBytes(obj, target, estimateBytes(srcData));\n            }\n            return out;\n        };\n    }\n    if (typeof gl.texImage2D === 'function') {\n        const orig = gl.texImage2D.bind(gl);\n        gl.texImage2D = (...args) => {\n            const out = orig(...args);\n            const target = args[0];\n            const obj = bindings.texture.get(target);\n            if (obj) {\n                noteTextureBytes(obj, target, args);\n            }\n            return out;\n        };\n    }\n    if (typeof gl.texSubImage2D === 'function') {\n        const orig = gl.texSubImage2D.bind(gl);\n        gl.texSubImage2D = (...args) => {\n            const out = orig(...args);\n            const target = args[0];\n            const obj = bindings.texture.get(target);\n            if (obj) {\n                noteTextureSubBytes(obj, target, args);\n            }\n            return out;\n        };\n    }\n    if (typeof gl.renderbufferStorage === 'function') {\n        const orig = gl.renderbufferStorage.bind(gl);\n        gl.renderbufferStorage = (target, internalFormat, width, height, ...args) => {\n            const out = orig(target, internalFormat, width, height, ...args);\n            if (target === gl.RENDERBUFFER && bindings.renderbuffer) {\n                noteRenderbufferBytes(bindings.renderbuffer, internalFormat, width, height);\n            }\n            return out;\n        };\n    }\n    if (typeof gl.readPixels === 'function') {\n        const orig = gl.readPixels.bind(gl);\n        gl.readPixels = (x, y, width, height, format, type, pixels, ...args) => {\n            const t0 = perfMS();\n            const out = orig(x, y, width, height, format, type, pixels, ...args);\n            const dt = Math.max(0, perfMS() - t0);\n            g_gpuDiagnostics.memory.readbacks.count += 1;\n            g_gpuDiagnostics.memory.readbacks.total_pixels += Math.max(0, width) * Math.max(0, height);\n            g_gpuDiagnostics.memory.readbacks.last_at_ms = nowMS();\n            g_gpuDiagnostics.memory.readbacks.last_duration_ms = dt;\n            g_gpuDiagnostics.memory.readbacks.max_duration_ms = Math.max(g_gpuDiagnostics.memory.readbacks.max_duration_ms, dt);\n            g_gpuDiagnostics.memory.readbacks.last_read_width = width ?? 0;\n            g_gpuDiagnostics.memory.readbacks.last_read_height = height ?? 0;\n            return out;\n        };\n    }\n    gl.__gpuDiagResourceTrackerInstalled = true;\n    gl.__gpuDiagResourceTrackerSeen = seen;\n    g_gpuDiagnostics.resources.current_context_id = contextId;\n    return true;\n}\n\nexport function gpuDiagReset() {\n    if (!GPU_DIAGNOSTICS_ENABLED) {\n        return;\n    }\n    g_gpuDiagnostics.seq = 1;\n    g_gpuDiagnostics.breadcrumbs = [];\n    g_gpuDiagnostics.context = {\n        id: null,\n        created_at_ms: null,\n        restored_at_ms: null,\n    };\n    g_gpuDiagnostics.frame = {\n        stamp: 0,\n        last_heartbeat_at_ms: 0,\n        last_heartbeat_draw_count: 0,\n        last_draw_at_ms: 0,\n        last_phase: '',\n        last_phase_at_ms: 0,\n        draw_count: 0,\n        activity: null,\n        activity_counts: {\n            frames: 0,\n            user_input: 0,\n            mouse_moved: 0,\n            direct_pick: 0,\n            passive_pick: 0,\n            camera_matrix_changed: 0,\n            camera_motion: 0,\n            renderless: 0,\n            scene_not_fully_rendered: 0,\n        },\n        activity_reason_counts: {\n            active_events: {},\n            direct_pick: {},\n            passive_pick: {},\n            camera_motion: {},\n            camera_mode: {},\n        },\n    };\n    g_gpuDiagnostics.gl = {\n        last_error: null,\n        draw_error_count: 0,\n    };\n    g_gpuDiagnostics.resources = {\n        current_context_id: null,\n        live: zeroCounts(),\n        high_water: zeroCounts(),\n        created: zeroCounts(),\n        deleted: zeroCounts(),\n        originStack: [],\n        origins: new Map(),\n    };\n    g_gpuDiagnostics.memory = {\n        live_bytes: zeroByteCounts(),\n        high_water_bytes: zeroByteCounts(),\n        uploaded_bytes: zeroByteCounts(),\n        upload_events: zeroByteCounts(),\n        readbacks: {\n            count: 0,\n            total_pixels: 0,\n            last_at_ms: 0,\n            last_duration_ms: 0,\n            max_duration_ms: 0,\n            picker_count: 0,\n            last_picker_id: 0,\n            last_read_width: 0,\n            last_read_height: 0,\n        },\n    };\n    g_gpuDiagnostics.scatterplot = {\n        by_key: new Map(),\n        draw_heartbeat_by_key: new Map(),\n        rebuild_count: 0,\n        draw_count: 0,\n    };\n    g_gpuDiagnostics.picker = {\n        trigger_count: 0,\n        kind_counts: {},\n        reason_counts: {},\n        gl_fallback_attempt_count: 0,\n        gl_fallback_reason_counts: {},\n        last_kind: '',\n        last_reason: '',\n        last_trigger_at_ms: 0,\n        dirty_resources: new Map(),\n    };\n    g_gpuDiagnostics.dirty = {\n        resources: new Map(),\n    };\n    g_gpuDiagnostics.scene = {\n        presentation_revision: 0,\n        presentation_reason_counts: {},\n        last_presentation: null,\n    };\n    g_gpuDiagnostics.tile = {\n        groups: new Map(),\n    };\n    g_gpuDiagnostics.text = {\n        groups: new Map(),\n        nodes: new Map(),\n        buttons: new Map(),\n    };\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { gpuDiagNoteGlError } from './browser-gpu-diagnostics.mjs';\n\nconst CHECK_GL_DRAW_ERRORS = (() => {\n    if (typeof globalThis === 'undefined') {\n        return false;\n    }\n    if (globalThis.__PORTAL_CHECK_GL_DRAW_ERRORS__ === true) {\n        return true;\n    }\n    if (typeof window === 'undefined' || typeof window.location?.search !== 'string') {\n        return false;\n    }\n    const raw = new URLSearchParams(window.location.search).get('testing_gl_draw_errors');\n    return raw === '1' || raw === 'true';\n})();\n\nfunction throwGlDrawError(gl, label, bufferInfo, instanceCount = null) {\n    const err = gl.getError();\n    if (err === gl.NO_ERROR) {\n        return;\n    }\n    gpuDiagNoteGlError('draw', {\n        label,\n        err_hex: `0x${err.toString(16)}`,\n        num_elements: bufferInfo?.numElements ?? null,\n        instance_count: instanceCount,\n    });\n    const instanceDetail = instanceCount === null ? '' : `, instanceCount=${instanceCount}`;\n    throw new Error(\n        `${label}: GL draw failed ` +\n        `(err=0x${err.toString(16)}, numElements=${bufferInfo?.numElements}${instanceDetail})`\n    );\n}\n\n\nfunction disableAttribArraysUsingBuffer(gl, buffer) {\n    if (!gl?.getParameter || !gl?.getVertexAttrib || !gl?.disableVertexAttribArray) {\n        return;\n    }\n    const maxAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS) ?? 0;\n    for (let i = 0; i < maxAttribs; i++) {\n        const enabled = gl.getVertexAttrib(i, gl.VERTEX_ATTRIB_ARRAY_ENABLED);\n        if (!enabled) {\n            continue;\n        }\n        const boundBuffer = gl.getVertexAttrib(i, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING);\n        if (boundBuffer === buffer) {\n            gl.disableVertexAttribArray(i);\n        }\n    }\n}\n\nfunction unbindDeletedBufferTargets(gl, buffer) {\n    if (!gl?.getParameter || !gl?.bindBuffer) {\n        return;\n    }\n    if (gl.getParameter(gl.ARRAY_BUFFER_BINDING) === buffer) {\n        gl.bindBuffer(gl.ARRAY_BUFFER, null);\n    }\n    if (gl.getParameter(gl.ELEMENT_ARRAY_BUFFER_BINDING) === buffer) {\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n    }\n}\n\nexport function deleteBufferInfo(gl, info) {\n    if (!gl || !info) {\n        return;\n    }\n\n    /*Keep track of already deleted buffers*/\n    const seen = new Set();\n\n    for (const key of Object.keys(info.attribs || {})) {\n        const buf = info.attribs[key]?.buffer;\n\n        /* If already deleted or null skip */\n        if (!buf || seen.has(buf)) {\n            continue;\n        }\n        disableAttribArraysUsingBuffer(gl, buf);\n        unbindDeletedBufferTargets(gl, buf);\n        gl.deleteBuffer(buf);\n        seen.add(buf);\n    }\n\n    /*Clean Indices*/\n    if (info.indices && !seen.has(info.indices)) {\n        \n        /*if the indices are in a nexted buffer*/\n        if(info.indices.buffer){\n            disableAttribArraysUsingBuffer(gl, info.indices.buffer);\n            unbindDeletedBufferTargets(gl, info.indices.buffer);\n            gl.deleteBuffer(info.indices.buffer);\n        }\n        disableAttribArraysUsingBuffer(gl, info.indices);\n        unbindDeletedBufferTargets(gl, info.indices);\n        gl.deleteBuffer(info.indices);\n    }\n\n    /*Clean Vertex Array Objects*/\n    if (info.vao) {\n        gl.deleteVertexArray(info.vao);\n    }\n}\n\nexport function drawArraysInstancedChecked(gl, label, bufferInfo, instanceCount) {\n    gl.drawArraysInstanced(gl.TRIANGLES, 0, bufferInfo.numElements, instanceCount);\n    if (!CHECK_GL_DRAW_ERRORS) {\n        return;\n    }\n    throwGlDrawError(gl, label, bufferInfo, instanceCount);\n}\n\nexport function drawBufferInfoInstancedChecked(gl, label, bufferInfo, instanceCount) {\n    if (bufferInfo?.indices) {\n        gl.drawElementsInstanced(\n            gl.TRIANGLES,\n            bufferInfo.numElements,\n            bufferInfo.elementType ?? gl.UNSIGNED_SHORT,\n            0,\n            instanceCount,\n        );\n    } else {\n        gl.drawArraysInstanced(gl.TRIANGLES, 0, bufferInfo.numElements, instanceCount);\n    }\n    if (!CHECK_GL_DRAW_ERRORS) {\n        return;\n    }\n    throwGlDrawError(gl, label, bufferInfo, instanceCount);\n}\n\nexport function drawArraysChecked(gl, label, bufferInfo) {\n    gl.drawArrays(gl.TRIANGLES, 0, bufferInfo.numElements);\n    if (!CHECK_GL_DRAW_ERRORS) {\n        return;\n    }\n    throwGlDrawError(gl, label, bufferInfo);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { Mouse } from '../../controls.mjs';\nimport { gpuDiagNotePickerRead, gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\n\nconst PICKING_PIXEL_BUFFER = new Uint8Array(4);\n\nfunction dropPickerBuffer(gl, shared) {\n    if (shared.ownGlPickerBufferInfo) {\n        deleteBufferInfo(gl, shared.ownGlPickerBufferInfo);\n        shared.ownGlPickerBufferInfo = null;\n    }\n    shared.borPickerMesh = null;\n}\n\nfunction decodePickerPixel(buffer) {\n    if (buffer[3] === 0) return 0; // Transparent / No selection\n    return (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];\n}\n\nexport function getGLPickerBufferInfo(gl, shared, mesh) {\n    if (!mesh) {\n        dropPickerBuffer(gl, shared);\n        return null;\n    }\n    if (shared.ownGlPickerBufferInfo && shared.borPickerMesh === mesh) {\n        return shared.ownGlPickerBufferInfo;\n    }\n    dropPickerBuffer(gl, shared);\n    shared.ownGlPickerBufferInfo = gpuDiagWithResourceOrigin('gl_picker.mesh_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n        position: { numComponents: 3, data: mesh },\n    }));\n    shared.borPickerMesh = mesh;\n    return shared.ownGlPickerBufferInfo;\n}\n\nexport function drawGLPicker(gl, scene, t, viewMatrix, projectionMatrix) {\n    const mouseWorld = scene?.camera?.getMouseWorldPosition?.() ?? null;\n    const drawPickerBatchers = (map) => {\n        for (const res of map.values()) {\n            let borPickerNodes = null;\n            if (Array.isArray(res.nodes)) {\n                borPickerNodes = res.nodes.filter(node =>\n                    scene._isPresentedNode(node)\n                    && node.computedVisible !== false\n                    && pickClipAllowsNode(node, mouseWorld)\n                );\n                if (borPickerNodes.length === 0) {\n                    continue;\n                }\n            }\n            if (borPickerNodes) {\n                const prevBorPickerNodes = res.borPickerNodes;\n                res.borPickerNodes = borPickerNodes;\n                try {\n                    res.classConstructor?._drawGLPickable?.(gl, res, t, viewMatrix, projectionMatrix);\n                } finally {\n                    if (prevBorPickerNodes === undefined) {\n                        delete res.borPickerNodes;\n                    } else {\n                        res.borPickerNodes = prevBorPickerNodes;\n                    }\n                }\n                continue;\n            }\n            res.classConstructor?._drawGLPickable?.(gl, res, t, viewMatrix, projectionMatrix);\n        }\n    };\n    drawPickerBatchers(scene._opaqueBatchers);\n    drawPickerBatchers(scene._textBatchers);\n    drawPickerBatchers(scene._transparentBatchers);\n}\n\n/**\n * Executes an immediate, synchronous pixel read from the offscreen picker buffer.\n */\nexport function readPixelBuffer(gl, scene, t, viewMatrix, projectionMatrix, opts = {}) {\n    const pickerData = scene?._glPickerData;\n    if (!pickerData || Mouse.x === undefined || Mouse.y === undefined) return 0;\n    const hadBlend = gl.isEnabled(gl.BLEND);\n    const hadDither = gl.isEnabled(gl.DITHER);\n\n    // 1. SETUP AND DRAW TO OFFSCREEN BUFFER\n    gl.bindFramebuffer(gl.FRAMEBUFFER, pickerData.frameBuffer);\n    gl.viewport(0, 0, 1, 1);\n    gl.disable(gl.BLEND);\n    gl.disable(gl.DITHER);\n\n    // The projection matrix is already focused onto the desired screen pixel, so\n    // the picker target can stay fixed at 1x1 regardless of window size.\n    gl.enable(gl.SCISSOR_TEST);\n    gl.scissor(0, 0, 1, 1);\n    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n    \n    drawGLPicker(gl, scene, t, viewMatrix, projectionMatrix);\n\n    // Ensure PBO is explicitly unbound in case it was bound by other processes\n    gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null); \n    \n    // Read directly into the CPU memory array\n    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, PICKING_PIXEL_BUFFER);\n\n    // 3. CLEANUP STATE\n    gl.disable(gl.SCISSOR_TEST);\n    if (hadBlend) {\n        gl.enable(gl.BLEND);\n    }\n    if (hadDither) {\n        gl.enable(gl.DITHER);\n    }\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n    // Decode and save the result\n    pickerData.lastPickedId = decodePickerPixel(PICKING_PIXEL_BUFFER);\n    gpuDiagNotePickerRead({\n        width: 1,\n        height: 1,\n        picked_id: pickerData.lastPickedId,\n    });\n}\n\nfunction pickClipAllowsNode(node, mouseWorld) {\n    const rect = node?.computedClipRect;\n    if (!rect || !mouseWorld) {\n        return true;\n    }\n    const [x, y] = mouseWorld;\n    return x >= rect[0]\n        && x <= rect[2]\n        && y >= rect[1]\n        && y <= rect[3];\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst INPUT_ROUTE_LOGGING_ENABLED = false;\n\n/* Keep one explicit switch for route-logging seams so call sites can stay wired without emitting by default. */\nexport function inputRouteLoggingEnabled() {\n    return INPUT_ROUTE_LOGGING_ENABLED;\n}\n\n/* Keep pointer-route logs focused on click and wheel actions rather than per-frame hold churn. */\nexport function shouldLogPointerRoute(events) {\n    if (!inputRouteLoggingEnabled()) {\n        return false;\n    }\n    if (!events?.has) {\n        return false;\n    }\n    return events.has('L_MOUSE_DOWN')\n        || events.has('L_MOUSE_UP')\n        || events.has('R_MOUSE_DOWN')\n        || events.has('R_MOUSE_UP')\n        || events.has('DOUBLE_CLICK')\n        || events.has('SCROLL_LEFT')\n        || events.has('SCROLL_RIGHT')\n        || events.has('SCROLL_UP')\n        || events.has('SCROLL_DOWN')\n        || events.has('SCROLL_LEFT_PIXEL')\n        || events.has('SCROLL_RIGHT_PIXEL')\n        || events.has('SCROLL_UP_PIXEL')\n        || events.has('SCROLL_DOWN_PIXEL');\n}\n\n/* Flatten one pointer-event frame into a stable console-friendly summary. */\nexport function summarizePointerEvents(events) {\n    return {\n        events: Array.from(events ?? []),\n        wheel_delta_x: Number.isFinite(events?.wheelDeltaX) ? events.wheelDeltaX : null,\n        wheel_delta_y: Number.isFinite(events?.wheelDeltaY) ? events.wheelDeltaY : null,\n        wheel_delta_mode: Number.isFinite(events?.wheelDeltaMode) ? events.wheelDeltaMode : null,\n    };\n}\n\n/* Flatten one key event into a narrow stable route summary. */\nexport function summarizeKeyEvent(evt) {\n    return {\n        key: evt?.key ?? null,\n        ctrl: evt?.ctrlKey === true,\n        shift: evt?.shiftKey === true,\n        alt: evt?.altKey === true,\n        meta: evt?.metaKey === true,\n    };\n}\n\n/* Build one compact stable label for a route target. */\nexport function routeNodeLabel(node) {\n    if (!node) {\n        return 'null';\n    }\n    const base = node.state?.name\n        ?? node.focusContainerKind\n        ?? node.constructor?.name\n        ?? 'Node';\n    const line = Number.isInteger(node.cellID) ? node.cellID : null;\n    return line === null ? base : `${base}(line=${line})`;\n}\n\nfunction nodeLocalPosition(node) {\n    if (typeof node?.localPosition !== 'function') {\n        return null;\n    }\n    const pos = node.localPosition();\n    if (!Array.isArray(pos) || pos.length < 3) {\n        return null;\n    }\n    return [\n        Number.isFinite(pos[0]) ? pos[0] : null,\n        Number.isFinite(pos[1]) ? pos[1] : null,\n        Number.isFinite(pos[2]) ? pos[2] : null,\n    ];\n}\n\n/* Snapshot narrow node and scene state so consumed vs masked can be inferred mechanically. */\nexport function pointerRouteStateStamp(scene, node) {\n    return JSON.stringify({\n        selected_interactable: scene?.selectedIteractable ?? null,\n        drag_capture: scene?.dragCapture ?? null,\n        node: routeNodeLabel(node),\n        node_local_position: nodeLocalPosition(node),\n        node_visible: node?.visible !== false,\n        node_enabled: node?.enabled !== false,\n        node_hovering: node?._mouseIsHovering === true,\n        node_expanded: node?.expanded === true,\n        node_in_focus: node?.inFocus === true,\n        node_cursor_col: node?.cursorIndex ?? null,\n        node_is_held: node?.isHeld === true,\n    });\n}\n\n/* Emit one consolidated key-route trace. */\nexport function logKeyRoute(trace) {\n    if (!inputRouteLoggingEnabled()) {\n        return;\n    }\n    console.log('[input-key-route]', trace);\n}\n\n/* Emit one consolidated pointer-route trace. */\nexport function logPointerRoute(trace) {\n    if (!inputRouteLoggingEnabled()) {\n        return;\n    }\n    console.log('[input-pointer-route]', trace);\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Bump this on every debugging/instrumentation edit so captures can prove\n// which frontend revision produced them.\nexport const PORTAL_DEBUG_BUILD_VERSION = 9;\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { PORTAL_DEBUG_BUILD_VERSION } from '../debug-build-version.mjs';\n\nlet g_requestFrame = null;\n\ntry {\n    globalThis.__frameWakeupDebugBuildVersion__ = PORTAL_DEBUG_BUILD_VERSION;\n} catch (_err) {\n    // Ignore if globalThis is not writable.\n}\n\n/* Install the single portal-owned frame requester so lower layers can wake the scheduler without importing portal.mjs directly. */\nexport function installFrameRequester(requestFrame) {\n    if (requestFrame !== null && typeof requestFrame !== 'function') {\n        throw new Error('installFrameRequester(...): expected a function or null.');\n    }\n    g_requestFrame = requestFrame;\n}\n\n/* Wake the portal frame loop when input, transport, or model work becomes pending. */\nexport function requestFrame(reason = 'unspecified') {\n    if (!g_requestFrame) {\n        return false;\n    }\n    g_requestFrame(reason);\n    return true;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { gpuDiagNotePickerClear, gpuDiagNotePickerDirty, gpuDiagNoteResourceDirty } from './browser-gpu-diagnostics.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\n\nexport const DIRTY = Object.freeze({\n    attach: 'attach',\n    detach: 'detach',\n    structure: 'structure',\n    content: 'content',\n    text: 'text',\n    style: 'style',\n    layout: 'layout',\n    transform: 'transform',\n    visibility: 'visibility',\n    instance: 'instance',\n    buffer: 'buffer',\n    pickerBatch: 'pickerBatch',\n    pickerPose: 'pickerPose',\n});\n\nconst DIRTY_KIND_ORDER = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.content,\n    DIRTY.text,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n    DIRTY.buffer,\n    DIRTY.pickerBatch,\n    DIRTY.pickerPose,\n]);\n\nconst DIRTY_MASKS = Object.freeze(Object.fromEntries(\n    DIRTY_KIND_ORDER.map((kind, index) => [kind, 1 << index]),\n));\n\nconst NON_PICKER_DIRTY_KINDS = Object.freeze(DIRTY_KIND_ORDER.filter(\n    (kind) => kind !== DIRTY.pickerBatch && kind !== DIRTY.pickerPose,\n));\n\nconst NON_PICKER_DIRTY_MASK = NON_PICKER_DIRTY_KINDS.reduce(\n    (mask, kind) => mask | DIRTY_MASKS[kind],\n    0,\n);\n\nconst DIRTY_KINDS_VIEW = Symbol('DIRTY_KINDS_VIEW');\n\n/* Collapse one or more dirty-kind labels into the compact mask stored on each shared resource. */\nexport function dirtyMaskOf(kinds) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    let mask = 0;\n    for (const kind of list) {\n        if (!kind) {\n            continue;\n        }\n        mask |= DIRTY_MASKS[kind] ?? 0;\n    }\n    return mask;\n}\n\n/* Expand a resource's dirty mask back into stable kind labels for diagnostics and tests. */\nexport function resourceDirtyKinds(shared) {\n    const mask = shared?.dirtyMask ?? 0;\n    return DIRTY_KIND_ORDER.filter(kind => (mask & DIRTY_MASKS[kind]) !== 0);\n}\n\n/* Keep legacy `dirtyKinds` reads alive while the compact mask becomes the semantic source of truth. */\nfunction createDirtyKindsView(shared) {\n    return {\n        has(kind) {\n            return hasAnyResourceDirty(shared, kind);\n        },\n        add(kind) {\n            markResourceDirty(shared, kind);\n            return this;\n        },\n        delete(kind) {\n            const hadKind = hasAnyResourceDirty(shared, kind);\n            clearResourceDirty(shared, kind);\n            return hadKind;\n        },\n        clear() {\n            shared.dirtyMask = 0;\n            syncResourceDirtyState(shared);\n        },\n        get size() {\n            return resourceDirtyKinds(shared).length;\n        },\n        [Symbol.iterator]() {\n            return resourceDirtyKinds(shared)[Symbol.iterator]();\n        },\n    };\n}\n\n/* Normalise any legacy dirty-kind seed into one canonical per-resource mask and compatibility view. */\nfunction ensureDirtyMask(shared) {\n    if (!shared) {\n        return 0;\n    }\n    let mask = Number.isInteger(shared.dirtyMask) ? shared.dirtyMask : 0;\n    const legacyKinds = shared.dirtyKinds;\n    const dirtyKindsView = shared[DIRTY_KINDS_VIEW] ?? null;\n    if (legacyKinds && legacyKinds !== dirtyKindsView) {\n        mask = dirtyMaskOf(Array.from(legacyKinds));\n    }\n    shared.dirtyMask = mask;\n    if (!dirtyKindsView) {\n        shared[DIRTY_KINDS_VIEW] = createDirtyKindsView(shared);\n    }\n    shared.dirtyKinds = shared[DIRTY_KINDS_VIEW];\n    return mask;\n}\n\n/* Mirror picker bits onto the historical booleans already consumed in picker scheduling paths. */\nfunction syncResourceDirtyState(shared) {\n    const mask = ensureDirtyMask(shared);\n    shared.pickerBatchDirty = (mask & DIRTY_MASKS[DIRTY.pickerBatch]) !== 0;\n    shared.pickerPoseDirty = (mask & DIRTY_MASKS[DIRTY.pickerPose]) !== 0;\n}\n\nfunction perfDirtyLabel(shared) {\n    const raw = shared?.dirtyLabel\n        ?? shared?.key\n        ?? shared?.resourceKey\n        ?? shared?.classConstructor?.name\n        ?? 'unknown';\n    return String(raw).replace(/[^A-Za-z0-9_.:-]/g, '_');\n}\n\nfunction perfDirtySource(source) {\n    if (!source) {\n        return 'unknown';\n    }\n    if (typeof source === 'string') {\n        return String(source).replace(/[^A-Za-z0-9_.:-]/g, '_');\n    }\n    const name = source?.state?.name ?? null;\n    const key = typeof source?._resourceKey === 'function' ? source._resourceKey() : null;\n    const ctor = source?.constructor?.name ?? 'unknown';\n    const raw = name ? `${ctor}:${name}` : (key ?? ctor);\n    return String(raw).replace(/[^A-Za-z0-9_.:-]/g, '_');\n}\n\nfunction perfDirtySourcePath(source, maxDepth = 5) {\n    if (!source || typeof source === 'string') {\n        return perfDirtySource(source);\n    }\n    const parts = [];\n    let node = source;\n    let depth = 0;\n    while (node && depth < maxDepth) {\n        parts.push(perfDirtySource(node));\n        node = node.parentNode ?? null;\n        depth += 1;\n    }\n    return parts.join('__');\n}\n\n/* Add new dirty kinds by OR-ing them into the shared resource mask and waking the next frame once. */\nexport function markResourceDirty(shared, kinds, source = null) {\n    if (!shared) {\n        return;\n    }\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    const resourceKey = perfDirtyLabel(shared);\n    let mask = ensureDirtyMask(shared);\n    const addedKinds = [];\n    for (const kind of list) {\n        if (!kind) {\n            continue;\n        }\n        const kindMask = DIRTY_MASKS[kind] ?? 0;\n        if (kindMask === 0 || (mask & kindMask) !== 0) {\n            continue;\n        }\n        mask |= kindMask;\n        if (globalThis.__eviluiPerformanceTracker?.enabled) {\n            const label = perfDirtyLabel(shared);\n            globalThis.__eviluiPerformanceTracker.incrementCounter(`dirty_mark_kind.${kind}`);\n            globalThis.__eviluiPerformanceTracker.incrementCounter(`dirty_mark.${label}.${kind}`);\n            globalThis.__eviluiPerformanceTracker.incrementCounter(\n                `dirty_first_source.${label}.${kind}.${perfDirtySource(source)}`,\n            );\n            globalThis.__eviluiPerformanceTracker.incrementCounter(\n                `dirty_first_source_path.${label}.${kind}.${perfDirtySourcePath(source)}`,\n            );\n        }\n        addedKinds.push(kind);\n    }\n    shared.dirtyMask = mask;\n    syncResourceDirtyState(shared);\n    if (addedKinds.length > 0) {\n        gpuDiagNoteResourceDirty(resourceKey, {\n            source: perfDirtySource(source),\n            source_path: perfDirtySourcePath(source),\n            kinds: addedKinds,\n        });\n        requestFrame(`resource_dirty:${resourceKey}`);\n    }\n    for (const kind of addedKinds) {\n        if (kind !== DIRTY.pickerBatch && kind !== DIRTY.pickerPose) {\n            continue;\n        }\n        gpuDiagNotePickerDirty(resourceKey, kind, {\n            source: perfDirtySource(source),\n            dirty_kinds: resourceDirtyKinds(shared),\n        });\n    }\n}\n\n/* Clear selected dirty bits and keep picker diagnostics aligned with the remaining resource mask. */\nexport function clearResourceDirty(shared, kinds) {\n    if (!shared) {\n        return;\n    }\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    let mask = ensureDirtyMask(shared);\n    const resourceKey = perfDirtyLabel(shared);\n    for (const kind of list) {\n        const kindMask = DIRTY_MASKS[kind] ?? 0;\n        const hadKind = kindMask !== 0 && (mask & kindMask) !== 0;\n        mask &= ~kindMask;\n        if (!hadKind) {\n            continue;\n        }\n        if (kind === DIRTY.pickerBatch || kind === DIRTY.pickerPose) {\n            gpuDiagNotePickerClear(resourceKey, kind, {\n                dirty_kinds: DIRTY_KIND_ORDER.filter(otherKind => (mask & DIRTY_MASKS[otherKind]) !== 0),\n            });\n        }\n    }\n    shared.dirtyMask = mask;\n    syncResourceDirtyState(shared);\n}\n\n/* Drop all non-picker dirty bits while preserving picker-only invalidation between pick passes. */\nexport function clearNonPickerResourceDirty(shared) {\n    if (!shared) {\n        return;\n    }\n    shared.dirtyMask = ensureDirtyMask(shared) & ~NON_PICKER_DIRTY_MASK;\n    syncResourceDirtyState(shared);\n}\n\n/* Answer whether any of the requested dirty kinds are present by testing the compact resource mask. */\nexport function hasAnyResourceDirty(shared, kinds = null) {\n    if (!shared) {\n        return false;\n    }\n    const mask = ensureDirtyMask(shared);\n    if (kinds === null) {\n        return mask !== 0;\n    }\n    return (mask & dirtyMaskOf(kinds)) !== 0;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst CLICK_TRACE_WINDOW_MS = 1200;\nconst CLICK_TRACE_FLUSH_DELAY_MS = 1300;\nconst CLICK_TRACE_ENABLED = false;\n\nfunction scheduleTraceFlush(trace) {\n    if (!CLICK_TRACE_ENABLED) {\n        return;\n    }\n    if (trace.flush_timer != null) {\n        clearTimeout(trace.flush_timer);\n    }\n    trace.flush_timer = setTimeout(() => {\n        flushClickFocusTrace(trace.seq, 'timeout');\n    }, CLICK_TRACE_FLUSH_DELAY_MS);\n}\n\n/* Return the active click-scoped debug trace while it is still within its short investigation window. */\nexport function activeClickFocusTrace() {\n    if (!CLICK_TRACE_ENABLED) {\n        return null;\n    }\n    const trace = globalThis.__portalClickFocusTrace ?? null;\n    if (!trace || !Number.isFinite(trace.until_ms) || performance.now() > trace.until_ms) {\n        return null;\n    }\n    return trace;\n}\n\n/* Flush one aggregated click trace as a single console event so multi-step focus logs stay pasteable. */\nexport function flushClickFocusTrace(seq = null, flushReason = 'manual') {\n    if (!CLICK_TRACE_ENABLED) {\n        void seq;\n        void flushReason;\n        return false;\n    }\n    const trace = globalThis.__portalClickFocusTrace ?? null;\n    if (!trace) {\n        return false;\n    }\n    if (seq !== null && trace.seq !== seq) {\n        return false;\n    }\n    if (trace.flushed === true) {\n        return false;\n    }\n    trace.flushed = true;\n    if (trace.flush_timer != null) {\n        clearTimeout(trace.flush_timer);\n        trace.flush_timer = null;\n    }\n    console.log('[click-trace]', {\n        seq: trace.seq,\n        click_reason: trace.reason ?? null,\n        click_button: trace.button ?? null,\n        click_detail: trace.detail ?? null,\n        flush_reason: flushReason,\n        events: Array.isArray(trace.events) ? trace.events : [],\n    });\n    if ((globalThis.__portalClickFocusTrace ?? null)?.seq === trace.seq) {\n        globalThis.__portalClickFocusTrace = null;\n    }\n    return true;\n}\n\n/* Start one fresh click-scoped aggregation window and retire any older pending trace first. */\nexport function armClickFocusTrace(reason, event = null) {\n    if (!CLICK_TRACE_ENABLED) {\n        void reason;\n        void event;\n        return null;\n    }\n    const now = performance.now();\n    const cur = activeClickFocusTrace();\n    const button = event?.button ?? null;\n    const canExtend = !!cur\n        && cur.flushed !== true\n        && (\n            (cur.reason === 'mouse_down' && reason === 'mouse_up')\n            || (cur.reason === 'mouse_down' && reason === 'double_click')\n            || (cur.reason === 'mouse_up' && reason === 'double_click')\n        )\n        && (\n            cur.button === button\n            || button === -1\n            || cur.button === -1\n        );\n    if (canExtend) {\n        cur.until_ms = now + CLICK_TRACE_WINDOW_MS;\n        scheduleTraceFlush(cur);\n        cur.events.push({\n            kind: 'pointer-phase',\n            phase: reason,\n            button,\n            detail: event?.detail ?? null,\n        });\n        return cur;\n    }\n    flushClickFocusTrace(null, 'superseded');\n    const seq = (globalThis.__portalClickFocusTraceSeq ?? 0) + 1;\n    globalThis.__portalClickFocusTraceSeq = seq;\n    const trace = {\n        seq,\n        reason,\n        button: event?.button ?? null,\n        detail: event?.detail ?? null,\n        until_ms: now + CLICK_TRACE_WINDOW_MS,\n        events: [{\n            kind: 'pointer-phase',\n            phase: reason,\n            button,\n            detail: event?.detail ?? null,\n        }],\n        flush_timer: null,\n        flushed: false,\n    };\n    scheduleTraceFlush(trace);\n    globalThis.__portalClickFocusTrace = trace;\n    return trace;\n}\n\n/* Append one ordered sub-event into the current click trace when one is active. */\nexport function appendClickTraceEvent(kind, detail = {}) {\n    if (!CLICK_TRACE_ENABLED) {\n        void kind;\n        void detail;\n        return false;\n    }\n    const trace = activeClickFocusTrace();\n    if (!trace) {\n        return false;\n    }\n    trace.events.push({\n        kind,\n        ...detail,\n    });\n    return true;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst TESTING_TABLEVIEW_TRACE_LIMIT = 512;\nconst TESTING_PUFFBOOK_TRACE_LIMIT = 512;\nconst TESTING_PUFFBOOK_FORENSIC_LIMIT = 128;\nconst TESTING_PUFFBOOK_FORENSIC_FIELD_LIMIT = 512;\nconst TESTING_PORTAL_TIMING_TRACE_LIMIT = 1024;\nconst TESTING_PORTAL_TIMING_SCOPE_LIMIT = 512;\nconst PORTAL_SCOPE_TRACE_MS = 8;\nconst TESTING_TRACE_ENABLED = true;\n\nconst g_testingTableviewTrace = {\n    nextSeq: 1,\n    events: [],\n};\n\nconst g_testingPuffbookTrace = {\n    nextSeq: 1,\n    events: [],\n};\n\nconst g_testingPuffbookForensics = {\n    nextSeq: 1,\n    events: [],\n};\n\nconst g_testingPortalTimingTrace = {\n    nextSeq: 1,\n    events: [],\n};\n\nconst g_portalTimingScopes = {\n    nextSeq: 1,\n    active: [],\n    recent: [],\n    longtaskObserverInstalled: false,\n};\n\nexport function pushTestingTableviewTrace(event, fields = {}) {\n    return pushTestingTrace(g_testingTableviewTrace, TESTING_TABLEVIEW_TRACE_LIMIT, event, fields);\n}\n\nexport function pushTestingPuffbookTrace(event, fields = {}) {\n    return pushTestingTrace(g_testingPuffbookTrace, TESTING_PUFFBOOK_TRACE_LIMIT, event, fields);\n}\n\n/* Keep a bounded breach/recovery ring separate from the ordinary trace so the\n * first detector's evidence survives subsequent repair and stream churn. */\nexport function recordTestingPuffbookForensic(event, fields = {}) {\n    const bounded = {};\n    for (const [key, value] of Object.entries(fields)) {\n        if (typeof value === 'string' && value.length > TESTING_PUFFBOOK_FORENSIC_FIELD_LIMIT) {\n            bounded[key] = `${value.slice(0, TESTING_PUFFBOOK_FORENSIC_FIELD_LIMIT)}\u2026`;\n        } else {\n            bounded[key] = value;\n        }\n    }\n    const entry = {\n        seq: g_testingPuffbookForensics.nextSeq++,\n        at_ms: Date.now(),\n        event,\n        ...bounded,\n    };\n    g_testingPuffbookForensics.events.push(entry);\n    if (g_testingPuffbookForensics.events.length > TESTING_PUFFBOOK_FORENSIC_LIMIT) {\n        g_testingPuffbookForensics.events.splice(\n            0,\n            g_testingPuffbookForensics.events.length - TESTING_PUFFBOOK_FORENSIC_LIMIT,\n        );\n    }\n    return entry;\n}\n\n/* Flush one detached recovery artifact before any live replacement is scheduled. */\nexport function flushTestingPuffbookForensicArtifact(artifact = {}) {\n    return recordTestingPuffbookForensic('projection_recovery_artifact_flushed', {\n        ...artifact,\n        artifact_flushed: true,\n    });\n}\n\n/* Retain one small always-on ring of portal timing samples so live backdoor reads survive stalls. */\nexport function pushTestingPortalTimingTrace(event, fields = {}) {\n    const entry = {\n        seq: g_testingPortalTimingTrace.nextSeq++,\n        at_ms: Date.now(),\n        event,\n        ...fields,\n    };\n    g_testingPortalTimingTrace.events.push(entry);\n    if (g_testingPortalTimingTrace.events.length > TESTING_PORTAL_TIMING_TRACE_LIMIT) {\n        g_testingPortalTimingTrace.events.splice(\n            0,\n            g_testingPortalTimingTrace.events.length - TESTING_PORTAL_TIMING_TRACE_LIMIT,\n        );\n    }\n    return entry;\n}\n\n/* Start one named synchronous portal timing scope so later longtask attribution can recover where JS stalled. */\nexport function beginPortalTimingScope(scope, fields = {}) {\n    ensurePortalTimingLongtaskObserver();\n    const token = {\n        seq: g_portalTimingScopes.nextSeq++,\n        scope,\n        start_perf_ms: performance.now(),\n        start_wall_ms: Date.now(),\n        depth: g_portalTimingScopes.active.length,\n        parent_scope: g_portalTimingScopes.active.at(-1)?.scope ?? null,\n        fields,\n    };\n    g_portalTimingScopes.active.push(token);\n    return token;\n}\n\n/* End one named portal timing scope and retain it for later longtask overlap attribution. */\nexport function endPortalTimingScope(token, fields = {}) {\n    if (!token) {\n        return null;\n    }\n    const idx = g_portalTimingScopes.active.lastIndexOf(token);\n    if (idx >= 0) {\n        g_portalTimingScopes.active.splice(idx, 1);\n    }\n    const rec = {\n        seq: token.seq,\n        scope: token.scope,\n        start_perf_ms: token.start_perf_ms,\n        end_perf_ms: performance.now(),\n        duration_ms: performance.now() - token.start_perf_ms,\n        depth: token.depth,\n        parent_scope: token.parent_scope,\n        fields: token.fields,\n        end_fields: fields,\n    };\n    g_portalTimingScopes.recent.push(rec);\n    if (g_portalTimingScopes.recent.length > TESTING_PORTAL_TIMING_SCOPE_LIMIT) {\n        g_portalTimingScopes.recent.splice(\n            0,\n            g_portalTimingScopes.recent.length - TESTING_PORTAL_TIMING_SCOPE_LIMIT,\n        );\n    }\n    if (rec.duration_ms >= PORTAL_SCOPE_TRACE_MS) {\n        pushTestingPortalTimingTrace('portal_scope', {\n            scope: rec.scope,\n            duration_ms: roundMS(rec.duration_ms),\n            depth: rec.depth,\n            parent_scope: rec.parent_scope,\n            ...rec.fields,\n            ...rec.end_fields,\n        });\n    }\n    return rec;\n}\n\n/* Run one callback inside one named portal timing scope and close it correctly for sync or async completion. */\nexport function withPortalTimingScope(scope, fields, fn) {\n    const token = beginPortalTimingScope(scope, fields);\n    try {\n        const ret = fn();\n        if (ret && typeof ret.then === 'function') {\n            return ret.then(\n                (value) => {\n                    endPortalTimingScope(token);\n                    return value;\n                },\n                (err) => {\n                    endPortalTimingScope(token, {\n                        error: err instanceof Error ? err.message : String(err),\n                    });\n                    throw err;\n                },\n            );\n        }\n        endPortalTimingScope(token);\n        return ret;\n    } catch (err) {\n        endPortalTimingScope(token, {\n            error: err instanceof Error ? err.message : String(err),\n        });\n        throw err;\n    }\n}\n\nfunction pushTestingTrace(trace, limit, event, fields = {}) {\n    if (!TESTING_TRACE_ENABLED) {\n        void trace;\n        void limit;\n        void event;\n        void fields;\n        return null;\n    }\n    const entry = {\n        seq: trace.nextSeq++,\n        at_ms: Date.now(),\n        event,\n        ...fields,\n    };\n    trace.events.push(entry);\n    if (trace.events.length > limit) {\n        trace.events.splice(\n            0,\n            trace.events.length - limit,\n        );\n    }\n    return entry;\n}\n\n/* Install one longtask observer and annotate each task with the overlapping named portal scopes. */\nfunction ensurePortalTimingLongtaskObserver() {\n    if (g_portalTimingScopes.longtaskObserverInstalled) {\n        return;\n    }\n    g_portalTimingScopes.longtaskObserverInstalled = true;\n    if (typeof PerformanceObserver !== 'function') {\n        return;\n    }\n    if (!PerformanceObserver.supportedEntryTypes?.includes?.('longtask')) {\n        return;\n    }\n    const obs = new PerformanceObserver((list) => {\n        for (const entry of list.getEntries()) {\n            const matches = matchingPortalScopes(entry.startTime, entry.startTime + entry.duration);\n            pushTestingPortalTimingTrace('portal_longtask', {\n                duration_ms: roundMS(entry.duration),\n                start_perf_ms: roundMS(entry.startTime),\n                end_perf_ms: roundMS(entry.startTime + entry.duration),\n                active_scope: g_portalTimingScopes.active.at(-1)?.scope ?? null,\n                matching_scopes: matches.map((match) => ({\n                    scope: match.scope,\n                    duration_ms: roundMS(match.duration_ms),\n                    overlap_ms: roundMS(match.overlap_ms),\n                    depth: match.depth,\n                    bytes: Number.isFinite(match.fields?.bytes) ? match.fields.bytes : null,\n                    event_type: match.fields?.event_type ?? null,\n                    line: Number.isInteger(match.fields?.line) ? match.fields.line : null,\n                })),\n            });\n        }\n    });\n    obs.observe({ entryTypes: ['longtask'] });\n}\n\n/* Find the portal scopes that overlap one longtask window so hangs can be attributed to concrete JS phases. */\nfunction matchingPortalScopes(startPerfMS, endPerfMS) {\n    const matches = [];\n    for (const rec of g_portalTimingScopes.recent) {\n        const overlapMS = overlapDurationMS(startPerfMS, endPerfMS, rec.start_perf_ms, rec.end_perf_ms);\n        if (overlapMS <= 0) {\n            continue;\n        }\n        matches.push({\n            scope: rec.scope,\n            duration_ms: rec.duration_ms,\n            overlap_ms: overlapMS,\n            depth: rec.depth,\n            fields: rec.fields,\n        });\n    }\n    for (const token of g_portalTimingScopes.active) {\n        const overlapMS = overlapDurationMS(startPerfMS, endPerfMS, token.start_perf_ms, endPerfMS);\n        if (overlapMS <= 0) {\n            continue;\n        }\n        matches.push({\n            scope: token.scope,\n            duration_ms: endPerfMS - token.start_perf_ms,\n            overlap_ms: overlapMS,\n            depth: token.depth,\n            fields: token.fields,\n        });\n    }\n    matches.sort((a, b) => {\n        if (b.overlap_ms !== a.overlap_ms) {\n            return b.overlap_ms - a.overlap_ms;\n        }\n        return b.depth - a.depth;\n    });\n    return matches.slice(0, 8);\n}\n\n/* Compute the overlap of two performance-time intervals. */\nfunction overlapDurationMS(aStart, aEnd, bStart, bEnd) {\n    const start = Math.max(aStart, bStart);\n    const end = Math.min(aEnd, bEnd);\n    return Math.max(0, end - start);\n}\n\n/* Round one timing value to millisecond precision so trace payloads stay compact and legible. */\nfunction roundMS(value) {\n    return Math.round(Number(value) * 1000) / 1000;\n}\n\nexport function testingTableviewTrace() {\n    if (!TESTING_TRACE_ENABLED) {\n        return [];\n    }\n    return g_testingTableviewTrace.events.map((entry) => ({ ...entry }));\n}\n\nexport function testingResetTableviewTrace() {\n    g_testingTableviewTrace.nextSeq = 1;\n    g_testingTableviewTrace.events = [];\n    return true;\n}\n\nexport function testingPuffbookTrace() {\n    if (!TESTING_TRACE_ENABLED) {\n        return [];\n    }\n    return g_testingPuffbookTrace.events.map((entry) => ({ ...entry }));\n}\n\nexport function testingResetPuffbookTrace() {\n    g_testingPuffbookTrace.nextSeq = 1;\n    g_testingPuffbookTrace.events = [];\n    return true;\n}\n\nexport function testingPuffbookForensics() {\n    return g_testingPuffbookForensics.events.map((entry) => ({ ...entry }));\n}\n\nexport function testingResetPuffbookForensics() {\n    g_testingPuffbookForensics.nextSeq = 1;\n    g_testingPuffbookForensics.events = [];\n    return true;\n}\n\n/* Return a copy of the retained portal timing ring for backdoor inspection. */\nexport function testingPortalTimingTrace() {\n    return g_testingPortalTimingTrace.events.map((entry) => ({ ...entry }));\n}\n\n/* Clear the retained portal timing ring before one focused repro. */\nexport function testingResetPortalTimingTrace() {\n    g_testingPortalTimingTrace.nextSeq = 1;\n    g_testingPortalTimingTrace.events = [];\n    return true;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { appendClickTraceEvent } from './click-trace.mjs';\nimport { inputRouteLoggingEnabled, logKeyRoute, summarizeKeyEvent } from './input-route-log.mjs';\nimport { withPortalTimingScope } from './testing-trace.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\n\nlet g_nextFocusToken = 1;\nlet g_focusStack = [];\nconst g_focusStackListeners = new Set();\nlet g_rootContainer = null;\nlet g_nextNavigationOrdinal = 1;\nconst g_focusControls = [];\nlet g_reconcilingControl = false;\n\nexport function allocateNavigationOrdinal() {\n    return g_nextNavigationOrdinal++;\n}\n\nexport function registerFocusControl(control) {\n    if (g_focusControls.includes(control)) throw new Error('Focus control is already registered.');\n    const index = g_focusControls.length && g_focusControls.at(-1).navigationOrdinal > control.navigationOrdinal\n        ? g_focusControls.findIndex(node => node.navigationOrdinal > control.navigationOrdinal) : -1;\n    g_focusControls.splice(index < 0 ? g_focusControls.length : index, 0, control);\n    control.navigationRegistered = true;\n}\n\nexport function unregisterFocusControl(control) {\n    const index = g_focusControls.indexOf(control);\n    if (index >= 0) g_focusControls.splice(index, 1);\n    control.navigationRegistered = false;\n    if (g_rootContainer) reconcileControlFocus(control.scene?.stage);\n    clearFocusTargetReferences(control);\n    if (control.focused) control.syncFocusVisual(false, 'control_detach');\n    if (g_rootContainer) reconcileControlFocus(control.scene?.stage);\n}\n\nfunction explicitlyVisible(node) {\n    for (let current = node; current; current = current.parentNode) {\n        if (current.visible === false || current.closed === true) return false;\n    }\n    return true;\n}\n\nfunction modalFocusScope(stage) {\n    for (let i = g_focusStack.length - 1; i >= 0; i--) {\n        const owner = g_focusStack[i].container;\n        if ((owner.modal === true || owner.focusContainerKind === 'TransientDialog')\n                && owner.scene?.stage === stage\n                && (owner.scene === stage.activeScene || owner.scene === stage.hudScene)\n                && explicitlyVisible(owner)) return owner;\n    }\n    return null;\n}\n\nfunction ownsFocusTarget(owner, target) {\n    return owner === target || containerOwnsFocusTarget(owner, target);\n}\n\n/* Culling is deliberately ignored here: ScrollBox can reveal those targets. */\nexport function isFocusControlEligible(control, stage = control.scene?.stage) {\n    if (!stage || !control.navigationRegistered || control.scene?.stage !== stage || !control.isTabStop()\n            || !explicitlyVisible(control)) return false;\n    if (control.scene !== stage.activeScene && control.scene !== stage.hudScene) return false;\n    for (let node = control; node; node = node.parentNode) {\n        if (node.enabled === false) return false;\n    }\n    const modal = modalFocusScope(stage);\n    if (modal && !ownsFocusTarget(modal, control)) return false;\n    return stage.windowManager?.allowsKeyboardTarget(control, modal) !== false;\n}\n\nexport function focusNavigationControls(stage) {\n    return g_focusControls.filter(control => isFocusControlEligible(control, stage));\n}\n\n/* Use existing scroll owners, inside out; camera position never defines order. */\nfunction revealFocusControl(control) {\n    for (let owner = control.parentNode; owner; owner = owner.parentNode) {\n        owner.revealFocusTarget?.(control);\n    }\n}\n\nexport function focusControl(control, { keyboard = false } = {}) {\n    if (!g_rootContainer || !isFocusControlEligible(control)) return false;\n    const stage = control.scene.stage;\n    const modal = modalFocusScope(stage);\n    const owner = modal ?? g_rootContainer;\n    // Publish the handoff once; observers must never restore an intermediate\n    // remembered editor while removing content owners above the allowed scope.\n    blurEntry(currentFocusEntry(), 'control_focus_transfer');\n    const ownerIndex = findEntryIndex(owner);\n    g_focusStack.splice(ownerIndex + 1);\n    const entry = currentFocusEntry();\n    entry.target = control;\n    control.focusVisible = keyboard;\n    revealFocusControl(control);\n    focusEntry(entry, 'control_focus_transfer');\n    noteFocusStack('control_focus', entry);\n    emitFocusStackChange();\n    requestFrame('control_focus');\n    return true;\n}\n\nexport function navigateFocus(stage, direction) {\n    const controls = focusNavigationControls(stage);\n    const target = currentFocusTarget();\n    const index = controls.indexOf(target);\n    if (controls.length) {\n        const next = index < 0 ? (direction > 0 ? 0 : controls.length - 1)\n            : (index + direction + controls.length) % controls.length;\n        focusControl(controls[next], { keyboard: true });\n    }\n    // Even an empty scope owns Tab: never hand navigation to the browser.\n    return true;\n}\n\n/* Called at structural/eligibility boundaries, never as a frame-polled scan. */\nexport function reconcileControlFocus(stage = g_rootContainer) {\n    if (g_reconcilingControl || !g_rootContainer) return;\n    const target = currentFocusTarget();\n    if (target?.focusTargetKind !== 'control' || isFocusControlEligible(target, stage)) return;\n    g_reconcilingControl = true;\n    try {\n        const keyboard = target.focusVisible;\n        const controls = focusNavigationControls(stage);\n        const next = controls.find(node => node.navigationOrdinal > target.navigationOrdinal)\n            ?? controls.at(-1) ?? null;\n        target.syncFocusVisual(false, 'control_unavailable');\n        currentFocusEntry().target = null;\n        if (next) focusControl(next, { keyboard });\n        else emitFocusStackChange();\n    } finally {\n        g_reconcilingControl = false;\n    }\n}\n\n/* Refresh semantics only for the live target, without changing focus ownership. */\nexport function notifyFocusTargetChange(target) {\n    if (target === currentFocusTarget()) emitFocusStackChange();\n}\n\nexport function cancelFocusedActivation() {\n    const target = currentFocusTarget();\n    if (target?.focusTargetKind === 'control') target.cancelActivation();\n}\n\nfunction dispatchControlKeyDown(scene, event) {\n    // Input cells and their owners retain their complete existing key route.\n    if (currentFocusedInputCell()) return null;\n    const stage = scene.stage ?? g_rootContainer;\n    reconcileControlFocus(stage);\n    if (event.key === 'Tab' && !event.ctrlKey && !event.metaKey && !event.altKey\n            && !event.isComposing) {\n        for (let owner = currentFocusTarget()?.parentNode; owner; owner = owner.parentNode) {\n            if (owner.onFocusTab?.(event.shiftKey ? -1 : 1) === true) return true;\n        }\n        return navigateFocus(stage, event.shiftKey ? -1 : 1);\n    }\n    const target = currentFocusTarget();\n    if (target?.focusTargetKind !== 'control') return null;\n    if (event.key === 'Escape') {\n        for (let owner = target.parentNode; owner; owner = owner.parentNode) {\n            if (owner.onFocusEscape?.() === true) return true;\n        }\n        const modal = modalFocusScope(stage);\n        if (modal?.onKeyDownCapture?.(event) === true || modal?.onKeyDown?.(event) === true) return true;\n    }\n    if (target.onKeyDown(event) === true) return true;\n    // Never send typing/clipboard commands from a button into a remembered editor.\n    return !event.ctrlKey && !event.metaKey || ['copy', 'cut', 'paste'].includes(event.key);\n}\n\nexport function dispatchFocusedKeyUp(event) {\n    const target = currentFocusTarget();\n    if (target?.focusTargetKind !== 'control') return false;\n    if (!isFocusControlEligible(target)) {\n        target.cancelActivation();\n        reconcileControlFocus(target.scene?.stage);\n        return false;\n    }\n    return target.onKeyUp(event) === true;\n}\n\nfunction makeRootEntry() {\n    if (g_rootContainer === null) {\n        throw new Error('makeRootEntry(): root focus container has not been installed.');\n    }\n    return {\n        token: 0,\n        container: g_rootContainer,\n        target: null,\n    };\n}\n\nfunction ensureStack(caller = 'ensureStack()') {\n    if (g_rootContainer === null) {\n        throw new Error(`${caller}: root focus container has not been installed.`);\n    }\n    if (g_focusStack.length === 0) {\n        g_focusStack = [makeRootEntry()];\n    }\n}\n\n/* Label one stack entry compactly so click-trace output stays readable during focus churn. */\nfunction focusEntryLabel(entry) {\n    if (!entry) {\n        return 'Unknown';\n    }\n    const kind = entry.container?.focusContainerKind ?? entry.container?.constructor?.name ?? 'Unknown';\n    const line = entry.target?.cellID;\n    return Number.isInteger(line)\n        ? `${kind}(line=${line})`\n        : kind;\n}\n\n/* Label one scene or viewport compactly for key-route diagnostics. */\nfunction sceneRouteLabel(scene) {\n    return scene?.activeViewport?.state?.name\n        ?? scene?.rootViewport?.state?.name\n        ?? scene?.root?.state?.name\n        ?? scene?.constructor?.name\n        ?? 'scene';\n}\n\n/* Snapshot the focus-routing state narrowly so consumed vs masked can be inferred mechanically. */\nfunction routeStateStamp(scene, entry = null) {\n    const top = currentFocusEntry();\n    return JSON.stringify({\n        scene: sceneRouteLabel(scene),\n        stack: g_focusStack.map((item) => ({\n            token: item.token,\n            label: focusEntryLabel(item),\n            scene_match: item.container?.scene === scene || item.container === scene?.stage,\n            cursor_col: item.target?.cursorIndex ?? null,\n            in_focus: item.target?.inFocus === true,\n            expanded: item.container?.expanded === true,\n        })),\n        top: top?.token ?? null,\n        active_viewport: scene?.activeViewport?.state?.name ?? null,\n        active_viewport_expanded: scene?.activeViewport?.expanded === true,\n        root_viewport: scene?.rootViewport?.state?.name ?? null,\n        root_viewport_expanded: scene?.rootViewport?.expanded === true,\n        entry: entry ? {\n            token: entry.token,\n            cursor_col: entry.target?.cursorIndex ?? null,\n            in_focus: entry.target?.inFocus === true,\n            expanded: entry.container?.expanded === true,\n        } : null,\n    });\n}\n\n/* Trace one structural focus-stack change from the single stack authority. */\nfunction noteFocusStack(action, entry = null) {\n    ensureStack('noteFocusStack(...)');\n    appendClickTraceEvent('focus-stack', {\n        action,\n        entry: focusEntryLabel(entry),\n        top: focusEntryLabel(g_focusStack[g_focusStack.length - 1] ?? null),\n        depth: g_focusStack.length,\n        stack: g_focusStack.map((item) => focusEntryLabel(item)),\n    });\n}\n\n/* Blur one entry's rendered leaf so only the current top-of-stack target stays visually focused. */\nfunction blurEntry(entry, reason) {\n    entry?.target?.syncFocusVisual?.(false, reason);\n}\n\n/* Focus one entry's rendered leaf and let its owner reconcile any row-local state. */\nfunction focusEntry(entry, reason) {\n    if (!entry || entry.container === null || !entry.target) {\n        return;\n    }\n    if (entry.target.focusTargetKind === 'control' && !isFocusControlEligible(entry.target)) {\n        reconcileControlFocus(entry.target.scene?.stage);\n        return;\n    }\n    const target = entry.target;\n    target.syncFocusVisual?.(true, reason);\n    // Input restoration may synchronously unmount or hand off its own leaf.\n    if (entry.target === target && currentFocusEntry() === entry && target.focusTargetKind !== 'control') {\n        entry.container.restoreFocusState?.(target);\n    }\n}\n\n/* Notify stack observers after one complete focus-stack mutation. */\nfunction emitFocusStackChange() {\n    for (const listener of g_focusStackListeners) {\n        listener();\n    }\n}\n\n/* Return the stack index for one concrete container or focus target. */\nfunction findEntryIndex(target) {\n    ensureStack('findEntryIndex(...)');\n    if (target == null) {\n        return -1;\n    }\n    return g_focusStack.findIndex((entry) => entry.container === target || entry.target === target);\n}\n\n/* Prove that one target is physically or logically owned by the proposed container by walking the scene parent chain. */\nfunction containerOwnsFocusTarget(container, target) {\n    if (container === target?.scene?.stage) return true;\n    if (container.ownsNode?.(target)) return true;\n    let cur = target?.parentNode ?? null;\n    while (cur) {\n        if (cur === container || cur.inputOwnerWindow === container || cur.inputOwnerDialog === container) {\n            return true;\n        }\n        cur = cur.parentNode ?? null;\n    }\n    return false;\n}\n\n/* Validate one incoming focus entry before mutating the authoritative stack. */\nfunction assertFocusEntry(container, target, caller) {\n    if (container === null) {\n        throw new Error(`${caller}: expected a non-null focus container.`);\n    }\n    if (target === null) {\n        return;\n    }\n    if (!containerOwnsFocusTarget(container, target)) {\n        throw new Error(`${caller}: target does not belong to container in the live scene-parent chain.`);\n    }\n}\n\n/* Install the permanent bottom-of-stack focus container, which is normally the Stage. */\nexport function setFocusStackRoot(container) {\n    assertFocusEntry(container, null, 'setFocusStackRoot(...)');\n    const prevRoot = g_rootContainer;\n    g_rootContainer = container;\n    if (g_focusStack.length === 0) {\n        g_focusStack = [makeRootEntry()];\n        emitFocusStackChange();\n        return;\n    }\n    if (g_focusStack.length > 1 && prevRoot !== null && prevRoot !== container) {\n        throw new Error('setFocusStackRoot(...): cannot replace the root container while non-root focus entries are present.');\n    }\n    g_focusStack[0] = {\n        token: 0,\n        container,\n        target: null,\n    };\n    emitFocusStackChange();\n}\n\n/* Reset the singleton manager so unit tests can assert stack state without cross-test leakage. */\nexport function resetFocusManagerForTesting() {\n    g_nextFocusToken = 1;\n    g_rootContainer = null;\n    g_focusStack = [];\n    g_focusControls.length = 0;\n    g_nextNavigationOrdinal = 1;\n}\n\n/* Snapshot the stack entries directly so tests can assert the strict stack contract. */\nexport function focusStackSnapshot() {\n    if (g_rootContainer === null) {\n        return [];\n    }\n    ensureStack('focusStackSnapshot()');\n    return g_focusStack.map((entry) => ({\n        token: entry.token,\n        kind: entry.container?.focusContainerKind ?? entry.container?.constructor?.name ?? 'Unknown',\n        line: entry.target?.cellID ?? null,\n    }));\n}\n\n/* Return the ordered unique containers represented in the current focus stack. */\nexport function focusStackContainers() {\n    if (g_rootContainer === null) {\n        return [];\n    }\n    ensureStack('focusStackContainers()');\n    const out = [];\n    const seen = new Set();\n    for (const entry of g_focusStack) {\n        if (seen.has(entry.container)) {\n            continue;\n        }\n        seen.add(entry.container);\n        out.push(entry.container);\n    }\n    return out;\n}\n\n/* Return the current top entry, including the permanent Stage root entry. */\nexport function currentFocusEntry() {\n    if (g_rootContainer === null) {\n        return null;\n    }\n    ensureStack('currentFocusEntry()');\n    return g_focusStack[g_focusStack.length - 1];\n}\n\n/* Return the current top container from the authoritative focus stack. */\nexport function currentFocusContainer() {\n    return currentFocusEntry()?.container ?? null;\n}\n\n/* Report whether one container already has a concrete entry somewhere in the authoritative focus stack. */\nexport function focusStackContainsContainer(container) {\n    if (g_rootContainer === null) {\n        return false;\n    }\n    ensureStack('focusStackContainsContainer()');\n    return g_focusStack.some((entry) => entry.container === container);\n}\n\n/* Return the current general focus target. */\nexport function currentFocusTarget() {\n    return currentFocusEntry()?.target ?? null;\n}\n\n/* Editing and caret consumers only receive input targets. */\nexport function currentFocusedInputCell() {\n    const target = currentFocusTarget();\n    return target?.focusTargetKind === 'control' ? null : target;\n}\n\n/* Subscribe one listener to stack changes so Stage can reattach its shared caret promptly. */\nexport function onFocusStackChange(listener) {\n    if (typeof listener !== 'function') {\n        throw new Error('onFocusStackChange(...): listener must be a function.');\n    }\n    g_focusStackListeners.add(listener);\n    return () => {\n        g_focusStackListeners.delete(listener);\n    };\n}\n\n/* Push one concrete `{ container, target }` entry, replacing the top when it is a sibling in the same container. */\nexport function pushFocusEntry(container, target) {\n    assertFocusEntry(container, target, 'pushFocusEntry(...)');\n    ensureStack('pushFocusEntry(...)');\n    const top = currentFocusEntry();\n    if (top.container === container) {\n        return replaceTopFocusEntry(container, target);\n    }\n    if (target !== null && findEntryIndex(target) !== -1) {\n        throw new Error('pushFocusEntry(...): target is already in the focus stack.');\n    }\n    if (findEntryIndex(container) !== -1) {\n        throw new Error('pushFocusEntry(...): container is already in the focus stack away from the top.');\n    }\n    blurEntry(top, 'focus_stack_push');\n    const entry = {\n        token: g_nextFocusToken++,\n        container,\n        target,\n    };\n    g_focusStack.push(entry);\n    focusEntry(entry, 'focus_stack_restore');\n    noteFocusStack('push', entry);\n    emitFocusStackChange();\n    return entry.token;\n}\n\n/* Replace the current top entry with one new concrete `{ container, target }` pair. */\nexport function replaceTopFocusEntry(container, target) {\n    assertFocusEntry(container, target, 'replaceTopFocusEntry(...)');\n    ensureStack('replaceTopFocusEntry(...)');\n    const top = currentFocusEntry();\n    if (g_focusStack.length === 1 && container !== g_rootContainer) {\n        return pushFocusEntry(container, target);\n    }\n    if (top.target === target && top.container === container) {\n        focusEntry(top, 'focus_stack_restore');\n        emitFocusStackChange();\n        return top.token;\n    }\n    blurEntry(top, 'focus_stack_replace');\n    top.container = container;\n    top.target = target;\n    focusEntry(top, 'focus_stack_restore');\n    noteFocusStack('replace_top', top);\n    emitFocusStackChange();\n    return top.token;\n}\n\n/* Apply one user-level focus request without violating stack modality above the target container. */\nexport function focusThis(container, target) {\n    assertFocusEntry(container, target, 'focusThis(...)');\n    ensureStack('focusThis(...)');\n    for (let index = g_focusStack.length - 1; index >= 0; index--) {\n        const entry = g_focusStack[index];\n        if (entry.container !== container) {\n            continue;\n        }\n        if (index === g_focusStack.length - 1) {\n            if (entry.target === target) {\n                return true;\n            }\n            replaceTopFocusEntry(container, target);\n            return true;\n        }\n        return false;\n    }\n    throw new Error('focusThis(...): target container is not present in the focus stack.');\n}\n\n/* Transfer focus between document content and directory search without creating a modal layer. */\nexport function focusContentInputCell(container, target) {\n    assertFocusEntry(container, target, 'focusContentInputCell(...)');\n    ensureStack('focusContentInputCell(...)');\n    const isContent = (owner) => owner.focusContainerKind === 'DocumentView'\n        || owner.focusContainerKind === 'DirectorySearch'\n        || owner.focusContainerKind === 'AgentInput';\n    if (!isContent(container)) {\n        throw new Error('focusContentInputCell(...): expected a document, directory search, or agent input owner.');\n    }\n    const top = currentFocusEntry();\n    if (top.container === container) return focusThis(container, target);\n    if (top.container !== g_rootContainer && !isContent(top.container)) return false;\n    const existing = findEntryIndex(container);\n    if (existing !== -1) {\n        // A modal entry below the active content still prevents reaching through it.\n        if (g_focusStack.slice(existing + 1).some((entry) => !isContent(entry.container))) return false;\n        blurEntry(top, 'focus_handoff');\n        g_focusStack.splice(existing + 1);\n        g_focusStack[existing].target = target;\n        focusEntry(g_focusStack[existing], 'content_focus_transfer');\n        noteFocusStack('content_transfer', g_focusStack[existing]);\n        emitFocusStackChange();\n        return true;\n    }\n    blurEntry(top, 'focus_handoff');\n    if (top.container === g_rootContainer) pushFocusEntry(container, target);\n    else replaceTopFocusEntry(container, target);\n    return true;\n}\n\n/* Clear the input leaf on a background click while retaining modal keyboard ownership. */\nexport function clearInputFocus() {\n    ensureStack('clearInputFocus()');\n    const top = currentFocusEntry();\n    if (top.target === null) return false;\n    blurEntry(top, 'focus_handoff');\n    const isContent = (entry) => entry.container.focusContainerKind === 'DocumentView'\n        || entry.container.focusContainerKind === 'DirectorySearch'\n        || entry.container.focusContainerKind === 'AgentInput';\n    if (isContent(top)) {\n        while (g_focusStack.length > 1 && isContent(currentFocusEntry())) g_focusStack.pop();\n        focusEntry(currentFocusEntry(), 'background_click');\n    } else {\n        top.target = null;\n    }\n    noteFocusStack('clear_input', currentFocusEntry());\n    emitFocusStackChange();\n    return true;\n}\n\n/* Pop the current top entry and restore focus to the new top, leaving the Stage root entry in place. */\nexport function popFocusEntry(expected = null) {\n    ensureStack('popFocusEntry(...)');\n    const top = currentFocusEntry();\n    if (g_focusStack.length === 1) {\n        return false;\n    }\n    if (expected !== null && top.container !== expected && top.target !== expected) {\n        throw new Error('popFocusEntry(...): expected target does not match the current top-of-stack entry.');\n    }\n    blurEntry(top, 'focus_stack_pop');\n    g_focusStack.pop();\n    focusEntry(currentFocusEntry(), 'focus_stack_restore');\n    noteFocusStack('pop', top);\n    emitFocusStackChange();\n    return true;\n}\n\n/* Remove one matching entry from anywhere in the stack and restore the new top when necessary. */\nexport function removeFocusEntry(target) {\n    ensureStack('removeFocusEntry(...)');\n    const index = findEntryIndex(target);\n    if (index === -1) {\n        return false;\n    }\n    if (index === 0) {\n        throw new Error('removeFocusEntry(...): cannot remove the permanent root focus container.');\n    }\n    const [removed] = g_focusStack.splice(index, 1);\n    blurEntry(removed, 'focus_stack_remove');\n    if (index >= g_focusStack.length) {\n        focusEntry(currentFocusEntry(), 'focus_stack_restore');\n    }\n    noteFocusStack('remove', removed);\n    emitFocusStackChange();\n    return true;\n}\n\n/* Drop one detached focus container from the whole stack so no entry can retain a dead owner object. */\nexport function clearFocusContainerReferences(container) {\n    ensureStack('clearFocusContainerReferences(...)');\n    if (container == null) {\n        return false;\n    }\n    const removed = [];\n    const keep = [];\n    for (let index = 0; index < g_focusStack.length; index++) {\n        const entry = g_focusStack[index];\n        if (entry.container !== container) {\n            keep.push(entry);\n            continue;\n        }\n        if (index === 0) {\n            throw new Error('clearFocusContainerReferences(...): cannot remove the permanent root focus container.');\n        }\n        removed.push(entry);\n    }\n    if (removed.length === 0) {\n        return false;\n    }\n    const topChanged = keep.length !== g_focusStack.length && currentFocusEntry()?.container === container;\n    g_focusStack = keep;\n    for (const entry of removed) {\n        blurEntry(entry, 'focus_container_detach');\n    }\n    if (topChanged) {\n        focusEntry(currentFocusEntry(), 'focus_stack_restore');\n    }\n    noteFocusStack('clear_dead_container', removed[0]);\n    emitFocusStackChange();\n    return true;\n}\n\n/* Drop one detached target from every stack entry so the focus stack never retains dead leaf references. */\nexport function clearFocusTargetReferences(target) {\n    if (!g_rootContainer) return false;\n    ensureStack('clearFocusTargetReferences(...)');\n    if (target == null) {\n        return false;\n    }\n    let changed = false;\n    for (let index = 0; index < g_focusStack.length; index++) {\n        const entry = g_focusStack[index];\n        if (entry.target !== target) {\n            continue;\n        }\n        entry.target = null;\n        changed = true;\n    }\n    if (!changed) {\n        return false;\n    }\n    noteFocusStack('clear_dead_target');\n    emitFocusStackChange();\n    return true;\n}\n\n/* Route keydown top-down through the focus stack, then fall back to the presented scene viewport when unhandled. */\nexport function dispatchFocusedKeyDown(scene, evt) {\n    return withPortalTimingScope('focus.dispatch_keydown', {\n        key: evt?.key ?? null,\n    }, () => {\n        ensureStack('dispatchFocusedKeyDown(...)');\n        const controlResult = dispatchControlKeyDown(scene, evt);\n        if (controlResult !== null) return controlResult;\n        const trace = inputRouteLoggingEnabled() ? {\n            event: summarizeKeyEvent(evt),\n            scene: sceneRouteLabel(scene),\n            handled: false,\n            stack: g_focusStack.map((entry) => ({\n                token: entry.token,\n                label: focusEntryLabel(entry),\n                scene_match: entry.container?.scene === scene || entry.container === scene?.stage,\n                cursor_line: entry.target?.cellID ?? null,\n                cursor_col: entry.target?.cursorIndex ?? null,\n                in_focus: entry.target?.inFocus === true,\n                expanded: entry.container?.expanded === true,\n            })),\n            steps: [],\n            fallback: null,\n        } : null;\n        for (let index = g_focusStack.length - 1; index >= 0; index--) {\n            const entry = g_focusStack[index];\n            // A key handler is allowed to close its own focus container.\n            // Skip an entry removed during that same dispatch.\n            if (!entry) {\n                continue;\n            }\n            if (entry.container?.scene !== scene && entry.container !== scene?.stage) {\n                trace?.steps.push({\n                    target: focusEntryLabel(entry),\n                    outcome: 'propagated',\n                    reason: 'scene_mismatch',\n                });\n                continue;\n            }\n            const before = trace ? routeStateStamp(scene, entry) : null;\n            // A container may reserve Escape/Tab before its editable leaf.\n            if (entry.container?.onKeyDownCapture?.(evt) === true) {\n                trace?.steps.push({ target: focusEntryLabel(entry), via: 'container_capture', outcome: 'consumed' });\n                if (trace) trace.handled = true;\n                logKeyRoute(trace);\n                return true;\n            }\n            if (entry.target) {\n                if (entry.target.onKeyDown?.(evt) === true) {\n                    const outcome = before === null || before !== routeStateStamp(scene, entry) ? 'consumed' : 'masked';\n                    trace?.steps.push({\n                        target: focusEntryLabel(entry),\n                        via: 'target',\n                        outcome,\n                    });\n                    if (trace) {\n                        trace.handled = true;\n                    }\n                    logKeyRoute(trace);\n                    return true;\n                }\n            }\n            const handledByContainer = entry.container?.onKeyDown?.(evt) === true;\n            if (handledByContainer) {\n                const outcome = before === null || before !== routeStateStamp(scene, entry) ? 'consumed' : 'masked';\n                trace?.steps.push({\n                    target: focusEntryLabel(entry),\n                    via: 'container',\n                    outcome,\n                });\n                if (trace) {\n                    trace.handled = true;\n                }\n                logKeyRoute(trace);\n                return true;\n            }\n            trace?.steps.push({\n                target: focusEntryLabel(entry),\n                outcome: 'propagated',\n                reason: 'unhandled',\n            });\n            // Stop at transient input surfaces while preserving native browser\n            // shortcuts (notably copy/paste) when neither field nor panel handles them.\n            if (entry.container?.blocksKeyPropagation === true) {\n                logKeyRoute(trace);\n                return false;\n            }\n        }\n        const viewport = scene?.activeViewport ?? scene?.rootViewport ?? null;\n        if (viewport && typeof viewport.onKeyDown === 'function') {\n            const before = trace ? routeStateStamp(scene, null) : null;\n            const handled = viewport.onKeyDown(evt) === true;\n            const outcome = handled\n                ? (before === null || before !== routeStateStamp(scene, null) ? 'consumed' : 'masked')\n                : 'propagated';\n            if (trace) {\n                trace.fallback = {\n                    target: viewport.state?.name ?? viewport.constructor?.name ?? 'Viewport',\n                    via: 'scene_viewport',\n                    outcome,\n                };\n                trace.handled = handled;\n            }\n            logKeyRoute(trace);\n            return handled;\n        }\n        logKeyRoute(trace);\n        return false;\n    });\n}\n\n/* Route document beforeinput through its command boundary; standalone fields retain their leaf handler. */\nexport function dispatchFocusedBeforeInput(scene, evt) {\n    ensureStack('dispatchFocusedBeforeInput(...)');\n    if (currentFocusTarget()?.focusTargetKind === 'control') return false;\n    for (let index = g_focusStack.length - 1; index >= 0; index--) {\n        const entry = g_focusStack[index];\n        if (entry.container?.scene !== scene && entry.container !== scene?.stage) {\n            continue;\n        }\n        if (entry.container?.onBeforeInput?.(evt) === true) {\n            return true;\n        }\n        if (entry.target?.onBeforeInput?.(evt) === true) {\n            return true;\n        }\n        if (entry.container?.blocksKeyPropagation === true) return false;\n    }\n    return false;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport const Palette = {\n    \"clear\": [0.0, 0.0, 0.0, 0.0],\n    \"orange\": [0.824, 0.396, 0.255, 1.0],\n    \"teal\": [0.3255, 0.6157, 0.5961, 1.0],\n    \"neonblue\": [0, 217 / 255, 1.0, 1.0], // #00d9ff\n    \"darkteal\": [0, 82 / 255, 116 / 255, 203 / 255], // #005274cb\n    \"darkburgundy\": [93 / 255, 21 / 255, 15 / 255, 1.0], // #5d150fff\n    \"charcoal\": [0.098, 0.122, 0.145, 1.0],\n    \"white\": [1.0, 0.9412, 0.8745, 1.0],\n    \"black\": [0.0627, 0.0705, 0.0784, 1.0],\n    \"lightgrey\": [0.5, 0.5, 0.6, 1.0],\n    \"silver\": [0.698, 0.698, 0.698, 1.0],\n    \"darkgrey\": [0.1882, 0.1882, 0.1882, 1.0],\n    \"grey\": [0.31, 0.31, 0.31, 1.0],\n    \"granite\": [0.1843, 0.2078, 0.2314, 1.0],\n    \"yellow\": [0.992, 0.855, 0.051, 1.0],\n    \"darkred\": [0.3961, 0.1373, 0.1373, 1.0],\n    \"darkgreen\": [0.259, 0.420, 0.294, 1.0],\n    \"olivegreen\":[0.38, 0.56, 0.2, 1.0],\n    \"dryteal\":[0.15, 0.51, 0.59, 1.0],\n    \"purple\":[0.604, 0.322, 0.675, 1.0],\n\n    \n        \n    //1 bit palette\n    \"red\": [1.0, 0.0, 0.0, 1.0],         \n    \"green\": [0.0, 1.0, 0.0, 1.0],      \n    \"blue\": [0.0, 0.0, 1.0, 1.0],       \n    \"magenta\": [1.0, 0.0, 1.0, 1.0],      \n    \"cyan\": [0.0, 1.0, 1.0, 1.0],         \n\n    \n    //non standardised colors are allowed to change in the future, but they are here for convenience,\n    //the other colours are linked witht the branding and should not be changed without a good reason\n    \"pink\": [0.95, 0.5, 0.65, 1.0],       // none standardised\n    \"brown\": [0.45, 0.3, 0.15, 1.0],      // none standardised\n    \"lime\": [0.65, 0.9, 0.1, 1.0],        // none standardised\n    \"olive\": [0.4, 0.45, 0.2, 1.0],       // none standardised\n    \"navy\": [0.05, 0.1, 0.35, 1.0],       // none standardised\n    \"maroon\": [0.5, 0.05, 0.15, 1.0],     // none standardised\n    \"gold\": [0.85, 0.65, 0.1, 1.0],       // none standardised\n    \"beige\": [0.95, 0.9, 0.8, 1.0],       // none standardised\n    \"lavender\": [0.7, 0.65, 0.85, 1.0]     // none standardised\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n/*\n    This module defines the core classes that make up EvilUI. They are declared\n    together in a single file so they can have \"circular\" dependencies amongst\n    themselves easily.\n\n    All other framework code depends on this file.\n\n    Framework users normally include lib/evilui/evilui.mjs which in turn will\n    import all the framework exports across files (including this one), hiding\n    which file each class is declared in as an implementation detail.\n*/\n\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport { currentEvil } from '../eviltime.mjs';\nimport * as glpicker from './gl-picker.mjs';\nimport { pointerRouteStateStamp, routeNodeLabel } from './input-route-log.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { DIRTY, markResourceDirty } from './dirty-flags.mjs';\nimport { clearFocusContainerReferences, reconcileControlFocus } from './focus-manager.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nfunction perfOwnerClass(node) {\n    let cur = node;\n    while (cur) {\n        const name = cur.constructor?.name ?? 'unknown';\n        if (name !== 'Placeholder' && name !== 'Node') {\n            return name;\n        }\n        cur = cur.parentNode;\n    }\n    return 'unknown';\n}\n\nfunction perfAttachCounterName(kind, child, owner) {\n    const key = child?._resourceKey?.() ?? child?.constructor?.name ?? 'unknown';\n    return `${kind}.${key}.${perfOwnerClass(owner)}`;\n}\n\n/* Build a short stable label for diagnostics without depending on object identity. */\nfunction diagNodeLabel(node) {\n    if (!node) {\n        return '<none>';\n    }\n    return `${node.constructor?.name ?? 'Unknown'}(${node.state?.name ?? 'unnamed'})`;\n}\n\n/* Describe a scene-graph path from root to node so propagated dirty sources stay readable in crash bundles. */\nfunction diagNodePath(node) {\n    const parts = [];\n    let cur = node;\n    while (cur) {\n        parts.push(diagNodeLabel(cur));\n        cur = cur.parentNode ?? null;\n    }\n    return parts.reverse().join(' -> ');\n}\n\n/* Keep lightweight runtime canaries available even when the heavy perf tracker is disabled. */\nfunction bumpDebugCounter(name, delta = 1) {\n    const root = globalThis;\n    const counters = root.__eviluiDebugCounters ?? (root.__eviluiDebugCounters = Object.create(null));\n    counters[name] = (counters[name] ?? 0) + delta;\n}\n\n/* Track the nearest ancestor cause for propagated instance dirtiness. */\nfunction withInstancePropagation(node, reasons, prev = null) {\n    const next = {\n        source_node: node ?? null,\n        source_class: node?.constructor?.name ?? 'unknown',\n        source_name: node?.state?.name ?? 'unnamed',\n        source_path: diagNodePath(node),\n        reasons: [],\n    };\n    const merged = prev?.source_path === next.source_path\n        ? [...(prev?.reasons ?? []), ...(Array.isArray(reasons) ? reasons : [reasons])]\n        : (Array.isArray(reasons) ? reasons : [reasons]);\n    for (const reason of merged) {\n        if (reason && !next.reasons.includes(reason)) {\n            next.reasons.push(reason);\n        }\n    }\n    return next;\n}\n\n/* Distinguish pure ancestor pose motion from propagated state that still needs per-instance uploads. */\nfunction wantsPropagatedInstanceDirty(cause) {\n    const reasons = cause?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.some(reason => reason !== 'ancestor' && reason !== 'transform');\n}\n\n/* Compare two mat4 snapshots so pure anchor-scope motion can be distinguished from local anchor churn. */\nfunction sameMat4(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!(a instanceof Float32Array) || !(b instanceof Float32Array) || a.length !== 16 || b.length !== 16) {\n        return false;\n    }\n    for (let i = 0; i < 16; i++) {\n        if (a[i] !== b[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\nconst PICKER_BATCH_DIRTY_KINDS = Object.freeze(new Set([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.visibility,\n    DIRTY.buffer,\n]));\nconst PICKER_POSE_DIRTY_KINDS = Object.freeze(new Set([\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.instance,\n]));\nconst ROOT_ANCHOR_ID = 1;\nlet g_nextAnchorId = ROOT_ANCHOR_ID + 1;\nconst g_resourceClassKeys = new WeakMap();\nlet g_nextResourceClassKey = 1;\nlet g_nextScheduledThinkId = 1;\nconst IDENTITY_MATRIX = twgl.m4.identity();\nexport const MAX_CLIP_UNIFORM_DEPTH = 8;\nconst DRAW_PASS_NAMES = Object.freeze(['opaque', 'text', 'transparent']);\n\nfunction resourceClassKey(ctor) {\n    let key = g_resourceClassKeys.get(ctor);\n    if (key) {\n        return key;\n    }\n    key = `rc${g_nextResourceClassKey++}`;\n    g_resourceClassKeys.set(ctor, key);\n    return key;\n}\n\n/* Infer one authoritative draw pass from the subclass draw hooks and reject accidental multi-pass families. */\nfunction inferBatchPassForClass(ctor) {\n    const passes = [];\n    if (ctor._drawOpaque !== Node._drawOpaque) {\n        passes.push('opaque');\n    }\n    if (ctor._drawText !== Node._drawText) {\n        passes.push('text');\n    }\n    if (ctor._drawTransparent !== Node._drawTransparent) {\n        passes.push('transparent');\n    }\n    if (passes.length === 1) {\n        return passes[0];\n    }\n    if (passes.length === 0) {\n        return 'opaque';\n    }\n    throw new Error(`${ctor.name}._batchPassForNode(...): multiple draw passes (${passes.join(', ')}). Split the batcher or override _batchPassForNode/_batchPassForShared explicitly.`);\n}\n\n/* Keep shared-resource pass ownership deterministic even when a test injects a shared object without a live node. */\nfunction inferBatchPassForShared(ctor, shared) {\n    const pass = shared?.drawPass ?? null;\n    if (pass == null) {\n        return inferBatchPassForClass(ctor);\n    }\n    if (!DRAW_PASS_NAMES.includes(pass)) {\n        throw new Error(`${ctor.name}._batchPassForShared(...): bad drawPass '${pass}'.`);\n    }\n    return pass;\n}\n\n/* Allocate one stable monotonic scope id so batch partitioning does not depend on object identity strings. */\nfunction allocAnchorId() {\n    return g_nextAnchorId++;\n}\n\n/* Describe one clip owner in its own local space so downstream batchers do not need world-rect repair logic. */\nfunction makeClipEntry(node, localRect) {\n    return {\n        owner: node,\n        owner_key: diagNodePath(node),\n        local_rect: new Float32Array(localRect),\n    };\n}\n\n/* Keep batch clip identity deterministic from the structural owner path rather than object identity. */\nfunction clipChainKey(chain) {\n    if (!Array.isArray(chain) || chain.length === 0) {\n        return 'clip:none';\n    }\n    return `clip:${chain.map((entry) => entry.owner_key).join('|')}`;\n}\n\n/* Project one shared clip chain into batch-level uniforms and reject mixed clip scopes inside one batch. */\nexport function batchClipUniformState(nodes, scene, label = 'batch') {\n    const list = Array.isArray(nodes) ? nodes.filter(Boolean) : [];\n    const clipInverseMatrices = new Float32Array(MAX_CLIP_UNIFORM_DEPTH * 16);\n    const clipRects = new Float32Array(MAX_CLIP_UNIFORM_DEPTH * 4);\n    for (let i = 0; i < MAX_CLIP_UNIFORM_DEPTH; i++) {\n        clipInverseMatrices.set(IDENTITY_MATRIX, i * 16);\n    }\n    if (list.length === 0) {\n        return {\n            u_clipCount: 0,\n            u_clipInverseMatrices: clipInverseMatrices,\n            u_clipRects: clipRects,\n        };\n    }\n    const head = list[0];\n    const chain = head.clipChain ?? [];\n    const key = head.clipChainKey ?? 'clip:none';\n    if (chain.length > MAX_CLIP_UNIFORM_DEPTH) {\n        throw new Error(`batchClipUniformState(${label}): clip depth ${chain.length} exceeds MAX_CLIP_UNIFORM_DEPTH=${MAX_CLIP_UNIFORM_DEPTH}.`);\n    }\n    for (const node of list) {\n        const nodeKey = node?.clipChainKey ?? 'clip:none';\n        if (nodeKey !== key) {\n            throw new Error(`batchClipUniformState(${label}): mixed clipChainKey (${key} vs ${nodeKey}).`);\n        }\n        const nodeChain = node?.clipChain ?? [];\n        if (nodeChain.length !== chain.length) {\n            throw new Error(`batchClipUniformState(${label}): mixed clip chain length (${chain.length} vs ${nodeChain.length}).`);\n        }\n        for (let i = 0; i < chain.length; i++) {\n            const expected = chain[i];\n            const actual = nodeChain[i];\n            if (actual?.owner !== expected?.owner) {\n                throw new Error(`batchClipUniformState(${label}): mixed clip owner at depth ${i}.`);\n            }\n            if (!sameClipRect(actual?.local_rect ?? null, expected?.local_rect ?? null)) {\n                throw new Error(`batchClipUniformState(${label}): mixed local clip rect at depth ${i}.`);\n            }\n        }\n    }\n    for (let i = 0; i < chain.length; i++) {\n        const entry = chain[i];\n        const owner = entry?.owner ?? null;\n        const worldMatrix = owner?._worldMatrixForBatch?.(scene) ?? owner?._worldMatrix ?? null;\n        if (!worldMatrix) {\n            throw new Error(`batchClipUniformState(${label}): clip owner world matrix missing at depth ${i}.`);\n        }\n        clipInverseMatrices.set(twgl.m4.inverse(worldMatrix), i * 16);\n        clipRects.set(entry.local_rect ?? [1, 1, 0, 0], i * 4);\n    }\n    return {\n        u_clipCount: chain.length,\n        u_clipInverseMatrices: clipInverseMatrices,\n        u_clipRects: clipRects,\n    };\n}\n\n/* Require finite clip bounds only at explicit clipping boundaries, not on ordinary scene nodes. */\nfunction localClipRectForNode(node) {\n    if (!node?.clipChildren) {\n        return null;\n    }\n    const width = node.state?.width;\n    const height = node.state?.height;\n    if (!Number.isFinite(width) || !Number.isFinite(height)) {\n        throw new Error(`${node.constructor?.name ?? 'Node'}(${node.state?.name ?? 'unnamed'}) clipChildren=true requires finite state.width/state.height.`);\n    }\n    return new Float32Array([0, 0, width, height]);\n}\n\n/* Seed one root-attached node with its own clip scope so descendants can inherit before the first frame walk. */\nexport function bootstrapClipScope(node) {\n    if (node.parentNode !== null) {\n        throw new Error(`bootstrapClipScope(${node.state?.name ?? node.constructor?.name ?? 'unknown'}): expected a root node.`);\n    }\n    const localRect = localClipRectForNode(node);\n    node.localClipRect = localRect;\n    if (!localRect) {\n        node.clipOwner = null;\n        node.clipChain = [];\n        node.clipChainKey = clipChainKey(node.clipChain);\n        return;\n    }\n    node.clipOwner = node;\n    node.clipChain = [makeClipEntry(node, localRect)];\n    node.clipChainKey = clipChainKey(node.clipChain);\n}\n\n/* Intern one shared batch key shape for all resource families so anchor scoping stays centralised. */\nexport function anchorBatchKey(resourceKey, anchorId) {\n    if (typeof resourceKey !== 'string' || resourceKey.length === 0) {\n        throw new Error(`anchorBatchKey(${resourceKey}, ${anchorId}): bad resourceKey.`);\n    }\n    if (!Number.isInteger(anchorId) || anchorId <= 0) {\n        throw new Error(`anchorBatchKey(${resourceKey}, ${anchorId}): bad anchorId.`);\n    }\n    return `${resourceKey}@${anchorId}`;\n}\n\n/* Resolve the active attached scope key for one node so batch lookups cannot bypass anchor partitioning. */\nexport function nodeBatchKey(node) {\n    const resourceKey = node?._resourceKey?.();\n    const anchorId = node?.anchorNode?.anchorId ?? null;\n    const sceneKey = node?.scene?.batchScopeKey?.() ?? null;\n    const activeClipChainKey = node?.clipChainKey ?? null;\n    if (typeof sceneKey !== 'string' || sceneKey.length === 0) {\n        throw new Error(`${node?.constructor?.name ?? 'Node'}.nodeBatchKey(): scene batch scope is required while attached.`);\n    }\n    if (anchorId === null) {\n        throw new Error(`${node?.constructor?.name ?? 'Node'}.nodeBatchKey(): anchorNode is required while attached.`);\n    }\n    if (typeof activeClipChainKey !== 'string' || activeClipChainKey.length === 0) {\n        throw new Error(`${node?.constructor?.name ?? 'Node'}.nodeBatchKey(): clipChainKey is required while attached.`);\n    }\n    return `${sceneKey}:${anchorBatchKey(resourceKey, anchorId)}:${activeClipChainKey}`;\n}\n\n/* Classify one node as belonging to its own scope boundary so traversal can branch explicitly. */\nfunction isAnchorNode(node) {\n    return node instanceof Anchor;\n}\n\n/* Install one active anchor-scope classification on attach so resource lookup can use it before the first frame walk. */\nfunction attachAnchorScope(parent, child) {\n    if (!parent?.scene) {\n        throw new Error(`attachAnchorScope(${parent?.state?.name ?? parent}, ${child?.state?.name ?? child}): parent scene is required.`);\n    }\n    if (isAnchorNode(parent) && parent.parentNode === null && parent.anchorNode == null) {\n        parent.anchorNode = parent;\n        parent.localToAnchor = new Float32Array(twgl.m4.identity());\n        parent.anchorToRoot = parent._worldMatrix ? new Float32Array(parent._worldMatrix) : null;\n    }\n    const localToParent = inferLocalToParent(child.state);\n    if (isAnchorNode(child)) {\n        child.anchorNode = child;\n        child.localToAnchor = new Float32Array(twgl.m4.identity());\n        const parentWorld = parent._worldMatrixForBatch?.(parent.scene) ?? parent._worldMatrix ?? null;\n        child.anchorToRoot = parentWorld\n            ? new Float32Array(twgl.m4.multiply(parentWorld, localToParent))\n            : null;\n        return;\n    }\n    const anchorNode = isAnchorNode(parent) ? parent : parent.anchorNode;\n    if (!anchorNode) {\n        throw new Error(`attachAnchorScope(${parent.state?.name ?? parent.constructor?.name ?? 'unknown'}, ${child.state?.name ?? child.constructor?.name ?? 'unknown'}): parent anchorNode is required.`);\n    }\n    child.anchorNode = anchorNode;\n    child.localToAnchor = parent.localToAnchor\n        ? new Float32Array(twgl.m4.multiply(parent.localToAnchor, localToParent))\n        : null;\n}\n\n/* Install one active clip-scope classification on attach so batching can distinguish rare clipping boundaries. */\nfunction attachClipScope(parent, child) {\n    if (parent.parentNode === null && parent.clipChainKey == null) {\n        bootstrapClipScope(parent);\n    }\n    if (!Array.isArray(parent.clipChain) || typeof parent.clipChainKey !== 'string') {\n        throw new Error(`attachClipScope(${parent.state?.name ?? parent.constructor?.name ?? 'unknown'}, ${child.state?.name ?? child.constructor?.name ?? 'unknown'}): parent clip scope is required.`);\n    }\n    const localRect = localClipRectForNode(child);\n    child.localClipRect = localRect;\n    if (!localRect) {\n        child.clipOwner = parent.clipOwner ?? null;\n        child.clipChain = parent.clipChain;\n        child.clipChainKey = parent.clipChainKey;\n        return;\n    }\n    child.clipOwner = child;\n    child.clipChain = [...parent.clipChain, makeClipEntry(child, localRect)];\n    child.clipChainKey = clipChainKey(child.clipChain);\n}\n\n/* Clear active scope caches on detach so detached subtrees do not retain stale attached classification. */\nfunction clearAnchorScope(node) {\n    node.anchorNode = null;\n    node.localToAnchor = null;\n    if (isAnchorNode(node)) {\n        node.anchorToRoot = null;\n    }\n}\n\n/* Clear active clip-scope caches on detach so detached subtrees do not retain stale clipping identity. */\nfunction clearClipScope(node) {\n    node.clipOwner = null;\n    node.localClipRect = null;\n    node.clipChain = null;\n    node.clipChainKey = null;\n}\n\nfunction isTransformStateKey(key) {\n    return key === 'x'\n        || key === 'y'\n        || key === 'z'\n        || key === 'rotation_z'\n        || key === 'localToParent';\n}\n\nfunction hasAnyTransformStateKey(patch) {\n    return Object.keys(patch).some(isTransformStateKey);\n}\n\nfunction hasAnyPresentationStateKey(patch) {\n    return Object.hasOwn(patch, 'opacity');\n}\n\nconst ZERO_PRESENTATION_OFFSET = Object.freeze([0, 0, 0]);\n\n/* Normalise one local presentation offset into a strict vec3 so shader-facing seams stay deterministic. */\nfunction normalizePresentationVec3(value, label) {\n    if (value == null) {\n        return new Float32Array(ZERO_PRESENTATION_OFFSET);\n    }\n    if (!Array.isArray(value) && !(value instanceof Float32Array)) {\n        throw new Error(`${label}: expected an array-like vec3.`);\n    }\n    const x = Number(value[0] ?? 0);\n    const y = Number(value[1] ?? 0);\n    const z = Number(value[2] ?? 0);\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n        throw new Error(`${label}: expected finite vec3 values.`);\n    }\n    return new Float32Array([x, y, z]);\n}\n\n/* Close one optional draw-time presentation offset payload so batch paths can trust it without local fallback logic. */\nfunction normalizePresentationOffsetPayload(payload, label) {\n    if (payload == null) {\n        return {\n            active: false,\n            position: new Float32Array(ZERO_PRESENTATION_OFFSET),\n            velocity: new Float32Array(ZERO_PRESENTATION_OFFSET),\n            start_s: 0,\n            stop_s: 0,\n            decay_per_s: 1,\n        };\n    }\n    const position = normalizePresentationVec3(payload.position ?? payload.base_position ?? null, `${label}.position`);\n    const velocity = normalizePresentationVec3(payload.velocity ?? payload.base_velocity ?? null, `${label}.velocity`);\n    const startS = Number(payload.start_s ?? 0);\n    const stopS = Number(payload.stop_s ?? startS);\n    const decayPerS = Number(payload.decay_per_s ?? 1);\n    const active = payload.active === true;\n    if (!Number.isFinite(startS) || !Number.isFinite(stopS)) {\n        throw new Error(`${label}: expected finite start_s/stop_s.`);\n    }\n    if (active) {\n        if (stopS < startS) {\n            throw new Error(`${label}: active presentation offset requires stop_s >= start_s.`);\n        }\n        if (!Number.isFinite(decayPerS) || decayPerS <= 0) {\n            throw new Error(`${label}: active presentation offset requires decay_per_s > 0.`);\n        }\n    }\n    return {\n        active,\n        position,\n        velocity,\n        start_s: startS,\n        stop_s: stopS,\n        decay_per_s: active ? decayPerS : 1,\n    };\n}\n\n/* Project one node-owned presentation payload into the shared shader uniform contract. */\nexport function presentationOffsetUniformState(node, scene, label = null) {\n    const payload = node?._presentationOffsetPayload?.(scene) ?? null;\n    const scopeLabel = label ?? node?.state?.name ?? node?.constructor?.name ?? 'node';\n    const norm = normalizePresentationOffsetPayload(payload, `presentationOffsetUniformState(${scopeLabel})`);\n    return {\n        u_presentationOffsetActive: norm.active ? 1 : 0,\n        u_presentationOffsetPosition: norm.position,\n        u_presentationOffsetVelocity: norm.velocity,\n        u_presentationOffsetStartS: norm.start_s,\n        u_presentationOffsetStopS: norm.stop_s,\n        u_presentationOffsetDecayPerS: norm.decay_per_s,\n    };\n}\n\n/* Extract one human-meaningful batch family suffix from the internal resource key. */\nfunction resourceFamilyLabel(node) {\n    const raw = typeof node?._resourceKey === 'function' ? node._resourceKey() : '';\n    if (typeof raw === 'string' && raw.includes(':')) {\n        const tail = raw.split(':').slice(1).join('.');\n        if (tail.length > 0) {\n            return tail;\n        }\n    }\n    return node?.constructor?.name ?? 'unknown';\n}\n\n/* Derive one semantic batch label from the active anchor scope and resource family. */\nfunction defaultResourceLabel(node) {\n    const anchorName = node?.anchorNode?.state?.name ?? 'detached_anchor';\n    return `${anchorName}.${resourceFamilyLabel(node)}`;\n}\n\nfunction isReservedStatePatchKey(key) {\n    return key === 'children'\n        || key === 'parentNode'\n        || key === 'scene'\n        || key === 'clipChildren'\n        || key === '_resources'\n        || key === '_glAttached'\n        || key === '_worldMatrix'\n        || key === '_selfTransformDirty'\n        || key === '_subtreeTransformDirty'\n        || key === 'computedVisible'\n        || key === 'computedClipRect'\n        || key === 'renderStatus';\n}\n\nfunction firstReservedStatePatchKey(patch) {\n    return Object.keys(patch).find(isReservedStatePatchKey) ?? null;\n}\n\nfunction classifyNodeDirtyKinds(prevState, nextState) {\n    const kinds = new Set();\n    for (const key of Object.keys(nextState)) {\n        if (prevState[key] === nextState[key]) {\n            continue;\n        }\n        if (isTransformStateKey(key)) {\n            kinds.add(DIRTY.transform);\n            continue;\n        }\n        if (key === 'width' || key === 'height' || key === 'depth') {\n            kinds.add(DIRTY.layout);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        if (key === 'visible' || key === 'enabled') {\n            kinds.add(DIRTY.visibility);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        if (key === 'opacity') {\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        kinds.add(DIRTY.content);\n    }\n    return Array.from(kinds);\n}\n\nfunction pickerDirtyKindsForDirtyKinds(kinds) {\n    if (kinds.some(kind => PICKER_BATCH_DIRTY_KINDS.has(kind))) {\n        return [DIRTY.pickerBatch];\n    }\n    if (kinds.some(kind => PICKER_POSE_DIRTY_KINDS.has(kind))) {\n        return [DIRTY.pickerPose];\n    }\n    return [];\n}\n\nfunction isPickerDirtyReason(reason) {\n    return reason === 'picker_batch_dirty' || reason === 'picker_pose_dirty';\n}\n\nfunction walkPostOrder(node, visit) {\n    for (const ch of node.children) {\n        walkPostOrder(ch, visit);\n    }\n    visit(node);\n}\n\nconst NODE_LIFECYCLE = Object.freeze({\n    DETACHED: 'detached',\n    ATTACHED_NO_GL: 'attached_no_gl',\n    ATTACHED_GL: 'attached_gl',\n});\n\nconst ANIMATION_PROPS = Object.freeze(['opacity', 'x', 'y', 'z', 'rotation_z', 'post_view_rotation_y', 'rim_light_strength', 'clock_s']);\nconst ANIMATION_OPTION_KEYS = Object.freeze(new Set([\n    'start_s',\n    'stop_s',\n    'duration_s',\n    'ease',\n    'loop',\n    'iterations',\n    'accumulate',\n    'onFinish',\n    'onStop',\n]));\nconst EASING = Object.freeze({\n    linear: (t) => t,\n    easeInQuad: (t) => t * t,\n    easeOutQuad: (t) => 1 - ((1 - t) * (1 - t)),\n    easeInOutQuad: (t) => t < 0.5 ? 2 * t * t : 1 - ((-2 * t + 2) ** 2) / 2,\n    easeInCubic: (t) => t * t * t,\n    easeOutCubic: (t) => 1 - ((1 - t) ** 3),\n    easeInOutCubic: (t) => t < 0.5 ? 4 * t * t * t : 1 - ((-2 * t + 2) ** 3) / 2,\n    easeInSine: (t) => 1 - Math.cos((t * Math.PI) / 2),\n    easeOutSine: (t) => Math.sin((t * Math.PI) / 2),\n    easeInOutSine: (t) => -(Math.cos(Math.PI * t) - 1) / 2,\n});\n\nfunction cloneAnimationRecord(rec) {\n    if (!rec) {\n        return null;\n    }\n    return {\n        prop: rec.prop,\n        from: rec.from,\n        to: rec.to,\n        start_s: rec.start_s,\n        stop_s: rec.stop_s,\n        duration_s: rec.duration_s,\n        ease: rec.ease_name,\n        loop: rec.loop_mode,\n        iterations: rec.iterations,\n        accumulate: rec.accumulate,\n    };\n}\n\nfunction normalizeAnimationLoop(loop) {\n    if (loop == null || loop === false || loop === 'none') {\n        return 'none';\n    }\n    if (loop === true) {\n        return 'repeat';\n    }\n    if (loop === 'repeat' || loop === 'ping_pong') {\n        return loop;\n    }\n    throw new Error(`Unknown animation loop mode '${loop}'.`);\n}\n\nfunction normalizeAnimationIterations(loopMode, iterations) {\n    if (iterations == null) {\n        return null;\n    }\n    if (loopMode === 'none') {\n        throw new Error('Node.animateTo(...): iterations requires looped animation mode.');\n    }\n    if (!Number.isInteger(iterations) || iterations <= 0) {\n        throw new Error('Node.animateTo(...): iterations must be a positive integer or null.');\n    }\n    return iterations;\n}\n\nfunction animationTerminalTarget(rec) {\n    if (rec.loop_mode === 'repeat' && rec.accumulate && rec.iterations != null) {\n        return rec.from + rec.span * rec.iterations;\n    }\n    if (rec.loop_mode === 'ping_pong' && rec.iterations != null) {\n        return rec.iterations % 2 === 0 ? rec.from : rec.to;\n    }\n    return rec.to;\n}\n\nfunction normalizeAnimationPropsArg(arg, fallback) {\n    if (arg == null) {\n        return [...fallback];\n    }\n    const props = Array.isArray(arg) ? arg : [arg];\n    const deduped = [];\n    for (const prop of props) {\n        if (!ANIMATION_PROPS.includes(prop)) {\n            throw new Error(`Unknown animation property '${prop}'.`);\n        }\n        if (!deduped.includes(prop)) {\n            deduped.push(prop);\n        }\n    }\n    return deduped;\n}\n\nfunction normalizeAnimationEase(ease) {\n    if (typeof ease === 'function') {\n        return {\n            name: ease.name || 'custom',\n            fn: ease,\n        };\n    }\n    const name = ease ?? 'linear';\n    const fn = EASING[name];\n    if (!fn) {\n        throw new Error(`Unknown animation ease '${name}'.`);\n    }\n    return { name, fn };\n}\n\nfunction isFiniteDecayValue(value) {\n    if (typeof value === 'number') {\n        return Number.isFinite(value);\n    }\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n        for (const part of value) {\n            if (!Number.isFinite(part)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n}\n\nfunction cloneDecayValue(value) {\n    if (typeof value === 'number') {\n        return value;\n    }\n    if (Array.isArray(value)) {\n        return value.slice();\n    }\n    if (ArrayBuffer.isView(value)) {\n        return Array.from(value);\n    }\n    throw new Error(`cloneDecayValue(${value}): unsupported value shape.`);\n}\n\nfunction sameDecayShape(position, velocity) {\n    const posScalar = typeof position === 'number';\n    const velScalar = typeof velocity === 'number';\n    if (posScalar || velScalar) {\n        return posScalar && velScalar;\n    }\n    return position.length === velocity.length;\n}\n\nfunction scaleDecayValue(value, scale) {\n    if (typeof value === 'number') {\n        return value * scale;\n    }\n    return value.map((part) => part * scale);\n}\n\nfunction addScaledDecayValue(position, velocity, scale) {\n    if (typeof position === 'number') {\n        return position + velocity * scale;\n    }\n    return position.map((part, i) => part + velocity[i] * scale);\n}\n\n/* Build one zero-shaped decay value so settled/clamped terminal samples can expose a hard stop deterministically. */\nfunction zeroDecayValueLike(value) {\n    if (typeof value === 'number') {\n        return 0;\n    }\n    return value.map(() => 0);\n}\n\n/* Project one exponential-decay record forward in closed form from its authoritative start state. */\nfunction projectDecayValue(position, velocity, decayPerS, dtS) {\n    const dt = Math.max(0, Number.isFinite(dtS) ? dtS : 0);\n    const decay = Math.exp(-decayPerS * dt);\n    const displacementScale = (1.0 - decay) / decayPerS;\n    return {\n        dt_s: dt,\n        position: addScaledDecayValue(position, velocity, displacementScale),\n        velocity: scaleDecayValue(velocity, decay),\n    };\n}\n\nfunction decayVelocitySettled(velocity, epsilon) {\n    if (typeof velocity === 'number') {\n        return Math.abs(velocity) <= epsilon;\n    }\n    for (const part of velocity) {\n        if (Math.abs(part) > epsilon) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Solve the first time when all decay components have dropped to the epsilon stop threshold. */\nfunction decaySettleAfterS(velocity, epsilon, decayPerS) {\n    if (decayVelocitySettled(velocity, epsilon)) {\n        return 0;\n    }\n    const parts = typeof velocity === 'number' ? [velocity] : velocity;\n    let maxDt = 0;\n    for (const part of parts) {\n        const speed = Math.abs(part);\n        if (speed <= epsilon) {\n            continue;\n        }\n        maxDt = Math.max(maxDt, Math.log(speed / epsilon) / decayPerS);\n    }\n    return maxDt;\n}\n\nfunction assertChildIsDetachedOrphan(child, op) {\n    if (child.parentNode !== null) {\n        throw new Error(\n            `Node.${op}(${child.state.name}): child must be an orphan. `\n            + `Use remount(...) or replaceChild(...) for reparenting.`\n        );\n    }\n    if (child.scene !== null) {\n        throw new Error(\n            `Node.${op}(${child.state.name}): child.scene must be null before attach. `\n            + `Use remount(...) or removeChild(...) first.`\n        );\n    }\n    if (child._glAttached) {\n        throw new Error(\n            `Node.${op}(${child.state.name}): child must not be GL-attached while detached.`\n        );\n    }\n    child._assertLifecycle(NODE_LIFECYCLE.DETACHED, `Node.${op}(${child.state.name})`);\n}\n\nfunction releaseSubtree(gl, node) {\n    walkPostOrder(node, n => {\n        if (!n._glAttached) {\n            return;\n        }\n        n._assertLifecycle(NODE_LIFECYCLE.ATTACHED_GL, `${n.state.name} releaseSubtree`);\n        n._onReleaseNode(gl, /*ref*/ n._resources);\n        n._glAttached = false;\n        n._setLifecycle(NODE_LIFECYCLE.ATTACHED_NO_GL);\n    });\n}\n\n/* Drop one shared batcher once its last scene node detaches so per-scope caches cannot leak indefinitely. */\nfunction retireSharedResourcesIfUnused(node) {\n    const scene = node.scene;\n    const res = node._resources;\n    if (!scene || !res) {\n        return;\n    }\n    if (!Number.isInteger(res.instanceRefCount) || res.instanceRefCount <= 0) {\n        throw new Error(\n            `retireSharedResourcesIfUnused(${node.state?.name ?? node.constructor?.name ?? 'unknown'}): `\n            + `bad instanceRefCount=${res.instanceRefCount}.`\n        );\n    }\n    res.instanceRefCount -= 1;\n    if (res.instanceRefCount > 0) {\n        return;\n    }\n\n    if (scene.gl) {\n        res.classConstructor._onReleaseContext(scene.gl, res, new WeakMap());\n    }\n    res.classConstructor._onDetachClass(res);\n    if (!scene._deleteBatcher(res.resourceKey)) {\n        throw new Error(\n            `retireSharedResourcesIfUnused(${node.state?.name ?? node.constructor?.name ?? 'unknown'}): `\n            + `missing batcher '${res.resourceKey}'.`\n        );\n    }\n}\n\nfunction assertDetachedSubtreeHasNoGL(node) {\n    walkPostOrder(node, n => {\n        if (n._glAttached) {\n            throw new Error(\n                `${n.state.name} was detached while still in the GL-attached state. `\n                + `Call subtree release before detach.`\n            );\n        }\n    });\n}\n\nfunction deleteFramebufferInfo(gl, framebufferInfo) {\n    if (!gl || !framebufferInfo) {\n        return;\n    }\n    const attachments = framebufferInfo.attachments || [];\n    for (const attachment of attachments) {\n        if (!attachment) {\n            continue;\n        }\n        if (typeof WebGLTexture !== 'undefined' && attachment instanceof WebGLTexture) {\n            gl.deleteTexture(attachment);\n            continue;\n        }\n        if (typeof WebGLRenderbuffer !== 'undefined' && attachment instanceof WebGLRenderbuffer) {\n            gl.deleteRenderbuffer(attachment);\n            continue;\n        }\n        if (gl.isTexture && gl.isTexture(attachment)) {\n            gl.deleteTexture(attachment);\n            continue;\n        }\n        if (gl.isRenderbuffer && gl.isRenderbuffer(attachment)) {\n            gl.deleteRenderbuffer(attachment);\n        }\n    }\n    if (framebufferInfo.framebuffer) {\n        gl.deleteFramebuffer(framebufferInfo.framebuffer);\n    }\n}\n\n\n/**\n    Base class for any resources. These are things that only need to exist once\n    per scene, even if they are reused by multiple objects. The teapot mesh, for\n    example, is a resource.\n*/\nexport class Resource {\n    constructor(scene) {\n        if (!scene) {\n            throw new Error(`All Resources should pass the scene to the base class constructor.`);\n        }\n        this.scene = scene;\n    }\n\n    // protected:\n    _onAcquireContext(gl, visited) {\n        // Typical implementation:\n        //    <allocate one or more GL resources and save in this.\n    }\n\n    _onReleaseContext(gl, visited) {\n    }\n};\n\n\nexport const RENDER_STATUS = {\n    NONE: 0,\n    LOADING: 1,\n    READY: 2\n}\n\n/**\n    Base class for scene graph. A node has a matrix, controlling its position,\n    orientation, scale and skew relative to its parent Node. This matrix is\n    this.state.localToParent.\n\n    Anything that can vary through the lifetime of the node should be stored in\n    the state object, so we can easily do diffs and see if a resource prepared\n    for a previous frame is reusable as-is. (Reactive programming model.)\n\n    Nodes themselves are immutable. All changes should happen to state.\n    Node has internal members which updates as things evolve, but these are\n    implementation detail, the object is still logically immutable outside of\n    `state`.\n\n    Call this.remove() to remove the object from the scene graph. The Node\n    will become an \"orphan\", disconnected from the scene.\n*/\nexport class Node {\n    // public:\n    constructor(state) {\n        state = Object.assign({\n            name: simpleName(this),\n            visible: true,\n            opacity: 1.0,\n        }, state);\n\n        this.state = state;\n        this.scene = null;\n        this.parentNode = null;\n        this.children = [];\n        this._resources = null;\n        this._glAttached = false;\n        this._lifecycle = NODE_LIFECYCLE.DETACHED;\n        this._worldMatrix = null; // transform from model coordinates to camera/view space\n        this.anchorNode = null;\n        this.localToAnchor = null;\n        this.clipOwner = null;\n        this.localClipRect = null;\n        this.clipChain = null;\n        this.clipChainKey = null;\n        this._selfTransformDirty = true;\n        this._subtreeTransformDirty = true;\n        this.renderStatus = RENDER_STATUS.NONE;\n        this.clipChildren = state.clipChildren === true;\n        this.computedVisible = state.visible !== false;\n        this._culled = false;\n        this.computedOpacity = state.opacity ?? 1.0;\n        this.computedClipRect = null;\n        this._animations = new Map();\n        this._animationTargets = new Map();\n        this._scheduledThinks = new Map();\n        this._queuedWakes = new Map();\n        this._exponentialDecays = new Map();\n        this._presentationOffsetProvider = null;\n        // Node is now created, but detached. Use parent.appendChild to connect it to the scene graph.\n    }\n\n    get visible() {\n        return this.state.visible !== false;\n    }\n\n    set visible(state) {\n        const next = state !== false;\n        const prev = this.state.visible !== false;\n        this.state.visible = next;\n        if (prev === next) {\n            return;\n        }\n        this._refreshComputedVisibility(false);\n        if (!next) reconcileControlFocus(this.scene?.stage);\n    }\n\n    /* Viewport culling does not change application visibility or enabled state. */\n    setCulled(culled) {\n        if (this._culled === culled) return;\n        this._culled = culled;\n        this._refreshComputedVisibility(false);\n    }\n\n    get opacity() {\n        return this.state.opacity ?? 1.0;\n    }\n\n    set opacity(value) {\n        const next = Number.isFinite(value) ? value : 1.0;\n        const prev = this.state.opacity ?? 1.0;\n        this.state.opacity = next;\n        if (prev === next) {\n            return;\n        }\n        this._dirtyTransforms();\n        this._dirtyResources({ kinds: [DIRTY.instance] });\n    }\n\n    /**\n        Calculates the matrix converting local coordinates within this Node to\n        world coordinates (as defined by the scene root Node).\n    */\n    localToWorld() {\n        const localToParent = inferLocalToParent(this.state);\n        if (!this.parentNode) {\n            return localToParent;\n        }\n\n        return twgl.m4.multiply(this.parentNode.localToWorld(), localToParent);\n    }\n\n    /* Read the authoritative scene clock for this node, falling back only when detached. */\n    sceneNowS() {\n        return this.scene?.stage?.frameNowS\n            ?? this.scene?.presentationTimeSeconds?.()\n            ?? currentEvil();\n    }\n\n    /* Derive one conservative reschedule step for self-owned thinkAt loops. */\n    sceneFrameStepS(fallback = 1 / 60) {\n        const delta = this.scene?.stage?.frameDeltaS ?? 0.0;\n        if (!Number.isFinite(delta) || delta <= 0) {\n            return fallback;\n        }\n        return Math.max(1 / 240, Math.min(1 / 30, delta));\n    }\n\n    /* Publish one draw-time local offset provider so scope motion can stay shader-driven instead of dirtifying transforms. */\n    setPresentationOffsetProvider(provider) {\n        if (provider !== null && typeof provider !== 'function') {\n            throw new Error('Node.setPresentationOffsetProvider(...): expected a function or null.');\n        }\n        this._presentationOffsetProvider = provider;\n    }\n\n    /* Resolve one optional draw-time local offset payload for this node without mutating scene-graph transforms. */\n    _presentationOffsetPayload(scene) {\n        if (!scene || this.scene !== scene || typeof this._presentationOffsetProvider !== 'function') {\n            return null;\n        }\n        return this._presentationOffsetProvider({\n            node: this,\n            scene,\n            now_s: this.sceneNowS(),\n        }) ?? null;\n    }\n\n    /* Compose one optional presentation offset after the authoritative local/world matrix so draw-time motion stays side-effect free. */\n    _presentationAdjustedMatrix(matrix, scene) {\n        if (!matrix) {\n            return null;\n        }\n        const payload = this._presentationOffsetPayload(scene);\n        if (!payload) {\n            return matrix;\n        }\n        const norm = normalizePresentationOffsetPayload(payload, `${this.state?.name ?? this.constructor?.name ?? 'Node'}._presentationAdjustedMatrix`);\n        if (norm.active) {\n            return matrix;\n        }\n        if (norm.position[0] === 0 && norm.position[1] === 0 && norm.position[2] === 0) {\n            return matrix;\n        }\n        return twgl.m4.multiply(matrix, twgl.m4.translation(norm.position));\n    }\n\n    /* Sample the exact draw-time presentation offset for CPU/GL picking. */\n    _presentationOffsetAt(scene) {\n        const payload = this._presentationOffsetPayload(scene);\n        if (!payload) {\n            return null;\n        }\n        const norm = normalizePresentationOffsetPayload(\n            payload,\n            `${this.state?.name ?? this.constructor?.name ?? 'Node'}._presentationOffsetAt`,\n        );\n        if (!norm.active) {\n            return norm.position;\n        }\n        const nowS = this.sceneNowS();\n        const sampleS = Math.max(norm.start_s, Math.min(norm.stop_s, nowS));\n        return projectDecayValue(\n            norm.position,\n            norm.velocity,\n            norm.decay_per_s,\n            sampleS - norm.start_s,\n        ).position;\n    }\n\n    /* Resolve one anchor-to-root matrix for batch draws, including any draw-time presentation offset owned by the anchor scope. */\n    _anchorToRootForBatch(scene) {\n        if (!scene || this.scene !== scene || !isAnchorNode(this)) {\n            return null;\n        }\n        const matrix = this.anchorToRoot ?? this._worldMatrix ?? null;\n        return this._presentationAdjustedMatrix(matrix, scene);\n    }\n\n    /*\n        Defensive closure for batch/draw paths: a node may be attached or remounted\n        after the main propagateTransforms() walk, yet still be reachable from a\n        same-frame picker/draw pass. In that case we can derive the world matrix\n        directly from the authoritative parent chain.\n    */\n    _worldMatrixForBatch(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        if (!this.parentNode && this !== scene.root) {\n            return null;\n        }\n        const anchorNode = this.anchorNode ?? null;\n        const localToAnchor = this.localToAnchor ?? null;\n        const anchorToRoot = anchorNode?._anchorToRootForBatch?.(scene) ?? anchorNode?.anchorToRoot ?? null;\n        if (anchorNode && localToAnchor && anchorToRoot) {\n            return twgl.m4.multiply(anchorToRoot, localToAnchor);\n        }\n        if (!this._worldMatrix) {\n            this._worldMatrix = this.localToWorld();\n        }\n        return this._presentationAdjustedMatrix(this._worldMatrix, scene);\n    }\n\n    _batchPose(scene) {\n        const worldMatrix = this._worldMatrixForBatch(scene);\n        if (!worldMatrix) {\n            return null;\n        }\n        const anchorNode = this.anchorNode ?? null;\n        const anchorToRoot = anchorNode?._anchorToRootForBatch?.(scene) ?? anchorNode?.anchorToRoot ?? null;\n        const localToAnchor = this.localToAnchor ?? null;\n        return {\n            worldMatrix,\n            anchorToRoot: anchorToRoot ? new Float32Array(anchorToRoot) : new Float32Array(worldMatrix),\n            localToAnchor: localToAnchor ? new Float32Array(localToAnchor) : new Float32Array(worldMatrix),\n            clipOwner: this.clipOwner ?? null,\n            localClipRect: this.localClipRect ? new Float32Array(this.localClipRect) : null,\n            clipChainKey: this.clipChainKey ?? 'clip:none',\n            clipChain: (this.clipChain ?? []).map((entry) => ({\n                owner: entry.owner,\n                owner_key: entry.owner_key,\n                local_rect: new Float32Array(entry.local_rect),\n            })),\n            opacity: this.computedOpacity,\n        };\n    }\n\n    /* Build a picker pose from the same analytical presentation offsets used by shaders. */\n    _pickPose(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        const anchorNode = this.anchorNode ?? null;\n        const rawAnchorToRoot = anchorNode?.anchorToRoot ?? null;\n        const rawLocalToAnchor = this.localToAnchor ?? null;\n        if (!anchorNode || !rawAnchorToRoot || !rawLocalToAnchor) {\n            return this._batchPose(scene);\n        }\n        const anchorOffset = anchorNode._presentationOffsetAt?.(scene) ?? null;\n        const ownOffset = anchorNode === this ? null : this._presentationOffsetAt(scene);\n        const anchorToRoot = anchorOffset\n            ? twgl.m4.multiply(rawAnchorToRoot, twgl.m4.translation(anchorOffset))\n            : rawAnchorToRoot;\n        const localToAnchor = ownOffset\n            ? twgl.m4.multiply(rawLocalToAnchor, twgl.m4.translation(ownOffset))\n            : rawLocalToAnchor;\n        return {\n            worldMatrix: twgl.m4.multiply(anchorToRoot, localToAnchor),\n            anchorToRoot: new Float32Array(anchorToRoot),\n            localToAnchor: new Float32Array(localToAnchor),\n            clipOwner: this.clipOwner ?? null,\n            localClipRect: this.localClipRect ? new Float32Array(this.localClipRect) : null,\n            clipChainKey: this.clipChainKey ?? 'clip:none',\n            clipChain: this.clipChain ?? [],\n            opacity: this.computedOpacity,\n        };\n    }\n\n    worldPosition() {\n        return twgl.m4.getTranslation(this.localToWorld());\n    }\n\n    /* Resolve mouse position against the scene presentation camera so shared-camera chrome scenes work like document scenes. */\n    getLocalMousePosition() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            throw new Error('Node.getLocalMousePosition(): scene presentation camera is required.');\n        }\n        const worldPos = this.scene?.worldToPresentationPoint\n            ? this.scene.worldToPresentationPoint(cam.getMouseWorldPosition())\n            : cam.getMouseWorldPosition();\n        const inverseWorldMatrix = twgl.m4.inverse(this.localToWorld());\n        const localPoint = twgl.m4.transformPoint(inverseWorldMatrix, [worldPos[0], worldPos[1], 0]);\n        \n        return [localPoint[0], localPoint[1]];\n    }\n\n    /* Resolve view-space mouse position against the scene presentation camera for chrome/document scene parity. */\n    getLocalMouseViewPosition() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            throw new Error('Node.getLocalMouseViewPosition(): scene presentation camera is required.');\n        }\n        const worldPos = this.scene?.hasPresentationWorldMatrix?.()\n            ? this.scene.worldToPresentationPoint(cam.getMouseWorldPosition())\n            : cam.getMouseViewPosition();\n        const inverseWorldMatrix = twgl.m4.inverse(this.localToWorld());\n        const localPoint = twgl.m4.transformPoint(inverseWorldMatrix, [worldPos[0], worldPos[1], 0]);\n        \n        return [localPoint[0], localPoint[1]];\n    }\n\n\n    /**\n        Returns the local to parent matrix.\n    */\n    localToParent() {\n        return inferLocalToParent(this.state);\n\n    }\n    localPosition() {\n        return twgl.m4.getTranslation(this.localToParent());\n    }\n\n    localRotationZ() {\n        return this.state.rotation_z ?? 0.0;\n    }\n\n    setLocalToParent(localToParent) {\n        delete this.state.x;\n        delete this.state.y;\n        delete this.state.z;\n        delete this.state.rotation_z;\n        this.state.localToParent = localToParent;\n        this._dirtyTransforms();\n    }\n\n    setLocalPosition(x, y, z) {\n        bumpDebugCounter('set_local_position_calls');\n        globalThis.__eviluiPerformanceTracker?.incrementCounter('set_local_position_calls');\n        let position;\n        // account for arrays\n        if (Array.isArray(x) || ArrayBuffer.isView(x)) {\n            position = x;\n        }\n        else if (typeof x === 'number') {\n            // If y or z are missing, default them to the current position or 0\n            position = [x, y || 0, z || 0];\n        }\n        else {\n            console.error(\"Invalid arguments passed to setLocalPosition:\", x, y, z);\n            return;\n        }\n\n        const current = this.localPosition();\n        if (current[0] === position[0] && current[1] === position[1] && current[2] === position[2]) {\n            return;\n        }\n        bumpDebugCounter('set_local_position_mutations');\n        globalThis.__eviluiPerformanceTracker?.incrementCounter('set_local_position_mutations');\n        const next = new Float32Array(this.localToParent());\n        next[12] = position[0];\n        next[13] = position[1];\n        next[14] = position[2];\n        this.setLocalToParent(next);\n    }\n\n    setLocalRotationZ(angle) {\n        const next = Number.isFinite(angle) ? angle : 0.0;\n        const prev = this.localRotationZ();\n        this.state.rotation_z = next;\n        delete this.state.localToParent;\n        if (prev === next) {\n            return;\n        }\n        this._dirtyTransforms();\n    }\n\n    /**\n        Framework users should not directly modify this.state, instead they\n        should call this method with their update, giving subclasses a chance to put\n        some caching / dirty flag mechanism inbetween if they want.\n\n        Contract:\n        - mutate() is for local non-structural node state only\n        - scene-graph changes use dedicated structural mutators\n        - transform changes use dedicated transform mutators\n        - renderer dirtiness stays on underscore-only helpers\n\t\n        The default implementation does not do this, but simply directly\n        assigns the new state.\n\n        The framework itself, including extension classes, can directly mutate\n        this.state.\n    */\n    mutate(newState) {\n        const reservedKey = firstReservedStatePatchKey(newState);\n        if (reservedKey !== null) {\n            throw new Error(\n                `${this.constructor.name}.mutate(...) cannot patch reserved/internal key '${reservedKey}'. `\n                + 'Use dedicated structural or framework-internal APIs instead.'\n            );\n        }\n        if (hasAnyTransformStateKey(newState)) {\n            throw new Error(\n                `${this.constructor.name}.mutate(...) cannot patch transform keys. `\n                + 'Use setLocalPosition(...) or setLocalToParent(...) instead.'\n            );\n        }\n        if (Object.hasOwn(newState, 'visible')) {\n            throw new Error(\n                `${this.constructor.name}.mutate(...) cannot patch visible. `\n                + 'Use setVisibility(...) or the visible property instead.'\n            );\n        }\n        const prevState = this.state;\n        this.state = { ...this.state, ...newState };\n        const kinds = classifyNodeDirtyKinds(prevState, this.state);\n        if (kinds.length === 0) {\n            return;\n        }\n        if (hasAnyPresentationStateKey(newState)) {\n            this._dirtyTransforms();\n        }\n        this._dirtyResources({ kinds });\n    }\n\n    /* Return the stable target value for one animation property, or a shallow snapshot of all tracked targets. */\n    animationTarget(prop = null) {\n        if (prop == null) {\n            const targets = {};\n            for (const key of ANIMATION_PROPS) {\n                targets[key] = this.animationTarget(key);\n            }\n            return targets;\n        }\n        if (!ANIMATION_PROPS.includes(prop)) {\n            throw new Error(`Node.animationTarget(${prop}): unknown animation property.`);\n        }\n        return this._animationTargets.has(prop)\n            ? this._animationTargets.get(prop)\n            : this.#readAnimatedProperty(prop);\n    }\n\n    /* Return the active animation state for one property, or all current property records. */\n    animationState(prop = null) {\n        if (prop == null) {\n            const state = {};\n            for (const key of this._animations.keys()) {\n                state[key] = cloneAnimationRecord(this._animations.get(key));\n            }\n            return state;\n        }\n        if (!ANIMATION_PROPS.includes(prop)) {\n            throw new Error(`Node.animationState(${prop}): unknown animation property.`);\n        }\n        return cloneAnimationRecord(this._animations.get(prop));\n    }\n\n    /* Create or replace one shared-timing animation bundle, expanded internally into one property record per touched property. */\n    animateTo(opts = {}) {\n        const stage = this.scene?.stage ?? null;\n        const defaultStartS = stage?.timeEpochJSMs != null\n            ? stage.frameNowS\n            : currentEvil();\n        const {\n            start_s = defaultStartS,\n            stop_s = null,\n            duration_s = null,\n            ease = 'linear',\n            loop = 'none',\n            iterations = null,\n            accumulate = false,\n            onFinish = null,\n            onStop = null,\n            ...targets\n        } = opts;\n        if (!Number.isFinite(start_s)) {\n            throw new Error('Node.animateTo(...): start_s must be finite.');\n        }\n        const props = Object.keys(targets);\n        if (props.length === 0) {\n            throw new Error('Node.animateTo(...): at least one animated property is required.');\n        }\n        const animProps = normalizeAnimationPropsArg(props, []);\n        const loopMode = normalizeAnimationLoop(loop);\n        const loopIterations = normalizeAnimationIterations(loopMode, iterations);\n        if (typeof accumulate !== 'boolean') {\n            throw new Error('Node.animateTo(...): accumulate must be a boolean.');\n        }\n        if (accumulate && loopMode === 'none') {\n            throw new Error('Node.animateTo(...): accumulate requires looped animation mode.');\n        }\n        if (accumulate && loopMode === 'ping_pong') {\n            throw new Error('Node.animateTo(...): accumulate is not supported with ping_pong loop mode.');\n        }\n        const endS = stop_s ?? (duration_s == null ? null : start_s + duration_s);\n        if (!Number.isFinite(endS)) {\n            throw new Error('Node.animateTo(...): provide finite stop_s or duration_s.');\n        }\n        if (endS < start_s) {\n            throw new Error('Node.animateTo(...): stop_s must be >= start_s.');\n        }\n        const durationS = endS - start_s;\n        if (loopMode !== 'none' && durationS <= 0) {\n            throw new Error('Node.animateTo(...): looped animations require positive duration_s or stop_s > start_s.');\n        }\n        const easing = normalizeAnimationEase(ease);\n        for (const prop of animProps) {\n            const to = targets[prop];\n            if (!Number.isFinite(to)) {\n                throw new Error(`Node.animateTo(...): target ${prop} must be finite.`);\n            }\n            const prev = this._animations.get(prop);\n            if (prev) {\n                this.#finishAnimation(prop, prev, 'replaced', false);\n            }\n            const rec = {\n                prop,\n                from: this.#readAnimatedProperty(prop),\n                to,\n                start_s,\n                stop_s: endS,\n                duration_s: durationS,\n                ease_name: easing.name,\n                ease_fn: easing.fn,\n                loop_mode: loopMode,\n                iterations: loopIterations,\n                accumulate,\n                span: to - this.#readAnimatedProperty(prop),\n                onFinish,\n                onStop,\n            };\n            this._animations.set(prop, rec);\n            this._animationTargets.set(prop, animationTerminalTarget(rec));\n        }\n        if (loopMode === 'none' && endS === start_s) {\n            this._evaluateAnimations(start_s);\n        }\n        this.refreshAnimationRegistration();\n        return this.animationState();\n    }\n\n    /* Stop active animations and keep the currently resolved values as the new stable targets. */\n    stopAnimation(props = null) {\n        for (const prop of normalizeAnimationPropsArg(props, this._animations.keys())) {\n            const rec = this._animations.get(prop);\n            if (!rec) {\n                continue;\n            }\n            this._animationTargets.set(prop, this.#readAnimatedProperty(prop));\n            this.#finishAnimation(prop, rec, 'stopped', false);\n        }\n        this.refreshAnimationRegistration();\n    }\n\n    /* Schedule one sparse scene-clock wake rather than keeping this node on an automatic per-frame callback list. */\n    thinkAt(whenS, onWake, opts = {}) {\n        if (!Number.isFinite(whenS)) {\n            throw new Error(`Node.thinkAt(${whenS}, ...): whenS must be finite.`);\n        }\n        if (typeof onWake !== 'function') {\n            throw new Error('Node.thinkAt(...): onWake must be a function.');\n        }\n        if (!this.scene) {\n            throw new Error('Node.thinkAt(...): node must be attached to a scene.');\n        }\n        const reason = opts?.reason ?? null;\n        if (reason !== null && (typeof reason !== 'string' || reason.length === 0)) {\n            throw new Error('Node.thinkAt(...): reason must be null or a non-empty string.');\n        }\n        const token = g_nextScheduledThinkId++;\n        const rec = {\n            token,\n            at_s: whenS,\n            onWake,\n            reason,\n        };\n        this._scheduledThinks.set(token, rec);\n        this.scene._scheduleNodeThinkAt(this, rec);\n        return token;\n    }\n\n    /* Cancel one previously scheduled sparse wake if it is still pending. */\n    cancelThinkAt(token) {\n        const rec = this._scheduledThinks.get(token);\n        if (!rec) {\n            return false;\n        }\n        this._scheduledThinks.delete(token);\n        this.scene?._cancelNodeThinkAt(this, token);\n        return true;\n    }\n\n    /* Drop all pending sparse wakes owned by this node, typically during detach. */\n    _cancelScheduledThinks() {\n        if (this._scheduledThinks.size === 0) {\n            return;\n        }\n        const tokens = [...this._scheduledThinks.keys()];\n        this._scheduledThinks.clear();\n        for (const token of tokens) {\n            this.scene?._cancelNodeThinkAt(this, token);\n        }\n    }\n\n    /* Queue one readiness-driven wake for the next shared scene update without pretending it is time-based work. */\n    wake(onWake, opts = {}) {\n        if (typeof onWake !== 'function') {\n            throw new Error('Node.wake(...): onWake must be a function.');\n        }\n        if (!this.scene) {\n            throw new Error('Node.wake(...): node must be attached to a scene.');\n        }\n        const reason = opts?.reason ?? null;\n        if (reason !== null && (typeof reason !== 'string' || reason.length === 0)) {\n            throw new Error('Node.wake(...): reason must be null or a non-empty string.');\n        }\n        const token = g_nextScheduledThinkId++;\n        const rec = {\n            token,\n            onWake,\n            reason,\n        };\n        this._queuedWakes.set(token, rec);\n        this.scene._queueNodeWake(this, rec);\n        return token;\n    }\n\n    /* Cancel one previously queued readiness wake if it is still pending. */\n    cancelWake(token) {\n        const rec = this._queuedWakes.get(token);\n        if (!rec) {\n            return false;\n        }\n        this._queuedWakes.delete(token);\n        this.scene?._cancelNodeWake(this, token);\n        return true;\n    }\n\n    /* Drop all queued readiness wakes owned by this node, typically during detach. */\n    _cancelQueuedWakes() {\n        if (this._queuedWakes.size === 0) {\n            return;\n        }\n        const tokens = [...this._queuedWakes.keys()];\n        this._queuedWakes.clear();\n        for (const token of tokens) {\n            this.scene?._cancelNodeWake(this, token);\n        }\n    }\n\n    /* Return one active exponential-decay record, or a shallow snapshot of all active records. */\n    exponentialDecayState(name = null) {\n        const cloneRec = (rec) => rec ? {\n            name: rec.name,\n            position: cloneDecayValue(this.#projectExponentialDecay(rec, this.sceneNowS()).position),\n            velocity: cloneDecayValue(this.#projectExponentialDecay(rec, this.sceneNowS()).velocity),\n            decay_per_s: rec.decay_per_s,\n            epsilon: rec.epsilon,\n            start_s: rec.start_s,\n            stop_s: rec.stop_s,\n        } : null;\n        if (name == null) {\n            const out = {};\n            for (const [key, rec] of this._exponentialDecays.entries()) {\n                out[key] = cloneRec(rec);\n            }\n            return out;\n        }\n        return cloneRec(this._exponentialDecays.get(name) ?? null);\n    }\n\n    /* Expose one closed-form decay plan so draw-time consumers can project the same motion without frame-by-frame state writes. */\n    exponentialDecayPlan(name = null) {\n        const cloneRec = (rec) => rec ? {\n            name: rec.name,\n            position: cloneDecayValue(rec.base_position),\n            velocity: cloneDecayValue(rec.base_velocity),\n            decay_per_s: rec.decay_per_s,\n            epsilon: rec.epsilon,\n            start_s: rec.start_s,\n            stop_s: rec.stop_s,\n            stop_position: cloneDecayValue(rec.stop_position),\n            stop_velocity: cloneDecayValue(rec.stop_velocity),\n            stop_reason: rec.stop_reason,\n            sample_only: rec.sample_only === true,\n        } : null;\n        if (name == null) {\n            const out = {};\n            for (const [key, rec] of this._exponentialDecays.entries()) {\n                out[key] = cloneRec(rec);\n            }\n            return out;\n        }\n        return cloneRec(this._exponentialDecays.get(name) ?? null);\n    }\n\n    /* Project one active decay analytically at an arbitrary time without mutating node state or firing lifecycle edges. */\n    sampleExponentialDecay(name, nowS = this.sceneNowS(), opts = {}) {\n        if (typeof name !== 'string' || name.length === 0) {\n            throw new Error('Node.sampleExponentialDecay(...): name must be a non-empty string.');\n        }\n        if (!Number.isFinite(nowS)) {\n            throw new Error('Node.sampleExponentialDecay(...): nowS must be finite.');\n        }\n        const rec = this._exponentialDecays.get(name) ?? null;\n        if (!rec) {\n            return null;\n        }\n        const sample = this.#projectExponentialDecay(rec, nowS, opts.forceStop === true);\n        return {\n            name: rec.name,\n            now_s: nowS,\n            start_s: rec.start_s,\n            stop_s: rec.stop_s,\n            position: cloneDecayValue(sample.position),\n            velocity: cloneDecayValue(sample.velocity),\n            stop: sample.stop,\n            reason: sample.reason,\n        };\n    }\n\n    /* Start or replace one explicit exponential-decay motion with closed-form position integration. */\n    startExponentialDecay(name, opts = {}) {\n        if (typeof name !== 'string' || name.length === 0) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): name must be a non-empty string.`);\n        }\n        if (!this.scene) {\n            throw new Error('Node.startExponentialDecay(...): node must be attached to a scene.');\n        }\n        const {\n            position,\n            velocity,\n            decay_per_s,\n            epsilon,\n            clamp = null,\n            predict_stop = null,\n            apply,\n            sample_only = false,\n            onFinish = null,\n            onStop = null,\n        } = opts;\n        if (!isFiniteDecayValue(position)) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): position must be finite.`);\n        }\n        if (!isFiniteDecayValue(velocity)) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): velocity must be finite.`);\n        }\n        if (!sameDecayShape(position, velocity)) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): position and velocity must have matching shapes.`);\n        }\n        if (!Number.isFinite(decay_per_s) || decay_per_s <= 0) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): decay_per_s must be > 0.`);\n        }\n        if (!Number.isFinite(epsilon) || epsilon < 0) {\n            throw new Error(`Node.startExponentialDecay(${name}, ...): epsilon must be >= 0.`);\n        }\n        if (typeof sample_only !== 'boolean') {\n            throw new Error('Node.startExponentialDecay(...): sample_only must be a boolean.');\n        }\n        if (!sample_only && typeof apply !== 'function') {\n            throw new Error('Node.startExponentialDecay(...): apply must be a function unless sample_only=true.');\n        }\n        if (onFinish !== null && typeof onFinish !== 'function') {\n            throw new Error('Node.startExponentialDecay(...): onFinish must be a function or null.');\n        }\n        if (clamp !== null && typeof clamp !== 'function') {\n            throw new Error('Node.startExponentialDecay(...): clamp must be a function or null.');\n        }\n        if (predict_stop !== null && typeof predict_stop !== 'function') {\n            throw new Error('Node.startExponentialDecay(...): predict_stop must be a function or null.');\n        }\n        if (onStop !== null && typeof onStop !== 'function') {\n            throw new Error('Node.startExponentialDecay(...): onStop must be a function or null.');\n        }\n        const prev = this._exponentialDecays.get(name) ?? null;\n        if (prev) {\n            this.#finishExponentialDecay(prev, 'replaced');\n        }\n        const startS = this.sceneNowS();\n        const settleAfterS = decaySettleAfterS(velocity, epsilon, decay_per_s);\n        const settleStop = {\n            stop_s: startS + settleAfterS,\n            position: cloneDecayValue(projectDecayValue(position, velocity, decay_per_s, settleAfterS).position),\n            velocity: zeroDecayValueLike(velocity),\n            reason: 'settled',\n        };\n        const projectedStop = predict_stop?.({\n            node: this,\n            name,\n            start_s: startS,\n            position: cloneDecayValue(position),\n            velocity: cloneDecayValue(velocity),\n            decay_per_s,\n            epsilon,\n            settle_s: settleStop.stop_s,\n            settle_after_s: settleAfterS,\n            project_state_at_s: (atS) => {\n                if (!Number.isFinite(atS) || atS < startS) {\n                    throw new Error(`Node.startExponentialDecay(${name}, ...): project_state_at_s expected a finite time >= start_s.`);\n                }\n                return projectDecayValue(position, velocity, decay_per_s, atS - startS);\n            },\n            project_state_after_s: (dtS) => {\n                if (!Number.isFinite(dtS) || dtS < 0) {\n                    throw new Error(`Node.startExponentialDecay(${name}, ...): project_state_after_s expected a finite dt >= 0.`);\n                }\n                return projectDecayValue(position, velocity, decay_per_s, dtS);\n            },\n        }) ?? null;\n        if (projectedStop) {\n            if (!Number.isFinite(projectedStop.stop_s) || projectedStop.stop_s < startS) {\n                throw new Error(`Node.startExponentialDecay(${name}, ...): predict_stop must return stop_s >= start_s.`);\n            }\n            if (!isFiniteDecayValue(projectedStop.position) || !isFiniteDecayValue(projectedStop.velocity) || !sameDecayShape(projectedStop.position, projectedStop.velocity)) {\n                throw new Error(`Node.startExponentialDecay(${name}, ...): predict_stop must return finite position/velocity with matching shapes.`);\n            }\n            if (typeof projectedStop.reason !== 'string' || projectedStop.reason.length === 0) {\n                throw new Error(`Node.startExponentialDecay(${name}, ...): predict_stop must return a non-empty reason.`);\n            }\n        }\n        const stop = !projectedStop || settleStop.stop_s <= projectedStop.stop_s\n            ? settleStop\n            : {\n                stop_s: projectedStop.stop_s,\n                position: cloneDecayValue(projectedStop.position),\n                velocity: cloneDecayValue(projectedStop.velocity),\n                reason: projectedStop.reason,\n            };\n        const rec = {\n            name,\n            start_s: startS,\n            last_apply_s: startS,\n            base_position: cloneDecayValue(position),\n            base_velocity: cloneDecayValue(velocity),\n            decay_per_s,\n            epsilon,\n            clamp,\n            predict_stop,\n            apply,\n            sample_only,\n            onFinish,\n            onStop,\n            stop_s: stop.stop_s,\n            stop_position: cloneDecayValue(stop.position),\n            stop_velocity: cloneDecayValue(stop.velocity),\n            stop_reason: stop.reason,\n            stop_token: null,\n        };\n        this._exponentialDecays.set(name, rec);\n        if (settleAfterS === 0) {\n            if (!rec.sample_only) {\n                rec.apply({\n                    node: this,\n                    name,\n                    dt: 0,\n                    now_s: startS,\n                    position: cloneDecayValue(stop.position),\n                    velocity: cloneDecayValue(stop.velocity),\n                });\n            }\n            this.#finishExponentialDecay(rec, stop.reason, true, {\n                position: stop.position,\n                velocity: stop.velocity,\n            });\n            return null;\n        }\n        this.#scheduleExponentialDecayStop(rec);\n        this.refreshAnimationRegistration();\n        return this.exponentialDecayState(name);\n    }\n\n    /* Cancel one active exponential-decay motion if it is still live. */\n    cancelExponentialDecay(name) {\n        const rec = this._exponentialDecays.get(name) ?? null;\n        if (!rec) {\n            return false;\n        }\n        this.#finishExponentialDecay(rec, 'cancelled');\n        return true;\n    }\n\n    /* Cancel all active exponential-decay motions owned by this node. */\n    _cancelExponentialDecays(reason = 'cancelled') {\n        if (this._exponentialDecays.size === 0) {\n            return;\n        }\n        for (const rec of [...this._exponentialDecays.values()]) {\n            this.#finishExponentialDecay(rec, reason);\n        }\n    }\n\n    /* Cancel active animations and keep the current resolved values while reporting an explicit cancellation edge. */\n    cancelAnimation(props = null) {\n        for (const prop of normalizeAnimationPropsArg(props, this._animations.keys())) {\n            const rec = this._animations.get(prop);\n            if (!rec) {\n                continue;\n            }\n            this._animationTargets.set(prop, this.#readAnimatedProperty(prop));\n            this.#finishAnimation(prop, rec, 'cancelled', false);\n        }\n        this.refreshAnimationRegistration();\n    }\n\n    /* Schedule one sparse endpoint wake so callers can observe stop/clamp edges without a frame-step wake chain. */\n    #scheduleExponentialDecayStop(rec) {\n        if (!this.scene || !Number.isFinite(rec.stop_s)) {\n            return;\n        }\n        rec.stop_token = this.thinkAt(rec.stop_s, ({ now_s }) => {\n            rec.stop_token = null;\n            const live = this._exponentialDecays.get(rec.name) ?? null;\n            if (live !== rec) {\n                return;\n            }\n            const sample = this.#projectExponentialDecay(rec, now_s, true);\n            if (!rec.sample_only) {\n                rec.apply({\n                    node: this,\n                    name: rec.name,\n                    dt: Math.max(0, now_s - rec.last_apply_s),\n                    now_s,\n                    position: cloneDecayValue(sample.position),\n                    velocity: cloneDecayValue(sample.velocity),\n                });\n            }\n            rec.last_apply_s = now_s;\n            this.#finishExponentialDecay(rec, sample.reason, true, sample);\n        }, {\n            reason: `exponential_decay_stop:${rec.name}`,\n        });\n    }\n\n    /* Project one live exponential-decay motion from its start state, optionally forcing the terminal stop sample. */\n    #projectExponentialDecay(rec, nowS, forceStop = false) {\n        const stopS = rec.stop_s;\n        const sampleS = forceStop && Number.isFinite(stopS)\n            ? stopS\n            : Math.min(nowS, stopS ?? nowS);\n        const raw = projectDecayValue(rec.base_position, rec.base_velocity, rec.decay_per_s, sampleS - rec.start_s);\n        let position = cloneDecayValue(raw.position);\n        let velocity = cloneDecayValue(raw.velocity);\n        let stop = forceStop || (Number.isFinite(stopS) && nowS >= stopS);\n        let reason = rec.stop_reason ?? 'settled';\n\n        if (stop) {\n            position = cloneDecayValue(rec.stop_position);\n            velocity = cloneDecayValue(rec.stop_velocity);\n        } else if (rec.clamp) {\n            const next = rec.clamp({\n                node: this,\n                name: rec.name,\n                dt: Math.max(0, sampleS - rec.last_apply_s),\n                now_s: sampleS,\n                position: cloneDecayValue(position),\n                velocity: cloneDecayValue(velocity),\n            });\n            if (!next || !isFiniteDecayValue(next.position) || !isFiniteDecayValue(next.velocity) || !sameDecayShape(next.position, next.velocity)) {\n                throw new Error(`Node.startExponentialDecay(${rec.name}, ...): clamp must return finite position/velocity with matching shapes.`);\n            }\n            position = cloneDecayValue(next.position);\n            velocity = cloneDecayValue(next.velocity);\n            stop = next.stop === true;\n            reason = next.reason ?? 'clamped';\n        }\n\n        if (!stop && decayVelocitySettled(velocity, rec.epsilon)) {\n            stop = true;\n            reason = 'settled';\n            velocity = zeroDecayValueLike(velocity);\n        }\n\n        return {\n            position,\n            velocity,\n            stop,\n            reason,\n        };\n    }\n\n    /* Remove one exponential-decay motion and emit either a finish or stop edge exactly once. */\n    #finishExponentialDecay(rec, reason, completed = false, sample = null) {\n        const live = this._exponentialDecays.get(rec.name) ?? null;\n        if (live !== rec) {\n            return;\n        }\n        const projected = sample ?? this.#projectExponentialDecay(rec, this.sceneNowS());\n        this._exponentialDecays.delete(rec.name);\n        if (rec.stop_token !== null) {\n            this.cancelThinkAt(rec.stop_token);\n            rec.stop_token = null;\n        }\n        const payload = {\n            node: this,\n            name: rec.name,\n            reason,\n            position: cloneDecayValue(projected.position),\n            velocity: cloneDecayValue(projected.velocity),\n        };\n        if (completed) {\n            rec.onFinish?.(payload);\n        }\n        else if (typeof rec.onStop === 'function') {\n            rec.onStop(payload);\n        }\n        this.refreshAnimationRegistration();\n    }\n\n    _dirtyTransforms() {\n        this._markTransformDirty();\n        this._dirtyResources({ kinds: [DIRTY.transform] });\n    }\n\n    setVisibility(state) {\n        this.visible = state;\n    }\n\n    /**\n        Add a child node to myself, assuming its currently an orphan (newly\n        created or previously detatched).\n\n        2026-01-06:\n            * Extended to now accept children that already have their own children attached.\n            * Extended to work when `this` is detached from the scene graph. (Orphan's can now have kids!)\n\n        Invariant:\n        - `child` must already be a detached orphan\n        - reparenting an attached node must go through `remount(...)` or `replaceChild(...)`\n    */\n    appendChild(child) {\n        if (!child || !(child instanceof Node)) {\n            throw new Error(`Node.appendChild(${child} ${child?.constructor?.name}) should be called with object deriving from ui.Node.`);\n        }\n        this._childAttachGuard?.(child, 'appendChild');\n        assertChildIsDetachedOrphan(child, 'appendChild');\n\n        this.children.push(child);\n        child.parentNode = this;\n        child._markTransformDirty();\n        child._refreshComputedVisibility(true);\n\n        if (this.scene) {\n            this.#attachChild(child);\n        }\n    }\n\n    insertChildBefore(child, beforeChild = null) {\n        if (beforeChild === null) {\n            this.appendChild(child);\n            return;\n        }\n        if (!child || !(child instanceof Node)) {\n            throw new Error(`Node.insertChildBefore(${child} ${child?.constructor?.name}, ${beforeChild?.state?.name ?? beforeChild}): child should derive from ui.Node.`);\n        }\n        if (!beforeChild || !(beforeChild instanceof Node)) {\n            throw new Error(`Node.insertChildBefore(${child.state.name}, ${beforeChild}): beforeChild should derive from ui.Node.`);\n        }\n        this._childAttachGuard?.(child, 'insertChildBefore');\n        assertChildIsDetachedOrphan(child, 'insertChildBefore');\n        if (beforeChild.parentNode !== this) {\n            throw new Error(`Node.insertChildBefore(${child.state.name}, ${beforeChild.state.name}): beforeChild is not attached to ${this.state.name}.`);\n        }\n\n        const idx = this.children.indexOf(beforeChild);\n        if (idx < 0) {\n            throw new Error(`Node.insertChildBefore(${child.state.name}, ${beforeChild.state.name}): beforeChild not found in ${this.state.name}.children.`);\n        }\n\n        this.children.splice(idx, 0, child);\n        child.parentNode = this;\n        child._markTransformDirty();\n        child._refreshComputedVisibility(true);\n\n        if (this.scene) {\n            this.#attachChild(child);\n        }\n    }\n\n    /**\n        Internal method to handle when a Node is first attached to a scene, either directly, or because\n        its parent, grandparent, etc was attached to a scene.\n    */\n    #attachChild(child) {\n        if (!child) {\n            throw new Error(`${this.state.name}.#attachChild(${child}): child not valid.`);\n        } else if (!this.scene) {\n            throw new Error(`${this.state.name}.#attachChild(${child.state.name}): scene should be set.`);\n        }\n\n        child.scene = this.scene;\n        child._assertLifecycle(NODE_LIFECYCLE.DETACHED, `${child.state.name} attach`);\n        child._setLifecycle(NODE_LIFECYCLE.ATTACHED_NO_GL);\n        attachAnchorScope(this, child);\n        attachClipScope(this, child);\n        if (typeof __PORTAL_PERF_BUILD__ !== 'undefined' && __PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(perfAttachCounterName('node_attach', child, this));\n        }\n        child._refreshComputedVisibility(true);\n\n        for (let grandkid of child.children) {\n            if (grandkid.scene === this.scene) {\n                continue;\n            }\n            child.#attachChild(grandkid);\n        }\n\n        child._linkResources();\n        child._onAttachNode(child._resources);\n        child.refreshAnimationRegistration();\n\n        let gl = this.scene.gl;\n        if (gl && !this.scene._acquiringContext) {\n            child._assertLifecycle(NODE_LIFECYCLE.ATTACHED_NO_GL, `${child.state.name} acquire`);\n            child._onAcquireNode(gl, child._resources);\n            child._glAttached = true;\n            child._setLifecycle(NODE_LIFECYCLE.ATTACHED_GL);\n        }\n\n        // A subtree can be attached after the scene's normal transform-prepare\n        // pass for the frame. Seed world matrices eagerly so same-frame draw/pick\n        // paths do not observe attached pickables with null world transforms.\n        child.propagateTransforms(\n            this.localToWorld(),\n            null,\n            0,\n            true,\n            this.computedClipRect,\n            this.computedOpacity ?? 1.0,\n        );\n    }\n\n    /**\n        Internal method to handle when a Node is detached from a scene, either directly, or because\n        its parent, grandparent, etc was detached.\n    */\n    #detachChild(child) {\n        if (this.scene?.gl) {\n            // Detached + GL is an invalid quadrant in the scene lifecycle. The\n            // caller must release the subtree first, then detach it.\n            assertDetachedSubtreeHasNoGL(child);\n        }\n        child._assertLifecycle(NODE_LIFECYCLE.ATTACHED_NO_GL, `${child.state.name} detach`);\n        child._onBeforeDetachNode(/*ref*/ child._resources);\n        // Detach hooks may actively remove sibling chrome/transient mounts from\n        // the same parent. Walk a snapshot and ignore descendants that have\n        // already been rehomed or detached by an earlier hook-visible side\n        // effect in this same detach pass.\n        for (const grandkid of [...child.children]) {\n            if (grandkid.parentNode !== child) {\n                continue;\n            }\n            child.#detachChild(grandkid);\n        }\n        child.scene?._animatedNodes?.delete(child);\n        child._cancelScheduledThinks();\n        child._cancelQueuedWakes();\n        child._cancelExponentialDecays('detached');\n        if (typeof __PORTAL_PERF_BUILD__ !== 'undefined' && __PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(perfAttachCounterName('node_detach', child, this));\n        }\n        child._onDetachNode(/*ref*/ child._resources);\n        if (child.focusContainerKind != null) {\n            clearFocusContainerReferences(child);\n        }\n        retireSharedResourcesIfUnused(child);\n        child._resources = null;\n        clearAnchorScope(child);\n        clearClipScope(child);\n        child.scene = null;\n        child._setLifecycle(NODE_LIFECYCLE.DETACHED);\n    }\n\n    /**\n        Deletes node from the scene entirely. Implicitly removes from the scene\n        (orphans) grandchildren, grand-grandchildren etc.\n\n        Note that since the root node has no parent to call removeChild(root)\n        on, the scene root cannot be deleted.\n\n        Hook-visible invariant:\n        - `_onReleaseNode(...)` and `_onDetachNode(...)` still observe the current `parentNode` and `scene`\n        - the framework clears `parentNode` only after detach completes\n    */\n    removeChild(child) {\n        if (!child) {\n            throw new Error(`removeChild(${child}): expect valid object.`);\n        } else if (!child.parentNode) {\n            throw new Error(`Attempt to remove orphan Node ${this.state.name}. (Might be root Node, or detached from scene.)`);\n        } else if (child.parentNode != this) {\n            throw new Error(`Attempt to remove Node ${this.state.name}, whose parent is ${child.state.name} (expected: ${this.parentNode.state.name}).`);\n        }\n\n        let newChildren = this.children.filter(n => child !== n);\n        if (newChildren.length == this.children.length) {\n            throw new Error(`${child.state.name} is not a child of ${this.state.name}, rather it has parent ${child.parentNode.state.name}.`);\n        }\n\n        // Child-tree churn does not change this node's own pick geometry/IDs.\n        this._dirtyResources({ includePicker: false });\n        this.children = newChildren;\n\n        if (this.scene) {\n            if (this.scene.gl) {\n                releaseSubtree(this.scene.gl, child);\n            }\n\n            this.#detachChild(child);  // Calls this._onDetachNode recursively for us.\n        }\n        child.parentNode = null;\n        child._refreshComputedVisibility(true);\n    }\n\n    /**\n        Like removeChild(oldChild); appendChild(newChild); but may be more efficient.\n\n        Unlike removeChild and appendChild, either/both of the arguments may be null.\n\n        Hook-visible invariant:\n        - `oldChild.parentNode` and `oldChild.scene` remain valid through `_onReleaseNode(...)` and `_onDetachNode(...)`\n        - `newChild` must be a detached orphan when provided\n    */\n    replaceChild(oldChild, newChild) {\n        if (oldChild === null && newChild === null) {\n            return;\n        } else if (oldChild === null) {\n            return this.appendChild(newChild);\n        } else {\n            if (!oldChild) {\n                throw new Error(`removeChild(${oldChild}): expect valid object.`);\n            } else if (!oldChild.parentNode) {\n                throw new Error(`Attempt to remove orphan Node ${this.state.name}. (Might be root Node, or detached from scene.)`);\n            } else if (oldChild.parentNode != this) {\n                throw new Error(`Attempt to remove Node ${this.state.name}, whose parent is ${oldChild.state.name} (expected: ${this.parentNode.state.name}).`);\n            }\n        }\n        // postcondition: oldChild is not null\n\n        if (newChild === null) {\n            ;\n        } else {\n            if (!(newChild instanceof Node)) {\n                throw new Error(`Node.replaceChild(${newChild} ${newChild.constructor.name}) should be called with object deriving from ui.Node.`);\n            }\n            assertChildIsDetachedOrphan(newChild, 'replaceChild');\n        }\n\n        for (let i = 0; i < this.children.length; i++) {\n            if (this.children[i] === oldChild) {\n                if (this.scene) {\n                    if (this.scene.gl) {\n                        releaseSubtree(this.scene.gl, oldChild);\n                    }\n                    this.#detachChild(oldChild);\n                }\n                oldChild.parentNode = null;\n                oldChild.scene = null;\n\n                if (newChild) {\n                    this.children[i] = newChild;\n                    newChild.parentNode = this;\n                    newChild._markTransformDirty();\n                    newChild._refreshComputedVisibility(true);\n                    if (this.scene) {\n                        this.#attachChild(newChild);\n                    }\n                }\n\n                // Replacing descendants should not invalidate the parent's pick batch by itself.\n                this._dirtyResources({ includePicker: false });\n                return;\n            }\n        }\n\n        throw new Error(`replaceChild(${oldChild} ${oldChild?.constructor?.name}, ${newChild} ${newChild?.constructor?.name}): child not found.`);\n    }\n\n    /**\n        Removes all children of this node.\n\n        2026-01-31 gxmw: removed orphan check. (Its now permitted to remove all children from a orphan.)\n\n        Hook-visible invariant:\n        - each child keeps its current `parentNode` through `_onReleaseNode(...)` and `_onDetachNode(...)`\n        - direct-child `parentNode` pointers are cleared only after detach completes\n    */\n    removeAllChildren() {\n        if (this.children.length == 0) {\n            return;\n        }\n\n        // Depth first pre-order traversal ensures children are always removed before their\n        // parents, simplifying book-keeping.\n        for (const ch of this.children) {\n            ch.removeAllChildren();\n        }\n\n        // Release all the resources\n        if (this.scene) {\n            let gl = this.scene.gl;\n            if (gl) {\n                for (const ch of this.children) {\n                    releaseSubtree(gl, ch);\n                }\n            }\n\n            for (const ch of this.children) {\n                this.#detachChild(ch);\n            }\n        }\n\n        for (const ch of this.children) {\n            ch.parentNode = null;\n        }\n\n        this.children = [];\n    }\n\n    /**\n        Move this Node to be attached to a different parent within the same\n        scene. This is a passive transformation: it does not affect where the Node is\n        in the world at all, rather it reinterprets that position relative to a new\n        parent.\n\n        Imagine a box falling off the back of a lorry. Originally its parent would be\n        the lorry, but once it hits the ground, then the world (ground) would make a better\n        parent. The box should not teleport during the transition.\n    */\n    remount(newParent) {\n        if (newParent.scene !== this.scene) {\n            throw new Error('Cannot remount to a different scene.');\n        } else if (!this.parentNode) {\n            throw new Error('Cannot remount the root Node for a scene.');\n        } else if (newParent === this.parentNode) {\n            return;\n        }\n\n        const oldChain = this.localToWorld();\n        this._onRemountNode(newParent);\n        const newParentChain = newParent.localToWorld();\n\n        /*\n            Position vector x should be invariant to the coordinate change:\n                L M N x        == L' M' N' x\n                L M N          == (L' M') N'\n                ~(L' M') L M N == N'\n            where ' denotes new matrix chain, ~ is matrix inverse and N' is the\n            new localToParent matrix we are trying to calculate.\n        */\n        const newLocalToParent = twgl.m4.multiply(\n            twgl.m4.inverse(newParentChain),\n            oldChain\n        );\n        this.setLocalToParent(newLocalToParent);\n    }\n\n    // protected:\n    // Available use and/or override by subclasses of Node, but should not be called directly\n    // by framework users.\n\n    /**\n        Override if you want this Node to process keyboard input.\n\n        Return false to indicate this did not consume the keypress, return true\n        to indicate the keypress was consumed.\n    */\n    onKeyDown(evt) {\n        return false; // Did not consume, propogate further.\n    }\n\n    /**\n        Load any resources required by the Node class which do NOT depend on the OpenGL context.\n    */\n    static _onAttachClass(shared) {\n        // Typical implementation:\n        //     shared.nodes = [];\n    }\n\n    /**\n        Free any resources required by the Node class which do NOT depend on th OpenGL context.\n        The framework will only call this once the last Node of the given class is removed from\n        the scene.\n\n        TODO: Currently never trigerred. (This could be argued as an optimisation.)\n    */\n    static _onDetachClass(shared) {\n        // Typical implementation:\n        //     shared.nodes = null;\n    }\n\n    /* Keep scene-local animation registration aligned with whether the node currently owns any live animation records. */\n    refreshAnimationRegistration() {\n        if (!this.scene) {\n            return;\n        }\n        this.scene._syncAnimatedNode(this);\n    }\n\n    /* Report whether the node currently owns any live animation records. */\n    _hasActiveAnimations() {\n        return this._animations.size > 0 || this._exponentialDecays.size > 0;\n    }\n\n    /* Evaluate this node's active animation records against the shared Stage clock and resolve live properties in-place. */\n    _evaluateAnimations(nowS) {\n        if (!this._hasActiveAnimations()) {\n            return;\n        }\n        for (const [prop, rec] of [...this._animations.entries()]) {\n            if (rec.loop_mode !== 'none') {\n                const elapsed = Math.max(0.0, nowS - rec.start_s);\n                const iteration = Math.floor(elapsed / rec.duration_s);\n                if (rec.iterations != null && iteration >= rec.iterations) {\n                    const terminal = animationTerminalTarget(rec);\n                    this.#writeAnimatedProperty(prop, terminal);\n                    this._animationTargets.set(prop, terminal);\n                    this.#finishAnimation(prop, rec, 'finished', true);\n                    continue;\n                }\n                const cycleElapsed = elapsed - (iteration * rec.duration_s);\n                const progress = ewu.clamp(cycleElapsed / rec.duration_s, 0.0, 1.0);\n                const eased = rec.ease_fn(progress);\n                let from = rec.from;\n                let to = rec.to;\n                if (rec.loop_mode === 'repeat' && rec.accumulate) {\n                    const offset = iteration * rec.span;\n                    from += offset;\n                    to += offset;\n                } else if (rec.loop_mode === 'ping_pong' && (iteration % 2) === 1) {\n                    from = rec.to;\n                    to = rec.from;\n                }\n                this.#writeAnimatedProperty(prop, from + (to - from) * eased);\n                continue;\n            }\n            const progress = rec.duration_s <= 0 ? 1.0 : ewu.clamp((nowS - rec.start_s) / rec.duration_s, 0.0, 1.0);\n            const eased = rec.ease_fn(progress);\n            const value = rec.from + (rec.to - rec.from) * eased;\n            this.#writeAnimatedProperty(prop, value);\n            if (progress >= 1.0) {\n                this._animationTargets.set(prop, rec.to);\n                this.#finishAnimation(prop, rec, 'finished', true);\n            }\n        }\n        for (const rec of [...this._exponentialDecays.values()]) {\n            if (rec.sample_only) {\n                continue;\n            }\n            const sample = this.#projectExponentialDecay(rec, nowS);\n            rec.apply({\n                node: this,\n                name: rec.name,\n                dt: Math.max(0, nowS - rec.last_apply_s),\n                now_s: nowS,\n                position: cloneDecayValue(sample.position),\n                velocity: cloneDecayValue(sample.velocity),\n            });\n            rec.last_apply_s = nowS;\n            if (sample.stop) {\n                this.#finishExponentialDecay(rec, sample.reason, true, sample);\n            }\n        }\n        this.refreshAnimationRegistration();\n    }\n\n    /**\n        Load any resources requried by the specific Node instance, which do not depend on the\n        WebGL2Context.\n\n        Framework-only hook:\n        - subclasses may override and call `super`\n        - only the scene-graph framework may invoke this method\n        - visible state on entry: `parentNode !== null`, `scene !== null`, `_glAttached === false`\n        - any pre-existing descendants under this node are already scene-attached before this callback runs\n     */\n    _onAttachNode(shared) {\n        // Typical implementation:\n        //     shared.nodes.push(this);\n    }\n\n    /**\n        Unload any resources requried by the specific Node instance, which do not depend on the\n        WebGL2Context.\n\n        Framework-only hook:\n        - subclasses may override and call `super`\n        - only the scene-graph framework may invoke this method\n        - visible state on entry: `scene !== null`, `_glAttached === false`\n        - `parentNode` still points at the structural owner during this callback\n     */\n    _onDetachNode(shared) {\n        // Typical implementation:\n        //     shared.nodes = shared.nodes.filter(n  =>  n !== this);\n    }\n\n    /*\n        Framework-only pre-detach hook:\n        - subclasses may override and call `super`\n        - runs before descendant detach begins\n        - use this to sever externally owned child references that must not be\n          swept as part of this subtree's structural teardown\n     */\n    _onBeforeDetachNode(_shared) {\n    }\n\n    /**\n        Respond to the Node moving to a new parent within the scene.\n\n        Default implementation calls _onDetachNode, _onAttachNode, etc. but\n        subclasses can choose to provide a concrete implementation if they can do the\n        operation more cheaply in one go, presumably by avoiding deallocting and reallocating\n        resources unnecessarily.\n    */\n    _onRemountNode(newParent) {\n        this.parentNode.removeChild(this);\n        newParent.appendChild(this);\n    }\n\n    /**\n        Allocates and creates any scene-global resources, storing them in the resources\n        object for this class. It will be passed as the `shared` (2nd argument) to _drawOpaque.\n\n        If there are any resources which are neither scene-global nor object-specific, they need\n        to be handled explicitly by the implementation. E.g. a font is in this category, since\n        we can use multiple fonts per scene, and each font can be used in multiple nodes. See\n        MSDFText for an example of managing this situation using a Map() inside the resources\n        object.\n\n        The framework will have prepopulated `classConstructor` in the passed `shared` object.\n    */\n    static _onAcquireContext(gl, shared, visited) {\n    }\n\n    /**\n        Chance for class to clean up any resources explicitly, if it wants e.g. calling\n        gl.deleteBuffer on buffers about to be recycled.\n\n        This is optional because JS should eventually free those resources via the GC, but\n        freeing them here deterministically results in better GPU memory control.\n    */\n    static _onReleaseContext(gl, shared, visited) {\n    }\n\n    /**\n        A node has been added to the scene, and the corresponding resources in `shared`\n        (replaces batcher) should be updated.\n\n        Framework-only hook:\n        - subclasses may override and call `super`\n        - only the scene-graph framework may invoke this method\n        - visible state on entry: `parentNode !== null`, `scene !== null`, `_glAttached === false`\n     */\n    _onAcquireNode(gl, shared, visited) {\n    }\n\n    /**\n        A node has been removed from the scene, and the corresponding resources in `shared`\n        (replaces batcher) should be updated.\n\n        Framework-only hook:\n        - subclasses may override and call `super`\n        - only the scene-graph framework may invoke this method\n        - visible state on entry: `parentNode !== null`, `scene !== null`, `_glAttached === true`\n     */\n    _onReleaseNode(gl, shared, visited) {\n    }\n\n    /**\n        Node subclasses should override to add their drawing logic here. Note this is static,\n        meaning it is called once per frame. This is \"inner loop\" stuff, so efficiency matters\n        here much more than any of the other methods (generally). Anything you can \"hoist\" to\n        be frame-independent is usually a good idea.\n\n        The nodes to draw will be tracked within `shared` (and the exact way they're tracked can\n        vary by subclass). If in doubt on this, create a simple array, shared.nodes = [], add\n        each Node to the list during _acquireNode, and remove it again during _releaseNode.\n    */\n    static _drawOpaque(gl, shared, t) {\n        // If you need to iterate over nodes individually, you would write an explicit for loop\n        // in the subclass. E.g.:\n        //for (let n of shared.nodes) {\n        //    nodeSpecificDrawing(n);\n        //}\n    }\n\n    static _drawTransparent(gl, res, t) {\n    }\n\n    static _drawText(gl, res, t) {\n    }\n\n    /* Classify one shared batch family into exactly one draw pass so Scene can store segmented registries. */\n    static _batchPassForNode(_node) {\n        return inferBatchPassForClass(this);\n    }\n\n    /* Resolve the authoritative pass from shared state when no concrete node instance is available. */\n    static _batchPassForShared(shared) {\n        return inferBatchPassForShared(this, shared);\n    }\n\n    /*\n        Override this function to add interactability to a Node.\n    */\n    static _drawGLPickable(gl, shared) {\n    }\n\n    /**\n        Allow subclasses to respond to viewport resize.\n\n        This refers to how many world pixels (wpx; roughly equivalent to CSS pixels)\n        will fit inside the viewport at a time.\n\n        The viewport will increase if the user resizes the window larger. The\n        viewport size will decrease if the user zooms into the webpage using the\n        percentage zoom feature.\n\n        In either case, our job is to resize the UI to utilise the extra space (or\n        lack thereof). E.g. we will need to move objects that are meant to appear in the\n        top-right further out/in to make them fit on the screen.\n\n        // TODO: what about \"pinch zoom\".\n    */\n    static _onViewportResized(gl, shared, { width, height }) {\n    }\n\n    /**\n        Allow subclasses to respond to canvas resizes.\n\n        This refers to how big the framebuffer is, so is relevant for shaders\n        that operate full-screen, or which need full-screen stencil buffers or similar.\n        The vast majority of nodes don't need to consider this and should instead focus\n        on _onViewportResized.\n\n        _onFramebufferResized will be triggered when the window is resized, since that will\n        require a larger/smaller canvas. Note that _onViewportResized will also\n        trigger, so normally you respond to resize there. When both are triggered,\n        then _onFramebufferResized happens first.\n    */\n    static _onFramebufferResized(gl, shared, { width, height }) {\n    }\n\n    /**\n        Mark this node's own resources as dirty.\n    */\n    _dirtyResources(opts = {}) {\n        if (Object.hasOwn(opts, 'includeChildren')) {\n            throw new Error(\n                `${this.constructor.name}._dirtyResources() no longer supports includeChildren. `\n                + 'Dirty descendant resources explicitly at the specific child nodes you mutate.'\n            );\n        }\n        const {\n            includePicker = null,\n            kinds = null,\n        } = opts;\n        this._markLocalResourcesDirty({ includePicker, kinds });\n    }\n\n    /**\n        Mark this node's own resource cache as dirty. Subclasses can override if\n        resources are grouped differently.\n    */\n    _markLocalResourcesDirty({ includePicker = null, kinds = null } = {}) {\n        if (!this._resources) {\n            return;\n        }\n        const dirtyKinds = kinds ?? [DIRTY.content, DIRTY.style, DIRTY.layout, DIRTY.transform, DIRTY.instance];\n        markResourceDirty(this._resources, dirtyKinds, this);\n        if (includePicker === null) {\n            includePicker = this._shouldMarkPickerDirty(dirtyKinds);\n        }\n        if (includePicker && Object.hasOwn(this._resources, 'pickerBatchDirty')) {\n            const pickerKinds = Array.isArray(includePicker) ? includePicker : (includePicker ? [DIRTY.pickerBatch] : []);\n            if (pickerKinds.length > 0) {\n                markResourceDirty(this._resources, pickerKinds, this);\n            }\n        }\n    }\n\n    _usesGLPicker() {\n        return this.constructor._drawGLPickable !== Node._drawGLPickable;\n    }\n\n    // Subclasses may opt into the fast JS picker when their hit target is exactly\n    // a trivial local rect under the current projection.\n    _hasTrivialJSPick() {\n        return false;\n    }\n\n    // Return the local-space hit rect for the trivial JS picker, or null when the\n    // node cannot be reduced to a rectilinear hit box.\n    _jsPickLocalRect() {\n        return null;\n    }\n\n    _shouldMarkPickerDirty(kinds) {\n        if (!this._usesGLPicker() && !this._hasTrivialJSPick()) {\n            return [];\n        }\n        return pickerDirtyKindsForDirtyKinds(kinds);\n    }\n\n    // Descendants may inherit a shared text-batch scope from an ancestor to\n    // isolate churn or factor out common movement from per-span matrices.\n    _textBatchScopeForDescendants(scene) {\n        return null;\n    }\n\n    _resourceKey() {\n        return resourceClassKey(this.constructor);\n    }\n\n    /* Publish immutable batch metadata before class/context hooks run. */\n    _batchDescriptor() {\n        return null;\n    }\n\n    /* Read one first-pass animatable property from the live node state. */\n    #readAnimatedProperty(prop) {\n        switch (prop) {\n            case 'opacity':\n                return this.opacity;\n            case 'x':\n                return this.localPosition()[0];\n            case 'y':\n                return this.localPosition()[1];\n            case 'z':\n                return this.localPosition()[2];\n            case 'rotation_z':\n                return this.localRotationZ();\n            case 'post_view_rotation_y':\n                return this.state.post_view_rotation_y ?? 0.0;\n            case 'rim_light_strength':\n                return this.state.rim_light_strength ?? 0.0;\n            case 'clock_s':\n                return this._animationClockS ?? 0;\n            default:\n                throw new Error(`Node animation read does not support '${prop}'.`);\n        }\n    }\n\n    /* Write one first-pass animatable property back into the live node state. */\n    #writeAnimatedProperty(prop, value) {\n        switch (prop) {\n            case 'opacity':\n                this.opacity = value;\n                return;\n            case 'x': {\n                const pos = this.localPosition();\n                this.setLocalPosition([value, pos[1], pos[2]]);\n                return;\n            }\n            case 'y': {\n                const pos = this.localPosition();\n                this.setLocalPosition([pos[0], value, pos[2]]);\n                return;\n            }\n            case 'z': {\n                const pos = this.localPosition();\n                this.setLocalPosition([pos[0], pos[1], value]);\n                return;\n            }\n            case 'rotation_z':\n                this.setLocalRotationZ(value);\n                return;\n            case 'post_view_rotation_y':\n                this.state.post_view_rotation_y = Number.isFinite(value) ? value : 0.0;\n                this._dirtyResources({ kinds: [DIRTY.instance] });\n                return;\n            case 'rim_light_strength':\n                this.state.rim_light_strength = value;\n                this._dirtyResources({ kinds: [DIRTY.instance] });\n                return;\n            case 'clock_s':\n                this._animationClockS = value;\n                return;\n            default:\n                throw new Error(`Node animation write does not support '${prop}'.`);\n        }\n    }\n\n    /* Retire one property animation and emit the agreed completion edges without leaving stale registry entries behind. */\n    #finishAnimation(prop, rec, reason, completed) {\n        this._animations.delete(prop);\n        const target = animationTerminalTarget(rec);\n        if (completed) {\n            rec.onFinish?.({\n                node: this,\n                prop,\n                reason,\n                to: target,\n            });\n            return;\n        }\n        rec.onStop?.({\n            node: this,\n            prop,\n            reason,\n            to: target,\n        });\n    }\n\n    _markTransformDirty() {\n        this._selfTransformDirty = true;\n        this._subtreeTransformDirty = true;\n        let node = this.parentNode;\n        while (node) {\n            if (node._subtreeTransformDirty) {\n                break;\n            }\n            node._subtreeTransformDirty = true;\n            node = node.parentNode;\n        }\n    }\n\n    _refreshComputedVisibility(force = false) {\n        const activeViewport = this.scene?.activeViewport ?? null;\n        const parentVisible = this.parentNode\n            ? this.parentNode.computedVisible !== false\n            : !this.scene;\n        const next = (this.state.visible !== false)\n            && !this._culled\n            && (parentVisible || activeViewport === this);\n        const changed = force || this.computedVisible !== next;\n        this.computedVisible = next;\n        if (changed) {\n            this._markLocalResourcesDirty({ kinds: [DIRTY.visibility, DIRTY.instance] });\n        }\n        for (const ch of this.children) {\n            ch._refreshComputedVisibility(changed);\n        }\n    }\n\n    // private:\n    // NB: we use _ rather than # since these methods need to be accessible from Scene. (But please don't\n    // call directly from subclasses.)\n\n    /**\n        Called once `this` is attached to a scene graph, and populates\n        `this._resources` with an object that is shared across all instances in the\n        scene. If this is the first instance of this class, then the object will start\n        empty, except for a framework built-in called `classConstructor`. This can be\n        useful as `classConstructor.name` gives you the name of the class this resource\n        object belongs to.\n    */\n    _linkResources() {\n        if (this.constructor === Node) {\n            throw new Error(\"_linkResources called with typeof this === Node, which should not happen. (Try using ui.Placeholder instead of ui.Node).\");\n        }\n        if (!this.scene) {\n            throw new Error(`${this.constructor.name}._linkResources(): scene is required.`);\n        }\n        if (!this.anchorNode) {\n            throw new Error(`${this.constructor.name}._linkResources(): anchorNode is required while attached.`);\n        }\n\n        // Set up link to resources object, creating it if needed.\n        let gl = this.scene.gl;\n        const resourceKey = nodeBatchKey(this);\n        this._resources = this.scene._getBatcher(resourceKey);\n\n        if (!this._resources) {\n            this._resources = {\n                classConstructor: this.constructor,\n                scene: this.scene,\n                key: defaultResourceLabel(this),\n                dirtyLabel: defaultResourceLabel(this),\n                resourceKey,\n                instanceRefCount: 0,\n                batchDescriptor: this._batchDescriptor(),\n                pickerBatchDirty: false,\n                pickerPoseDirty: false,\n            };\n            this.scene._setBatcher(resourceKey, this._resources);\n            markResourceDirty(this._resources, [\n                DIRTY.attach,\n                DIRTY.structure,\n                DIRTY.content,\n                DIRTY.layout,\n                DIRTY.transform,\n                DIRTY.instance,\n                DIRTY.buffer,\n            ]);\n\n            this.constructor._onAttachClass(/*ref*/ this._resources);\n            if (gl) {\n                this.constructor._onAcquireContext(gl, /*ref*/ this._resources);\n            }\n        } else {\n            markResourceDirty(this._resources, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        }\n        this._resources.instanceRefCount += 1;\n        // postcondition: this._resources populated.\n    }\n\n    _assertLifecycle(expected, action) {\n        const expectedList = Array.isArray(expected) ? expected : [expected];\n        if (expectedList.includes(this._lifecycle)) {\n            return;\n        }\n        throw new Error(\n            `${action}: expected lifecycle ${expectedList.join(' or ')}, got ${this._lifecycle} `\n            + `for ${this.state?.name ?? this.constructor?.name ?? 'unknown'}.`\n        );\n    }\n\n    _setLifecycle(next) {\n        this._lifecycle = next;\n    }\n\n    /**\n        Framework internal function to propagate world transforms down the tree.\n\n        Legacy note: this replaces the older `_prepareFrameRecurse`\n        traversal. Keep mentioning the previous `_prepareFrameRecurse` name in\n        nearby comments during the focused migration so grep-based archaeology\n        still lands on the right rename.\n    */\n    propagateTransforms(parentTotalMatrix, stats = null, depth = 0, ancestorDirty = false, parentClipRect = null, parentOpacity = 1.0, instanceCause = null, topLabel = null) {\n        const startedAt = stats?.subtree_records ? performance.now() : 0;\n        if (!ancestorDirty && !this._selfTransformDirty && !this._subtreeTransformDirty) {\n            return;\n        }\n        const ownTopLabel = topLabel ?? (depth === 1 ? diagNodeLabel(this) : null);\n        const isTopSubtreeRoot = topLabel === null && depth === 1 && !!ownTopLabel;\n        if (stats) {\n            stats.node_count += 1;\n            stats.max_depth = Math.max(stats.max_depth, depth);\n        }\n        const localToParent = inferLocalToParent(this.state);\n        const worldTransformChanged = ancestorDirty || this._selfTransformDirty || !this._worldMatrix;\n        const prevLocalToAnchor = this.localToAnchor;\n        if (this.parentNode === null) {\n            if (!isAnchorNode(this)) {\n                throw new Error(`${this.state.name} root node must be an Anchor.`);\n            }\n            this.anchorNode = this;\n            this.localToAnchor = new Float32Array(twgl.m4.identity());\n        } else if (isAnchorNode(this)) {\n            this.anchorNode = this;\n            this.localToAnchor = new Float32Array(twgl.m4.identity());\n        } else {\n            const parentLocalToAnchor = this.parentNode.localToAnchor;\n            const parentAnchorNode = this.parentNode.anchorNode;\n            if (!parentLocalToAnchor || !parentAnchorNode) {\n                throw new Error(`${this.state.name} parent anchor scope cache missing during propagateTransforms().`);\n            }\n            this.anchorNode = parentAnchorNode;\n            this.localToAnchor = twgl.m4.multiply(parentLocalToAnchor, localToParent);\n        }\n        if (this.parentNode === null) {\n            bootstrapClipScope(this);\n        } else {\n            attachClipScope(this.parentNode, this);\n        }\n        const localToAnchorChanged = !sameMat4(prevLocalToAnchor, this.localToAnchor);\n        if (worldTransformChanged) {\n            this._worldMatrix = twgl.m4.multiply(parentTotalMatrix, localToParent);\n            if (ancestorDirty && !this._selfTransformDirty && (localToAnchorChanged || wantsPropagatedInstanceDirty(instanceCause))) {\n                this._markLocalResourcesDirty({\n                    kinds: [DIRTY.instance],\n                    diag: {\n                        instance_propagation: instanceCause ?? withInstancePropagation(this, ['ancestor']),\n                    },\n                });\n            }\n        }\n        if (isAnchorNode(this)) {\n            this.anchorToRoot = new Float32Array(this._worldMatrix);\n        }\n        if (!this._worldMatrix) {\n            throw new Error(`${this.state.name} has no world matrix while propagating transforms.`);\n        }\n        const ownClipRect = this.clipChildren ? worldClipRectForNode(this, this._worldMatrix) : null;\n        const nextClipRect = intersectClipRects(parentClipRect, ownClipRect);\n        const nextOpacity = parentOpacity * (this.state.opacity ?? 1.0);\n        const clipChanged = !sameClipRect(this.computedClipRect, nextClipRect);\n        const opacityChanged = this.computedOpacity !== nextOpacity;\n        let childInstanceCause = instanceCause;\n        if (this._selfTransformDirty) {\n            childInstanceCause = withInstancePropagation(this, ['transform'], childInstanceCause);\n        }\n        /* Keep world-space clip rects current for picking, but do not treat clip-owner pose motion as descendant instance churn. */\n        if (clipChanged) {\n            this.computedClipRect = copyClipRect(nextClipRect);\n        }\n        if (opacityChanged) {\n            this.computedOpacity = nextOpacity;\n            if (!worldTransformChanged) {\n                this._markLocalResourcesDirty({\n                    kinds: [DIRTY.instance],\n                    diag: {\n                        instance_propagation: withInstancePropagation(this, ['opacity']),\n                    },\n                });\n            }\n            childInstanceCause = withInstancePropagation(this, ['opacity'], childInstanceCause);\n        }\n        const childAncestorDirty = ancestorDirty || this._selfTransformDirty;\n        for (let ch of this.children) {\n            ch.propagateTransforms(\n                this._worldMatrix,\n                stats,\n                depth + 1,\n                childAncestorDirty || clipChanged || opacityChanged,\n                nextClipRect,\n                nextOpacity,\n                childInstanceCause,\n                ownTopLabel,\n            );\n        }\n        if (stats?.subtree_records && ownTopLabel) {\n            const rec = stats.subtree_records[ownTopLabel] ?? {\n                time_ms: 0,\n                node_count: 0,\n                dirty_nodes: 0,\n            };\n            if (isTopSubtreeRoot) {\n                rec.time_ms += performance.now() - startedAt;\n            }\n            rec.node_count += 1;\n            if (worldTransformChanged || clipChanged || opacityChanged || this._selfTransformDirty) {\n                rec.dirty_nodes += 1;\n            }\n            stats.subtree_records[ownTopLabel] = rec;\n        }\n        this._selfTransformDirty = false;\n        this._subtreeTransformDirty = false;\n    }\n\n    _prepareFrameRecurse() {\n        throw new Error('Node._prepareFrameRecurse() was renamed. Use propagateTransforms().');\n    }\n\n    /* Bubble one pointer-input frame from this node upward through its parent chain. */\n    _propagateInputEvent(event, trace = null) {\n        let node = this;\n        while (node) {\n            if (node.computedVisible !== false && typeof node.onPointerInput === 'function') {\n                const before = trace ? pointerRouteStateStamp(node.scene ?? null, node) : null;\n                const handled = node.onPointerInput(event) === true;\n                if (trace) {\n                    trace.steps.push({\n                        target: routeNodeLabel(node),\n                        via: 'node',\n                        outcome: handled\n                            ? (before === pointerRouteStateStamp(node.scene ?? null, node) ? 'masked' : 'consumed')\n                            : 'propagated',\n                    });\n                }\n                if (handled) {\n                    return true;\n                }\n            }\n            node = node.parentNode;\n        }\n\n        return false;\n    }\n};\n\n\nlet inferLocalToParentAlreadyWarned = new Map();\nexport function getInferLocalToParentWarningCount() {\n    return inferLocalToParentAlreadyWarned.size;\n}\n\n/**\n    Default matrix inference used by the base Node constructor.\n\n    - If caller provided localToParent, leave it alone.\n    - Otherwise, translate by x/y/z if any are provided (supports simple positioning).\n    - Otherwise, fall back to identity.\n*/\nfunction inferLocalToParent(state) {\n\n    if (state.localToParent) {\n        if (state.x || state.y || state.z || state.rotation_z) {\n            if (!inferLocalToParentAlreadyWarned.get(state.name)) {\n                console.warn(`Node ${state.name} has both explicit localToParent matrix, and also `\n                    + `(x=${state.x}, y=${state.y}, z=${state.z}, rotation_z=${state.rotation_z}). `\n                    + 'The scalar transform fields will be ignored.');\n                inferLocalToParentAlreadyWarned.set(state.name, true);\n            }\n        }\n        return state.localToParent;\n    }\n\n    const x = state.x ?? 0;\n    const y = state.y ?? 0;\n    const z = state.z ?? 0;\n    const rotationZ = state.rotation_z ?? 0;\n\n    if (x !== 0 || y !== 0 || z !== 0 || rotationZ !== 0) {\n        return twgl.m4.multiply(\n            twgl.m4.translation([x, y, z]),\n            twgl.m4.rotationZ(rotationZ),\n        );\n    }\n\n    return twgl.m4.identity();\n}\n\n/**\n    Used for a do-nothing Node which just maintains a transformation matrix\n    which affects its children (like normal), but doesn't actually draw anything.\n\n    The root node should be of this type.\n\n    Use this instead of a raw Node (which is abstract) if you just want a matrix\n    defining a subordinate coordinate system no further special behaviour.\n*/\nexport class Placeholder extends Node {\n    constructor(state) {\n        super(state);\n    }\n\n    /* Placeholder remains a legacy structural batch family, so park it in the opaque registry until the no-draw path is retired entirely. */\n    static _batchPassForNode(_node) {\n        return 'opaque';\n    }\n};\n\nexport class Anchor extends Placeholder {\n    constructor(state = {}) {\n        super(state);\n        this.anchorId = state.anchorId ?? allocAnchorId();\n        this.anchorToRoot = null;\n    }\n\n    /* Allow selected anchor boundaries to own a text scope so anchor motion updates one group matrix instead of every descendant glyph span. */\n    _textBatchScopeForDescendants(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        const key = this.state.textBatchScopeKey ?? null;\n        if (typeof key !== 'string' || key.length === 0) {\n            return null;\n        }\n        return {\n            key,\n            root: this,\n        };\n    }\n};\n\n/*\n    In the absence of a user-defined name for each node, derive one stable\n    local name from the class name.\n*/\nconst g_nameCounter = new Map();\nfunction simpleName(obj) {\n    const base = obj.constructor.name;\n    let counter = g_nameCounter.get(base) || 0;\n    counter++;\n    g_nameCounter.set(base, counter);\n    return `${base}${counter}`;\n}\n\n/* Allocate one unique semantic node name from a caller-provided base. */\nexport function uniqueName(base) {\n    if (typeof base !== 'string' || base.length === 0) {\n        throw new Error(`uniqueName(${base}): base must be a non-empty string.`);\n    }\n    let counter = g_nameCounter.get(base) || 0;\n    counter++;\n    g_nameCounter.set(base, counter);\n    return `${base}_${counter}`;\n}\n\nfunction sameClipRect(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!a || !b) {\n        return !a && !b;\n    }\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n\nfunction copyClipRect(rect) {\n    if (!rect) {\n        return null;\n    }\n    return new Float32Array(rect);\n}\n\nfunction intersectClipRects(a, b) {\n    if (!a) {\n        return copyClipRect(b);\n    }\n    if (!b) {\n        return copyClipRect(a);\n    }\n    const minX = Math.max(a[0], b[0]);\n    const minY = Math.max(a[1], b[1]);\n    const maxX = Math.min(a[2], b[2]);\n    const maxY = Math.min(a[3], b[3]);\n    return new Float32Array([minX, minY, maxX, maxY]);\n}\n\nfunction worldClipRectForNode(node, worldMatrix) {\n    const width = node.state?.width;\n    const height = node.state?.height;\n    if (!Number.isFinite(width) || !Number.isFinite(height)) {\n        throw new Error(`${node.constructor.name} with clipChildren=true requires finite state.width/state.height.`);\n    }\n    const p00 = twgl.m4.transformPoint(worldMatrix, [0, 0, 0]);\n    const p10 = twgl.m4.transformPoint(worldMatrix, [width, 0, 0]);\n    const p01 = twgl.m4.transformPoint(worldMatrix, [0, height, 0]);\n    const p11 = twgl.m4.transformPoint(worldMatrix, [width, height, 0]);\n    return new Float32Array([\n        Math.min(p00[0], p10[0], p01[0], p11[0]),\n        Math.min(p00[1], p10[1], p01[1], p11[1]),\n        Math.max(p00[0], p10[0], p01[0], p11[0]),\n        Math.max(p00[1], p10[1], p01[1], p11[1]),\n    ]);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport const FONTS_URL = 'https://evil-public-assets.ams3.cdn.digitaloceanspaces.com/fonts-v2/';\nexport const TEXTURES_URL = 'https://evil-public-assets.ams3.cdn.digitaloceanspaces.com/textures/';\nexport const MESHES_URL = 'https://evil-public-assets.ams3.cdn.digitaloceanspaces.com/meshes/';", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\n\nconst g_glProgramContexts = new WeakMap();\n\nfunction assertPendingGlKey(key) {\n    if (typeof key !== 'string' || !/^ownPendingGl[A-Z]/.test(key)) {\n        throw new Error(`GL acquire key must be an explicit ownPendingGl* field name. Actual value='${key ?? '<null>'}'.`);\n    }\n}\n\nfunction getGlProgramContext(gl) {\n    let ctx = g_glProgramContexts.get(gl);\n    if (!ctx) {\n        ctx = {\n            refCount: 0,\n            alive: true,\n            entries: new Map(),\n        };\n        g_glProgramContexts.set(gl, ctx);\n    }\n    return ctx;\n}\n\n/* Let batchers republish an already-cached program synchronously when they are recreated inside the same GL context. */\nexport function peekContextGlProgram(gl, key) {\n    if (!gl) {\n        throw new Error('peekContextGlProgram(gl, key): expected a live WebGL context.');\n    }\n    if (typeof key !== 'string' || key.length < 1) {\n        throw new Error(`peekContextGlProgram(gl, key): key must be a non-empty string. Actual value='${key ?? '<null>'}'.`);\n    }\n    return g_glProgramContexts.get(gl)?.entries.get(key)?.ownGlProgram ?? null;\n}\n\n/* Cache attached shader handles at create-time so later teardown does not depend on driver queries. */\nexport function captureGlProgramShaders(gl, ownGlProgram) {\n    if (!gl || !ownGlProgram?.program || typeof gl.getAttachedShaders !== 'function') {\n        return ownGlProgram;\n    }\n    const ownGlShaders = gl.getAttachedShaders(ownGlProgram.program) ?? [];\n    ownGlProgram.ownGlShaders = Array.isArray(ownGlShaders)\n        ? ownGlShaders.filter(Boolean)\n        : [];\n    return ownGlProgram;\n}\n\nexport function dropGlProgram(gl, ownGlProgram) {\n    if (!gl || !ownGlProgram?.program) {\n        return;\n    }\n    const shaders = Array.isArray(ownGlProgram.ownGlShaders)\n        ? ownGlProgram.ownGlShaders\n        : (typeof gl.getAttachedShaders === 'function'\n            ? (gl.getAttachedShaders(ownGlProgram.program) ?? [])\n            : []);\n    for (const shader of shaders) {\n        if (!shader) {\n            continue;\n        }\n        gl.deleteShader?.(shader);\n    }\n    ownGlProgram.ownGlShaders = [];\n    gl.deleteProgram(ownGlProgram.program);\n}\n\n/* Keep one context-scoped program cache alive while any scene still owns the GL context. */\nexport function retainContextGlPrograms(gl) {\n    if (!gl) {\n        throw new Error('retainContextGlPrograms(gl): expected a live WebGL context.');\n    }\n    const ctx = getGlProgramContext(gl);\n    ctx.alive = true;\n    ctx.refCount += 1;\n}\n\n/* Drop the whole context-scoped program cache when the last scene releases that GL context. */\nexport function releaseContextGlPrograms(gl) {\n    if (!gl) {\n        throw new Error('releaseContextGlPrograms(gl): expected a live WebGL context.');\n    }\n    const ctx = g_glProgramContexts.get(gl);\n    if (!ctx) {\n        return;\n    }\n    if (ctx.refCount < 1) {\n        throw new Error(`releaseContextGlPrograms(gl): refCount underflow for GL context. Actual value=${ctx.refCount}.`);\n    }\n    ctx.refCount -= 1;\n    if (ctx.refCount > 0) {\n        return;\n    }\n    ctx.alive = false;\n    for (const entry of ctx.entries.values()) {\n        if (entry.ownGlProgram) {\n            dropGlProgram(gl, entry.ownGlProgram);\n            entry.ownGlProgram = null;\n        }\n    }\n    ctx.entries.clear();\n    g_glProgramContexts.delete(gl);\n}\n\n/* Reuse one linked program per context/key; cache it until the GL context itself is released. */\nexport function getContextGlProgram(gl, key, makeOwnGlProgram) {\n    if (!gl) {\n        throw new Error('getContextGlProgram(gl, key, makeOwnGlProgram): expected a live WebGL context.');\n    }\n    if (typeof key !== 'string' || key.length < 1) {\n        throw new Error(`getContextGlProgram(gl, key, makeOwnGlProgram): key must be a non-empty string. Actual value='${key ?? '<null>'}'.`);\n    }\n    if (typeof makeOwnGlProgram !== 'function') {\n        throw new Error('getContextGlProgram(gl, key, makeOwnGlProgram): makeOwnGlProgram must be a function.');\n    }\n    const ctx = getGlProgramContext(gl);\n    let entry = ctx.entries.get(key);\n    if (entry?.ownGlProgram) {\n        return Promise.resolve(entry.ownGlProgram);\n    }\n    if (entry?.promise) {\n        return entry.promise;\n    }\n    entry = {\n        ownGlProgram: null,\n        promise: null,\n    };\n    ctx.entries.set(key, entry);\n    entry.promise = Promise.resolve()\n        .then(() => gpuDiagWithResourceOrigin(key, makeOwnGlProgram))\n        .then((ownGlProgram) => {\n            const captured = captureGlProgramShaders(gl, ownGlProgram);\n            if (!captured?.program) {\n                if (ctx.entries.get(key) === entry) {\n                    ctx.entries.delete(key);\n                }\n                return captured;\n            }\n            if (!ctx.alive || ctx.entries.get(key) !== entry) {\n                dropGlProgram(gl, captured);\n                return null;\n            }\n            entry.ownGlProgram = captured;\n            return captured;\n        })\n        .catch((err) => {\n            if (ctx.entries.get(key) === entry) {\n                ctx.entries.delete(key);\n            }\n            throw err;\n        })\n        .finally(() => {\n            if (ctx.entries.get(key) === entry) {\n                entry.promise = null;\n            }\n        });\n    return entry.promise;\n}\n\n/* Advance one explicit ownPendingGl* token so late async completions become stale. */\nexport function beginGlAcquire(shared, key) {\n    assertPendingGlKey(key);\n    const token = (shared[key] || 0) + 1;\n    shared[key] = token;\n    return token;\n}\n\n/* Invalidate the current ownPendingGl* token during detach/release teardown. */\nexport function invalidateGlAcquire(shared, key) {\n    assertPendingGlKey(key);\n    shared[key] = (shared[key] || 0) + 1;\n}\n\n/* Check whether one async completion still owns the current ownPendingGl* slot. */\nexport function isCurrentGlAcquire(shared, token, key) {\n    assertPendingGlKey(key);\n    return shared[key] === token;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/base.mjs';\nimport {\n    gpuDiagNoteTextDirty,\n    gpuDiagNoteTextDrop,\n    gpuDiagNoteTextNodeDirty,\n    gpuDiagNoteTextSpanUpload,\n    gpuDiagNoteTextSync,\n    gpuDiagWithResourceOrigin,\n} from '../evilui/browser-gpu-diagnostics.mjs';\nimport { fontDataFromAsset, glyphForSymbol, resolveGlyphForSymbol, isUnicodeScalar } from './font-asset.mjs';\nimport { FONTS_URL } from '../config.mjs';\nimport { deleteBufferInfo, drawArraysInstancedChecked } from '../evilui/gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty, resourceDirtyKinds } from '../evilui/dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire } from '../evilui/gl-program.mjs';\n\nconst g_glFontTextureContexts = new WeakMap();\nconst g_liveTextGroups = new Set();\nconst g_textGroupEvents = [];\nconst TEXT_ADVANCE_LRU_LIMIT = 128;\nconst TEXT_GROUP_EVENT_LIMIT = 256;\nconst g_textAdvanceLRUs = new WeakMap();\nconst TEXT_FULL_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.text,\n    DIRTY.layout,\n    DIRTY.buffer,\n]);\n\nconst TEXT_INSTANCE_BUFFER_KINDS = Object.freeze([\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.style,\n    DIRTY.instance,\n]);\n\nconst TEXT_SPAN_MATRIX_TEXTURE_WIDTH = 4;\nconst TEXT_BATCH_GLOBAL_KEY = 'global';\nconst TEXT_BATCHING = Object.freeze({\n    STATIC_GLOBAL: 'static_global',\n    STATIC_SEGMENTED: 'static_segmented',\n    VOLATILE_LOCAL: 'volatile_local',\n});\nconst IDENTITY_MATRIX = twgl.m4.identity();\nlet g_nextVolatileTextBatchId = 1;\nfunction normalizeTextPass(pass = 'text') {\n    if (pass === 'text' || pass === 'transparent') {\n        return pass;\n    }\n    throw new Error(`MSDFText pass must be 'text' or 'transparent', got ${pass}.`);\n}\n\n/* Keep one closed batching vocabulary so text grouping stays explicit and fail-fast. */\nfunction normalizeTextBatching(mode = null) {\n    if (mode == null) {\n        return null;\n    }\n    if (Object.values(TEXT_BATCHING).includes(mode)) {\n        return mode;\n    }\n    throw new Error(\n        `MSDFText textBatching must be one of `\n        + `'${TEXT_BATCHING.STATIC_GLOBAL}', '${TEXT_BATCHING.STATIC_SEGMENTED}', `\n        + `or '${TEXT_BATCHING.VOLATILE_LOCAL}', got ${mode}.`,\n    );\n}\n\n/* Track one live text group globally so leak probes can summarise retained evilfont ownership directly. */\nfunction noteLiveTextGroup(group) {\n    if (group) {\n        g_liveTextGroups.add(group);\n    }\n}\n\n/* Drop one text group from the live registry once the owning batcher no longer retains it. */\nfunction forgetLiveTextGroup(group) {\n    if (group) {\n        g_liveTextGroups.delete(group);\n    }\n}\n\n/* Keep one bounded lifecycle log for text-group retention transitions so leak probes can explain why a group is still live. */\nfunction noteTextGroupEvent(group, kind, extra = {}) {\n    const nodes = Array.isArray(group?.nodes) ? group.nodes : [];\n    const names = nodes.slice(0, 4).map((node) => node?.state?.name ?? node?.constructor?.name ?? 'unknown');\n    const event = {\n        at_ms: Date.now(),\n        kind,\n        scope_key: group?.textBatchScope?.key ?? TEXT_BATCH_GLOBAL_KEY,\n        font_name: group?.font?.name ?? 'unknown',\n        node_count: nodes.length,\n        node_names: names,\n        instance_count: group?.instanceCount ?? 0,\n        span_count: group?.spanCount ?? 0,\n        settled_empty: group?.settledEmpty === true,\n        has_gl_buffer: !!group?.ownGlBufferInfo,\n        has_span_texture: !!group?.ownGlSpanMatrixTexture,\n        owner_resource_key: group?.ownerResourceKey ?? 'unknown',\n        text_pass: group?.textPass ?? 'text',\n        ...extra,\n    };\n    g_textGroupEvents.push(event);\n    if (g_textGroupEvents.length > TEXT_GROUP_EVENT_LIMIT) {\n        g_textGroupEvents.splice(0, g_textGroupEvents.length - TEXT_GROUP_EVENT_LIMIT);\n    }\n    group.lastLifecycleEvent = event;\n    if (kind === 'settled_empty') {\n        group.lastSettledEvent = event;\n    } else if (kind === 'revived') {\n        group.lastRevivedEvent = event;\n    }\n}\n\nfunction requirePositiveInt(v, label) {\n    if (!Number.isInteger(v) || v <= 0) {\n        throw new Error(`${label} must be a positive integer, got ${v}.`);\n    }\n    return v;\n}\n\nfunction glContextUsable(gl) {\n    if (!gl) {\n        return false;\n    }\n    try {\n        return !(typeof gl.isContextLost === 'function' && gl.isContextLost());\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction requirePositiveGlInt(gl, key, label) {\n    if (!glContextUsable(gl)) {\n        return null;\n    }\n    const value = gl.getParameter(key);\n    if (!Number.isInteger(value) || value <= 0) {\n        if (!glContextUsable(gl)) {\n            return null;\n        }\n        throw new Error(`${label} must be a positive integer, got ${value}.`);\n    }\n    return value;\n}\n\n/* Keep one context-scoped font-texture cache alive while any stage or standalone scene still owns the GL context. */\nfunction getGlFontTextureContext(gl) {\n    let ctx = g_glFontTextureContexts.get(gl);\n    if (!ctx) {\n        ctx = {\n            refCount: 0,\n            alive: true,\n            entries: new Map(),\n        };\n        g_glFontTextureContexts.set(gl, ctx);\n    }\n    return ctx;\n}\n\n/* Cache the referenced immutable image, so new bundles never borrow an older atlas texture. */\nfunction fontTextureCacheKey(font) {\n    if (typeof font?.filename === 'string' && font.filename.length > 0) {\n        const jsonURL = new URL(font.filename + '.json', globalThis.location?.href ?? 'http://localhost/');\n        return new URL(font.fontData.atlas.image, jsonURL).href;\n    }\n    return null;\n}\n\n/* Read font textures only from their owning WebGL context cache. */\nfunction fontTextureEntry(gl, font) {\n    const key = fontTextureCacheKey(font);\n    if (!gl || !key) return null;\n    return g_glFontTextureContexts.get(gl)?.entries.get(key) ?? null;\n}\n\nexport function contextFontTextureState(gl, font) {\n    return fontTextureEntry(gl, font)?.textureState ?? 'idle';\n}\n\nexport function peekContextFontTexture(gl, font) {\n    return fontTextureEntry(gl, font)?.ownGlFontTexture ?? null;\n}\n\n/* Keep font-texture cache lifetime aligned with the shared WebGL context rather than any individual scene. */\nexport function retainContextFontTextures(gl) {\n    if (!gl) {\n        throw new Error('retainContextFontTextures(gl): expected a live WebGL context.');\n    }\n    const ctx = getGlFontTextureContext(gl);\n    ctx.alive = true;\n    ctx.refCount += 1;\n}\n\n/* Drop all cached font textures only when the last context owner releases that GL context. */\nexport function releaseContextFontTextures(gl) {\n    if (!gl) {\n        throw new Error('releaseContextFontTextures(gl): expected a live WebGL context.');\n    }\n    const ctx = g_glFontTextureContexts.get(gl);\n    if (!ctx) {\n        return;\n    }\n    if (ctx.refCount < 1) {\n        throw new Error(`releaseContextFontTextures(gl): refCount underflow for GL context. Actual value=${ctx.refCount}.`);\n    }\n    ctx.refCount -= 1;\n    if (ctx.refCount > 0) {\n        return;\n    }\n    ctx.alive = false;\n    for (const entry of ctx.entries.values()) {\n        invalidateGlAcquire(entry, 'ownPendingGlFontTexture');\n        if (entry.ownGlFontTexture) {\n            gl.deleteTexture(entry.ownGlFontTexture);\n            entry.ownGlFontTexture = null;\n        }\n        entry.textureState = 'idle';\n    }\n    ctx.entries.clear();\n    g_glFontTextureContexts.delete(gl);\n}\n\n/* Reuse one atlas texture per context/font; late async uploads self-drop once the cache entry goes stale. */\nexport function ensureContextFontTexture(gl, font) {\n    if (!gl) {\n        throw new Error('ensureContextFontTexture(gl, font): expected a live WebGL context.');\n    }\n    const key = fontTextureCacheKey(font);\n    if (!key) {\n        throw new Error(`ensureContextFontTexture(gl, font): font '${font?.name ?? '<unknown>'}' is missing filename.`);\n    }\n    const ctx = getGlFontTextureContext(gl);\n    let entry = ctx.entries.get(key);\n    if (!entry) {\n        entry = {\n            fontName: font?.name ?? key,\n            ownGlFontTexture: null,\n            textureState: 'idle',\n            ownPendingGlFontTexture: 0,\n        };\n        ctx.entries.set(key, entry);\n    }\n    if (entry.ownGlFontTexture || entry.textureState === 'loading') {\n        return entry.ownGlFontTexture;\n    }\n\n    entry.textureState = 'loading';\n    const loadToken = beginGlAcquire(entry, 'ownPendingGlFontTexture');\n    entry.ownGlFontTexture = loadTexture(gl, key, {\n        origin: `evilfont.font_texture.${font?.name ?? key}`,\n        atlas: font.fontData.atlas,\n        shouldUpload: (tex) => {\n            if (!ctx.alive) {\n                return false;\n            }\n            return isCurrentGlAcquire(entry, loadToken, 'ownPendingGlFontTexture')\n                && ctx.entries.get(key) === entry\n                && entry.ownGlFontTexture === tex;\n        },\n        onReady: () => {\n            entry.textureState = 'idle';\n        },\n        onError: (failedTexture) => {\n            if (!isCurrentGlAcquire(entry, loadToken, 'ownPendingGlFontTexture')) {\n                return;\n            }\n            if (entry.ownGlFontTexture === failedTexture) {\n                entry.ownGlFontTexture = null;\n            }\n            entry.textureState = 'failed';\n        },\n    });\n    return entry.ownGlFontTexture;\n}\n\nexport function buildSpanMatrixTextureUpload(maxTextureSize, spanCount, spanMatrices) {\n    requirePositiveInt(maxTextureSize, 'buildSpanMatrixTextureUpload(maxTextureSize)');\n    if (!Number.isInteger(spanCount) || spanCount < 0) {\n        throw new Error(`buildSpanMatrixTextureUpload(spanCount): expected a non-negative integer, got ${spanCount}.`);\n    }\n    if (!(spanMatrices instanceof Float32Array)) {\n        throw new Error('buildSpanMatrixTextureUpload(spanMatrices): expected Float32Array.');\n    }\n    const expectedFloats = spanCount * 16;\n    if (spanMatrices.length !== expectedFloats) {\n        throw new Error(\n            `buildSpanMatrixTextureUpload(spanMatrices): expected ${expectedFloats} floats for ${spanCount} spans, got ${spanMatrices.length}.`\n        );\n    }\n\n    const spansPerRow = Math.max(1, Math.floor(maxTextureSize / TEXT_SPAN_MATRIX_TEXTURE_WIDTH));\n    const packedSpansPerRow = Math.max(1, Math.min(spanCount || 1, spansPerRow));\n    const width = packedSpansPerRow * TEXT_SPAN_MATRIX_TEXTURE_WIDTH;\n    const height = Math.max(1, Math.ceil(spanCount / packedSpansPerRow));\n    const data = new Float32Array(width * height * 4);\n    if (spanCount > 0) {\n        data.set(spanMatrices);\n    }\n    return {\n        width,\n        height,\n        data,\n    };\n}\n\nfunction perfKeyPart(value) {\n    return String(value).replace(/[^A-Za-z0-9_.:-]/g, '_');\n}\n\nfunction perfTextKey(fontName, scopeKey = null) {\n    const fontKey = perfKeyPart(fontName);\n    if (!scopeKey || scopeKey === TEXT_BATCH_GLOBAL_KEY) {\n        return fontKey;\n    }\n    return `${fontKey}.${perfKeyPart(scopeKey)}`;\n}\n\nfunction perfTracker() {\n    return globalThis.__eviluiPerformanceTracker ?? null;\n}\n\nfunction countTextSyncReason(key, reason) {\n    const tracker = perfTracker();\n    if (!tracker?.enabled) {\n        return;\n    }\n    tracker.incrementCounter(`text_sync_reason.${key}.${reason}`);\n}\n\nfunction countTextSyncStats(key, stats) {\n    const tracker = perfTracker();\n    if (!tracker?.enabled) {\n        return;\n    }\n    tracker.incrementCounter(`text_sync_count.${key}`);\n    tracker.incrementCounter(`text_presented_nodes.${key}`, stats.presentedNodeCount ?? 0);\n    tracker.incrementCounter(`text_visible_nodes.${key}`, stats.visibleNodeCount ?? 0);\n    tracker.incrementCounter(`text_drawable_nodes.${key}`, stats.drawableNodeCount ?? 0);\n    tracker.incrementCounter(`text_presented_glyphs.${key}`, stats.presentedGlyphCount ?? 0);\n    tracker.incrementCounter(`text_drawable_glyphs.${key}`, stats.drawableGlyphCount ?? 0);\n}\n\nfunction hashFloat32Array(data) {\n    const words = new Uint32Array(data.buffer, data.byteOffset, data.byteLength / 4);\n    let hash = 2166136261 >>> 0;\n    for (let i = 0; i < words.length; i++) {\n        hash ^= words[i];\n        hash = Math.imul(hash, 16777619) >>> 0;\n    }\n    return hash >>> 0;\n}\n\n/* Describe a span-matrix upload so steady-state redraws can skip identical GPU texture uploads. */\nfunction describeSpanMatrixUpload(spanCount, upload) {\n    return {\n        hash: hashFloat32Array(upload.data),\n        width: upload.width,\n        height: upload.height,\n        span_count: spanCount,\n        bytes: upload.data.byteLength,\n    };\n}\n\nfunction sameSpanMatrixUpload(a, b) {\n    if (!a || !b) {\n        return false;\n    }\n    return a.hash === b.hash\n        && a.width === b.width\n        && a.height === b.height\n        && a.span_count === b.span_count;\n}\n\n// Walk up the scene graph and return the nearest ancestor-defined text scope.\nfunction textBatchScope(node, scene = node?.scene ?? null) {\n    for (let cur = node; cur; cur = cur.parentNode) {\n        const scope = cur._textBatchScopeForDescendants?.(scene) ?? null;\n        if (!scope) {\n            continue;\n        }\n        if (!scope.root) {\n            throw new Error('textBatchScope(...): scope.root is required.');\n        }\n        if (typeof scope.key !== 'string' || scope.key.length === 0) {\n            throw new Error('textBatchScope(...): scope.key must be a non-empty string.');\n        }\n        return scope;\n    }\n    return null;\n}\n\n/* Resolve one canonical batching descriptor so resource keys and group scopes agree. */\nfunction textBatchDescriptor(node, scene = node?.scene ?? null) {\n    const mode = normalizeTextBatching(node?.state?.textBatching);\n    const inheritedScope = textBatchScope(node, scene);\n    const batching = mode ?? (inheritedScope ? TEXT_BATCHING.STATIC_SEGMENTED : TEXT_BATCHING.STATIC_GLOBAL);\n    if (batching === TEXT_BATCHING.STATIC_GLOBAL) {\n        return {\n            batching,\n            scope: null,\n            key: TEXT_BATCH_GLOBAL_KEY,\n        };\n    }\n    if (batching === TEXT_BATCHING.STATIC_SEGMENTED) {\n        if (!inheritedScope) {\n            throw new Error('MSDFText static_segmented batching requires an inherited text batch scope.');\n        }\n        return {\n            batching,\n            scope: inheritedScope,\n            key: inheritedScope.key,\n        };\n    }\n    if (!node._volatileTextBatchKey) {\n        node._volatileTextBatchKey = `volatile_local:${g_nextVolatileTextBatchId++}`;\n    }\n    return {\n        batching,\n        scope: {\n            key: node._volatileTextBatchKey,\n            root: node,\n        },\n        key: node._volatileTextBatchKey,\n    };\n}\n\nfunction sameTextBatchScope(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!a || !b) {\n        return !a && !b;\n    }\n    return a.key === b.key && a.root === b.root;\n}\n\n/* Resolve one raw scope-root matrix so text presentation offsets are applied exactly once in shader space. */\nfunction rawTextScopeRootMatrix(scope, scene) {\n    const root = scope?.root ?? null;\n    if (!root) {\n        return null;\n    }\n    if (root.scene !== scene) {\n        return null;\n    }\n    if (root.anchorNode === root) {\n        return root.anchorToRoot ?? root._worldMatrix ?? root.localToWorld?.() ?? null;\n    }\n    return root._worldMatrix ?? root.localToWorld?.() ?? null;\n}\n\n/* Resolve one raw node world matrix so scoped text span transforms stay presentation-offset free on CPU. */\nfunction rawTextNodeWorldMatrix(node, scene) {\n    if (!node || node.scene !== scene) {\n        return null;\n    }\n    return node._worldMatrix ?? node.localToWorld?.() ?? null;\n}\n\n// Resolve the draw-time matrix for a scoped text group; unscoped groups use identity.\nfunction textBatchGroupMatrix(group, scene) {\n    const scope = group?.textBatchScope ?? null;\n    if (!scope) {\n        return IDENTITY_MATRIX;\n    }\n    const worldMatrix = rawTextScopeRootMatrix(scope, scene);\n    if (!worldMatrix) {\n        throw new Error(`textBatchGroupMatrix(${scope.key}): scope root world matrix missing.`);\n    }\n    return worldMatrix;\n}\n\n/* Resolve one scoped text-root owner so draw-time inertia can stay on the shared group transform instead of per-span uploads. */\nfunction textBatchScopeNode(group) {\n    return group?.textBatchScope?.root ?? null;\n}\n\n// Convert node world transforms into group-local span matrices when a batch scope exists.\nfunction textBatchScopeInverseMatrix(group, scene) {\n    const scope = group?.textBatchScope ?? null;\n    if (!scope) {\n        return null;\n    }\n    return twgl.m4.inverse(textBatchGroupMatrix(group, scene));\n}\n\n/* Derive one shared clip uniform payload for the presented text nodes in a group. */\nfunction textClipUniformState(group, scene, nodes) {\n    return ui.batchClipUniformState(nodes, scene, `MSDFText(${textGroupKey(group)})`);\n}\n\nfunction textSpanMatrixForNode(node, scene, scopeWorldInverse = null) {\n    const worldMatrix = rawTextNodeWorldMatrix(node, scene);\n    if (!worldMatrix) {\n        return null;\n    }\n    if (!scopeWorldInverse) {\n        return worldMatrix;\n    }\n    return twgl.m4.multiply(scopeWorldInverse, worldMatrix);\n}\n\nfunction textGroupKey(group) {\n    return perfTextKey(group?.font?.name ?? 'unknown', group?.textBatchScope?.key ?? null);\n}\n\nfunction textDirtySourceLabel(source, label = null) {\n    if (label) {\n        return label;\n    }\n    if (!source) {\n        return 'unknown';\n    }\n    if (typeof source === 'string') {\n        return source;\n    }\n    return source.constructor?.name ?? 'unknown';\n}\n\nfunction diagLabel(node) {\n    if (!node) {\n        return '<none>';\n    }\n    const name = node.state?.name ?? 'unnamed';\n    return `${node.constructor?.name ?? 'Unknown'}(${name})`;\n}\n\nfunction textPreview(text, limit = 64) {\n    if (typeof text !== 'string' || text.length === 0) {\n        return '';\n    }\n    return text.length <= limit ? text : `${text.slice(0, limit)}...`;\n}\n\n/* Extract ancestor-driven instance-propagation metadata from a local dirty call when present. */\nfunction textInstancePropagation(diag = null) {\n    return diag?.instance_propagation ?? null;\n}\n\nfunction findTextOwner(node) {\n    let owner = node?.parentNode ?? null;\n    const path = [];\n    while (owner) {\n        path.push(diagLabel(owner));\n        if (!(owner instanceof MSDFText)) {\n            break;\n        }\n        owner = owner.parentNode ?? null;\n    }\n    return {\n        owner,\n        owner_path: path.join(' <- '),\n    };\n}\n\nfunction textNodeDiagKey(node) {\n    const { owner } = findTextOwner(node);\n    return [\n        perfTextKey(node?.state?.font?.name ?? 'unknown'),\n        diagLabel(owner),\n        diagLabel(node),\n        textPreview(node?.state?.text ?? '', 24),\n    ].join('|');\n}\n\nfunction noteTextNodeDirty(node, kinds, source, diag = null) {\n    const { owner, owner_path } = findTextOwner(node);\n    const ownerHovering = owner?._mouseIsHovering ?? false;\n    const ownerFocus = owner?._isInFocus ?? false;\n    const propagation = textInstancePropagation(diag);\n    gpuDiagNoteTextNodeDirty(textNodeDiagKey(node), {\n        source: textDirtySourceLabel(source),\n        kinds,\n        owner_class: owner?.constructor?.name ?? '<none>',\n        owner_name: owner?.state?.name ?? '<none>',\n        owner_path,\n        owner_hovering: ownerHovering,\n        owner_focus: ownerFocus,\n        owner_enabled: owner?.enabled !== false,\n        text_preview: textPreview(node?.state?.text ?? ''),\n        visible: node?.visible !== false,\n        computed_visible: node?.computedVisible !== false,\n        computed_opacity: node?.computedOpacity ?? null,\n        propagation_source_class: propagation?.source_class ?? '',\n        propagation_source_name: propagation?.source_name ?? '',\n        propagation_source_path: propagation?.source_path ?? '',\n        propagation_reasons: propagation?.reasons ?? [],\n    });\n}\n\n/* Settled-empty groups should ignore pure transform churn until a real content change wakes them. */\nfunction shouldSkipSettledEmptyTextDirty(group, kinds, diag = null) {\n    if (group?.settledEmpty !== true) {\n        return false;\n    }\n    return isTransformOnlyTextDirty(kinds, diag);\n}\n\n/* Return true when `ancestor` is the same node as `node` or sits above it in the scene graph. */\nfunction isAncestorOrSelf(ancestor, node) {\n    for (let cur = node; cur; cur = cur.parentNode ?? null) {\n        if (cur === ancestor) {\n            return true;\n        }\n    }\n    return false;\n}\n\n/* Scoped text owns batch-uniform clip churn inside its local scope, not above it. */\nfunction shouldSkipScopedTransformPropagation(group, kinds, diag = null) {\n    const scopeRoot = group?.textBatchScope?.root ?? null;\n    if (!scopeRoot) {\n        return false;\n    }\n    if (!isTransformOnlyTextDirty(kinds, diag)) {\n        return false;\n    }\n    const sourceNode = diag?.instance_propagation?.source_node ?? null;\n    if (!sourceNode) {\n        return false;\n    }\n    if (isAncestorOrSelf(sourceNode, scopeRoot)) {\n        return true;\n    }\n    const reasons = diag?.instance_propagation?.reasons ?? [];\n    if (reasons.length === 0 || !reasons.every(reason => reason === 'ancestor' || reason === 'clip_rect')) {\n        return false;\n    }\n    return isAncestorOrSelf(scopeRoot, sourceNode);\n}\n\n/* Recognise the TableView-owned text batch scopes so live probes can budget dirty fan-out by frame. */\nfunction parseTableviewTextScope(scopeKey) {\n    if (typeof scopeKey !== 'string' || scopeKey === '') {\n        return null;\n    }\n    const chunkMatch = /^(.+)\\.chunk\\.(\\d+)\\.(\\d+)$/.exec(scopeKey);\n    if (chunkMatch) {\n        return {\n            table_name: chunkMatch[1],\n            scope_kind: 'chunk',\n            row_band: Number.parseInt(chunkMatch[2], 10),\n            col_band: Number.parseInt(chunkMatch[3], 10),\n        };\n    }\n    const headerMatch = /^(.+)\\.header\\.text$/.exec(scopeKey);\n    if (headerMatch) {\n        return {\n            table_name: headerMatch[1],\n            scope_kind: 'header',\n            row_band: null,\n            col_band: null,\n        };\n    }\n    return null;\n}\n\n/* Forward TableView text dirty events into the live probe so bundle summaries can spot over-dirty frames. */\nfunction noteTableviewTextDirty(group, kinds, source = null, label = null) {\n    const scopeKey = group?.textBatchScope?.key ?? null;\n    const parsed = parseTableviewTextScope(scopeKey);\n    if (!parsed) {\n        return;\n    }\n    globalThis.__tableviewLiveProbe?.noteTextDirty?.({\n        table_name: parsed.table_name,\n        scope_key: scopeKey,\n        scope_kind: parsed.scope_kind,\n        row_band: parsed.row_band,\n        col_band: parsed.col_band,\n        frame_index: source?.scene?.stage?.frameIndex ?? group?.textBatchScope?.root?.scene?.stage?.frameIndex ?? null,\n        dirty_kinds: Array.isArray(kinds) ? kinds.slice() : [kinds],\n        source_label: textDirtySourceLabel(source, label),\n        source_name: source?.state?.name ?? null,\n    });\n}\n\n/* Coalesce repeated lifecycle dirties once one scoped group already carries the same rebuild request. */\nfunction shouldCoalesceLifecycleTextDirty(group, kinds, label = null) {\n    if (!group?.dirtyKinds || typeof label !== 'string' || !label.startsWith('MSDFText._on')) {\n        return false;\n    }\n    for (const kind of kinds) {\n        if (!group.dirtyKinds.has(kind)) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Emit one text-group dirty event only when the call actually widens the group's dirty-kind set. */\nfunction addedTextDirtyKinds(group, kinds) {\n    if (!group?.dirtyKinds) {\n        return kinds.slice();\n    }\n    return kinds.filter(kind => !group.dirtyKinds.has(kind));\n}\n\n/* Once a full text rebuild is queued, extra instance-only kinds add no further work before the next sync. */\nfunction shouldSkipRedundantFullRebuildFollowup(group, kinds) {\n    if (!group?.dirtyKinds || kinds.length === 0) {\n        return false;\n    }\n    if (!hasAnyResourceDirty(group, TEXT_FULL_BUFFER_KINDS)) {\n        return false;\n    }\n    return kinds.every(kind => TEXT_INSTANCE_BUFFER_KINDS.includes(kind));\n}\n\nfunction markTextGroupDirty(group, kinds, source = null, label = null, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (shouldSkipSettledEmptyTextDirty(group, list, diag)) {\n        return;\n    }\n    if (shouldSkipScopedTransformPropagation(group, list, diag)) {\n        return;\n    }\n    if (shouldCoalesceLifecycleTextDirty(group, list, label)) {\n        return;\n    }\n    const addedKinds = addedTextDirtyKinds(group, list);\n    if (shouldSkipRedundantFullRebuildFollowup(group, addedKinds)) {\n        return;\n    }\n    if (addedKinds.length === 0) {\n        if (group.pendingTransformOnly === true && !isTransformOnlyTextDirty(list, diag)) {\n            group.pendingTransformOnly = false;\n        }\n        if (group.pendingOpacityOnly === true && !isOpacityOnlyTextDirty(list, diag)) {\n            group.pendingOpacityOnly = false;\n        }\n        return;\n    }\n    markResourceDirty(group, addedKinds, source);\n    if (group.settledEmpty === true) {\n        noteTextGroupEvent(group, 'revived', {\n            source: textDirtySourceLabel(source, label),\n            dirty_kinds: addedKinds.slice(),\n        });\n    }\n    group.settledEmpty = false;\n    const transformOnly = isTransformOnlyTextDirty(addedKinds, diag);\n    const opacityOnly = isOpacityOnlyTextDirty(addedKinds, diag);\n    group.pendingTransformOnly = group.pendingTransformOnly == null\n        ? transformOnly\n        : group.pendingTransformOnly && transformOnly;\n    group.pendingOpacityOnly = group.pendingOpacityOnly == null\n        ? opacityOnly\n        : group.pendingOpacityOnly && opacityOnly;\n    const propagation = textInstancePropagation(diag);\n    gpuDiagNoteTextDirty(textGroupKey(group), {\n        source: textDirtySourceLabel(source, label),\n        kinds: addedKinds,\n        picker_batch_dirty: !!group?.pickerBatchDirty,\n        picker_pose_dirty: !!group?.pickerPoseDirty,\n        propagation_source_class: propagation?.source_class ?? '',\n        propagation_source_name: propagation?.source_name ?? '',\n        propagation_source_path: propagation?.source_path ?? '',\n        propagation_reasons: propagation?.reasons ?? [],\n    });\n    noteTableviewTextDirty(group, addedKinds, source, label);\n    if (source instanceof MSDFText) {\n        noteTextNodeDirty(source, addedKinds, source, diag);\n    }\n}\n\nfunction measurePresentedTextNodes(scene, group) {\n    const tracker = perfTracker();\n    const key = textGroupKey(group);\n    const timerName = `text_presented_nodes_scan.${key}`;\n    const token = tracker?.beginTimer(timerName);\n    const nodes = presentedTextNodes(scene, group);\n    tracker?.endTimer(timerName, token);\n    tracker?.incrementCounter(`text_presented_nodes_scan_count.${key}`);\n    tracker?.incrementCounter(`text_presented_nodes_scan_nodes.${key}`, nodes.length);\n    return nodes;\n}\n\n/* Accept the cheap path only for shared batch-uniform motion such as transform or clip changes. */\nfunction isTransformOnlyTextDirty(kinds, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (list.length === 0) {\n        return false;\n    }\n    for (const kind of list) {\n        if (kind === DIRTY.transform) {\n            continue;\n        }\n        if (kind !== DIRTY.instance) {\n            return false;\n        }\n    }\n    if (!list.includes(DIRTY.instance)) {\n        return true;\n    }\n    const reasons = diag?.instance_propagation?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.every(reason => reason === 'ancestor' || reason === 'transform' || reason === 'clip_rect');\n}\n\n/* Accept the narrow colour-only path only for ancestor opacity propagation with unchanged glyph topology. */\nfunction isOpacityOnlyTextDirty(kinds, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (list.length === 0) {\n        return false;\n    }\n    for (const kind of list) {\n        if (kind !== DIRTY.instance) {\n            return false;\n        }\n    }\n    const reasons = diag?.instance_propagation?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.every(reason => reason === 'opacity');\n}\n\nfunction setBufferData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n}\n\n/* Accept compact RGBA streams on the glyph axis and fail fast when callers provide the wrong shape. */\nfunction validateGlyphColors(glyphColors, glyphCount, label = 'MSDFText') {\n    if (glyphColors == null) {\n        return;\n    }\n    if (!ArrayBuffer.isView(glyphColors) && !Array.isArray(glyphColors)) {\n        throw new Error(`${label} glyphColors must be an Array or TypedArray.`);\n    }\n    const expected = glyphCount * 4;\n    if (glyphColors.length !== expected) {\n        throw new Error(`${label} glyphColors must contain exactly ${expected} floats for ${glyphCount} glyphs, got ${glyphColors.length}.`);\n    }\n}\n\n/* Treat equivalent colour arrays as the same state even when callers allocate a fresh container. */\nfunction sameNumericSequence(left, right) {\n    if (left === right) {\n        return true;\n    }\n    const leftIsSequence = Array.isArray(left) || ArrayBuffer.isView(left);\n    const rightIsSequence = Array.isArray(right) || ArrayBuffer.isView(right);\n    if (!leftIsSequence || !rightIsSequence || left.length !== right.length) {\n        return false;\n    }\n    for (let i = 0; i < left.length; i += 1) {\n        if (left[i] !== right[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\n// dropTextGroupGl releases one font group's shared GL batch so churn can be traced back to its caller.\nfunction dropTextGroupGl(gl, group, source = 'unknown') {\n    gpuDiagNoteTextDrop(textGroupKey(group), {\n        source,\n        had_buffer: !!group?.ownGlBufferInfo,\n        had_span_texture: !!group?.ownGlSpanMatrixTexture,\n        instance_count: group?.instanceCount ?? 0,\n        span_count: group?.spanCount ?? 0,\n    });\n    deleteBufferInfo(gl, group?.ownGlBufferInfo);\n    group.ownGlBufferInfo = null;\n    if (group?.ownGlSpanMatrixTexture) {\n        gl.deleteTexture(group.ownGlSpanMatrixTexture);\n        group.ownGlSpanMatrixTexture = null;\n    }\n    if (group) {\n        group.instanceCount = 0;\n        group.spanCount = 0;\n        group.pendingTransformOnly = null;\n        group.pendingOpacityOnly = null;\n        group.settledEmpty = false;\n    }\n}\n\n// Decide whether a text group actually needs GPU sync work this frame.\nfunction needsTextGroupSync(group) {\n    if (hasAnyResourceDirty(group, TEXT_FULL_BUFFER_KINDS) || hasAnyResourceDirty(group, TEXT_INSTANCE_BUFFER_KINDS)) {\n        return true;\n    }\n    if (group.ownGlBufferInfo) {\n        return false;\n    }\n    return group.settledEmpty !== true;\n}\n\nfunction isTransformStateKey(key) {\n    return key === 'x' || key === 'y' || key === 'z' || key === 'localToParent';\n}\n\n// NB: no export, force users to call createMSDFFont instead.\nclass MSDFFont extends ui.Resource {\n    constructor(scene, name) {\n        super(scene);\n\n        this.name = name;\n        this.fontData = undefined; // overwritten by createMSDFFont\n        //All fonts are stored on digitaloceanspaces\n        this.filename = `${FONTS_URL}${this.name}`;\n    }\n\n    /* Request one shared context-scoped atlas texture instead of binding this font object to a specific scene lifecycle. */\n    _onAcquireContext(gl, visited) {\n        if (visited?.has(this)) {\n            return;\n        }\n        visited?.set(this, true);\n        ensureContextFontTexture(gl, this);\n    }\n\n    /* The context cache owns atlas lifetime; scene release only records visitation. */\n    _onReleaseContext(_gl, visited) {\n        if (visited?.has(this)) {\n            return;\n        }\n        visited?.set(this, true);\n    }\n};\n\nexport async function createMSDFFont(scene, name) {\n\n    const font = new MSDFFont(scene, name);\n\n    try {\n        font.fontData = await loadFontData(font.filename + '.json');\n    } catch (e) {\n        console.warn(`Failed to load fontData from ${font.filename}.`);\n        throw e;\n    }\n\n    return font;\n}\n\nexport function getTextAdvanceMetrics(font, fontSize, text) {\n    if (!font?.fontData?.glyphs) {\n        throw new Error('Font data not loaded yet');\n    }\n\n    const safeText = text ?? '';\n    let advanceCache = g_textAdvanceLRUs.get(font.fontData);\n    if (!advanceCache) {\n        advanceCache = new Map();\n        g_textAdvanceLRUs.set(font.fontData, advanceCache);\n    }\n    const key = JSON.stringify([fontSize, safeText]);\n    const cached = advanceCache.get(key);\n    if (cached) {\n        advanceCache.delete(key);\n        advanceCache.set(key, cached);\n        return cached;\n    }\n\n    // Cursor coordinates remain UTF-16 offsets; each scalar is measured once.\n    // The interior of a surrogate pair shares its leading boundary's width.\n    const widths = new Float32Array(safeText.length + 1);\n    const codepointOffsets = [0];\n    const codepointWidths = [0];\n    let offset = 0;\n    for (const ch of safeText) {\n        const advance = ch === '\\r' || ch === '\\n' ? 0\n            : glyphForSymbol(font.fontData, ch).advance * fontSize;\n        for (let unit = 1; unit < ch.length; unit++) widths[offset + unit] = widths[offset];\n        widths[offset + ch.length] = widths[offset] + advance;\n        offset += ch.length;\n        codepointOffsets.push(offset);\n        codepointWidths.push(widths[offset]);\n    }\n    widths.codepointOffsets = codepointOffsets;\n    widths.codepointWidths = codepointWidths;\n\n    const metrics = {\n        text: safeText,\n        fontName: font.name,\n        fontSize,\n        widths,\n    };\n    advanceCache.set(key, metrics);\n    if (advanceCache.size > TEXT_ADVANCE_LRU_LIMIT) {\n        const oldestKey = advanceCache.keys().next().value;\n        advanceCache.delete(oldestKey);\n    }\n    return metrics;\n}\n\n/* Normalise text input to one numeric codepoint stream for both string and vectorised callers. */\nfunction normalizeTextCodepoints(config) {\n    const codepoints = config?.codepoints ?? null;\n    if (codepoints != null) {\n        if (!Array.isArray(codepoints) && !ArrayBuffer.isView(codepoints)) {\n            throw new Error('MSDFText codepoints must be an Array or TypedArray.');\n        }\n        return codepoints;\n    }\n    const text = config?.text ?? '';\n    const out = [];\n    for (const ch of text) {\n        out.push(ch.codePointAt(0));\n    }\n    return out;\n}\n\n/* Validate one prebuilt text shape so callers fail fast instead of drifting into partial text state. */\nfunction validatePrebuiltTextShape(state, label = 'MSDFText') {\n    const hasLayout = state?.prebuiltLayout != null;\n    const hasGlyphData = state?.prebuiltGlyphData != null;\n    if (hasLayout !== hasGlyphData) {\n        throw new Error(`${label} prebuilt text requires both prebuiltLayout and prebuiltGlyphData.`);\n    }\n    if (!hasLayout) {\n        return false;\n    }\n    const glyphCount = state.prebuiltGlyphData?.glyphCount;\n    if (!Number.isInteger(glyphCount) || glyphCount < 0) {\n        throw new Error(`${label} prebuiltGlyphData.glyphCount must be a non-negative integer.`);\n    }\n    const layout = state.prebuiltLayout;\n    const glyphData = state.prebuiltGlyphData;\n    const packed = (value, Type, length, field) => {\n        if (!(value instanceof Type) || value.length !== length) {\n            throw new Error(`${label} prebuilt ${field} must be ${Type.name} with ${length} entries.`);\n        }\n    };\n    packed(layout.codepoints, Uint32Array, glyphCount, 'codepoints');\n    if (layout.codepoints.some(cp => !isUnicodeScalar(cp))) {\n        throw new Error(`${label} prebuilt codepoints must be Unicode scalars.`);\n    }\n    packed(layout.positions, Float32Array, glyphCount * 2, 'positions');\n    packed(glyphData.rects, Float32Array, glyphCount * 4, 'rects');\n    packed(glyphData.texRects, Float32Array, glyphCount * 4, 'texRects');\n    packed(glyphData.atlasIndices, Uint8Array, glyphCount, 'atlas indices');\n    const paletteSize = state.font.fontData.atlasFonts?.length ?? 1;\n    if (glyphData.atlasIndices.some(index => index >= paletteSize)) {\n        throw new Error(`${label} prebuilt atlas indices must refer to the font palette.`);\n    }\n    for (const [field, values] of [['positions', layout.positions], ['rects', glyphData.rects], ['texRects', glyphData.texRects]]) {\n        if (values.some(value => !Number.isFinite(value))) {\n            throw new Error(`${label} prebuilt ${field} must be finite.`);\n        }\n    }\n\n    return true;\n}\n\n/* Build one layout+glyph payload up front so callers can avoid duplicate layout work during node construction. */\nexport function buildTextShape(state) {\n    if (!state?.font?.fontData) {\n        throw new Error('buildTextShape(...): font data not loaded yet.');\n    }\n    const config = { ...state, fontSize: state.fontSize ?? 1 };\n    const { layout, resolvedGlyphs } = layoutTextWithGlyphs(state.font.fontData, config);\n    return { layout, glyphData: buildGlyphData(config, layout, resolvedGlyphs) };\n}\n\nexport class MSDFText extends ui.Node {\n    static bias = 0.5;\n\n    /*\n        1:1 Quad built with vec2 xy, defined by 2 triangles.\n        This serves as base quad to render text and will\n        vary in dimentions once char matrix is applied.\n    */\n    static baseQuad = new Float32Array([\n        0, 0, 0, 1, 1, 0,\n        1, 0, 0, 1, 1, 1\n    ]);\n\n    /* Keep plain MSDFText pinned to the text pass so transparent text stays an explicit opt-in class. */\n    static #assertCtorPass(target, pass) {\n        if (target !== MSDFText || pass === 'text') {\n            return;\n        }\n        throw new Error(`MSDFText(...): pass '${pass}' is not supported; use MSDFTextTransparent for transparent-pass text.`);\n    }\n\n    // public:\n    constructor(state) {\n        const pass = normalizeTextPass(state?.pass);\n        MSDFText.#assertCtorPass(new.target, pass);\n        state = {\n            text: null,\n            codepoints: null,\n            font: null, // MSDFFont\n            fontSize: 32,\n            fontColor: state.fontColor || [0, 0, 0, 1],\n            glyphColors: state.glyphColors ?? null,\n            prebuiltLayout: state.prebuiltLayout ?? null,\n            prebuiltGlyphData: state.prebuiltGlyphData ?? null,\n            ...state,\n            pass,\n            textBatching: normalizeTextBatching(state?.textBatching),\n        };\n\n        if (!state.font) {\n            throw new Error('font is a required argument to each MSDFText instance');\n        }\n        if (!state.fontSize) {\n            throw new Error('fontSize is a required argument to each MSDFText instance');\n        }\n        validatePrebuiltTextShape(state);\n\n        super(state);\n        this._volatileTextBatchKey = null;\n        this.#rebuild();\n    }\n\n    // Partition text surfaces into explicit global, inherited segmented, or node-local volatile batches.\n    _resourceKey() {\n        const baseKey = super._resourceKey();\n        const pass = normalizeTextPass(this.state.pass);\n        const batch = textBatchDescriptor(this, this.scene);\n        if (batch.batching === TEXT_BATCHING.STATIC_GLOBAL) {\n            return `${baseKey}:${pass}`;\n        }\n        return `${baseKey}:${pass}:${batch.key}`;\n    }\n\n    /* Text batches pick their draw registry from the declared text pass rather than the class hook surface. */\n    static _batchPassForNode(node) {\n        return normalizeTextPass(node?.state?.pass);\n    }\n\n    /* Shared text resources keep the same one-pass ownership contract after the last node is detached. */\n    static _batchPassForShared(res) {\n        return normalizeTextPass(res?.textPass);\n    }\n\n    height() {\n        return this._layout.height;\n    }\n    width() {\n        return this._layout.width;\n    }\n\n    static measureFromState(state) {\n        if (!state.font?.fontData) {\n            throw new Error('Font data not loaded yet');\n        }\n        const { layout } = layoutTextWithGlyphs(state.font.fontData, state);\n        return {\n            width: layout.width,\n            height: layout.height,\n        };\n    }\n\n    measure(newState) {\n        const { layout } = layoutTextWithGlyphs(this.state.font.fontData, { ...this.state, ...newState });\n        return {\n            width: layout.width,\n            height: layout.height,\n        };\n    }\n\n    static getTextAligment(state, boxWidth = 1, boxHeight = 1, vAlignment = 'TOP', hAlignment = 'LEFT') {\n        if (!state.font || !state.fontSize || !state.text) {\n            throw new Error(\"Getting alignment with invalid font state.\");\n        }\n\n        // Measure the text using the existing function\n        const textMetrics = this.measureFromState(state);\n        const textHeight = textMetrics.height;\n        const textWidth = textMetrics.width;\n\n        let x = 0;\n        let y = 0;\n\n        // Determine X coordinate\n        switch (hAlignment?.toUpperCase()) {\n            case 'RIGHT':\n                x = boxWidth - textWidth;\n                break;\n            case 'CENTER':\n                x = (boxWidth - textWidth) / 2;\n                break;\n            case 'MIDDLE':\n                x = (boxWidth - textWidth) / 2;\n                break;\n            case 'LEFT':\n            default:\n                x = 0; // Defaults to LEFT\n        }\n\n        // Determine Y coordinate\n        switch (vAlignment?.toUpperCase()) {\n            case 'BOTTOM':\n                y = boxHeight - textHeight;\n                break;\n            case 'CENTER':\n                y = (boxHeight - textHeight) / 2;\n                break;\n            case 'MIDDLE':\n                y = (boxHeight - textHeight) / 2;\n                break;\n            case 'TOP':\n            default:\n                y = 0 // Defaults to TOP\n        }\n\n        return [ x, y ];\n    }\n\n    setText(newText) {\n        if (this.state.text === newText) {\n            return;\n        }\n        this.state.text = newText;\n        this.state.glyphColors = null;\n        this.state.codepoints = null;\n        this.state.prebuiltLayout = null;\n        this.state.prebuiltGlyphData = null;\n        this.#rebuild();\n        this._dirtyResources({ kinds: [DIRTY.text, DIRTY.layout, DIRTY.instance] });\n    }\n\n    /* Swap one per-glyph colour stream without rebuilding layout when the glyph topology is unchanged. */\n    setGlyphColors(glyphColors) {\n        validateGlyphColors(glyphColors, this.glyphCount(), this.state.name ?? 'MSDFText');\n        if (sameNumericSequence(this.state.glyphColors, glyphColors)) {\n            return;\n        }\n        this.state.glyphColors = glyphColors;\n        this._dirtyResources({ kinds: [DIRTY.style, DIRTY.instance] });\n    }\n\n    setVisibility(state){\n        if (this.visible === state) {\n            return;\n        }\n        this.visible = state;\n        this._dirtyResources({ kinds: [DIRTY.visibility, DIRTY.instance] });\n    }\n\n    mutate(newState) {\n        if (Object.hasOwn(newState, 'font') && newState.font !== this.state.font) {\n            throw new Error('MSDFText font changes require a new node so font groups remain canonical.');\n        }\n        if (Object.hasOwn(newState, 'pass') && normalizeTextPass(newState.pass) !== this.state.pass) {\n            throw new Error('MSDFText pass changes require a new node so render-pass groups remain canonical.');\n        }\n        const prevState = this.state;\n        const nextState = { ...this.state, ...newState };\n        validatePrebuiltTextShape(nextState);\n        this.state = nextState;\n\n        let needsRebuild = false;\n        const kinds = new Set();\n        for (const key of Object.keys(newState)) {\n            if ((key === 'fontColor' || key === 'glyphColors')\n                && sameNumericSequence(prevState[key], this.state[key])) {\n                this.state[key] = prevState[key];\n                continue;\n            }\n            if (prevState[key] === this.state[key]) {\n                continue;\n            }\n            if (isTransformStateKey(key)) {\n                kinds.add(DIRTY.transform);\n                continue;\n            }\n            if (key === 'fontColor') {\n                kinds.add(DIRTY.style);\n                kinds.add(DIRTY.instance);\n                continue;\n            }\n            if (key === 'glyphColors') {\n                validateGlyphColors(this.state.glyphColors, this.glyphCount(), this.state.name ?? 'MSDFText');\n                kinds.add(DIRTY.style);\n                kinds.add(DIRTY.instance);\n                continue;\n            }\n            kinds.add(DIRTY.text);\n            kinds.add(DIRTY.layout);\n            kinds.add(DIRTY.instance);\n            needsRebuild = true;\n        }\n\n        if (needsRebuild) {\n            if (Object.hasOwn(newState, 'text')) {\n                this.state.codepoints = null;\n                this.state.prebuiltLayout = null;\n                this.state.prebuiltGlyphData = null;\n            } else if (Object.hasOwn(newState, 'codepoints')) {\n                this.state.text = null;\n                this.state.prebuiltLayout = null;\n                this.state.prebuiltGlyphData = null;\n            }\n            this.#rebuild();\n        }\n        if (kinds.size > 0) {\n            this._dirtyResources({ kinds: Array.from(kinds) });\n        }\n    }\n\n    /* Invalidate this node's primary-font batch through the shared dirty ledger. */\n    _markLocalResourcesDirty({ kinds = null, diag = null } = {}) {\n        const group = this._resources?.groupByFont?.get(this.state.font.name);\n        if (group) {\n            markTextGroupDirty(\n                group,\n                kinds ?? [DIRTY.text, DIRTY.layout, DIRTY.transform, DIRTY.visibility, DIRTY.style, DIRTY.instance],\n                this,\n                'MSDFText._markLocalResourcesDirty',\n                diag,\n            );\n        }\n    }\n\n    // protected: (should be called by the framework rather than directly by developers)\n    static _onAttachClass(res) {\n        res.groupByFont = new Map();\n        res.textPass = null;\n    }\n\n    _onAttachNode(res) {\n        const fontName = this.state.font.name;\n        const batch = textBatchDescriptor(this, this.scene);\n        const scope = batch.scope;\n        const textPass = normalizeTextPass(this.state.pass);\n        if (res.textPass == null) {\n            res.textPass = textPass;\n        } else if (res.textPass !== textPass) {\n            throw new Error(`MSDFText._onAttachNode(${fontName}): pass mismatch (${res.textPass} vs ${textPass}).`);\n        }\n\n        let group = res.groupByFont.get(fontName);\n        if (!group) {\n            group = {\n                nodes: [],\n                usedAtlasIndices: [],\n                font: this.state.font,\n                dirtyLabel: `MSDFTextGroup.${perfTextKey(`${fontName}.${textPass}`, batch.key)}`,\n                ownGlSpanMatrixTexture: null,\n                pendingTransformOnly: null,\n                pendingOpacityOnly: null,\n                settledEmpty: false,\n                textBatchScope: scope,\n                textBatching: batch.batching,\n                textPass,\n                ownerResourceKey: this._resourceKey?.() ?? 'unknown',\n                lastLifecycleEvent: null,\n                lastSettledEvent: null,\n                lastRevivedEvent: null,\n            };\n            res.groupByFont.set(fontName, group);\n            noteLiveTextGroup(group);\n            noteTextGroupEvent(group, 'created', {\n                source: 'MSDFText._onAttachNode(create_group)',\n            });\n        } else if (!sameTextBatchScope(group.textBatchScope ?? null, scope)) {\n            throw new Error(\n                `MSDFText._onAttachNode(${fontName}): scope mismatch `\n                + `(${group.textBatchScope?.key ?? TEXT_BATCH_GLOBAL_KEY} vs ${scope?.key ?? TEXT_BATCH_GLOBAL_KEY}).`\n            );\n        } else if (group.textBatching !== batch.batching) {\n            throw new Error(`MSDFText._onAttachNode(${fontName}): batching mismatch (${group.textBatching} vs ${batch.batching}).`);\n        } else if (group.textPass !== textPass) {\n            throw new Error(`MSDFText._onAttachNode(${fontName}): group pass mismatch (${group.textPass} vs ${textPass}).`);\n        }\n        group.nodes.push(this);\n\n        // If GL is already acquired, ensure the font texture is loaded\n        if (this.scene?.gl && !peekContextFontTexture(this.scene.gl, group.font)) {\n            group.font._onAcquireContext(this.scene.gl, new WeakMap());\n        }\n\n        // FIXME: probably redundant since we keep this up-to-date throughout object lifetime anyway.\n        this.#rebuild();\n        markTextGroupDirty(group, [DIRTY.attach, DIRTY.structure, DIRTY.text, DIRTY.layout, DIRTY.instance, DIRTY.buffer], this, 'MSDFText._onAttachNode');\n    }\n\n    _onDetachNode(res) {\n        const fontName = this.state.font.name;\n\n        const group = res.groupByFont.get(fontName);\n        if (!group) {\n            throw new Error(`res.groupByFont[${fontName}] should have been created already by _onAttachNode.`);\n        }\n        group.nodes = group.nodes.filter(n => n !== this);\n        if (group.nodes.length === 0) {\n            if (this.scene?.gl) {\n                dropTextGroupGl(this.scene.gl, group, 'MSDFText._onDetachNode(last_group_node)');\n            }\n            noteTextGroupEvent(group, 'deleted', {\n                source: 'MSDFText._onDetachNode(last_group_node)',\n            });\n            res.groupByFont.delete(fontName);\n            forgetLiveTextGroup(group);\n            if (res.groupByFont.size === 0) {\n                res.textPass = null;\n            }\n            return;\n        }\n        markTextGroupDirty(group, [DIRTY.detach, DIRTY.structure, DIRTY.text, DIRTY.layout, DIRTY.instance, DIRTY.buffer], this, 'MSDFText._onDetachNode');\n    }\n\n    static _onAcquireContext(gl, res, visited) {\n        if (visited?.has(res)) {\n            return;\n        }\n\n        for (const group of res.groupByFont.values()) {\n            group.font._onAcquireContext(gl, visited);\n        }\n\n        // program: one only (per scene & WebGL context)\n        res.ownGlFontProgram = null;\n        const acquireToken = beginGlAcquire(res, 'ownPendingGlFontProgram');\n\n        // fire-and-forget\n        (async () => {\n            const ownGlFontProgram = await getContextGlProgram(gl, 'gl_program.evilfont', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource('lib/evilfont/evilfont.vs.glsl',\n                    'lib/evilfont/evilfont.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(res, acquireToken, 'ownPendingGlFontProgram')) {\n                return;\n            }\n            res.ownGlFontProgram = ownGlFontProgram;\n        })();\n    }\n\n    static _onReleaseContext(gl, res, visited) {\n        invalidateGlAcquire(res, 'ownPendingGlFontProgram');\n        for (let [, group] of res.groupByFont) {\n            dropTextGroupGl(gl, group, 'MSDFText._onReleaseContext');\n            group.font._onReleaseContext(gl, visited);\n        }\n        res.ownGlFontProgram = null;\n    }\n\n    /**\n        Allocate resources depending on both the Node being part of the scene graph AND the\n        GL context being acquired.\n    */\n    _onAcquireNode(gl, res, visited) {\n        if (visited?.has(this)) {\n            return;\n        }\n\n        const fontName = this.state.font.name;\n        let group = res.groupByFont.get(fontName);\n        if (!group) {\n            throw new Error(`res.groupByFont[${fontName}] should have been created already by _onAttachNode.`);\n        }\n\n        this.#rebuild();\n        markTextGroupDirty(group, [DIRTY.attach, DIRTY.text, DIRTY.layout, DIRTY.instance, DIRTY.buffer], this, 'MSDFText._onAcquireNode');\n    }\n\n    _onReleaseNode(gl, res, visited) {\n        if (visited?.has(this)) {\n            return;\n        }\n        const fontName = this.state.font.name;\n        const group = res.groupByFont.get(fontName);\n        if (!group) {\n            throw new Error(`res.groupByFont[${fontName}] should have been created already by _onAttachNode.`);\n        }\n        // Keep the shared GL cache alive across ordinary node release churn.\n        // The next sync will rebuild any invalidated batch contents in place.\n        markTextGroupDirty(group, [DIRTY.detach, DIRTY.structure, DIRTY.text, DIRTY.layout, DIRTY.instance, DIRTY.buffer], this, 'MSDFText._onReleaseNode');\n    }\n\n    /**\n        Batch (if dirty) and Draw all text across the scene.\n    */\n    static _drawText(gl, res, t, viewMatrix, projectionMatrix, status = null) {\n        drawTextPass(gl, res, this, 'text', viewMatrix, projectionMatrix, status);\n    }\n\n    static _drawTransparent(gl, res, t, viewMatrix, projectionMatrix, status = null) {\n        drawTextPass(gl, res, this, 'transparent', viewMatrix, projectionMatrix, status);\n    }\n\n    // private:\n    #glyphData;\n\n    #rebuild() {\n        if (validatePrebuiltTextShape(this.state)) {\n            this._layout = this.state.prebuiltLayout;\n            this.#glyphData = this.state.prebuiltGlyphData;\n        } else {\n            const shape = buildTextShape(this.state);\n            this._layout = shape.layout;\n            this.#glyphData = shape.glyphData;\n        }\n        validateGlyphColors(this.state.glyphColors, this.#glyphData?.glyphCount ?? 0, this.state.name ?? 'MSDFText');\n    }\n\n    glyphCount() {\n        return this.#glyphData?.glyphCount ?? 0;\n    }\n\n    glyphData() {\n        return this.#glyphData;\n    }\n\n\n}\n\nfunction presentedTextNodes(scene, group) {\n    if (!scene?._isPresentedNode) {\n        return group.nodes;\n    }\n    return group.nodes.filter(node => scene._isPresentedNode(node));\n}\n\nfunction makeTextGlyphArrays(baseQuad, totalGlyphs) {\n    return {\n        a_position: { numComponents: 2, data: baseQuad },\n        a_rect: { numComponents: 4, data: new Float32Array(totalGlyphs * 4), divisor: 1 },\n        a_texRect: { numComponents: 4, data: new Float32Array(totalGlyphs * 4), divisor: 1 },\n        a_span: { numComponents: 1, data: new Float32Array(totalGlyphs), divisor: 1 },\n        a_atlas: { numComponents: 1, data: new Float32Array(totalGlyphs), divisor: 1 },\n        a_color: { numComponents: 4, data: new Float32Array(totalGlyphs * 4), divisor: 1 },\n        a_id: { numComponents: 1, data: new Float32Array(totalGlyphs), divisor: 1 },\n    };\n}\n\nfunction makeTextTransformArrays(totalSpans) {\n    return {\n        spanMatrices: new Float32Array(totalSpans * 16),\n    };\n}\n\nfunction setTextGlyphInstance(glyphArrays, node, scene, glyphData, glyphIndex, instanceIndex, spanIndex) {\n    const baseRect = glyphIndex * 4;\n    const targetRect = instanceIndex * 4;\n    glyphArrays.a_rect.data.set(glyphData.rects.subarray(baseRect, baseRect + 4), targetRect);\n    glyphArrays.a_texRect.data.set(glyphData.texRects.subarray(baseRect, baseRect + 4), targetRect);\n    glyphArrays.a_span.data[instanceIndex] = spanIndex;\n    glyphArrays.a_atlas.data[instanceIndex] = glyphData.atlasIndices[glyphIndex];\n    const glyphColors = node.state.glyphColors ?? null;\n    if (glyphColors) {\n        const colorOffset = glyphIndex * 4;\n        glyphArrays.a_color.data.set([\n            glyphColors[colorOffset],\n            glyphColors[colorOffset + 1],\n            glyphColors[colorOffset + 2],\n            (glyphColors[colorOffset + 3] ?? 1.0) * (node.computedOpacity ?? 1.0),\n        ], instanceIndex * 4);\n    } else {\n        const fontColor = node.state.fontColor;\n        glyphArrays.a_color.data.set([\n            fontColor[0],\n            fontColor[1],\n            fontColor[2],\n            (fontColor[3] ?? 1.0) * (node.computedOpacity ?? 1.0),\n        ], instanceIndex * 4);\n    }\n    glyphArrays.a_id.data[instanceIndex] = instanceIndex;\n}\n\nfunction setTextSpanTransform(transformArrays, worldMatrix, spanIndex) {\n    transformArrays.spanMatrices.set(worldMatrix, spanIndex * 16);\n}\n\nfunction mergeTextBatchArrays(glyphArrays, transformArrays, stats) {\n    return {\n        ...glyphArrays,\n        ...transformArrays,\n        ...stats,\n    };\n}\n\n/* Count the visible and drawable text payload so sync paths can share one authoritative scan. */\nfunction measureTextNodes(nodes) {\n    const stats = {\n        presentedNodeCount: nodes.length,\n        visibleNodeCount: 0,\n        drawableNodeCount: 0,\n        presentedGlyphCount: 0,\n        totalGlyphs: 0,\n    };\n    for (const node of nodes) {\n        const glyphData = node.glyphData();\n        if (!glyphData) {\n            continue;\n        }\n        stats.presentedGlyphCount += glyphData.glyphCount;\n        if (node.computedVisible === false) {\n            continue;\n        }\n        stats.visibleNodeCount++;\n        stats.totalGlyphs += glyphData.glyphCount;\n    }\n    return stats;\n}\n\n/* Build only the per-span transforms for pure movement churn, leaving glyph-side buffers untouched. */\nfunction buildTextTransformBatchArrays(group, nodes) {\n    const stats = measureTextNodes(nodes);\n    const transformArrays = makeTextTransformArrays(stats.visibleNodeCount);\n    const scopeWorldInverse = nodes.length > 0 ? textBatchScopeInverseMatrix(group, nodes[0].scene) : null;\n    let instanceCount = 0;\n    let spanCount = 0;\n    let drawableNodeCount = 0;\n    const drawableNodeSignature = [];\n    for (const node of nodes) {\n        const glyphData = node.glyphData();\n        if (node.computedVisible === false || !glyphData) {\n            continue;\n        }\n        const scene = node.scene;\n        const worldMatrix = textSpanMatrixForNode(node, scene, scopeWorldInverse);\n        if (!worldMatrix) {\n            continue;\n        }\n        drawableNodeCount++;\n        drawableNodeSignature.push({ node, glyphCount: glyphData.glyphCount });\n        setTextSpanTransform(transformArrays, worldMatrix, spanCount);\n        spanCount++;\n        instanceCount += glyphData.glyphCount;\n    }\n    return {\n        ...transformArrays,\n        spanCount,\n        instanceCount,\n        presentedNodeCount: stats.presentedNodeCount,\n        visibleNodeCount: stats.visibleNodeCount,\n        drawableNodeCount,\n        presentedGlyphCount: stats.presentedGlyphCount,\n        drawableGlyphCount: instanceCount,\n        drawableNodeSignature,\n    };\n}\n\n/* Build only per-glyph colours when ancestor opacity changes but glyph geometry and span layout stay stable. */\nfunction buildTextColorBatchArrays(group, nodes) {\n    const stats = measureTextNodes(nodes);\n    const colorArrays = {\n        a_color: { numComponents: 4, data: new Float32Array(stats.totalGlyphs * 4), divisor: 1 },\n    };\n    const scopeWorldInverse = nodes.length > 0 ? textBatchScopeInverseMatrix(group, nodes[0].scene) : null;\n    let instanceCount = 0;\n    let spanCount = 0;\n    let drawableNodeCount = 0;\n    for (const node of nodes) {\n        const glyphData = node.glyphData();\n        if (node.computedVisible === false || !glyphData) {\n            continue;\n        }\n        const scene = node.scene;\n        const worldMatrix = textSpanMatrixForNode(node, scene, scopeWorldInverse);\n        if (!worldMatrix) {\n            continue;\n        }\n        drawableNodeCount++;\n        spanCount++;\n        for (let g = 0; g < glyphData.glyphCount; g++) {\n            const glyphColors = node.state.glyphColors ?? null;\n            if (glyphColors) {\n                const colorOffset = g * 4;\n                colorArrays.a_color.data.set([\n                    glyphColors[colorOffset],\n                    glyphColors[colorOffset + 1],\n                    glyphColors[colorOffset + 2],\n                    (glyphColors[colorOffset + 3] ?? 1.0) * (node.computedOpacity ?? 1.0),\n                ], instanceCount * 4);\n            } else {\n                const fontColor = node.state.fontColor;\n                colorArrays.a_color.data.set([\n                    fontColor[0],\n                    fontColor[1],\n                    fontColor[2],\n                    (fontColor[3] ?? 1.0) * (node.computedOpacity ?? 1.0),\n                ], instanceCount * 4);\n            }\n            instanceCount++;\n        }\n    }\n    return {\n        ...colorArrays,\n        spanCount,\n        instanceCount,\n        presentedNodeCount: stats.presentedNodeCount,\n        visibleNodeCount: stats.visibleNodeCount,\n        drawableNodeCount,\n        presentedGlyphCount: stats.presentedGlyphCount,\n        drawableGlyphCount: instanceCount,\n    };\n}\n\nfunction buildTextBatchArrays(group, baseQuad, nodes = group.nodes) {\n    const stats = measureTextNodes(nodes);\n    const glyphArrays = makeTextGlyphArrays(baseQuad, stats.totalGlyphs);\n    const usedAtlasIndices = new Set();\n    const transformArrays = makeTextTransformArrays(stats.visibleNodeCount);\n    const scopeWorldInverse = nodes.length > 0 ? textBatchScopeInverseMatrix(group, nodes[0].scene) : null;\n\n    let instanceCount = 0;\n    let spanCount = 0;\n    let drawableNodeCount = 0;\n    const drawableNodeSignature = [];\n    for (const node of nodes) {\n        const glyphData = node.glyphData();\n        if (node.computedVisible === false || !glyphData) {\n            continue;\n        }\n        const scene = node.scene;\n        const worldMatrix = textSpanMatrixForNode(node, scene, scopeWorldInverse);\n        if (!worldMatrix) {\n            continue;\n        }\n        drawableNodeCount++;\n        drawableNodeSignature.push({ node, glyphCount: glyphData.glyphCount });\n        const spanIndex = spanCount;\n        setTextSpanTransform(transformArrays, worldMatrix, spanIndex);\n        spanCount++;\n        for (let g = 0; g < glyphData.glyphCount; g++) {\n            usedAtlasIndices.add(glyphData.atlasIndices[g]);\n            setTextGlyphInstance(glyphArrays, node, scene, glyphData, g, instanceCount, spanIndex);\n            instanceCount++;\n        }\n    }\n\n    return mergeTextBatchArrays(glyphArrays, transformArrays, {\n        usedAtlasIndices: [...usedAtlasIndices],\n        spanCount,\n        instanceCount,\n        presentedNodeCount: stats.presentedNodeCount,\n        visibleNodeCount: stats.visibleNodeCount,\n        drawableNodeCount,\n        presentedGlyphCount: stats.presentedGlyphCount,\n        drawableGlyphCount: instanceCount,\n        drawableNodeSignature,\n    });\n}\n\n/* A visibility edge can reuse glyph buffers only when the exact drawable node stream is unchanged. */\nfunction sameDrawableNodeSignature(a, b) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n        return false;\n    }\n    return a.every((entry, index) => (\n        entry.node === b[index].node && entry.glyphCount === b[index].glyphCount\n    ));\n}\n\n/* Visibility dirtiness normally changes batch topology; keep the narrow no-op case off the glyph upload path. */\nfunction isVisibilityOnlyTextDirty(group) {\n    const kinds = resourceDirtyKinds(group);\n    return kinds.length > 0\n        && kinds.every(kind => kind === DIRTY.visibility || kind === DIRTY.instance)\n        && group.pendingTransformOnly !== true\n        && group.pendingOpacityOnly !== true;\n}\n\n/* Direct font or per-glyph colour changes preserve glyph geometry and span topology. */\nfunction isStyleOnlyTextDirty(group) {\n    const kinds = resourceDirtyKinds(group);\n    return kinds.includes(DIRTY.style)\n        && kinds.every(kind => kind === DIRTY.style || kind === DIRTY.instance)\n        && group.pendingTransformOnly !== true\n        && group.pendingOpacityOnly !== true;\n}\n\nfunction uploadMeasuredTextAttrib(gl, prefix, key, attribName, attrib, data) {\n    setBufferData(gl, attrib, data);\n}\n\nfunction updateTextGlyphBuffers(gl, ownGlBufferInfo, arrays, perf = null) {\n    if (perf) {\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_rect', ownGlBufferInfo.attribs.a_rect, arrays.a_rect.data);\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_texRect', ownGlBufferInfo.attribs.a_texRect, arrays.a_texRect.data);\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_atlas', ownGlBufferInfo.attribs.a_atlas, arrays.a_atlas.data);\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_span', ownGlBufferInfo.attribs.a_span, arrays.a_span.data);\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_color', ownGlBufferInfo.attribs.a_color, arrays.a_color.data);\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_id', ownGlBufferInfo.attribs.a_id, arrays.a_id.data);\n        return;\n    }\n    setBufferData(gl, ownGlBufferInfo.attribs.a_rect, arrays.a_rect.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.a_texRect, arrays.a_texRect.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.a_atlas, arrays.a_atlas.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.a_span, arrays.a_span.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.a_color, arrays.a_color.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.a_id, arrays.a_id.data);\n}\n\n/* Refresh only the packed colour stream when opacity changes without any glyph-layout changes. */\nfunction updateTextColorBuffer(gl, ownGlBufferInfo, arrays, perf = null) {\n    if (perf) {\n        uploadMeasuredTextAttrib(gl, perf.prefix, perf.key, 'a_color', ownGlBufferInfo.attribs.a_color, arrays.a_color.data);\n        return;\n    }\n    setBufferData(gl, ownGlBufferInfo.attribs.a_color, arrays.a_color.data);\n}\n\n/* Reuse the existing span-matrix texture and avoid texImage2D when the packed matrix data is unchanged. */\nfunction syncTextSpanMatrixTexture(gl, ownGlSpanMatrixTexture, upload, origin = 'evilfont.span_matrix_texture', opts = {}) {\n    const skipUpload = opts.skipUpload === true;\n    const reuseStorage = opts.reuseStorage === true;\n    let ownGlTexture = ownGlSpanMatrixTexture;\n    if (!ownGlTexture) {\n        ownGlTexture = gpuDiagWithResourceOrigin(`${origin}.create`, () => gl.createTexture());\n        gl.bindTexture(gl.TEXTURE_2D, ownGlTexture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n    } else {\n        gl.bindTexture(gl.TEXTURE_2D, ownGlTexture);\n    }\n    if (skipUpload && ownGlSpanMatrixTexture) {\n        return ownGlTexture;\n    }\n    gpuDiagWithResourceOrigin(`${origin}.upload`, () => {\n        if (reuseStorage) {\n            gl.texSubImage2D(\n                gl.TEXTURE_2D,\n                0,\n                0,\n                0,\n                upload.width,\n                upload.height,\n                gl.RGBA,\n                gl.FLOAT,\n                upload.data,\n            );\n            return;\n        }\n        gl.texImage2D(\n            gl.TEXTURE_2D,\n            0,\n            gl.RGBA32F,\n            upload.width,\n            upload.height,\n            0,\n            gl.RGBA,\n            gl.FLOAT,\n            upload.data,\n        );\n    });\n    return ownGlTexture;\n}\n\nfunction updateTextBuffers(gl, ownGlBufferInfo, arrays, perf = null) {\n    updateTextGlyphBuffers(gl, ownGlBufferInfo, arrays, perf);\n    ownGlBufferInfo.instanceCount = arrays.instanceCount;\n    return ownGlBufferInfo;\n}\n\nfunction totalTextGlyphArrayBytes(arrays, names) {\n    let total = 0;\n    for (const name of names) {\n        total += arrays[name]?.data?.byteLength ?? 0;\n    }\n    return total;\n}\n\nfunction totalTextTransformArrayBytes(arrays, names) {\n    let total = 0;\n    for (const name of names) {\n        total += arrays[name]?.byteLength ?? arrays[name]?.data?.byteLength ?? 0;\n    }\n    return total;\n}\n\n/* Clear text-group non-picker dirtiness and reset the pending transform-only eligibility latch. */\nfunction clearTextGroupNonPickerDirty(group) {\n    clearNonPickerResourceDirty(group);\n    group.pendingTransformOnly = null;\n    group.pendingOpacityOnly = null;\n}\n\nfunction syncTextGroupBufferInfo(gl, scene, group, baseQuad, perf, nodes) {\n    const fontName = group.font.name;\n    const presentationRev = scene?._presentationRevision ?? 0;\n    const drawScopeRoot = scene?._drawScopeRoot ?? null;\n    const presentationChanged = group.lastPresentationRevision !== presentationRev;\n    const drawScopeChanged = group.lastDrawScopeRoot !== drawScopeRoot;\n    const fullDirty = hasAnyResourceDirty(group, TEXT_FULL_BUFFER_KINDS);\n    const instanceDirty = hasAnyResourceDirty(group, TEXT_INSTANCE_BUFFER_KINDS);\n    const needsCreate = !group.ownGlBufferInfo && (group.settledEmpty !== true\n        || fullDirty || presentationChanged || drawScopeChanged || resourceDirtyKinds(group).includes(DIRTY.visibility));\n    const needsFullRebuild = drawScopeChanged || presentationChanged || needsCreate || fullDirty;\n    const needsInstanceUpdate = needsFullRebuild || instanceDirty;\n    const instanceOnly = !needsFullRebuild && instanceDirty;\n    const transformOnly = !needsFullRebuild && group.pendingTransformOnly === true;\n    const visibilityOnly = !needsFullRebuild && isVisibilityOnlyTextDirty(group);\n    const opacityOnly = !needsFullRebuild\n        && !transformOnly\n        && !visibilityOnly\n        && group.pendingOpacityOnly === true\n        && !!group.ownGlSpanMatrixTexture;\n    const styleOnly = !needsFullRebuild\n        && !transformOnly\n        && !visibilityOnly\n        && !opacityOnly\n        && isStyleOnlyTextDirty(group)\n        && !!group.ownGlSpanMatrixTexture;\n    const colorOnly = opacityOnly || styleOnly;\n    if (!needsInstanceUpdate) {\n        return group.ownGlBufferInfo;\n    }\n\n    const key = textGroupKey(group);\n    const tracker = perfTracker();\n    const syncToken = tracker?.beginTimer(`text_sync_group.${key}`);\n    countTextSyncReason(key, 'any');\n    if (presentationChanged) {\n        countTextSyncReason(key, 'presentation');\n    }\n    if (drawScopeChanged) {\n        countTextSyncReason(key, 'draw_scope');\n    }\n    if (needsCreate) {\n        countTextSyncReason(key, 'create');\n    }\n    if (fullDirty) {\n        for (const kind of TEXT_FULL_BUFFER_KINDS) {\n            if (hasAnyResourceDirty(group, kind)) {\n                countTextSyncReason(key, kind);\n            }\n        }\n    }\n    if (instanceDirty) {\n        for (const kind of TEXT_INSTANCE_BUFFER_KINDS) {\n            if (hasAnyResourceDirty(group, kind)) {\n                countTextSyncReason(key, kind);\n            }\n        }\n    }\n\n    const buildToken = tracker?.beginTimer(`text_build_arrays.${key}`);\n    let arrays = transformOnly || visibilityOnly\n        ? buildTextTransformBatchArrays(group, nodes)\n        : colorOnly\n            ? buildTextColorBatchArrays(group, nodes)\n            : buildTextBatchArrays(group, baseQuad, nodes);\n    const reusableVisibilityOnly = visibilityOnly\n        && sameDrawableNodeSignature(group.lastDrawableNodeSignature, arrays.drawableNodeSignature);\n    if (visibilityOnly && !reusableVisibilityOnly) {\n        arrays = buildTextBatchArrays(group, baseQuad, nodes);\n    }\n    tracker?.endTimer(`text_build_arrays.${key}`, buildToken);\n    countTextSyncStats(key, arrays);\n    if (arrays.usedAtlasIndices) group.usedAtlasIndices = arrays.usedAtlasIndices;\n    const maxTextureSize = requirePositiveGlInt(gl, gl.MAX_TEXTURE_SIZE, 'gl.MAX_TEXTURE_SIZE');\n    if (maxTextureSize === null) {\n        tracker?.endTimer(`text_sync_group.${key}`, syncToken);\n        return null;\n    }\n    const prevSpanDiag = group.lastSpanMatrixDiag ?? null;\n    const spanUpload = colorOnly\n        ? null\n        : buildSpanMatrixTextureUpload(maxTextureSize, arrays.spanCount, arrays.spanMatrices);\n    const spanDiag = colorOnly\n        ? (prevSpanDiag ?? { width: 0, height: 0, hash: 0 })\n        : describeSpanMatrixUpload(arrays.spanCount, spanUpload);\n    const spanChanged = colorOnly ? false : !sameSpanMatrixUpload(prevSpanDiag, spanDiag);\n    const scoped = !!group.textBatchScope;\n    const scopeKey = group.textBatchScope?.key ?? TEXT_BATCH_GLOBAL_KEY;\n    const syncReasons = [];\n    if (presentationChanged) syncReasons.push('presentation');\n    if (drawScopeChanged) syncReasons.push('draw_scope');\n    if (needsCreate) syncReasons.push('create');\n    if (fullDirty) {\n        for (const kind of TEXT_FULL_BUFFER_KINDS) {\n            if (hasAnyResourceDirty(group, kind)) {\n                syncReasons.push(kind);\n            }\n        }\n    }\n    if (instanceDirty) {\n        for (const kind of TEXT_INSTANCE_BUFFER_KINDS) {\n            if (hasAnyResourceDirty(group, kind)) {\n                syncReasons.push(kind);\n            }\n        }\n    }\n    gpuDiagNoteTextSync(key, {\n        reasons: syncReasons,\n        dirty_kinds: resourceDirtyKinds(group),\n        picker_batch_dirty: !!group.pickerBatchDirty,\n        picker_pose_dirty: !!group.pickerPoseDirty,\n        span_count: arrays.spanCount,\n        instance_count: arrays.instanceCount,\n        presented_node_count: arrays.presentedNodeCount,\n        visible_node_count: arrays.visibleNodeCount,\n        draw_scope_changed: drawScopeChanged,\n        presentation_changed: presentationChanged,\n        needs_create: needsCreate,\n        full_dirty: fullDirty,\n        instance_dirty: instanceDirty,\n        full_rebuild: needsFullRebuild,\n        instance_only: instanceOnly,\n        transform_only: transformOnly,\n        visibility_only: reusableVisibilityOnly,\n        opacity_only: opacityOnly,\n        style_only: styleOnly,\n        scoped,\n        scope_key: scopeKey,\n        span_changed: spanChanged,\n    });\n\n    if (arrays.instanceCount === 0) {\n        if (group.ownGlBufferInfo || group.ownGlSpanMatrixTexture) {\n            dropTextGroupGl(gl, group, 'syncTextGroupBufferInfo(empty_presented_set)');\n        }\n        group.instanceCount = 0;\n        group.spanCount = 0;\n        group.lastPresentationRevision = presentationRev;\n        group.lastDrawScopeRoot = drawScopeRoot;\n        group.lastSpanMatrixDiag = spanDiag;\n        if (group.settledEmpty !== true) {\n            noteTextGroupEvent(group, 'settled_empty', {\n                source: 'syncTextGroupBufferInfo(empty_presented_set)',\n                presented_node_count: arrays.presentedNodeCount ?? nodes.length,\n                visible_node_count: arrays.visibleNodeCount ?? null,\n                drawable_node_count: arrays.drawableNodeCount ?? null,\n                presented_glyph_count: arrays.presentedGlyphCount ?? null,\n                drawable_glyph_count: arrays.drawableGlyphCount ?? null,\n            });\n        }\n        group.settledEmpty = true;\n        tracker?.endTimer(`text_sync_group.${key}`, syncToken);\n        return null;\n    }\n    group.settledEmpty = false;\n\n    if (needsCreate) {\n        const createToken = tracker?.beginTimer(`text_create_buffer.${key}`);\n        group.ownGlBufferInfo = gpuDiagWithResourceOrigin(`evilfont.sync_group_buffer.${key}`, () => twgl.createBufferInfoFromArrays(gl, {\n            a_position: arrays.a_position,\n            a_rect: arrays.a_rect,\n            a_texRect: arrays.a_texRect,\n            a_atlas: arrays.a_atlas,\n            a_span: arrays.a_span,\n            a_color: arrays.a_color,\n            a_id: arrays.a_id,\n        }));\n        tracker?.endTimer(`text_create_buffer.${key}`, createToken);\n    }\n\n    if (!group.ownGlBufferInfo) {\n        tracker?.endTimer(`text_sync_group.${key}`, syncToken);\n        return null;\n    }\n    if ((transformOnly || reusableVisibilityOnly)\n        && (group.instanceCount !== arrays.instanceCount || group.spanCount !== arrays.spanCount)) {\n        throw new Error(\n            `syncTextGroupBufferInfo(${fontName}): narrow sync changed batch shape `\n            + `(instances ${group.instanceCount} -> ${arrays.instanceCount}, `\n            + `spans ${group.spanCount} -> ${arrays.spanCount}).`\n        );\n    }\n    if (colorOnly\n        && (group.instanceCount !== arrays.instanceCount || group.spanCount !== arrays.spanCount)) {\n        throw new Error(\n            `syncTextGroupBufferInfo(${fontName}): colour-only sync changed batch shape `\n            + `(instances ${group.instanceCount} -> ${arrays.instanceCount}, `\n            + `spans ${group.spanCount} -> ${arrays.spanCount}).`\n        );\n    }\n\n    const uploadToken = tracker?.beginTimer(`text_upload_buffers.${key}`);\n    if (!colorOnly) {\n        const texturePresentBeforeSync = !!group.ownGlSpanMatrixTexture;\n        const skipSpanUpload = !spanChanged && texturePresentBeforeSync;\n        const reuseSpanTextureStorage = !!prevSpanDiag\n            && texturePresentBeforeSync\n            && prevSpanDiag.width === spanUpload.width\n            && prevSpanDiag.height === spanUpload.height;\n        let spanSkipBlockReason = '';\n        if (!skipSpanUpload && !spanChanged) {\n            if (!texturePresentBeforeSync) {\n                spanSkipBlockReason = 'missing_texture';\n            }\n        }\n        group.ownGlSpanMatrixTexture = syncTextSpanMatrixTexture(\n            gl,\n            group.ownGlSpanMatrixTexture,\n            spanUpload,\n            `evilfont.sync_span_matrix_texture.${key}`,\n            {\n                skipUpload: skipSpanUpload,\n                reuseStorage: !skipSpanUpload && reuseSpanTextureStorage,\n            },\n        );\n        gpuDiagNoteTextSpanUpload(key, {\n            span_count: arrays.spanCount,\n            width: spanUpload.width,\n            height: spanUpload.height,\n            bytes: spanUpload.data.byteLength,\n            hash: spanDiag.hash,\n            prev_hash: prevSpanDiag?.hash ?? 0,\n            data_changed: spanChanged,\n            resized: !prevSpanDiag || prevSpanDiag.width !== spanUpload.width || prevSpanDiag.height !== spanUpload.height,\n            skipped: skipSpanUpload,\n            texture_present_before_sync: texturePresentBeforeSync,\n            skip_block_reason: spanSkipBlockReason,\n        });\n    }\n    if (colorOnly) {\n        updateTextColorBuffer(gl, group.ownGlBufferInfo, arrays, perf);\n    } else if (!transformOnly && !reusableVisibilityOnly) {\n        updateTextBuffers(gl, group.ownGlBufferInfo, arrays, perf);\n    }\n    tracker?.endTimer(`text_upload_buffers.${key}`, uploadToken);\n    if (typeof __PORTAL_PERF_BUILD__ !== 'undefined' && __PORTAL_PERF_BUILD__) {\n        if (needsCreate) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_recreate_events.text');\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.text',\n                totalTextGlyphArrayBytes(arrays, ['a_position', 'a_rect', 'a_texRect', 'a_atlas', 'a_span', 'a_color', 'a_id']),\n            );\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.text',\n                totalTextTransformArrayBytes(arrays, ['spanMatrices']),\n            );\n            globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_upload_events.text');\n        }\n        globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_upload_events.text');\n        if (colorOnly) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.text',\n                totalTextGlyphArrayBytes(arrays, ['a_color']),\n            );\n        } else if (!transformOnly && !reusableVisibilityOnly) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.text',\n                totalTextGlyphArrayBytes(arrays, ['a_rect', 'a_texRect', 'a_atlas', 'a_span', 'a_color', 'a_id']),\n            );\n        }\n        if (!colorOnly) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.text',\n                totalTextTransformArrayBytes(arrays, ['spanMatrices']),\n            );\n        }\n    }\n    group.instanceCount = arrays.instanceCount;\n    group.spanCount = arrays.spanCount;\n    group.lastPresentationRevision = presentationRev;\n    group.lastDrawScopeRoot = drawScopeRoot;\n    group.lastSpanMatrixDiag = spanDiag;\n    if (arrays.drawableNodeSignature) {\n        group.lastDrawableNodeSignature = arrays.drawableNodeSignature;\n    }\n    tracker?.endTimer(`text_sync_group.${key}`, syncToken);\n    return group.ownGlBufferInfo;\n}\n\nfunction syncMeasuredTextGroupBufferInfo(gl, scene, group, baseQuad, nodes) {\n    const key = textGroupKey(group);\n    const perf = { prefix: 'portal.scene.draw.text.MSDFText.sync_group_buffer', key };\n    return syncTextGroupBufferInfo(gl, scene, group, baseQuad, perf, nodes);\n}\n\n/* Acquire used atlases and prepare all sampler slots from one live context. */\nfunction collectTextAtlasTextures(gl, group) {\n    const palette = group.font.fontData.atlasFonts ?? [group.font];\n    const textures = [];\n    let ready = true;\n    if (group.usedAtlasIndices.length === 0) throw new Error(`Drawable text batch ${textGroupKey(group)} has no used atlas indices.`);\n    for (const index of group.usedAtlasIndices) {\n        const font = palette[index];\n        const texture = peekContextFontTexture(gl, font);\n        const state = contextFontTextureState(gl, font);\n        if (state !== 'idle' || !texture) {\n            if (state !== 'loading') font._onAcquireContext(gl, new WeakMap());\n            ready = false;\n        }\n        textures[index] = texture;\n    }\n    if (!ready) return null;\n    // Unused samplers borrow a live texture without allocating placeholders.\n    const liveTexture = textures.find(Boolean);\n    for (let index = 0; index < 4; index++) textures[index] ??= liveTexture;\n    return textures;\n}\n\nfunction setMeasuredTextTextureUniform(glProgram, t, font, textures, spanMatrixTexture, groupMatrix, presentationState, clipState) {\n    const palette = font.fontData.atlasFonts ?? [font];\n    const uniforms = {};\n    for (let index = 0; index < 4; index++) {\n        const suffix = index === 0 ? '' : String(index);\n        uniforms[`u_sdfTexture${suffix}`] = textures[index];\n        uniforms[`u_pxRange${suffix}`] = (palette[index] ?? font).fontData.pxRange;\n    }\n    twgl.setUniforms(glProgram, {\n        u_time: t,\n        ...uniforms,\n        u_spanMatrixTexture: spanMatrixTexture,\n        u_groupMatrix: groupMatrix,\n        ...presentationState,\n        ...clipState,\n    });\n}\n\nfunction drawMeasuredTextInstances(gl, pass, fontName, bufferInfo, instanceCount) {\n    const label = pass === 'transparent' ? 'MSDFTextTransparent' : 'MSDFText';\n    drawArraysInstancedChecked(gl, `${label}(${fontName})`, bufferInfo, instanceCount);\n}\n\nfunction drawTextPass(gl, res, cls, pass, viewMatrix, projectionMatrix, status = null) {\n    const borGlProgram = res.ownGlFontProgram;\n    const scene = res.scene;\n    const resPass = res.textPass ?? 'text';\n    if (status) {\n        status.response = ui.RENDER_STATUS.LOADING;\n    }\n    if (resPass !== pass) {\n        if (status) {\n            status.response = ui.RENDER_STATUS.READY;\n        }\n        return;\n    }\n    if (!borGlProgram || !glContextUsable(gl)) {\n        if (status && ![...res.groupByFont.values()].some(group =>\n            measurePresentedTextNodes(scene, group).some(node => node.computedVisible !== false && node.glyphCount() > 0))) {\n            status.response = ui.RENDER_STATUS.READY;\n        }\n        return;\n    }\n    let drew = false;\n    let pending = false;\n\n    gl.useProgram(borGlProgram.program);\n    twgl.setUniforms(borGlProgram, {\n        u_bias: cls.bias - 0.5,\n        u_projectionMatrix: projectionMatrix,\n        u_viewMatrix: viewMatrix,\n    });\n\n    for (const [fontName, group] of res.groupByFont) {\n        if (!glContextUsable(gl)) {\n            pending = true;\n            break;\n        }\n        const nodes = measurePresentedTextNodes(scene, group);\n        if (nodes.length === 0) {\n            continue;\n        }\n        if (needsTextGroupSync(group)) {\n            const batch = syncMeasuredTextGroupBufferInfo(gl, scene, group, cls.baseQuad, nodes);\n            if (!batch) {\n                if (!glContextUsable(gl)) { pending = true; break; }\n                clearTextGroupNonPickerDirty(group);\n                continue;\n            }\n            clearTextGroupNonPickerDirty(group);\n        }\n        if (!group.ownGlBufferInfo || group.instanceCount === 0) continue;\n        const textures = collectTextAtlasTextures(gl, group);\n        if (!textures) { pending = true; continue; }\n        const clipState = textClipUniformState(group, scene, nodes);\n\n        setMeasuredTextTextureUniform(\n            borGlProgram,\n            scene.stage?.frameNowS ?? 0,\n            group.font,\n            textures,\n            group.ownGlSpanMatrixTexture,\n            textBatchGroupMatrix(group, scene),\n            ui.presentationOffsetUniformState(textBatchScopeNode(group), scene, `MSDFText(${textGroupKey(group)})`),\n            clipState,\n        );\n        twgl.setBuffersAndAttributes(gl, borGlProgram, group.ownGlBufferInfo);\n        drawMeasuredTextInstances(gl, pass, fontName, group.ownGlBufferInfo, group.instanceCount);\n        drew = true;\n    }\n\n    if (!status) {\n        return;\n    }\n    if (!pending && (drew || res.groupByFont.size === 0)) {\n        status.response = ui.RENDER_STATUS.READY;\n        return;\n    }\n\n    let hasPresentedGroup = false;\n    for (const [, group] of res.groupByFont) {\n        if (measurePresentedTextNodes(scene, group).length > 0) {\n            hasPresentedGroup = true;\n            break;\n        }\n    }\n    if (!hasPresentedGroup || !pending) {\n        status.response = ui.RENDER_STATUS.READY;\n    }\n}\n\nexport class MSDFTextTransparent extends MSDFText {\n    constructor(state) {\n        super({\n            ...state,\n            pass: 'transparent',\n        });\n    }\n\n    // Scene registers the batch before attachment populates shared.textPass.\n    // This class always owns the transparent pass, including empty batches.\n    static _batchPassForShared(_res) {\n        return 'transparent';\n    }\n\n    static _drawText(gl, res, t, viewMatrix, projectionMatrix, status = null){\n        return MSDFText._drawText(gl, res, t, viewMatrix, projectionMatrix, status);\n    }\n\n    static _drawTransparent(gl, res, t, viewMatrix, projectionMatrix, status = null) {\n        return MSDFText._drawTransparent(gl, res, t, viewMatrix, projectionMatrix, status);\n    }\n}\n\nexport function summarizeSceneText(scene, { includeChildScenes = true } = {}) {\n    const summary = {\n        scene_count: 0,\n        font_group_count: 0,\n        dirty_group_count: 0,\n        text_node_count: 0,\n        visible_text_node_count: 0,\n        glyph_count: 0,\n        visible_glyph_count: 0,\n        total_text_chars: 0,\n        max_text_chars: 0,\n    };\n\n    function visitScene(sc) {\n        if (!sc) {\n            return;\n        }\n        summary.scene_count += 1;\n        const visitTextBatchers = (map) => {\n            for (const [, res] of map ?? []) {\n                if (res?.classConstructor !== MSDFText && res?.classConstructor !== MSDFTextTransparent) {\n                    continue;\n                }\n                for (const [, group] of res.groupByFont ?? []) {\n                    summary.font_group_count += 1;\n                    if (hasAnyResourceDirty(group)) {\n                        summary.dirty_group_count += 1;\n                    }\n                    for (const node of group.nodes ?? []) {\n                        const chars = node.state?.text?.length ?? 0;\n                        const glyphs = typeof node.glyphCount === 'function' ? node.glyphCount() : 0;\n                        const visible = node.computedVisible !== false;\n                        summary.text_node_count += 1;\n                        summary.total_text_chars += chars;\n                        summary.max_text_chars = Math.max(summary.max_text_chars, chars);\n                        summary.glyph_count += glyphs;\n                        if (visible) {\n                            summary.visible_text_node_count += 1;\n                            summary.visible_glyph_count += glyphs;\n                        }\n                    }\n                }\n            }\n        };\n        visitTextBatchers(sc?._textBatchers ?? null);\n        visitTextBatchers(sc?._transparentBatchers ?? null);\n        if (!includeChildScenes) {\n            return;\n        }\n    }\n\n    visitScene(scene);\n    return summary;\n}\n\n/* Report one global evilfont live-group summary so browser leak probes can separate retained text bookkeeping from chunk payloads. */\nexport function testingLiveTextGroupSummary() {\n    const groups = [...g_liveTextGroups];\n    const totals = {\n        groups: groups.length,\n        nodes: 0,\n        instance_count: 0,\n        span_count: 0,\n        with_gl_buffer: 0,\n        with_span_texture: 0,\n        dirty_groups: 0,\n        pending_transform_only: 0,\n        pending_opacity_only: 0,\n        settled_empty: 0,\n    };\n    const byScope = new Map();\n    const byFont = new Map();\n    const details = [];\n    const settledGroups = [];\n\n    for (const group of groups) {\n        const scopeKey = group?.textBatchScope?.key ?? TEXT_BATCH_GLOBAL_KEY;\n        const fontName = group?.font?.name ?? 'unknown';\n        const nodeCount = group?.nodes?.length ?? 0;\n        const instanceCount = group?.instanceCount ?? 0;\n        const spanCount = group?.spanCount ?? 0;\n        const dirtyKinds = resourceDirtyKinds(group);\n        const sampleScene = group?.nodes?.[0]?.scene ?? null;\n        const presentedNodeCount = sampleScene ? presentedTextNodes(sampleScene, group).length : 0;\n        totals.nodes += nodeCount;\n        totals.instance_count += instanceCount;\n        totals.span_count += spanCount;\n        totals.with_gl_buffer += group?.ownGlBufferInfo ? 1 : 0;\n        totals.with_span_texture += group?.ownGlSpanMatrixTexture ? 1 : 0;\n        totals.dirty_groups += dirtyKinds.length > 0 ? 1 : 0;\n        totals.pending_transform_only += group?.pendingTransformOnly === true ? 1 : 0;\n        totals.pending_opacity_only += group?.pendingOpacityOnly === true ? 1 : 0;\n        totals.settled_empty += group?.settledEmpty === true ? 1 : 0;\n\n        const scopeStat = byScope.get(scopeKey) ?? {\n            scope_key: scopeKey,\n            groups: 0,\n            nodes: 0,\n            instance_count: 0,\n            span_count: 0,\n        };\n        scopeStat.groups += 1;\n        scopeStat.nodes += nodeCount;\n        scopeStat.instance_count += instanceCount;\n        scopeStat.span_count += spanCount;\n        byScope.set(scopeKey, scopeStat);\n\n        const fontStat = byFont.get(fontName) ?? {\n            font_name: fontName,\n            groups: 0,\n            nodes: 0,\n            instance_count: 0,\n            span_count: 0,\n        };\n        fontStat.groups += 1;\n        fontStat.nodes += nodeCount;\n        fontStat.instance_count += instanceCount;\n        fontStat.span_count += spanCount;\n        byFont.set(fontName, fontStat);\n\n        details.push({\n            scope_key: scopeKey,\n            scope_kind: scopeKey.includes('.chunk.') ? 'chunk' : (scopeKey.endsWith('.header.text') ? 'header' : 'other'),\n            font_name: fontName,\n            text_pass: group?.textPass ?? 'text',\n            node_count: nodeCount,\n            instance_count: instanceCount,\n            span_count: spanCount,\n            has_gl_buffer: !!group?.ownGlBufferInfo,\n            has_span_texture: !!group?.ownGlSpanMatrixTexture,\n            dirty_kinds: dirtyKinds,\n            pending_transform_only: group?.pendingTransformOnly === true,\n            pending_opacity_only: group?.pendingOpacityOnly === true,\n            settled_empty: group?.settledEmpty === true,\n            owner_resource_key: group?.ownerResourceKey ?? 'unknown',\n            presented_node_count: presentedNodeCount,\n            last_lifecycle_event: group?.lastLifecycleEvent ?? null,\n            last_settled_event: group?.lastSettledEvent ?? null,\n            last_revived_event: group?.lastRevivedEvent ?? null,\n        });\n        if (group?.settledEmpty === true) {\n            settledGroups.push({\n                scope_key: scopeKey,\n                font_name: fontName,\n                text_pass: group?.textPass ?? 'text',\n                node_count: nodeCount,\n                node_names: (group?.nodes ?? []).slice(0, 4).map((node) => node?.state?.name ?? node?.constructor?.name ?? 'unknown'),\n                presented_node_count: presentedNodeCount,\n                instance_count: instanceCount,\n                span_count: spanCount,\n                owner_resource_key: group?.ownerResourceKey ?? 'unknown',\n                last_settled_event: group?.lastSettledEvent ?? null,\n                last_revived_event: group?.lastRevivedEvent ?? null,\n            });\n        }\n    }\n\n    details.sort((a, b) => b.node_count - a.node_count || b.instance_count - a.instance_count || a.scope_key.localeCompare(b.scope_key));\n    return {\n        totals,\n        by_scope: [...byScope.values()].sort((a, b) => b.nodes - a.nodes || a.scope_key.localeCompare(b.scope_key)).slice(0, 24),\n        by_font: [...byFont.values()].sort((a, b) => b.nodes - a.nodes || a.font_name.localeCompare(b.font_name)),\n        top_groups: details.slice(0, 24),\n        settled_groups: settledGroups\n            .sort((a, b) => b.node_count - a.node_count || a.scope_key.localeCompare(b.scope_key))\n            .slice(0, 24),\n        recent_events: g_textGroupEvents.slice(-32).reverse(),\n    };\n}\n\n/*\n    Typesetting itself, based on font metrics. No dependence on the WebGL context.\n\n    Technically the answer depends on where we are in the canvas / parent\n    space, but text is only expected to vary in sub-pixel detail as it is moved\n    around the screen.\n*/\nfunction layoutTextWithGlyphs(fontData, config) {\n    const codepoints = normalizeTextCodepoints(config);\n    const fontSize = config.fontSize ?? 1;\n    if (!Number.isFinite(fontSize) || fontSize <= 0) throw new Error('Text fontSize must be finite and positive.');\n\n    let cursorX = 0;\n    let line = 0;\n\n    const lineHeight = fontData.lineHeight * fontSize;\n    const lineAdvance = Number.isFinite(config.lineAdvance) && config.lineAdvance > 0\n        ? config.lineAdvance\n        : lineHeight;\n\n    let maxWidth = 0;\n\n    let totalHeight = lineHeight;\n\n    const positions = [];\n    const shapedCodepoints = [];\n    const resolvedGlyphs = [];\n    const atlasIndices = [];\n\n    for (let i = 0; i < codepoints.length; i++) {\n        const codepoint = codepoints[i];\n\n        // Handle Windows CRLF as a single newline\n        if (codepoint === 13) {\n            if (codepoints[i + 1] === 10) i++;\n            cursorX = 0;\n            line++;\n            totalHeight += lineAdvance;\n            continue;\n        }\n\n        // Handle Unix newline\n        if (codepoint === 10) {\n            cursorX = 0;\n            line++;\n            totalHeight += lineAdvance;\n            continue;\n        }\n\n        const resolved = resolveGlyphForSymbol(fontData, codepoint);\n        const glyph = resolved.glyph;\n\n        if (!glyph.planeBounds) {\n            cursorX += glyph.advance * fontSize;\n            maxWidth = Math.max(cursorX, maxWidth);\n            continue;\n        }\n\n        // Local coordinates for UI have (0, 0) at top-left, but fonts have (0, 0)\n        // at bottom-left (start of baseline), hence why we adjust. We can't adjust\n        // by a full lineHeight, however, since that includes the whitespace between\n        // lines as well, hence we use \"ascender\" instead, which will be of order 70%\n        // of the full lineHeight.\n        const ascender = fontData.ascender * fontSize;\n        const cursorY = ascender + line * lineAdvance;\n\n        positions.push(cursorX, cursorY);\n        shapedCodepoints.push(codepoint);\n        resolvedGlyphs.push(glyph);\n        atlasIndices.push(resolved.atlasIndex);\n\n        cursorX += glyph.advance * fontSize;\n\n        maxWidth = Math.max(cursorX, maxWidth);\n    }\n\n    return {\n        layout: {\n            width: maxWidth,\n            height: totalHeight,\n            lineHeight,\n            lineAdvance,\n            positions: Float32Array.from(positions), // packed [x, y] pairs per drawable glyph\n            codepoints: Uint32Array.from(shapedCodepoints),\n            atlasIndices: Uint8Array.from(atlasIndices),\n        },\n        resolvedGlyphs,\n    };\n}\n\n/*\n    Create WebGL buffers with typeset layout i.e. bake (x, y) for each glyph\n    in a string into a vertex buffer.\n*/\n\nfunction buildGlyphData(config, layout, resolvedGlyphs) {\n    const glyphCount = layout.codepoints.length;\n    const rects = new Float32Array(glyphCount * 4);\n    const texRects = new Float32Array(glyphCount * 4);\n\n    for (let i = 0; i < glyphCount; i++) {\n        const cursorX = layout.positions[i * 2];\n        const cursorY = layout.positions[i * 2 + 1];\n        const glyph = resolvedGlyphs[i];\n        if (!glyph.planeBounds) throw new Error(`Drawable glyph ${i} lacks plane bounds.`);\n\n        const [tex_x, tex_y_bottom, tex_w, tex_h] = glyph.tex_rect;\n        const b = glyph.planeBounds;\n\n        const x0 = cursorX + (b.left * config.fontSize);\n        const x1 = cursorX + (b.right * config.fontSize);\n        const y0 = (cursorY - (b.top * config.fontSize)) + 0.5;\n        const y1 = (cursorY - (b.bottom * config.fontSize)) + 0.5;\n\n        const rectOffset = i * 4;\n        rects[rectOffset] = x0;\n        rects[rectOffset + 1] = y0;\n        rects[rectOffset + 2] = x1;\n        rects[rectOffset + 3] = y1;\n\n        const vTop = 1.0 - (tex_y_bottom + tex_h);\n        const vBottom = 1.0 - tex_y_bottom;\n        texRects[rectOffset] = tex_x;\n        texRects[rectOffset + 1] = vTop;\n        texRects[rectOffset + 2] = tex_x + tex_w;\n        texRects[rectOffset + 3] = vBottom;\n    }\n    return {\n        glyphCount,\n        rects,\n        texRects,\n        atlasIndices: layout.atlasIndices,\n    };\n}\n\n\nfunction loadTexture(gl, url, { origin = 'evilfont.texture', atlas, shouldUpload = null, onReady = null, onError = null } = {}) {\n    const tex = gpuDiagWithResourceOrigin(`${origin}.create`, () => gl.createTexture());\n    gl.bindTexture(gl.TEXTURE_2D, tex);\n    gpuDiagWithResourceOrigin(`${origin}.placeholder_upload`, () => {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 255, 255]));\n    });\n    const img = new Image();\n    img.crossOrigin = 'anonymous';\n    img.onload = () => {\n        if (shouldUpload && !shouldUpload(tex)) {\n            gl.deleteTexture(tex);\n            return;\n        }\n        if (img.width !== atlas.width || img.height !== atlas.height) {\n            gl.deleteTexture(tex);\n            onError(tex);\n            throw new Error(`Font atlas ${url}: expected ${atlas.width}x${atlas.height}, got ${img.width}x${img.height}. Publish matching JSON and PNG files.`);\n        }\n        gl.bindTexture(gl.TEXTURE_2D, tex);\n        gpuDiagWithResourceOrigin(`${origin}.image_upload`, () => {\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n        });\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n        onReady && onReady();\n    };\n    img.onerror = () => {\n        if (shouldUpload && !shouldUpload(tex)) {\n            gl.deleteTexture(tex);\n            return;\n        }\n        gl.deleteTexture(tex);\n        console.error('Failed to load texture:', url);\n        onError && onError(tex);\n    };\n    img.src = url;\n    return tex;\n}\n\nasync function loadFontData(url) {\n    const res = await fetch(url);\n    if (!res.ok) throw new Error(`Failed to fetch font data ${url}: HTTP ${res.status}`);\n    const data = await res.json();\n\n    return fontDataFromAsset(data, url);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// DO NOT EDIT -- changes are made through ptrless/common/constants.csv\n\n\n/**\n    Flag indicating this is experimental functionality, and requires explicit\n    opt-in.\n*/\nexport const EXPERIMENTAL = 0x8n;\n\n/**\n    For use as an `opts` argument to a `ptl` function. Indicates that metadata\n    should be included in debugging output.\n*/\nexport const SHOW_META = 0x1n;\n/**\n    For use as an `opts` argument to a `ptl` function. Indicates that the\n    returned object should be thoroughly validated for internal consistency.\n    This is for use in testing and debugging, and should not normally be set in\n    production usage, as it can have a performance impact.\n*/\nexport const VALIDATE = 0x2n;\n/**\n    For use as an `opts` argument to a `ptl` function. Indicates that null\n    values are also to be treated as a pass (true) rather than virally\n    infecting the output and making it null.\n*/\nexport const OR_NULL = 0x4n;\n/**\n    For use as an `opts` argument to a `ptl` function. Indicates that the\n    output object is temporary and will not tracked by the garbage collector,\n    thus needs to be explicitly destroyed with `ptl_free`.  Used, for example,\n    for intermediate calculations that are manually discarded after use.\n*/\nexport const TRANSIENT = 0x8n;\n/**\n    For use as an `opts` argument in `ptl_op1_sort` to indicate that sorting\n    via ascending order is desired.\n*/\nexport const ASCENDING = 0x0n;\n/**\n    For use as an `opts` argument in `ptl_op1_sort` to indicate that sorting\n    via descending order is desired.\n*/\nexport const DESCENDING = 0x10n;\n/**\n    For use with some low-level functions, asks them to calculate how much\n    memory needs to be passed into the function for it to succeed. The caller\n    would then invoke a second time with preallocated arrays.\n*/\nexport const CALC_SIZE = (0x1n) << 0x34n;\n\n/** Bit position where the `form` bitfield starts. */\nexport const form_SHIFT = 0x3n;\n/** Bitmask for selecting only the form bitfield. */\nexport const form_MASK = (0x3n) << form_SHIFT;\n/** Default physical form. */\nexport const form_DEFAULT = (0x0n) << form_SHIFT;\n/**\n    Physical form as an arithmetic sequence. Uses constant space to represent a\n    regular pattern like 1, 2, 3, ...\n*/\nexport const form_ARITHMETIC = (0x3n) << form_SHIFT;\n\n/** Bit position where the `inner` logical type bitfield starts. */\nexport const inner_SHIFT = 0x9n;\n/**\n    Bit that indicates if the bitwidth forms part of the logical type. (This is\n    embedded within :macro:`ptlf_inner_MASK`)\n*/\nexport const BITWIDTH_IS_LOGICAL_BIT = (0x8n) << inner_SHIFT;\n/**\n    Legacy hint bit for integral-family classification. Prefer inequality-based\n    checks via :macro:`ptlf_IS_INTEGRAL`.\n*/\nexport const inner_INTEGRAL_BIT = (0x40n) << inner_SHIFT;\n/** Mask which picks out only bits determining the inner logical type. */\nexport const inner_MASK = (0x7fn) << inner_SHIFT;\n/**\n    Mask for upper inner subfield bits that affect both logical and physical\n    typing.\n*/\nexport const inner_shared_MASK = (0x70n) << inner_SHIFT;\n/** Mask for lower inner subfield bits that affect only logical typing. */\nexport const inner_pure_MASK = (0xfn) << inner_SHIFT;\n/** Shared inner-family bits for no-inner. */\nexport const inner_shared_NONE = (0x0n) << inner_SHIFT;\n/** Shared inner-family bits for untyped literals. */\nexport const inner_shared_UNTYPED = (0x10n) << inner_SHIFT;\n/** Shared inner-family bits for bytes-like types (BIN/STR/BINFIX/STRFIX). */\nexport const inner_shared_BYTES = (0x20n) << inner_SHIFT;\n/** Shared inner-family bits for Bool. */\nexport const inner_shared_BOOL = (0x30n) << inner_SHIFT;\n/** Shared inner-family bits for signed/inferred integral families. */\nexport const inner_shared_INTEGRAL = (0x40n) << inner_SHIFT;\n/** Shared inner-family bits for unsigned integral families. */\nexport const inner_shared_UINTEGRAL = (0x50n) << inner_SHIFT;\n/** Shared inner-family bits for floating-point families. */\nexport const inner_shared_FLOAT = (0x60n) << inner_SHIFT;\n/** Pure inner subtype bits for deprecated null logical type. */\nexport const inner_pure_NULL = (0x1n) << inner_SHIFT;\n/** Pure inner subtype bits for BIN. */\nexport const inner_pure_BIN = (0x0n) << inner_SHIFT;\n/** Pure inner subtype bits for STR. */\nexport const inner_pure_STR = (0x1n) << inner_SHIFT;\n/** Pure inner subtype bits for BINFIX. */\nexport const inner_pure_BINFIX = (0x2n) << inner_SHIFT;\n/** Pure inner subtype bits for STRFIX. */\nexport const inner_pure_STRFIX = (0x3n) << inner_SHIFT;\n/** Pure inner subtype bits for ENUM. */\nexport const inner_pure_ENUM = (0x0n) << inner_SHIFT;\n/** Pure inner subtype bits for INDEX. */\nexport const inner_pure_INDEX = (0x1n) << inner_SHIFT;\n/** Pure inner subtype bits for INT. */\nexport const inner_pure_INT = (0x2n) << inner_SHIFT;\n/** Pure inner subtype bits for INTNN. */\nexport const inner_pure_INTNN = (0xan) << inner_SHIFT;\n/** Pure inner subtype bits for SATNN. */\nexport const inner_pure_SATNN = (0xbn) << inner_SHIFT;\n/** Pure inner subtype bits for GALOISNN. */\nexport const inner_pure_GALOISNN = (0xcn) << inner_SHIFT;\n/** Pure inner subtype bits for UINT. */\nexport const inner_pure_UINT = (0x2n) << inner_SHIFT;\n/** Pure inner subtype bits for UINTNN. */\nexport const inner_pure_UINTNN = (0xan) << inner_SHIFT;\n/** Pure inner subtype bits for USATNN. */\nexport const inner_pure_USATNN = (0xbn) << inner_SHIFT;\n/** Pure inner subtype bits for UGALOISNN. */\nexport const inner_pure_UGALOISNN = (0xcn) << inner_SHIFT;\n/** Pure inner subtype bits for FLOATNN. */\nexport const inner_pure_FLOATNN = (0x8n) << inner_SHIFT;\n/** Pure inner subtype bits for BFLOATNN. */\nexport const inner_pure_BFLOATNN = (0x9n) << inner_SHIFT;\n/**\n    No inner logical type. Used when outer logical is a heterogenous compound,\n    like a Struct.\n*/\nexport const inner_NONE = (0x0n) << inner_SHIFT;\n/** Deprecated null logical type. Prefer untyped null. */\nexport const inner_NULL = (0x1n) << inner_SHIFT;\n/**\n    Represents an untyped value, this adapts automatically to other operands'\n    types.\n*/\nexport const inner_UNTYPED = (0x10n) << inner_SHIFT;\n/** Binary blob type. This is variable width per row. */\nexport const inner_BIN = (0x20n) << inner_SHIFT;\n/**\n    String type. This is variable length per row. Should always be valid UTF8\n    data.\n*/\nexport const inner_STR = (0x21n) << inner_SHIFT;\n/**\n    Binary blob type of fixed width. Every instance will have exactly the same\n    length.\n*/\nexport const inner_BINFIX = (0x22n) << inner_SHIFT;\n/** String type. This is fixed length per row. Should always be valid UTF8 data. */\nexport const inner_STRFIX = (0x23n) << inner_SHIFT;\n/** Boolean type, meaning either `true` or `false`. */\nexport const inner_BOOL = (0x30n) << inner_SHIFT;\n/**\n    Enumeration type. This is an integer, but where it corresponds 1-to-1 with\n    a string.\n*/\nexport const inner_ENUM = (0x40n) << inner_SHIFT;\n/**\n    Enumeration type. This is an integer, but where it corresponds 1-to-1 with\n    a string. Enums are strongly typed, such that the set of strings accepted\n    by one enumerated type generally differs from any others.\n*/\nexport const inner_INDEX = (0x41n) << inner_SHIFT;\n/**\n    Signed integer. This is the default integer type that users should apply\n    most of the time. It is not a fixed width, instead it gets adjusted\n    dynamically based on the actual range of the data, but it does top out at\n    64 bits i.e. 2^63 is the biggest integer representable. Outside that range\n    it will overflow (not wrap around).\n*/\nexport const inner_INT = (0x42n) << inner_SHIFT;\n/**\n    Integer of explicit bitwidth. This is always stored in this many bits. It\n    will overflow instead of wrapping around.\n*/\nexport const inner_INTNN = (0x4an) << inner_SHIFT;\n/**\n    Saturated integer. Will saturate to min/max instead of overflow/underflow\n    or wraparound.\n*/\nexport const inner_SATNN = (0x4bn) << inner_SHIFT;\n/** Signed Galois integer i.e. integer with wraparound. */\nexport const inner_GALOISNN = (0x4cn) << inner_SHIFT;\n/**\n    Unsigned integer of flexible bitwidth. Pointerless will select bitwidth\n    automatically at runtime to represent full range, up to 2^64 \u2013 1.\n*/\nexport const inner_UINT = (0x52n) << inner_SHIFT;\n/**\n    Unsigned integer of specific bitwidth. Overflows rather than wraps around.\n    See bitwidth field for the width, which does form part of the logical type.\n*/\nexport const inner_UINTNN = (0x5an) << inner_SHIFT;\n/**\n    Integer of explicit bitwidth. This is always stored in this many bits. It\n    will overflow instead of wrapping around.\n*/\nexport const inner_USATNN = (0x5bn) << inner_SHIFT;\n/**\n    Galois field i.e. integer with wraparound. Equivalent to standard integers\n    in many programming languages.\n*/\nexport const inner_UGALOISNN = (0x5cn) << inner_SHIFT;\n/**\n    IEEE754 floating point value of specific bitwidth. See bitwidth field for\n    the width, which does form part of the logical type.\n*/\nexport const inner_FLOATNN = (0x68n) << inner_SHIFT;\n/** Google Brain floating point value. */\nexport const inner_BFLOATNN = (0x69n) << inner_SHIFT;\n\n\n// This is always the physical bitwidth. If offsets are used by the type, it\n// refers to that, otherwise the values themselves. This forms part of the\n// logical type if and only if the high bit of inner is set.\n/** Index of first bit which is part of the `bitwidth` field. */\nexport const bitwidth_SHIFT = 0x5n;\n/** Select the ``bitwidth`` bitfield from a flags value. */\nexport const bitwidth_MASK = (0xfn) << bitwidth_SHIFT;\n/**\n    Indicates the bitwidth field is not relevant for this type. (NB: shadows\n    :macro:`ptlf_bitwidth_1`).\n*/\nexport const bitwidth_NA = (0x0n) << bitwidth_SHIFT;\n/**\n    Indicates the bitwidth is 1 bit per array entry. (NB: shadows\n    :macro:`ptlf_bitwidth_NA`).\n*/\nexport const bitwidth_1 = (0x0n) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 8 bits per array entry. */\nexport const bitwidth_8 = (0x6n) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 16 bits per array entry. */\nexport const bitwidth_16 = (0x8n) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 24 bits per array entry. */\nexport const bitwidth_24 = (0x9n) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 32 bits per array entry. */\nexport const bitwidth_32 = (0xan) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 48 bits per array entry. */\nexport const bitwidth_48 = (0xbn) << bitwidth_SHIFT;\n/** Indicates the bitwidth is 64 bits per array entry. */\nexport const bitwidth_64 = (0xcn) << bitwidth_SHIFT;\n/** Combined with ptlf_bitwidth_UNTYPED means an untyped zero. */\nexport const bitwidth_UNTYPED_ZERO = (0x0n) << bitwidth_SHIFT;\n/** Combined with ptlf_bitwidth_UNTYPED means an untyped one. */\nexport const bitwidth_UNTYPED_ONE = (0x1n) << bitwidth_SHIFT;\n/** Combined with ptlf_bitwidth_UNTYPED means an untyped null. */\nexport const bitwidth_UNTYPED_NULL = (0x2n) << bitwidth_SHIFT;\n/** Combined with ptlf_bitwidth_UNTYPED means an untyped identity. */\nexport const bitwidth_UNTYPED_IDENTITY = (0x3n) << bitwidth_SHIFT;\n/**\n    Combined with ptlf_bitwidth_UNTYPED means an untyped \"i\" (square root of\n    minus one).\n*/\nexport const bitwidth_UNTYPED_IMAGINARY_UNIT = (0x4n) << bitwidth_SHIFT;\n\n/** Index of first bit which is part of the `outer` logical type bitfield. */\nexport const outer_SHIFT = 0x10n;\n/** Bitmask for seleting only the `outer` logical type bitfield. */\nexport const outer_MASK = (0x3fn) << outer_SHIFT;\n/**\n    Mask for upper outer subfield bits that affect both logical and physical\n    typing.\n*/\nexport const outer_shared_MASK = (0x38n) << outer_SHIFT;\n/** Mask for lower outer subfield bits that affect only logical typing. */\nexport const outer_pure_MASK = (0x7n) << outer_SHIFT;\n/** Shared outer-family bits for zero/invalid sentinel. */\nexport const outer_shared_NONE = (0x0n) << outer_SHIFT;\n/** Shared outer-family bits for scalar. */\nexport const outer_shared_SCALAR = (0x8n) << outer_SHIFT;\n/** Shared outer-family bits for array families (ARRAY_*). */\nexport const outer_shared_ARRAY = (0x18n) << outer_SHIFT;\n/** Shared outer-family bits for homo families (HOMO_*). */\nexport const outer_shared_HOMO = (0x10n) << outer_SHIFT;\n/**\n    Shared outer-family bits for hetero families\n    (STRUCT/TUPLE/NAMED_TUPLE/UNION/DICT).\n*/\nexport const outer_shared_HETERO = (0x20n) << outer_SHIFT;\n/**\n    Shared outer-family bits for runtime sentinel/indirection families (for\n    example Lazy).\n*/\nexport const outer_shared_RUNTIME = (0x28n) << outer_SHIFT;\n/** Shared outer-family bits for LogicalAxis wrappers. */\nexport const outer_shared_LOGICAL_AXIS = (0x30n) << outer_SHIFT;\n/** Pure outer subtype bits for scalar. */\nexport const outer_pure_SCALAR = (0x0n) << outer_SHIFT;\n/** Pure outer subtype bits for STRUCT. */\nexport const outer_pure_STRUCT = (0x1n) << outer_SHIFT;\n/** Pure outer subtype bits for TUPLE. */\nexport const outer_pure_TUPLE = (0x2n) << outer_SHIFT;\n/** Pure outer subtype bits for NAMED_TUPLE. */\nexport const outer_pure_NAMED_TUPLE = (0x3n) << outer_SHIFT;\n/** Pure outer subtype bits for UNION. */\nexport const outer_pure_UNION = (0x4n) << outer_SHIFT;\n/** Pure outer subtype bits for DICT. */\nexport const outer_pure_DICT = (0x5n) << outer_SHIFT;\n/** Pure outer subtype bits for VEC families (ARRAY_VEC/HOMO_VEC). */\nexport const outer_pure_VEC = (0x2n) << outer_SHIFT;\n/** Pure outer subtype bits for LIST families (ARRAY_LIST/HOMO_LIST). */\nexport const outer_pure_LIST = (0x3n) << outer_SHIFT;\n/** Pure outer subtype bits for SET families (ARRAY_SET/HOMO_SET). */\nexport const outer_pure_SET = (0x5n) << outer_SHIFT;\n/** Pure outer subtype bits for BAG families (ARRAY_BAG/HOMO_BAG). */\nexport const outer_pure_BAG = (0x7n) << outer_SHIFT;\n/** Pure outer subtype bits for hashed Lazy runtime placeholders. */\nexport const outer_pure_LAZY_HASHED = (0x0n) << outer_SHIFT;\n/** Pure outer subtype bits for handle-backed Lazy runtime placeholders. */\nexport const outer_pure_LAZY_HANDLE = (0x1n) << outer_SHIFT;\n/** Pure outer subtype bits for derived Lazy runtime placeholders. */\nexport const outer_pure_LAZY_DERIVED = (0x2n) << outer_SHIFT;\n/** Pure outer subtype bits for chunked runtime wrappers. */\nexport const outer_pure_CHUNKED = (0x4n) << outer_SHIFT;\n/** Scalar outer type. This is the canonical scalar outer encoding. */\nexport const outer_SCALAR = (0x8n) << outer_SHIFT;\n/**\n    Deprecated alias for a zero/invalid outer encoding. Prefer\n    :macro:`ptlf_outer_SCALAR`.\n*/\nexport const outer_NONE = (0x0n) << outer_SHIFT;\n/**\n    A Struct type. (:macro:`ptlf_inner_MASK` should be zero / ignored for this\n    type.)\n*/\nexport const outer_STRUCT = (0x21n) << outer_SHIFT;\n/**\n    A Tuple type. (:macro:`ptlf_inner_MASK` should be zero / ignored for this\n    type.)\n*/\nexport const outer_TUPLE = (0x22n) << outer_SHIFT;\n/**\n    A Named Tuple type. (:macro:`ptlf_inner_MASK` should be zero / ignored for\n    this type.)\n*/\nexport const outer_NAMED_TUPLE = (0x23n) << outer_SHIFT;\n/**\n    A Union type. (:macro:`ptlf_inner_MASK` should be zero / ignored for this\n    type.)\n*/\nexport const outer_UNION = (0x24n) << outer_SHIFT;\n/**\n    A Dict type, representing a dictionary. (:macro:`ptlf_inner_MASK` should be\n    zero / ignored for this type.)\n*/\nexport const outer_DICT = (0x25n) << outer_SHIFT;\n/**\n    A Vector i.e. an array of fixed length. The data type within the vector is\n    given by :macro:`ptlf_inner_MASK`.\n*/\nexport const outer_ARRAY_VEC = (0x1an) << outer_SHIFT;\n/**\n    A List i.e. an array of variable length. The position is assumed to be\n    meaningful. The data type within the vector is given by\n    :macro:`ptlf_inner_MASK`.\n*/\nexport const outer_ARRAY_LIST = (0x1bn) << outer_SHIFT;\n/**\n    A Set i.e. an array of variable length, where the position within the set\n    is assumed to be arbitrary. Sets should not contain duplicates of the same\n    item. The data type within the vector is given by :macro:`ptlf_inner_MASK`.\n*/\nexport const outer_ARRAY_SET = (0x1dn) << outer_SHIFT;\n/**\n    A bag is a collection of items which may be duplicated, and whose position\n    within the collection is arbitrary. This is the most general (least\n    constrained) of the homogenous types.\n*/\nexport const outer_ARRAY_BAG = (0x1fn) << outer_SHIFT;\n/**\n    A vector of nested homogeneous values (inner is expected to be\n    :macro:`ptlf_inner_NONE`).\n*/\nexport const outer_HOMO_VEC = (0x12n) << outer_SHIFT;\n/**\n    A list of nested homogeneous values (inner is expected to be\n    :macro:`ptlf_inner_NONE`).\n*/\nexport const outer_HOMO_LIST = (0x13n) << outer_SHIFT;\n/**\n    A set of nested homogeneous values (inner is expected to be\n    :macro:`ptlf_inner_NONE`).\n*/\nexport const outer_HOMO_SET = (0x15n) << outer_SHIFT;\n/**\n    A bag of nested homogeneous values (inner is expected to be\n    :macro:`ptlf_inner_NONE`).\n*/\nexport const outer_HOMO_BAG = (0x17n) << outer_SHIFT;\n/**\n    A hashed Lazy runtime placeholder. This preserves a stored content hash\n    while deferring payload materialisation.\n*/\nexport const outer_LAZY_HASHED = (0x28n) << outer_SHIFT;\n/**\n    A handle-backed Lazy runtime placeholder. This preserves an external\n    runtime handle while the final content hash is still undecided.\n*/\nexport const outer_LAZY_HANDLE = (0x29n) << outer_SHIFT;\n/**\n    A derived Lazy runtime placeholder. This preserves typed shape for a\n    blocked derived result that is not directly materialisable.\n*/\nexport const outer_LAZY_DERIVED = (0x2an) << outer_SHIFT;\n/**\n    A Vec LogicalAxis wrapper carrying an axis declaration and a physical\n    tensor subtree.\n*/\nexport const outer_LOGICAL_AXIS_VEC = (0x32n) << outer_SHIFT;\n/**\n    A List LogicalAxis wrapper carrying an axis declaration and a physical\n    tensor subtree.\n*/\nexport const outer_LOGICAL_AXIS_LIST = (0x33n) << outer_SHIFT;\n/**\n    A Set LogicalAxis wrapper carrying an axis declaration and a physical\n    tensor subtree.\n*/\nexport const outer_LOGICAL_AXIS_SET = (0x35n) << outer_SHIFT;\n/**\n    A Bag LogicalAxis wrapper carrying an axis declaration and a physical\n    tensor subtree.\n*/\nexport const outer_LOGICAL_AXIS_BAG = (0x37n) << outer_SHIFT;\n/**\n    The default List LogicalAxis wrapper carrying an axis declaration and a\n    physical tensor subtree.\n*/\nexport const outer_LOGICAL_AXIS = (0x33n) << outer_SHIFT;\n/**\n    A chunked runtime wrapper. This preserves concrete metadata while exposing\n    one or more materialised chunks together with deferred continuation.\n*/\nexport const outer_CHUNKED = (0x2cn) << outer_SHIFT;\n/**\n    A Lazy runtime placeholder. This preserves identity/hash while deferring\n    payload materialisation.\n*/\nexport const outer_LAZY = (0x28n) << outer_SHIFT;\n\n/** Index of first bit which is part of the `unit` bitfield. */\nexport const unit_SHIFT = 0x30n;\n/** Bitmask selecting the `unit` bitfield. (Not implemented yet.) */\nexport const unit_MASK = (0x3n) << unit_SHIFT;\n/** bare number, string, etc. */\nexport const unit_BARE = (0x0n) << unit_SHIFT;\n/** a dimensionless quantity */\nexport const unit_DIMENSIONLESS_UNIT = (0x1n) << unit_SHIFT;\n/** something with units e.g. m s^-1 */\nexport const unit_QUANTITY = (0x2n) << unit_SHIFT;\n/** something with weird units e.g. axial vector, bivector, etc. */\nexport const unit_EXOTIC = (0x3n) << unit_SHIFT;\n\n\n/** Bitflag indicating if inner values are nullable (for example list elements). */\nexport const inner_NULLABLE = 0x1n;\n/** Bitflag indicating if the outer object itself is nullable. */\nexport const outer_NULLABLE = (0x1n) << 0x1n;\n\n/** If the value is a scalar, indicates if its valid or not. */\nexport const SCALAR_VALID = (0x1n) << 0x28n;\n/**\n    If the value is a scalar Bool specifically, this indicates if the bool is\n    set or not. (NB: shadows :c:macro:`ptlf_UNIQUE`.)\n*/\nexport const SCALAR_BOOL = (0x1n) << 0x29n;\n/**\n    Indicates that there are no duplicates in the data (the converse is not\n    necessarily true). (NB: shadows :c:macro:`ptlf_SCALAR_BOOL`.)\n*/\nexport const UNIQUE = (0x1n) << 0x29n;\n/**\n    Indicates that the sort functions are to sort this arrow in descending\n    order rather than ascending.  Do not confuse with c:macro:`ptlf_DESCENDING`.\n*/\nexport const DESCENDING_SORT = (0x1n) << 0x2bn;\n/** Indicates if the min/max values are populated and valid. */\nexport const MIN_MAX_POPULATED = (0x1n) << 0x2cn;\n/** Indicates if the hash value is populated and valid. */\nexport const HASH_POPULATED = (0x1n) << 0x2dn;\n/**\n    Indicates the arguments have been passed in reverse order. The function\n    should act normally except it should merge metadata / diagnostics in\n    reverse order. Used in the implementation of some commutative operations.\n*/\nexport const REVERSED_ARGS = (0x1n) << 0x2en;\n/**\n    Indicates that a bitmap has been passed via the `const bool *` argument\n    instead of a bool array.\n*/\nexport const VALIDITY_AS_BITMAP = (0x1n) << 0x2fn;\n/**\n    For use as an `opts` argument to a `ptl` function. Requests type-only\n    validation/planning without performing the full runtime operation or\n    materializing the usual value payload.\n*/\nexport const TYPECHECK_ONLY = (0x1n) << 0x30n;\n/**\n    Indicates that this object is expected to be reused frequently enough that\n    transports may cache it across a session.\n*/\nexport const REUSABLE = (0x1n) << 0x33n;\n/**\n    These flags are always allowed on public entry points (unless specifically\n    noted otherwise). However, they may be ignored by the function.\n*/\nexport const ALWAYS_ALLOWED = VALIDATE | TRANSIENT | TYPECHECK_ONLY;\n\n/** Index of first bit which is part of the `sentinel` bitfield. */\nexport const sentinel_SHIFT = 0x20n;\n/** Bitmask that picks out only the `sentinel` bitfield. */\nexport const sentinel_MASK = (0x3fn) << sentinel_SHIFT;\n/**\n    Bit that indicates if any of the values in the array are null. This should\n    always be consistent with `validity`.\n*/\nexport const sentinel_ANY_NULLS = (0x1n) << sentinel_SHIFT;\n/**\n    Bit that indicates if ALL of the values in the array are null. This should\n    always be consistent with `validity`.\n*/\nexport const sentinel_ALL_NULLS = (0x2n) << sentinel_SHIFT;\n/**\n    Bit that indicates if any of the values in the array have warnings\n    attached. (In which case they can be found from the `diagnostic` field.)\n*/\nexport const sentinel_ANY_WARNINGS = (0x4n) << sentinel_SHIFT;\n/**\n    Bit that indicates if ALL of the values in the array have warnings\n    attached. (In which case they can be found from the `diagnostic` field.)\n*/\nexport const sentinel_ALL_WARNINGS = (0x8n) << sentinel_SHIFT;\n/**\n    Bit that indicates if any of the values in the array are in an error state.\n    All errors are also null values (even for \"non-nullable\" types). Error\n    details are found via the `diagnostic` field.)\n*/\nexport const sentinel_ANY_ERRORS = (0x10n) << sentinel_SHIFT;\n/**\n    Bit that indicates if ALL of the values in the array are in an error state.\n    All errors are also null values (even for \"non-nullable\" types). Error\n    details are found via the `diagnostic` field.)\n*/\nexport const sentinel_ALL_ERRORS = (0x20n) << sentinel_SHIFT;\n\n/**\n    Bit which is set unconditionally as a simple validity check of a\n    Pointerless object. (This is a bitmask not the bit index.)\n*/\nexport const BEACON_BIT = (0x1n) << 0x2an;\n\n/** Explicit opt-in to preview feature. */\nexport const EARLY = (0x1n) << 0x29n;\n/** Disable read-time canonicalisation of reconstructed helper/predef objects. */\nexport const NO_CANONICALISE = (0x1n) << 0x32n;\n\n/**\n    Bitmask selecting all object-resident metatype bits. Excludes runtime state\n    bits. Some opts constants still alias low raw bits for legacy reasons, but\n    are semantically separate from this mask.\n*/\nexport const TYPE_MASK = outer_MASK | inner_MASK | bitwidth_MASK | form_MASK | inner_NULLABLE | outer_NULLABLE | unit_MASK;\n/**\n    Bitmask selecting object-resident runtime state bits. These bits describe\n    the current value state rather than the fixed metatype.\n*/\nexport const RUNTIME_BITS = sentinel_MASK | SCALAR_VALID | SCALAR_BOOL | BEACON_BIT | DESCENDING_SORT | MIN_MAX_POPULATED | HASH_POPULATED | REUSABLE;\n/**\n    Bitmask selecting semantic opts-only flags. Some of these still alias low\n    raw bits used by type flags for legacy reasons, so this mask is a semantic\n    classification rather than a physically disjoint object-flags mask.\n*/\nexport const OPTS_BITS = SHOW_META | VALIDATE | OR_NULL | TRANSIENT | DESCENDING | REVERSED_ARGS | VALIDITY_AS_BITMAP | TYPECHECK_ONLY | CALC_SIZE | EXPERIMENTAL | EARLY | NO_CANONICALISE;\n/** Bitmask selecting only the bits that determine physical layout. */\nexport const physical_MASK = 0x38e1f8n;\n/** Canonical physical-type key for Struct/Tuple/NamedTuple layouts. */\nexport const physical_HETERO = outer_shared_HETERO;\n/** Canonical physical-type key for LogicalAxis layouts. */\nexport const physical_LOGICAL_AXIS = outer_shared_LOGICAL_AXIS;\n/** Canonical physical-type key for VecArrow. */\nexport const physical_VEC_ARROW = outer_shared_HOMO;\n/** Canonical physical-type key for HomoArrow32. */\nexport const physical_HOMO_ARROW32 = outer_shared_HOMO | bitwidth_32;\n/** Canonical physical-type key for HomoArrow64. */\nexport const physical_HOMO_ARROW64 = outer_shared_HOMO | bitwidth_64;\n/** Canonical physical-type key for Lazy runtime placeholders. */\nexport const physical_LAZY = outer_shared_RUNTIME;\n/** Canonical physical-type key for untyped zero. */\nexport const physical_UNTYPED_ZERO = outer_SCALAR | inner_UNTYPED | bitwidth_UNTYPED_ZERO;\n/** Canonical physical-type key for untyped one. */\nexport const physical_UNTYPED_ONE = outer_SCALAR | inner_UNTYPED | bitwidth_UNTYPED_ONE;\n/** Canonical physical-type key for untyped null. */\nexport const physical_UNTYPED_NULL = outer_SCALAR | inner_UNTYPED | bitwidth_UNTYPED_NULL;\n/** Canonical physical-type key for untyped identity. */\nexport const physical_UNTYPED_IDENTITY = outer_SCALAR | inner_UNTYPED | bitwidth_UNTYPED_IDENTITY;\n/** Canonical physical-type key for untyped imaginary unit. */\nexport const physical_UNTYPED_IMAGINARY_UNIT = outer_SCALAR | inner_UNTYPED | bitwidth_UNTYPED_IMAGINARY_UNIT;\n/** Canonical physical-type key for BoolScalar. */\nexport const physical_BOOL_SCALAR = outer_SCALAR | inner_BOOL;\n/** Canonical physical-type key for BoolArrow. */\nexport const physical_BOOL_ARROW = outer_shared_ARRAY | inner_BOOL;\n/** Canonical physical-type key for BytesScalar. */\nexport const physical_BYTES_SCALAR = outer_SCALAR | inner_BIN;\n/** Canonical physical-type key for BytesArrow32. */\nexport const physical_BYTES_ARROW32 = outer_shared_ARRAY | inner_BIN | bitwidth_32;\n/** Canonical physical-type key for BytesArrow64. */\nexport const physical_BYTES_ARROW64 = outer_shared_ARRAY | inner_BIN | bitwidth_64;\n/** Canonical physical-type key for FloatScalar32. */\nexport const physical_FLOAT_SCALAR32 = outer_SCALAR | inner_shared_FLOAT | bitwidth_32;\n/** Canonical physical-type key for FloatScalar64. */\nexport const physical_FLOAT_SCALAR64 = outer_SCALAR | inner_shared_FLOAT | bitwidth_64;\n/** Canonical physical-type key for FloatArrow32. */\nexport const physical_FLOAT_ARROW32 = outer_shared_ARRAY | inner_shared_FLOAT | bitwidth_32;\n/** Canonical physical-type key for FloatArrow64. */\nexport const physical_FLOAT_ARROW64 = outer_shared_ARRAY | inner_shared_FLOAT | bitwidth_64;\n/** Canonical physical-type key for FloatArithmetic32. */\nexport const physical_FLOAT_ARITHMETIC32 = outer_shared_ARRAY | inner_shared_FLOAT | bitwidth_32 | form_ARITHMETIC;\n/** Canonical physical-type key for FloatArithmetic64. */\nexport const physical_FLOAT_ARITHMETIC64 = outer_shared_ARRAY | inner_shared_FLOAT | bitwidth_64 | form_ARITHMETIC;\n/** Canonical physical-type key for IntegralScalar without fixed bitwidth. */\nexport const physical_INTEGRAL_SCALAR = outer_SCALAR | inner_shared_INTEGRAL;\n/** Canonical physical-type key for IntegralScalar8. */\nexport const physical_INTEGRAL_SCALAR8 = outer_SCALAR | inner_shared_INTEGRAL | bitwidth_8;\n/** Canonical physical-type key for IntegralScalar16. */\nexport const physical_INTEGRAL_SCALAR16 = outer_SCALAR | inner_shared_INTEGRAL | bitwidth_16;\n/** Canonical physical-type key for IntegralScalar32. */\nexport const physical_INTEGRAL_SCALAR32 = outer_SCALAR | inner_shared_INTEGRAL | bitwidth_32;\n/** Canonical physical-type key for IntegralScalar64. */\nexport const physical_INTEGRAL_SCALAR64 = outer_SCALAR | inner_shared_INTEGRAL | bitwidth_64;\n/**\n    Canonical physical-type key for unsigned IntegralScalar without fixed\n    bitwidth.\n*/\nexport const physical_UINTEGRAL_SCALAR = outer_SCALAR | inner_shared_UINTEGRAL;\n/** Canonical physical-type key for unsigned IntegralScalar8. */\nexport const physical_UINTEGRAL_SCALAR8 = outer_SCALAR | inner_shared_UINTEGRAL | bitwidth_8;\n/** Canonical physical-type key for unsigned IntegralScalar16. */\nexport const physical_UINTEGRAL_SCALAR16 = outer_SCALAR | inner_shared_UINTEGRAL | bitwidth_16;\n/** Canonical physical-type key for unsigned IntegralScalar32. */\nexport const physical_UINTEGRAL_SCALAR32 = outer_SCALAR | inner_shared_UINTEGRAL | bitwidth_32;\n/** Canonical physical-type key for unsigned IntegralScalar64. */\nexport const physical_UINTEGRAL_SCALAR64 = outer_SCALAR | inner_shared_UINTEGRAL | bitwidth_64;\n/** Canonical physical-type key for IntegralArrow8. */\nexport const physical_INTEGRAL_ARROW8 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_8;\n/** Canonical physical-type key for IntegralArrow16. */\nexport const physical_INTEGRAL_ARROW16 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_16;\n/** Canonical physical-type key for IntegralArrow32. */\nexport const physical_INTEGRAL_ARROW32 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_32;\n/** Canonical physical-type key for IntegralArrow64. */\nexport const physical_INTEGRAL_ARROW64 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_64;\n/** Canonical physical-type key for unsigned IntegralArrow8. */\nexport const physical_UINTEGRAL_ARROW8 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_8;\n/** Canonical physical-type key for unsigned IntegralArrow16. */\nexport const physical_UINTEGRAL_ARROW16 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_16;\n/** Canonical physical-type key for unsigned IntegralArrow32. */\nexport const physical_UINTEGRAL_ARROW32 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_32;\n/** Canonical physical-type key for unsigned IntegralArrow64. */\nexport const physical_UINTEGRAL_ARROW64 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_64;\n/** Canonical physical-type key for IntegralArithmetic without fixed bitwidth. */\nexport const physical_INTEGRAL_ARITHMETIC = outer_shared_ARRAY | inner_shared_INTEGRAL | form_ARITHMETIC;\n/** Canonical physical-type key for IntegralArithmetic8. */\nexport const physical_INTEGRAL_ARITHMETIC8 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_8 | form_ARITHMETIC;\n/** Canonical physical-type key for IntegralArithmetic16. */\nexport const physical_INTEGRAL_ARITHMETIC16 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_16 | form_ARITHMETIC;\n/** Canonical physical-type key for IntegralArithmetic32. */\nexport const physical_INTEGRAL_ARITHMETIC32 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_32 | form_ARITHMETIC;\n/** Canonical physical-type key for IntegralArithmetic64. */\nexport const physical_INTEGRAL_ARITHMETIC64 = outer_shared_ARRAY | inner_shared_INTEGRAL | bitwidth_64 | form_ARITHMETIC;\n/**\n    Canonical physical-type key for unsigned IntegralArithmetic without fixed\n    bitwidth.\n*/\nexport const physical_UINTEGRAL_ARITHMETIC = outer_shared_ARRAY | inner_shared_UINTEGRAL | form_ARITHMETIC;\n/** Canonical physical-type key for unsigned IntegralArithmetic8. */\nexport const physical_UINTEGRAL_ARITHMETIC8 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_8 | form_ARITHMETIC;\n/** Canonical physical-type key for unsigned IntegralArithmetic16. */\nexport const physical_UINTEGRAL_ARITHMETIC16 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_16 | form_ARITHMETIC;\n/** Canonical physical-type key for unsigned IntegralArithmetic32. */\nexport const physical_UINTEGRAL_ARITHMETIC32 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_32 | form_ARITHMETIC;\n/** Canonical physical-type key for unsigned IntegralArithmetic64. */\nexport const physical_UINTEGRAL_ARITHMETIC64 = outer_shared_ARRAY | inner_shared_UINTEGRAL | bitwidth_64 | form_ARITHMETIC;\n\n/**\n    Bitmask selecting which bits must always be zero in a valid Pointerless\n    object. Equivalently, object flags may contain only TYPE_MASK and\n    RUNTIME_BITS bits.\n*/\nexport const FLAGS_MUST_BE_ZERO = ~(TYPE_MASK | RUNTIME_BITS);\n/**\n    Bitmasking indicating which bits should always be set (1) in a valid\n    Pointerless object. Only :c:macro:`ptlf_BEACON_BIT` currently.\n*/\nexport const FLAGS_MUST_BE_SET = BEACON_BIT;\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.gen.mjs';\n\nexport * from './flags.gen.mjs';\nexport const OPEN = ptlf.SCALAR_BOOL;\n\n/* Interpret the shared OPEN/SCALAR_BOOL/UNIQUE bit in its physical-shape context. */\nexport function isOpen(flags) {\n    const outer = flags & ptlf.outer_MASK;\n    if (outer !== ptlf.outer_STRUCT && outer !== ptlf.outer_CHUNKED) {\n        return false;\n    }\n    return (flags & OPEN) !== 0n;\n}\n\nexport function decodeFlags(flags) {\n    const outer = decodeOuter(flags);\n    const inner = decodeInner(flags);\n    let ret = `${outer}/${inner}`;\n\n    const bw = decodeBitwidth(flags);\n    if (bw > 1) {\n        ret += `/${bw}`;\n    }\n\n    return ret;\n}\n\nexport function decodeBitwidth(flags) {\n    const notches = (flags & ptlf.bitwidth_MASK) >> ptlf.bitwidth_SHIFT;\n    const bits = 1n << (notches >> 1n);\n    return Number(bits | ((notches & 1n) * (bits >> 1n)));\n}\n\nexport function decodeForm(flags) {\n    switch (flags & ptlf.form_MASK) {\n        case ptlf.form_DEFAULT: return \"ARROW\";\n        case ptlf.form_ARITHMETIC: return \"ARITHMETIC\";\n        default: return `<unknown-layout-${flags & ptlf.form_MASK}>`;\n    }\n}\n\nexport function decodeInner(flags) {\n    const hex = '0x' + ((flags & ptlf.inner_MASK) >> ptlf.inner_SHIFT).toString(16);\n    switch (flags & ptlf.inner_MASK) {\n        case ptlf.inner_NONE: return \"None\";\n        case ptlf.inner_UNTYPED: return \"Untyped\";\n        case ptlf.inner_BIN: return \"Bin\";\n        case ptlf.inner_BINFIX: return \"BinFix\";\n        case ptlf.inner_STR: return \"Str\";\n        case ptlf.inner_STRFIX: return \"StrFix\";\n        case ptlf.inner_BOOL: return \"Bool\";\n        case ptlf.inner_INDEX: return \"Index\";\n        case ptlf.inner_ENUM: return \"Enum\";\n        case ptlf.inner_INT: return \"Int\";\n        case ptlf.inner_INTNN: return \"IntNN\";\n        case ptlf.inner_SATNN: return \"SatNN\";\n        case ptlf.inner_FLOATNN: return \"FloatNN\";\n        default: return `<unknown-inner-${hex}>`;\n    }\n}\n\nexport function decodeInnerLogical(flags) {\n    let ret = decodeInner(flags);\n\n    if (ret.endsWith('NN')) {\n        ret = ret.slice(0, -2)+ `${decodeBitwidth(flags)}`;\n    }\n\n    return ret;\n}\n\nexport function decodeOuter(flags) {\n    const hex = '0x' + ((flags & ptlf.outer_MASK) >> ptlf.outer_SHIFT).toString(16);\n    switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_SCALAR: return \"Scalar\";\n        case ptlf.outer_ARRAY_VEC:\n        case ptlf.outer_HOMO_VEC: return \"Vec\";\n        case ptlf.outer_ARRAY_LIST:\n        case ptlf.outer_HOMO_LIST: return \"List\";\n        case ptlf.outer_ARRAY_SET:\n        case ptlf.outer_HOMO_SET: return \"Set\";\n        case ptlf.outer_ARRAY_BAG:\n        case ptlf.outer_HOMO_BAG: return \"Bag\";\n        case ptlf.outer_STRUCT: return \"Struct\";\n        case ptlf.outer_TUPLE: return \"Tuple\";\n        case ptlf.outer_NAMED_TUPLE: return \"NamedTuple\";\n        case ptlf.outer_DICT: return \"Dict\";\n        case ptlf.outer_UNION: return \"Union\";\n        case ptlf.outer_LAZY_HASHED: return \"LazyHash\";\n        case ptlf.outer_LAZY_HANDLE: return \"LazyHandle\";\n        case ptlf.outer_LAZY_DERIVED: return \"LazyDerived\";\n        case ptlf.outer_CHUNKED: return \"Chunked\";\n        case ptlf.outer_LOGICAL_AXIS_VEC: return \"LogicalAxisVec\";\n        case ptlf.outer_LOGICAL_AXIS_LIST: return \"LogicalAxisList\";\n        case ptlf.outer_LOGICAL_AXIS_SET: return \"LogicalAxisSet\";\n        case ptlf.outer_LOGICAL_AXIS_BAG: return \"LogicalAxisBag\";\n        case ptlf.outer_LAZY: return \"Lazy\";\n        default: return `<unknown-outer-${hex}>`;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Code generated by puff IDL. DO NOT EDIT.\n\nexport const PuffPtlMetadataTupleFields = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldLogicalTypes = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldPhysicalTypes = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldItemLogicalTypes = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldItemPhysicalTypes = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldNullable = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldRoles = Object.freeze([])\nexport const PuffPtlMetadataTupleFieldDeclaredMetadata = Object.freeze([])\nexport const PuffPtlMetadataTupleSchemaIdentity = Object.freeze([0x20, 0x47, 0x1d, 0xcd, 0x82, 0xad, 0x8f, 0x77, 0x5b, 0x5b, 0x33, 0x69, 0xd1, 0xe2, 0xb6, 0xec, 0x16, 0x0a, 0xc7, 0xbb, 0x00, 0xf4, 0xdc, 0x4a, 0x80, 0x1c, 0xa6, 0xf3, 0xd4, 0x6f, 0xb4, 0x8b])\nexport const PuffPtlMetadataTuplePhysicalType = \"MetadataTuple\"\nexport const PuffPtlMetadataTupleFieldCount = 0;\n\nexport class PuffPtlMetadataTuple {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlMetadataTuple: expected a fixed-layout object\");\n    const names = PuffPtlMetadataTupleFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlMetadataTuple: fields must exactly match declaration order\");\n    Object.freeze(this);\n  }\n\n\n  static validate(value) { if (value instanceof PuffPtlMetadataTuple) return true; try { new PuffPtlMetadataTuple(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlMetadataTuple) return value; return new PuffPtlMetadataTuple(value); }\n\n  toObject() { return {}; }\n}\n\nexport const PuffPtlMetadataV1Fields = Object.freeze([\"flags\", \"object_nullable\", \"fixed\", \"logical\", \"physical\", \"logical_bitwidth\", \"physical_bitwidth\", \"field_names\", \"field_metatypes\", \"items_metatype\", \"key_metatype\", \"value_metatype\", \"bases\", \"subtype\", \"former_axis_name\", \"sorted\", \"unique\", \"unit\", \"basis\"])\nexport const PuffPtlMetadataV1FieldLogicalTypes = Object.freeze([\"Int\", \"Bool\", \"Int\", \"Str\", \"Str\", \"Int\", \"Int\", \"List\", \"Tuple\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"List\", \"Str\", \"Str\", \"Str\", \"Bool\", \"Str\", \"Str\"])\nexport const PuffPtlMetadataV1FieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BoolScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"MetadataTuple\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPtlMetadataV1FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"recursive_frontier\", null, null, null, \"Str\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlMetadataV1FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, \"MetadataV1\", null, null, null, null, \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlMetadataV1FieldNullable = Object.freeze([false, false, true, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true])\nexport const PuffPtlMetadataV1FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"metadata\", \"metadata\", \"metadata\", \"metadata\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlMetadataV1FieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BoolScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"MetadataTuple\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPtlMetadataV1SchemaIdentity = Object.freeze([0x2a, 0xbb, 0x43, 0xaf, 0x37, 0xdb, 0x4a, 0xb1, 0x40, 0x33, 0xfe, 0xd3, 0x81, 0xe6, 0xcc, 0x33, 0x3b, 0xe2, 0x14, 0xfb, 0xf7, 0xa1, 0x74, 0x33, 0xdc, 0x20, 0x11, 0x1c, 0x8f, 0xfb, 0x07, 0x1c])\nexport const PuffPtlMetadataV1PhysicalType = \"MetadataV1\"\nexport const PuffPtlMetadataV1FieldCount = 19;\nexport const PuffPtlMetadataV1FlagsField = 0;\nexport const PuffPtlMetadataV1ObjectNullableField = 1;\nexport const PuffPtlMetadataV1FixedField = 2;\nexport const PuffPtlMetadataV1LogicalField = 3;\nexport const PuffPtlMetadataV1PhysicalField = 4;\nexport const PuffPtlMetadataV1LogicalBitwidthField = 5;\nexport const PuffPtlMetadataV1PhysicalBitwidthField = 6;\nexport const PuffPtlMetadataV1FieldNamesField = 7;\nexport const PuffPtlMetadataV1FieldMetatypesField = 8;\nexport const PuffPtlMetadataV1ItemsMetatypeField = 9;\nexport const PuffPtlMetadataV1KeyMetatypeField = 10;\nexport const PuffPtlMetadataV1ValueMetatypeField = 11;\nexport const PuffPtlMetadataV1BasesField = 12;\nexport const PuffPtlMetadataV1SubtypeField = 13;\nexport const PuffPtlMetadataV1FormerAxisNameField = 14;\nexport const PuffPtlMetadataV1SortedField = 15;\nexport const PuffPtlMetadataV1UniqueField = 16;\nexport const PuffPtlMetadataV1UnitField = 17;\nexport const PuffPtlMetadataV1BasisField = 18;\n\nexport class PuffPtlMetadataV1 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlMetadataV1: expected a fixed-layout object\");\n    const names = PuffPtlMetadataV1Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlMetadataV1: fields must exactly match declaration order\");\n    if (typeof source.flags !== \"number\") throw new TypeError(\"field flags has an incompatible value\");\n    this.flags = source.flags;\n    if (typeof source.object_nullable !== \"boolean\") throw new TypeError(\"field object_nullable has an incompatible value\");\n    this.object_nullable = source.object_nullable;\n    if (source.fixed !== null && (typeof source.fixed !== \"number\")) throw new TypeError(\"field fixed has an incompatible value\");\n    this.fixed = source.fixed;\n    if (typeof source.logical !== \"string\") throw new TypeError(\"field logical has an incompatible value\");\n    this.logical = source.logical;\n    if (source.physical !== null && (typeof source.physical !== \"string\")) throw new TypeError(\"field physical has an incompatible value\");\n    this.physical = source.physical;\n    if (source.logical_bitwidth !== null && (typeof source.logical_bitwidth !== \"number\")) throw new TypeError(\"field logical_bitwidth has an incompatible value\");\n    this.logical_bitwidth = source.logical_bitwidth;\n    if (source.physical_bitwidth !== null && (typeof source.physical_bitwidth !== \"number\")) throw new TypeError(\"field physical_bitwidth has an incompatible value\");\n    this.physical_bitwidth = source.physical_bitwidth;\n    if (!Array.isArray(source.field_names)) throw new TypeError(\"field field_names has an incompatible value\");\n    this.field_names = source.field_names;\n    if (false) throw new TypeError(\"field field_metatypes has an incompatible value\");\n    this.field_metatypes = source.field_metatypes;\n    if (false) throw new TypeError(\"field items_metatype has an incompatible value\");\n    this.items_metatype = source.items_metatype;\n    if (false) throw new TypeError(\"field key_metatype has an incompatible value\");\n    this.key_metatype = source.key_metatype;\n    if (false) throw new TypeError(\"field value_metatype has an incompatible value\");\n    this.value_metatype = source.value_metatype;\n    if (!Array.isArray(source.bases)) throw new TypeError(\"field bases has an incompatible value\");\n    this.bases = source.bases;\n    if (source.subtype !== null && (typeof source.subtype !== \"string\")) throw new TypeError(\"field subtype has an incompatible value\");\n    this.subtype = source.subtype;\n    if (source.former_axis_name !== null && (typeof source.former_axis_name !== \"string\")) throw new TypeError(\"field former_axis_name has an incompatible value\");\n    this.former_axis_name = source.former_axis_name;\n    if (typeof source.sorted !== \"string\") throw new TypeError(\"field sorted has an incompatible value\");\n    this.sorted = source.sorted;\n    if (typeof source.unique !== \"boolean\") throw new TypeError(\"field unique has an incompatible value\");\n    this.unique = source.unique;\n    if (source.unit !== null && (typeof source.unit !== \"string\")) throw new TypeError(\"field unit has an incompatible value\");\n    this.unit = source.unit;\n    if (source.basis !== null && (typeof source.basis !== \"string\")) throw new TypeError(\"field basis has an incompatible value\");\n    this.basis = source.basis;\n    Object.freeze(this);\n  }\n\n  getFlags() { return this.flags; }\n  getObjectNullable() { return this.object_nullable; }\n  getFixed() { return this.fixed; }\n  getLogical() { return this.logical; }\n  getPhysical() { return this.physical; }\n  getLogicalBitwidth() { return this.logical_bitwidth; }\n  getPhysicalBitwidth() { return this.physical_bitwidth; }\n  getFieldNames() { return this.field_names; }\n  getFieldMetatypes() { return this.field_metatypes; }\n  getItemsMetatype() { return this.items_metatype; }\n  getKeyMetatype() { return this.key_metatype; }\n  getValueMetatype() { return this.value_metatype; }\n  getBases() { return this.bases; }\n  getSubtype() { return this.subtype; }\n  getFormerAxisName() { return this.former_axis_name; }\n  getSorted() { return this.sorted; }\n  getUnique() { return this.unique; }\n  getUnit() { return this.unit; }\n  getBasis() { return this.basis; }\n\n  static validate(value) { if (value instanceof PuffPtlMetadataV1) return true; try { new PuffPtlMetadataV1(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlMetadataV1) return value; return new PuffPtlMetadataV1(value); }\n\n  toObject() { return {flags: this.flags, object_nullable: this.object_nullable, fixed: this.fixed, logical: this.logical, physical: this.physical, logical_bitwidth: this.logical_bitwidth, physical_bitwidth: this.physical_bitwidth, field_names: this.field_names, field_metatypes: this.field_metatypes, items_metatype: this.items_metatype, key_metatype: this.key_metatype, value_metatype: this.value_metatype, bases: this.bases, subtype: this.subtype, former_axis_name: this.former_axis_name, sorted: this.sorted, unique: this.unique, unit: this.unit, basis: this.basis}; }\n}\n\nexport const PuffPtlMetadataV2Fields = Object.freeze([\"flags\", \"object_nullable\", \"fixed\", \"logical\", \"physical\", \"logical_bitwidth\", \"physical_bitwidth\", \"field_names\", \"field_metatypes\", \"items_metatype\", \"key_metatype\", \"value_metatype\", \"bases\", \"subtype\", \"former_axis_name\", \"sorted\", \"unique\", \"unit\", \"basis\", \"owner\", \"read_groups\", \"write_groups\", \"admin_flags\", \"created\", \"modified\", \"description\", \"title\", \"icon\", \"display_width\", \"display_height\", \"abstract\", \"legal_rights\", \"copyright_notice\", \"attribution\", \"pii\", \"classification\", \"source_uri\", \"source_kind\", \"content_type\", \"encoding\", \"language\", \"tags\", \"source_lineage\", \"artifact_lineage\", \"retention_class\", \"public\"])\nexport const PuffPtlMetadataV2FieldLogicalTypes = Object.freeze([\"Int\", \"Bool\", \"Int\", \"Str\", \"Str\", \"Int\", \"Int\", \"List\", \"Tuple\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"List\", \"Str\", \"Str\", \"Str\", \"Bool\", \"Str\", \"Str\", \"Str\", \"List\", \"List\", \"Int\", \"Int\", \"Int\", \"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Bool\", \"List\", \"Str\", \"Str\", \"Bool\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"List\", \"List\", \"List\", \"Str\", \"Bool\"])\nexport const PuffPtlMetadataV2FieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BoolScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"MetadataTuple\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BoolScalar\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesScalar\", \"BoolScalar\"])\nexport const PuffPtlMetadataV2FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"recursive_frontier\", null, null, null, \"Str\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"Str\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"Str\", \"Str\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlMetadataV2FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, \"MetadataV1\", null, null, null, null, \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, null, \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, null, null, \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlMetadataV2FieldNullable = Object.freeze([false, false, true, false, true, true, true, false, false, false, false, false, false, true, true, false, false, true, true, true, false, false, true, true, true, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, false, false, false, true, true])\nexport const PuffPtlMetadataV2FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"metadata\", \"metadata\", \"metadata\", \"metadata\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlMetadataV2FieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BoolScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"MetadataTuple\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BoolScalar\", \"BytesArrow32\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesScalar\", \"BoolScalar\"])\nexport const PuffPtlMetadataV2SchemaIdentity = Object.freeze([0xc7, 0x39, 0x50, 0x86, 0x14, 0xed, 0x71, 0xd9, 0x41, 0x16, 0x90, 0x06, 0xc5, 0x29, 0x63, 0x42, 0x69, 0x45, 0x94, 0x82, 0xd4, 0xd9, 0x2f, 0xfe, 0x4a, 0xcc, 0xab, 0x2c, 0x1f, 0x19, 0xd5, 0x92])\nexport const PuffPtlMetadataV2PhysicalType = \"MetadataV2\"\nexport const PuffPtlMetadataV2FieldCount = 46;\nexport const PuffPtlMetadataV2FlagsField = 0;\nexport const PuffPtlMetadataV2ObjectNullableField = 1;\nexport const PuffPtlMetadataV2FixedField = 2;\nexport const PuffPtlMetadataV2LogicalField = 3;\nexport const PuffPtlMetadataV2PhysicalField = 4;\nexport const PuffPtlMetadataV2LogicalBitwidthField = 5;\nexport const PuffPtlMetadataV2PhysicalBitwidthField = 6;\nexport const PuffPtlMetadataV2FieldNamesField = 7;\nexport const PuffPtlMetadataV2FieldMetatypesField = 8;\nexport const PuffPtlMetadataV2ItemsMetatypeField = 9;\nexport const PuffPtlMetadataV2KeyMetatypeField = 10;\nexport const PuffPtlMetadataV2ValueMetatypeField = 11;\nexport const PuffPtlMetadataV2BasesField = 12;\nexport const PuffPtlMetadataV2SubtypeField = 13;\nexport const PuffPtlMetadataV2FormerAxisNameField = 14;\nexport const PuffPtlMetadataV2SortedField = 15;\nexport const PuffPtlMetadataV2UniqueField = 16;\nexport const PuffPtlMetadataV2UnitField = 17;\nexport const PuffPtlMetadataV2BasisField = 18;\nexport const PuffPtlMetadataV2OwnerField = 19;\nexport const PuffPtlMetadataV2ReadGroupsField = 20;\nexport const PuffPtlMetadataV2WriteGroupsField = 21;\nexport const PuffPtlMetadataV2AdminFlagsField = 22;\nexport const PuffPtlMetadataV2CreatedField = 23;\nexport const PuffPtlMetadataV2ModifiedField = 24;\nexport const PuffPtlMetadataV2DescriptionField = 25;\nexport const PuffPtlMetadataV2TitleField = 26;\nexport const PuffPtlMetadataV2IconField = 27;\nexport const PuffPtlMetadataV2DisplayWidthField = 28;\nexport const PuffPtlMetadataV2DisplayHeightField = 29;\nexport const PuffPtlMetadataV2AbstractField = 30;\nexport const PuffPtlMetadataV2LegalRightsField = 31;\nexport const PuffPtlMetadataV2CopyrightNoticeField = 32;\nexport const PuffPtlMetadataV2AttributionField = 33;\nexport const PuffPtlMetadataV2PiiField = 34;\nexport const PuffPtlMetadataV2ClassificationField = 35;\nexport const PuffPtlMetadataV2SourceUriField = 36;\nexport const PuffPtlMetadataV2SourceKindField = 37;\nexport const PuffPtlMetadataV2ContentTypeField = 38;\nexport const PuffPtlMetadataV2EncodingField = 39;\nexport const PuffPtlMetadataV2LanguageField = 40;\nexport const PuffPtlMetadataV2TagsField = 41;\nexport const PuffPtlMetadataV2SourceLineageField = 42;\nexport const PuffPtlMetadataV2ArtifactLineageField = 43;\nexport const PuffPtlMetadataV2RetentionClassField = 44;\nexport const PuffPtlMetadataV2PublicField = 45;\n\nexport class PuffPtlMetadataV2 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlMetadataV2: expected a fixed-layout object\");\n    const names = PuffPtlMetadataV2Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlMetadataV2: fields must exactly match declaration order\");\n    if (typeof source.flags !== \"number\") throw new TypeError(\"field flags has an incompatible value\");\n    this.flags = source.flags;\n    if (typeof source.object_nullable !== \"boolean\") throw new TypeError(\"field object_nullable has an incompatible value\");\n    this.object_nullable = source.object_nullable;\n    if (source.fixed !== null && (typeof source.fixed !== \"number\")) throw new TypeError(\"field fixed has an incompatible value\");\n    this.fixed = source.fixed;\n    if (typeof source.logical !== \"string\") throw new TypeError(\"field logical has an incompatible value\");\n    this.logical = source.logical;\n    if (source.physical !== null && (typeof source.physical !== \"string\")) throw new TypeError(\"field physical has an incompatible value\");\n    this.physical = source.physical;\n    if (source.logical_bitwidth !== null && (typeof source.logical_bitwidth !== \"number\")) throw new TypeError(\"field logical_bitwidth has an incompatible value\");\n    this.logical_bitwidth = source.logical_bitwidth;\n    if (source.physical_bitwidth !== null && (typeof source.physical_bitwidth !== \"number\")) throw new TypeError(\"field physical_bitwidth has an incompatible value\");\n    this.physical_bitwidth = source.physical_bitwidth;\n    if (!Array.isArray(source.field_names)) throw new TypeError(\"field field_names has an incompatible value\");\n    this.field_names = source.field_names;\n    if (false) throw new TypeError(\"field field_metatypes has an incompatible value\");\n    this.field_metatypes = source.field_metatypes;\n    if (false) throw new TypeError(\"field items_metatype has an incompatible value\");\n    this.items_metatype = source.items_metatype;\n    if (false) throw new TypeError(\"field key_metatype has an incompatible value\");\n    this.key_metatype = source.key_metatype;\n    if (false) throw new TypeError(\"field value_metatype has an incompatible value\");\n    this.value_metatype = source.value_metatype;\n    if (!Array.isArray(source.bases)) throw new TypeError(\"field bases has an incompatible value\");\n    this.bases = source.bases;\n    if (source.subtype !== null && (typeof source.subtype !== \"string\")) throw new TypeError(\"field subtype has an incompatible value\");\n    this.subtype = source.subtype;\n    if (source.former_axis_name !== null && (typeof source.former_axis_name !== \"string\")) throw new TypeError(\"field former_axis_name has an incompatible value\");\n    this.former_axis_name = source.former_axis_name;\n    if (typeof source.sorted !== \"string\") throw new TypeError(\"field sorted has an incompatible value\");\n    this.sorted = source.sorted;\n    if (typeof source.unique !== \"boolean\") throw new TypeError(\"field unique has an incompatible value\");\n    this.unique = source.unique;\n    if (source.unit !== null && (typeof source.unit !== \"string\")) throw new TypeError(\"field unit has an incompatible value\");\n    this.unit = source.unit;\n    if (source.basis !== null && (typeof source.basis !== \"string\")) throw new TypeError(\"field basis has an incompatible value\");\n    this.basis = source.basis;\n    if (source.owner !== null && (typeof source.owner !== \"string\")) throw new TypeError(\"field owner has an incompatible value\");\n    this.owner = source.owner;\n    if (!Array.isArray(source.read_groups)) throw new TypeError(\"field read_groups has an incompatible value\");\n    this.read_groups = source.read_groups;\n    if (!Array.isArray(source.write_groups)) throw new TypeError(\"field write_groups has an incompatible value\");\n    this.write_groups = source.write_groups;\n    if (source.admin_flags !== null && (typeof source.admin_flags !== \"number\")) throw new TypeError(\"field admin_flags has an incompatible value\");\n    this.admin_flags = source.admin_flags;\n    if (source.created !== null && (typeof source.created !== \"number\")) throw new TypeError(\"field created has an incompatible value\");\n    this.created = source.created;\n    if (source.modified !== null && (typeof source.modified !== \"number\")) throw new TypeError(\"field modified has an incompatible value\");\n    this.modified = source.modified;\n    if (source.description !== null && (typeof source.description !== \"string\")) throw new TypeError(\"field description has an incompatible value\");\n    this.description = source.description;\n    if (source.title !== null && (typeof source.title !== \"string\")) throw new TypeError(\"field title has an incompatible value\");\n    this.title = source.title;\n    if (source.icon !== null && (typeof source.icon !== \"string\")) throw new TypeError(\"field icon has an incompatible value\");\n    this.icon = source.icon;\n    if (source.display_width !== null && (typeof source.display_width !== \"number\")) throw new TypeError(\"field display_width has an incompatible value\");\n    this.display_width = source.display_width;\n    if (source.display_height !== null && (typeof source.display_height !== \"number\")) throw new TypeError(\"field display_height has an incompatible value\");\n    this.display_height = source.display_height;\n    if (typeof source.abstract !== \"boolean\") throw new TypeError(\"field abstract has an incompatible value\");\n    this.abstract = source.abstract;\n    if (!Array.isArray(source.legal_rights)) throw new TypeError(\"field legal_rights has an incompatible value\");\n    this.legal_rights = source.legal_rights;\n    if (source.copyright_notice !== null && (typeof source.copyright_notice !== \"string\")) throw new TypeError(\"field copyright_notice has an incompatible value\");\n    this.copyright_notice = source.copyright_notice;\n    if (source.attribution !== null && (typeof source.attribution !== \"string\")) throw new TypeError(\"field attribution has an incompatible value\");\n    this.attribution = source.attribution;\n    if (source.pii !== null && (typeof source.pii !== \"boolean\")) throw new TypeError(\"field pii has an incompatible value\");\n    this.pii = source.pii;\n    if (source.classification !== null && (typeof source.classification !== \"string\")) throw new TypeError(\"field classification has an incompatible value\");\n    this.classification = source.classification;\n    if (source.source_uri !== null && (typeof source.source_uri !== \"string\")) throw new TypeError(\"field source_uri has an incompatible value\");\n    this.source_uri = source.source_uri;\n    if (source.source_kind !== null && (typeof source.source_kind !== \"string\")) throw new TypeError(\"field source_kind has an incompatible value\");\n    this.source_kind = source.source_kind;\n    if (source.content_type !== null && (typeof source.content_type !== \"string\")) throw new TypeError(\"field content_type has an incompatible value\");\n    this.content_type = source.content_type;\n    if (source.encoding !== null && (typeof source.encoding !== \"string\")) throw new TypeError(\"field encoding has an incompatible value\");\n    this.encoding = source.encoding;\n    if (source.language !== null && (typeof source.language !== \"string\")) throw new TypeError(\"field language has an incompatible value\");\n    this.language = source.language;\n    if (!Array.isArray(source.tags)) throw new TypeError(\"field tags has an incompatible value\");\n    this.tags = source.tags;\n    if (!Array.isArray(source.source_lineage)) throw new TypeError(\"field source_lineage has an incompatible value\");\n    this.source_lineage = source.source_lineage;\n    if (!Array.isArray(source.artifact_lineage)) throw new TypeError(\"field artifact_lineage has an incompatible value\");\n    this.artifact_lineage = source.artifact_lineage;\n    if (source.retention_class !== null && (typeof source.retention_class !== \"string\")) throw new TypeError(\"field retention_class has an incompatible value\");\n    this.retention_class = source.retention_class;\n    if (source.public !== null && (typeof source.public !== \"boolean\")) throw new TypeError(\"field public has an incompatible value\");\n    this.public = source.public;\n    Object.freeze(this);\n  }\n\n  getFlags() { return this.flags; }\n  getObjectNullable() { return this.object_nullable; }\n  getFixed() { return this.fixed; }\n  getLogical() { return this.logical; }\n  getPhysical() { return this.physical; }\n  getLogicalBitwidth() { return this.logical_bitwidth; }\n  getPhysicalBitwidth() { return this.physical_bitwidth; }\n  getFieldNames() { return this.field_names; }\n  getFieldMetatypes() { return this.field_metatypes; }\n  getItemsMetatype() { return this.items_metatype; }\n  getKeyMetatype() { return this.key_metatype; }\n  getValueMetatype() { return this.value_metatype; }\n  getBases() { return this.bases; }\n  getSubtype() { return this.subtype; }\n  getFormerAxisName() { return this.former_axis_name; }\n  getSorted() { return this.sorted; }\n  getUnique() { return this.unique; }\n  getUnit() { return this.unit; }\n  getBasis() { return this.basis; }\n  getOwner() { return this.owner; }\n  getReadGroups() { return this.read_groups; }\n  getWriteGroups() { return this.write_groups; }\n  getAdminFlags() { return this.admin_flags; }\n  getCreated() { return this.created; }\n  getModified() { return this.modified; }\n  getDescription() { return this.description; }\n  getTitle() { return this.title; }\n  getIcon() { return this.icon; }\n  getDisplayWidth() { return this.display_width; }\n  getDisplayHeight() { return this.display_height; }\n  getAbstract() { return this.abstract; }\n  getLegalRights() { return this.legal_rights; }\n  getCopyrightNotice() { return this.copyright_notice; }\n  getAttribution() { return this.attribution; }\n  getPii() { return this.pii; }\n  getClassification() { return this.classification; }\n  getSourceUri() { return this.source_uri; }\n  getSourceKind() { return this.source_kind; }\n  getContentType() { return this.content_type; }\n  getEncoding() { return this.encoding; }\n  getLanguage() { return this.language; }\n  getTags() { return this.tags; }\n  getSourceLineage() { return this.source_lineage; }\n  getArtifactLineage() { return this.artifact_lineage; }\n  getRetentionClass() { return this.retention_class; }\n  getPublic() { return this.public; }\n\n  static validate(value) { if (value instanceof PuffPtlMetadataV2) return true; try { new PuffPtlMetadataV2(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlMetadataV2) return value; return new PuffPtlMetadataV2(value); }\n\n  toObject() { return {flags: this.flags, object_nullable: this.object_nullable, fixed: this.fixed, logical: this.logical, physical: this.physical, logical_bitwidth: this.logical_bitwidth, physical_bitwidth: this.physical_bitwidth, field_names: this.field_names, field_metatypes: this.field_metatypes, items_metatype: this.items_metatype, key_metatype: this.key_metatype, value_metatype: this.value_metatype, bases: this.bases, subtype: this.subtype, former_axis_name: this.former_axis_name, sorted: this.sorted, unique: this.unique, unit: this.unit, basis: this.basis, owner: this.owner, read_groups: this.read_groups, write_groups: this.write_groups, admin_flags: this.admin_flags, created: this.created, modified: this.modified, description: this.description, title: this.title, icon: this.icon, display_width: this.display_width, display_height: this.display_height, abstract: this.abstract, legal_rights: this.legal_rights, copyright_notice: this.copyright_notice, attribution: this.attribution, pii: this.pii, classification: this.classification, source_uri: this.source_uri, source_kind: this.source_kind, content_type: this.content_type, encoding: this.encoding, language: this.language, tags: this.tags, source_lineage: this.source_lineage, artifact_lineage: this.artifact_lineage, retention_class: this.retention_class, public: this.public}; }\n}\n\nexport const PuffPtlAxisFields = Object.freeze([\"axis_length\", \"name\", \"guid\"])\nexport const PuffPtlAxisFieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Bin\"])\nexport const PuffPtlAxisFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPtlAxisFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlAxisFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlAxisFieldNullable = Object.freeze([false, true, false])\nexport const PuffPtlAxisFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffPtlAxisFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPtlAxisSchemaIdentity = Object.freeze([0x2e, 0xd3, 0xda, 0xf3, 0x9c, 0x57, 0xbb, 0x57, 0xa7, 0x0b, 0x5c, 0xb2, 0x06, 0x3a, 0xf0, 0x1b, 0x95, 0xe6, 0x10, 0xcf, 0xa8, 0x9b, 0x96, 0x2e, 0x80, 0x43, 0x88, 0xe6, 0xe1, 0x8f, 0xe5, 0xdc])\nexport const PuffPtlAxisPhysicalType = \"Axis\"\nexport const PuffPtlAxisFieldCount = 3;\nexport const PuffPtlAxisAxisLengthField = 0;\nexport const PuffPtlAxisNameField = 1;\nexport const PuffPtlAxisGuidField = 2;\n\nexport class PuffPtlAxis {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlAxis: expected a fixed-layout object\");\n    const names = PuffPtlAxisFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlAxis: fields must exactly match declaration order\");\n    if (typeof source.axis_length !== \"number\") throw new TypeError(\"field axis_length has an incompatible value\");\n    this.axis_length = source.axis_length;\n    if (source.name !== null && (typeof source.name !== \"string\")) throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    if (!(source.guid instanceof Uint8Array)) throw new TypeError(\"field guid has an incompatible value\");\n    this.guid = source.guid;\n    Object.freeze(this);\n  }\n\n  getAxisLength() { return this.axis_length; }\n  getName() { return this.name; }\n  getGuid() { return this.guid; }\n\n  static validate(value) { if (value instanceof PuffPtlAxis) return true; try { new PuffPtlAxis(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlAxis) return value; return new PuffPtlAxis(value); }\n\n  toObject() { return {axis_length: this.axis_length, name: this.name, guid: this.guid}; }\n}\n\nexport const PuffPtlLogicalAxisFields = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldLogicalTypes = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldPhysicalTypes = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldItemLogicalTypes = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldItemPhysicalTypes = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldNullable = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldRoles = Object.freeze([])\nexport const PuffPtlLogicalAxisFieldDeclaredMetadata = Object.freeze([])\nexport const PuffPtlLogicalAxisSchemaIdentity = Object.freeze([0x5c, 0xe4, 0x6a, 0x99, 0x56, 0xa4, 0x0a, 0x07, 0xdc, 0xa9, 0x97, 0x92, 0x91, 0x57, 0x9b, 0xce, 0xbd, 0x38, 0xfd, 0x3c, 0x19, 0x83, 0x1f, 0xd4, 0x58, 0xdd, 0x3c, 0xe1, 0x42, 0x7e, 0xaf, 0xc9])\nexport const PuffPtlLogicalAxisPhysicalType = \"LogicalAxis\"\nexport const PuffPtlLogicalAxisFieldCount = 0;\n\nexport class PuffPtlLogicalAxis {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlLogicalAxis: expected a fixed-layout object\");\n    const names = PuffPtlLogicalAxisFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlLogicalAxis: fields must exactly match declaration order\");\n    Object.freeze(this);\n  }\n\n\n  static validate(value) { if (value instanceof PuffPtlLogicalAxis) return true; try { new PuffPtlLogicalAxis(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlLogicalAxis) return value; return new PuffPtlLogicalAxis(value); }\n\n  toObject() { return {}; }\n}\n\nexport const AllStructDescriptors = Object.freeze([\n  Object.freeze({ name: \"ptl_MetadataTuple\", fields: PuffPtlMetadataTupleFields, fieldCount: PuffPtlMetadataTupleFieldCount, logicalTypes: PuffPtlMetadataTupleFieldLogicalTypes, physicalTypes: PuffPtlMetadataTupleFieldPhysicalTypes, physicalType: PuffPtlMetadataTuplePhysicalType, nullable: PuffPtlMetadataTupleFieldNullable, Type: PuffPtlMetadataTuple, roles: PuffPtlMetadataTupleFieldRoles, declaredMetadata: PuffPtlMetadataTupleFieldDeclaredMetadata, accessors: PuffPtlMetadataTupleFields, schemaIdentity: PuffPtlMetadataTupleSchemaIdentity }),\n  Object.freeze({ name: \"ptl_MetadataV1\", fields: PuffPtlMetadataV1Fields, fieldCount: PuffPtlMetadataV1FieldCount, logicalTypes: PuffPtlMetadataV1FieldLogicalTypes, physicalTypes: PuffPtlMetadataV1FieldPhysicalTypes, physicalType: PuffPtlMetadataV1PhysicalType, nullable: PuffPtlMetadataV1FieldNullable, Type: PuffPtlMetadataV1, roles: PuffPtlMetadataV1FieldRoles, declaredMetadata: PuffPtlMetadataV1FieldDeclaredMetadata, accessors: PuffPtlMetadataV1Fields, schemaIdentity: PuffPtlMetadataV1SchemaIdentity }),\n  Object.freeze({ name: \"ptl_MetadataV2\", fields: PuffPtlMetadataV2Fields, fieldCount: PuffPtlMetadataV2FieldCount, logicalTypes: PuffPtlMetadataV2FieldLogicalTypes, physicalTypes: PuffPtlMetadataV2FieldPhysicalTypes, physicalType: PuffPtlMetadataV2PhysicalType, nullable: PuffPtlMetadataV2FieldNullable, Type: PuffPtlMetadataV2, roles: PuffPtlMetadataV2FieldRoles, declaredMetadata: PuffPtlMetadataV2FieldDeclaredMetadata, accessors: PuffPtlMetadataV2Fields, schemaIdentity: PuffPtlMetadataV2SchemaIdentity }),\n  Object.freeze({ name: \"ptl_Axis\", fields: PuffPtlAxisFields, fieldCount: PuffPtlAxisFieldCount, logicalTypes: PuffPtlAxisFieldLogicalTypes, physicalTypes: PuffPtlAxisFieldPhysicalTypes, physicalType: PuffPtlAxisPhysicalType, nullable: PuffPtlAxisFieldNullable, Type: PuffPtlAxis, roles: PuffPtlAxisFieldRoles, declaredMetadata: PuffPtlAxisFieldDeclaredMetadata, accessors: PuffPtlAxisFields, schemaIdentity: PuffPtlAxisSchemaIdentity }),\n  Object.freeze({ name: \"ptl_LogicalAxis\", fields: PuffPtlLogicalAxisFields, fieldCount: PuffPtlLogicalAxisFieldCount, logicalTypes: PuffPtlLogicalAxisFieldLogicalTypes, physicalTypes: PuffPtlLogicalAxisFieldPhysicalTypes, physicalType: PuffPtlLogicalAxisPhysicalType, nullable: PuffPtlLogicalAxisFieldNullable, Type: PuffPtlLogicalAxis, roles: PuffPtlLogicalAxisFieldRoles, declaredMetadata: PuffPtlLogicalAxisFieldDeclaredMetadata, accessors: PuffPtlLogicalAxisFields, schemaIdentity: PuffPtlLogicalAxisSchemaIdentity }),\n]);\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.mjs';\nimport { PuffPtlMetadataV1PhysicalType, PuffPtlMetadataV2PhysicalType } from './concrete/base.gen.mjs';\n\n\nexport const HASH_BYTES = 32;\n\nconst HASH_IDENTITY_TAG = new TextEncoder().encode('ptrless-identity-v1');\nconst SHA256_INIT = Uint32Array.of(\n    0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,\n    0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19,\n);\nconst SHA256_K = Uint32Array.of(\n    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,\n);\n\n// bytesToHex projects one hash byte vector into canonical lowercase hex.\nexport function bytesToHex(bytes) {\n    return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n}\n\n// hexToBytes decodes one canonical hash hex string back to raw bytes.\nexport function hexToBytes(hex, where='ptrless.hash.hexToBytes') {\n    if (typeof hex !== 'string' || hex.length !== HASH_BYTES * 2) {\n        throw new Error(`${where}: expected ${HASH_BYTES * 2} hex chars`);\n    }\n    const out = new Uint8Array(HASH_BYTES);\n    for (let i = 0; i < HASH_BYTES; i++) {\n        const byte = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n        if (Number.isNaN(byte)) {\n            throw new Error(`${where}: invalid hex byte at index ${i}`);\n        }\n        out[i] = byte;\n    }\n    return out;\n}\n\n// hashIdentityBytesSync combines an object's direct semantic attachments.\n// Absent attachments are represented by all-zero hashes.\nexport function hashIdentityBytesSync(dataHash, metaHash, iaxisHash = new Uint8Array(HASH_BYTES), daxisHash = new Uint8Array(HASH_BYTES)) {\n    if (!(dataHash instanceof Uint8Array) || dataHash.length !== HASH_BYTES) {\n        throw new Error(`ptrless.hash.hashIdentityBytesSync: data hash must be ${HASH_BYTES} bytes`);\n    }\n    if (!(metaHash instanceof Uint8Array) || metaHash.length !== HASH_BYTES) {\n        throw new Error(`ptrless.hash.hashIdentityBytesSync: meta hash must be ${HASH_BYTES} bytes`);\n    }\n    if (!(iaxisHash instanceof Uint8Array) || iaxisHash.length !== HASH_BYTES) {\n        throw new Error(`ptrless.hash.hashIdentityBytesSync: index-axis hash must be ${HASH_BYTES} bytes`);\n    }\n    if (!(daxisHash instanceof Uint8Array) || daxisHash.length !== HASH_BYTES) {\n        throw new Error(`ptrless.hash.hashIdentityBytesSync: dependent-axis hash must be ${HASH_BYTES} bytes`);\n    }\n    return sha256BytesSync(concatBytes(HASH_IDENTITY_TAG, dataHash, metaHash, iaxisHash, daxisHash));\n}\n\n// hashIdentityHexSync computes the semantic identity for one imported ptrless object.\nexport function hashIdentityHexSync(obj) {\n    if ((obj.flags() & ptlf.outer_MASK) === ptlf.outer_LAZY_HASHED\n        && typeof obj.identityHashHex === 'function') {\n        const hex = obj.identityHashHex();\n        if (hex) return hex;\n    }\n    const dataHash = dataHashBytesSync(obj);\n    const metaHash = requireMetaHash(obj);\n    const iaxis = (obj.flags() & ptlf.outer_MASK) === ptlf.outer_SCALAR ? null : obj.iaxis?.();\n    const iaxisHash = iaxis ? domainGuidHashBytesSync(iaxis) : new Uint8Array(HASH_BYTES);\n    return bytesToHex(hashIdentityBytesSync(dataHash, metaHash, iaxisHash));\n}\n\n// domainGuidHashBytesSync projects an Axis realisation onto the semantic\n// domain identity carried by an incoming axis edge. Labels and extents are\n// properties of that realisation, not of the edge identity.\nfunction domainGuidHashBytesSync(axis) {\n    if (typeof axis?.field !== 'function') {\n        throw new Error(`ptrless.hash.hashIdentityHexSync: axis ${describeObject(axis)} has no GUID`);\n    }\n    return dataHashBytesSync(axis.field('guid'));\n}\n\n// rootHashesHexSync returns the payload and effective metadata hashes for one root object.\n// This is the JS projection of the C/Go RootHashes contract.\nexport function rootHashesHexSync(obj) {\n    return {\n        data: bytesToHex(dataHashBytesSync(obj)),\n        meta: bytesToHex(requireMetaHash(obj)),\n    };\n}\n\n// requireMetaHash follows the transport placeholder contract before failing on missing metadata.\nfunction requireMetaHash(obj) {\n    let meta = null;\n    if (typeof obj?.meta === 'function') {\n        try {\n            meta = obj.meta();\n        } catch (_err) {\n            meta = null;\n        }\n    }\n    if (meta) {\n        return dataHashBytesSync(meta);\n    }\n    // Only the generated metadata-schema bootstrap may omit its own metadata.\n    // A physical name is descriptive data, not permission to reinterpret an\n    // arbitrary object as the bootstrap root.\n    if (typeof obj?.isMetadataBootstrap === 'function' && obj.isMetadataBootstrap()) {\n        const physical = typeof obj.physicalType === 'function' ? obj.physicalType() : null;\n        if (physical === PuffPtlMetadataV1PhysicalType || physical === PuffPtlMetadataV2PhysicalType) {\n            return dataHashBytesSync(obj);\n        }\n        throw new Error(`ptrless.hash.hashIdentityHexSync: invalid metadata bootstrap ${describeObject(obj)}`);\n    }\n    throw new Error(`ptrless.hash.hashIdentityHexSync: object ${describeObject(obj)} has no metadata`);\n}\n\n// dataHashBytesSync returns the ordinary payload hash for imported or wrapped objects.\nfunction dataHashBytesSync(obj) {\n    if (!obj || typeof obj.flags !== 'function') {\n        throw new Error(`ptrless.hash.dataHashBytesSync: expected ptrless object, got ${describeObject(obj)}`);\n    }\n    if ((obj.flags() & ptlf.outer_MASK) === ptlf.outer_SCALAR) {\n        return scalarHashBytesSync(obj);\n    }\n    if (typeof obj.dataHashHex !== 'function') {\n        throw new Error(`ptrless.hash.dataHashBytesSync: non-scalar ${describeObject(obj)} does not expose dataHashHex()`);\n    }\n    return hexToBytes(obj.dataHashHex(), 'ptrless.hash.dataHashBytesSync');\n}\n\n// scalarHashBytesSync mirrors the scalar hashing contract for imported wrappers.\nfunction scalarHashBytesSync(obj) {\n    const valid = Uint8Array.of(typeof obj.valid === 'function' && obj.valid() ? 1 : 0);\n    switch (typeof obj.physicalType === 'function' ? obj.physicalType() : '') {\n    case 'BoolScalar':\n        return sha256BytesSync(concatBytes(valid, Uint8Array.of(obj.value() ? 1 : 0)));\n    case 'IntegralScalar':\n        return sha256BytesSync(concatBytes(valid, i64Bytes(obj.valueBig() ?? 0n)));\n    case 'FloatScalar32':\n        return sha256BytesSync(concatBytes(valid, f32Bytes(obj.value() ?? 0)));\n    case 'FloatScalar64':\n        return sha256BytesSync(concatBytes(valid, f64Bytes(obj.value() ?? 0)));\n    case 'BytesScalar':\n        return hexToBytes(obj.dataHashHex(), 'ptrless.hash.scalarHashBytesSync');\n    case 'UntypedScalar':\n        return sha256BytesSync(concatBytes(valid, u64Bytes(obj.flags() & ptlf.bitwidth_MASK)));\n    default:\n        throw new Error(`ptrless.hash.scalarHashBytesSync: unsupported scalar ${describeObject(obj)}`);\n    }\n}\n\n// describeObject keeps hash diagnostics short but still actionable.\nfunction describeObject(obj) {\n    return obj?.constructor?.name ?? typeof obj;\n}\n\nfunction i64Bytes(value) {\n    const out = new Uint8Array(8);\n    new DataView(out.buffer).setBigInt64(0, BigInt(value), true);\n    return out;\n}\n\nfunction u64Bytes(value) {\n    const out = new Uint8Array(8);\n    new DataView(out.buffer).setBigUint64(0, BigInt(value), true);\n    return out;\n}\n\nfunction f32Bytes(value) {\n    const out = new Uint8Array(4);\n    new DataView(out.buffer).setFloat32(0, value, true);\n    return out;\n}\n\nfunction f64Bytes(value) {\n    const out = new Uint8Array(8);\n    new DataView(out.buffer).setFloat64(0, value, true);\n    return out;\n}\n\nfunction concatBytes(...parts) {\n    const total = parts.reduce((sum, part) => sum + part.length, 0);\n    const out = new Uint8Array(total);\n    let offset = 0;\n    for (const part of parts) {\n        out.set(part, offset);\n        offset += part.length;\n    }\n    return out;\n}\n\n// sha256BytesSync keeps hash projections synchronous for existing UI call sites.\nexport function sha256BytesSync(bytes) {\n    const state = Uint32Array.from(SHA256_INIT);\n    const padded = padSha256(bytes);\n    const w = new Uint32Array(64);\n\n    for (let offset = 0; offset < padded.length; offset += 64) {\n        for (let i = 0; i < 16; i++) {\n            const at = offset + i * 4;\n            w[i] = (\n                (padded[at] << 24)\n                | (padded[at + 1] << 16)\n                | (padded[at + 2] << 8)\n                | padded[at + 3]\n            ) >>> 0;\n        }\n        for (let i = 16; i < 64; i++) {\n            w[i] = (smallSigma1(w[i - 2]) + w[i - 7] + smallSigma0(w[i - 15]) + w[i - 16]) >>> 0;\n        }\n\n        let a = state[0];\n        let b = state[1];\n        let c = state[2];\n        let d = state[3];\n        let e = state[4];\n        let f = state[5];\n        let g = state[6];\n        let h = state[7];\n        for (let i = 0; i < 64; i++) {\n            const t1 = (h + bigSigma1(e) + choose(e, f, g) + SHA256_K[i] + w[i]) >>> 0;\n            const t2 = (bigSigma0(a) + majority(a, b, c)) >>> 0;\n            h = g;\n            g = f;\n            f = e;\n            e = (d + t1) >>> 0;\n            d = c;\n            c = b;\n            b = a;\n            a = (t1 + t2) >>> 0;\n        }\n        state[0] = (state[0] + a) >>> 0;\n        state[1] = (state[1] + b) >>> 0;\n        state[2] = (state[2] + c) >>> 0;\n        state[3] = (state[3] + d) >>> 0;\n        state[4] = (state[4] + e) >>> 0;\n        state[5] = (state[5] + f) >>> 0;\n        state[6] = (state[6] + g) >>> 0;\n        state[7] = (state[7] + h) >>> 0;\n    }\n\n    const out = new Uint8Array(HASH_BYTES);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < state.length; i++) {\n        dv.setUint32(i * 4, state[i], false);\n    }\n    return out;\n}\n\nfunction padSha256(bytes) {\n    const bitLength = BigInt(bytes.length) * 8n;\n    const paddedBytes = (((bytes.length + 9 + 63) >> 6) << 6);\n    const out = new Uint8Array(paddedBytes);\n    out.set(bytes, 0);\n    out[bytes.length] = 0x80;\n    new DataView(out.buffer).setBigUint64(out.length - 8, bitLength, false);\n    return out;\n}\n\nfunction rotr(x, bits) {\n    return ((x >>> bits) | (x << (32 - bits))) >>> 0;\n}\n\nfunction choose(x, y, z) {\n    return ((x & y) ^ (~x & z)) >>> 0;\n}\n\nfunction majority(x, y, z) {\n    return ((x & y) ^ (x & z) ^ (y & z)) >>> 0;\n}\n\nfunction bigSigma0(x) {\n    return (rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22)) >>> 0;\n}\n\nfunction bigSigma1(x) {\n    return (rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25)) >>> 0;\n}\n\nfunction smallSigma0(x) {\n    return (rotr(x, 7) ^ rotr(x, 18) ^ (x >>> 3)) >>> 0;\n}\n\nfunction smallSigma1(x) {\n    return (rotr(x, 17) ^ rotr(x, 19) ^ (x >>> 10)) >>> 0;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { sha256BytesSync } from './hash.mjs';\nimport {\n    PuffPtlMetadataV2FieldRoles,\n    PuffPtlAxisFieldRoles,\n} from './concrete/base.gen.mjs';\n\n// Traversal state is internal control information. It must never be written\n// into a ptrless object or confused with a physical metadata value.\nexport const GraphState = Object.freeze({\n    Payload: 'payload',\n    Metadata: 'metadata',\n});\n\nexport const SELF_EDGE_REL = 1;\nconst FRONTIER_TAG = new TextEncoder().encode('ptrless.frontier.v1');\n\nexport function canonicalClosedFrontierBytes(depth, qualifiers = 0n) {\n    const depthValue = typeof depth === 'bigint' ? depth : BigInt(depth);\n    if (depthValue <= 0n || (typeof depth !== 'bigint' && !Number.isInteger(depth))) {\n        throw new RangeError(`ptrless canonical frontier: depth must be positive, got ${String(depth)}`);\n    }\n    const qualifierValue = typeof qualifiers === 'bigint' ? qualifiers : BigInt(qualifiers);\n    if (qualifierValue < 0n || qualifierValue > 0xffffffffffffffffn) {\n        throw new RangeError('ptrless canonical frontier: qualifiers must fit uint64');\n    }\n    const result = new Uint8Array(FRONTIER_TAG.length + 16);\n    result.set(FRONTIER_TAG);\n    const view = new DataView(result.buffer);\n    view.setBigUint64(FRONTIER_TAG.length, depthValue, true);\n    view.setBigUint64(FRONTIER_TAG.length + 8, qualifierValue, true);\n    return result;\n}\n\nexport function canonicalClosedFrontierHashBytes(depth, qualifiers = 0n) {\n    return sha256BytesSync(canonicalClosedFrontierBytes(depth, qualifiers));\n}\n\nexport const TraversalNodeState = Object.freeze({\n    Unseen: 0,\n    Active: 1,\n    Completed: 2,\n});\n\n// Reification changes only the traversal role. The metadata value remains the\n// same object, so its payload hash and identity are preserved.\nexport function reifyMetadata(metadata) {\n    if (metadata === null || metadata === undefined) {\n        throw new TypeError('ptrless reifyMetadata: metadata is required');\n    }\n    return metadata;\n}\n\n// assertLocalFinalizationReady checks direct children only. A caller must\n// provide the physical finality predicate because wrappers differ by runtime.\nexport function assertLocalFinalizationReady(children, isFinalized) {\n    if (!Array.isArray(children) || typeof isFinalized !== 'function') {\n        throw new TypeError('ptrless local finalization: children and predicate are required');\n    }\n    for (const child of children) {\n        if (child === null || child === undefined) continue;\n        if (!isFinalized(child)) {\n            throw new Error('ptrless local finalization: direct child is not finalised');\n        }\n    }\n}\n\nexport class TraversalIdentity {\n    #states = new WeakMap();\n\n    state(object) {\n        if ((typeof object !== 'object' && typeof object !== 'function') || object === null) {\n            throw new TypeError('ptrless traversal identity: object must be a non-null object');\n        }\n        return this.#states.get(object) ?? TraversalNodeState.Unseen;\n    }\n\n    enter(object) {\n        const previous = this.state(object);\n        if (previous === TraversalNodeState.Unseen) {\n            this.#states.set(object, TraversalNodeState.Active);\n        }\n        return previous;\n    }\n\n    complete(object) {\n        if (this.state(object) !== TraversalNodeState.Active) {\n            throw new Error('ptrless traversal identity: complete requires an active object');\n        }\n        this.#states.set(object, TraversalNodeState.Completed);\n    }\n}\n\nexport class TraversalContext {\n    constructor({\n        declaredMetadata = null,\n        binders = [],\n        identity = new TraversalIdentity(),\n        ownerType = null,\n        ownerOffset = null,\n        fieldIndex = null,\n        fieldName = null,\n    } = {}) {\n        this.declaredMetadata = declaredMetadata;\n        this.binders = Object.freeze([...binders]);\n        this.identity = identity;\n        this.ownerType = ownerType;\n        this.ownerOffset = ownerOffset;\n        this.fieldIndex = fieldIndex;\n        this.fieldName = fieldName;\n        Object.freeze(this);\n    }\n\n    child(declaredMetadata = null) {\n        const binders = declaredMetadata === null\n            ? this.binders\n            : [...this.binders, declaredMetadata];\n        return new TraversalContext({ declaredMetadata, binders, identity: this.identity });\n    }\n\n    resolveFrontier(frontier, depth) {\n        if (frontier === null || frontier === undefined) return frontier;\n        if (!Number.isInteger(depth) || depth <= 0 || depth > this.binders.length) {\n            throw new Error(`ptrless traversal context: frontier depth ${String(depth)} exceeds binder depth ${this.binders.length}`);\n        }\n        return this.binders[this.binders.length - depth];\n    }\n\n    resolveConcreteFrontier(frontier, depth, isConcrete) {\n        if (typeof isConcrete !== 'function') {\n            throw new TypeError('ptrless traversal context: concrete predicate is required');\n        }\n        const resolved = this.resolveFrontier(frontier, depth);\n        if (resolved === null || resolved === undefined || !isConcrete(resolved)) {\n            throw new Error('ptrless traversal context: frontier resolves to abstract metadata');\n        }\n        return resolved;\n    }\n}\n\nexport const ZeroRelContext = Object.freeze({\n    DeclaredFieldMetatype: 'declared-field-metatype',\n    MetadataBootstrap: 'metadata-bootstrap',\n    PayloadMetadataGraph: 'payload-metadata-graph',\n});\n\nexport function isLazyPhysicalType(obj) {\n    const physicalType = typeof obj?.physicalType === 'function' ? obj.physicalType() : null;\n    return physicalType === 'Lazy'\n        || physicalType === 'LazyHandle'\n        || physicalType === 'LazyHash'\n        || physicalType === 'LazyDerived';\n}\n\nexport function declaredFieldMetatype(meta, index) {\n    if (!meta || typeof meta.fieldMetatypes !== 'function' || index < 0) {\n        return null;\n    }\n    const fieldMetatypes = meta.fieldMetatypes();\n    if (!fieldMetatypes || typeof fieldMetatypes.at !== 'function'\n        || typeof fieldMetatypes.numFields !== 'function'\n        || index >= fieldMetatypes.numFields()) {\n        return null;\n    }\n    return fieldMetatypes.at(index);\n}\n\nexport function declaredItemsMetatype(meta) {\n    if (!meta || typeof meta.itemsMetatype !== 'function') {\n        return null;\n    }\n    return meta.itemsMetatype();\n}\n\n// Aggregate edge roles come from the generated declaration, not from the\n// runtime value stored in the field. MetadataV1 uses the same role-bearing\n// prefix as MetadataV2; the field_metatypes carrier is deliberately a\n// metadata-state edge even though its logical value is a Tuple.\nexport function metadataFieldGraphState(index, fallback = GraphState.Payload) {\n    if (index >= 0 && index < PuffPtlMetadataV2FieldRoles.length\n        && PuffPtlMetadataV2FieldRoles[index] === GraphState.Metadata) {\n        return GraphState.Metadata;\n    }\n    return fallback;\n}\n\nexport function axisFieldGraphState(index, fallback = GraphState.Payload) {\n    if (index >= 0 && index < PuffPtlAxisFieldRoles.length\n        && PuffPtlAxisFieldRoles[index] === GraphState.Metadata) {\n        return GraphState.Metadata;\n    }\n    return fallback;\n}\n\nexport function assertGraphState(state, operation='ptrless serialisation') {\n    if (state !== GraphState.Payload && state !== GraphState.Metadata) {\n        throw new Error(\n            `${operation}: invalid graph state ${String(state)}; `\n            + `expected '${GraphState.Payload}' or '${GraphState.Metadata}'`\n        );\n    }\n    return state;\n}\n\n/**\n * Resolve a zero metadata relative offset from the already-known traversal\n * context. This is a contract helper for the importer/exporter migration;\n * it deliberately does not inspect or walk the object graph.\n */\nexport function resolveZeroRelContext(state, {\n    isMetadataRoot = false,\n    hasDeclaredFieldMetatype = false,\n    hasPayloadMetadataGraph = false,\n    hasPayloadPosition = false,\n} = {}) {\n    assertGraphState(state, 'ptrless zero-rel resolution');\n\n    const candidates = [];\n    if (state === GraphState.Metadata && isMetadataRoot) {\n        candidates.push(ZeroRelContext.MetadataBootstrap);\n    }\n    if (hasDeclaredFieldMetatype) {\n        candidates.push(ZeroRelContext.DeclaredFieldMetatype);\n    }\n    if (state === GraphState.Payload && hasPayloadMetadataGraph && hasPayloadPosition) {\n        candidates.push(ZeroRelContext.PayloadMetadataGraph);\n    }\n\n    if (candidates.length !== 1) {\n        throw new Error(\n            `ptrless zero-rel resolution: context must select exactly one source; `\n            + `state=${state}, candidates=${candidates.length}`\n        );\n    }\n    return candidates[0];\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { hashIdentityHexSync } from '../hash.mjs';\nimport { reifyMetadata } from '../serialization-state.mjs';\n\n\nconst QWORD = 8;\nconst HASH_BYTES = 32;\nexport class Core {\n    // Call ptl.importObject rather than this directly.\n    constructor(builder, offset, spine) {\n        this._builder = builder;\n        this._offset = offset;\n        this._spine = spine;\n    }\n\n    // Perform any lazy parsing of the ptrless data required to bring this\n    // object into a ready state. You never NEED to call this, but it might be\n    // useful as an optimisation.\n    touch() {\n    }\n\n    // Retrieve the metadata for this object as ptrless MetadataV1.\n    meta() {\n        if (!this._meta) {\n            throw new Error(`This object did not come with metadata.`);\n        }\n        return reifyMetadata(this._meta);\n    }\n\n    // Return the attached metadata edge for codecs and graph walkers. Public\n    // callers should use meta(), which makes the traversal role explicit.\n    rawMetadata() {\n        return this._meta ?? null;\n    }\n\n    diagnostic() {\n        return this._diagnostic ?? null;\n    }\n\n    // Is it a scalar or a 1D array, meaning it has no further child objects?\n    isLeaf() {\n        const flags = this._spine.getBigUint64(0, true);\n        return (flags & ptlf.inner_MASK) != ptlf.inner_NONE;\n    }\n\n    // Is it a scalar? (Scalars never have child objects, beyond metadata.)\n    isScalar() {\n        const flags = this._spine.getBigUint64(0, true);\n        return (flags & ptlf.outer_MASK) == ptlf.outer_SCALAR;\n    }\n\n    // One of Struct, Tuple or NamedTuple which are the hetrogenous collection types.\n    isHetrogenous() {\n        const flags = this._spine.getBigUint64(0, true);\n        if ((flags & ptlf.inner_MASK) == ptlf.inner_NONE) {\n            return false;\n        }\n\n        switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_STRUCT:\n        case ptlf.outer_TUPLE:\n        case ptlf.outer_NAMED_TUPLE:\n            return true;\n        }\n\n        return false;\n    }\n\n    flags() {\n        return this._spine.getBigUint64(0, true);\n    }\n\n    iaxis() {\n        if (this.isScalar()) {\n            return null;\n        }\n        if (this._iaxis !== undefined) {\n            return this._iaxis;\n        }\n\n        const rel = Number(this._spine.getBigInt64(3 * QWORD, true));\n        if (rel === 0) {\n            this._iaxis = null;\n        } else {\n            this._iaxis = this._builder.buildChild(this, rel, 'iaxis', this._builder.declaredAxisMetadata());\n        }\n        return this._iaxis;\n    }\n\n    axisName() {\n        const axis = this.iaxis();\n        if (!axis || typeof axis.field !== 'function') {\n            return '';\n        }\n\n        try {\n            const name = axis.field('name');\n            if (!name) {\n                return '';\n            }\n            if (typeof name.toText === 'function') {\n                return name.toText();\n            }\n            if (typeof name.toString === 'function') {\n                const text = name.toString();\n                if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n                    return text.slice(1, -1);\n                }\n                return text;\n            }\n        } catch (_err) {\n        }\n\n        return '';\n    }\n\n    outerWithAxis(head) {\n        const axis = this.axisName();\n        return axis ? `${head}${axis}` : head;\n    }\n\n    dataHashHex() {\n        if (!this._dataHashHex) {\n            if (this.isScalar()) {\n                throw new Error(`ptrless.Core.dataHashHex: scalar ${this.logicalType()} does not carry a stored on-wire hash.`);\n            }\n            if ((this.flags() & ptlf.HASH_POPULATED) === 0n) {\n                throw new Error(`ptrless.Core.dataHashHex: non-scalar ${this.logicalType()} is missing HASH_POPULATED.`);\n            }\n            const bytes = new Uint8Array(\n                this._builder.buffer,\n                this._offset - this._builder.base + 64,\n                HASH_BYTES,\n            );\n            this._dataHashHex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n        }\n        return this._dataHashHex;\n    }\n\n    totalHashHex() {\n        if (!this._totalHashHex) {\n            this._totalHashHex = hashIdentityHexSync(this);\n        }\n        return this._totalHashHex;\n    }\n\n    preview() {\n        return this.toString();\n    }\n\n    _prepopulate(meta) {\n        this._meta = meta;\n    }\n\n    physicalType() {\n        const flags = this.flags();\n        const outer = flags & ptlf.outer_MASK;\n        const inner = flags & ptlf.inner_MASK;\n        if (outer === ptlf.outer_SCALAR) {\n            if (inner === ptlf.inner_NONE) {\n                return 'Scalar';\n            }\n            return `${ptlf.decodeInnerLogical(flags)}Scalar`;\n        }\n        if (inner === ptlf.inner_NONE) {\n            return ptlf.decodeOuter(flags);\n        }\n        return `${ptlf.decodeInnerLogical(flags)}${ptlf.decodeOuter(flags)}`;\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        const outer = ptlf.decodeOuter(flags);\n        const inner = ptlf.decodeInner(flags);\n        const bw = ptlf.decodeBitwidth(flags);\n        return `<unknown! outer=${outer} inner=${inner} bitwidth=${bw}>`;\n    }\n\n    deepLogicalType() {\n        const flags = this.flags();\n        const outer = ptlf.decodeOuter(flags);\n        const inner = ptlf.decodeInner(flags);\n        const bw = ptlf.decodeBitwidth(flags);\n        return `<unknown! outer=${outer} inner=${inner} bitwidth=${bw}>`;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Compatibility names for the wire wrappers. Declaration order and indexes\n// are generated from base.idl.puff; this module contains no independent\n// MetadataV1/MetadataV2 schema table.\nexport {\n    PuffPtlMetadataV1Fields as METADATA_V1_FIELD_NAMES,\n    PuffPtlMetadataV1FieldCount as METADATA_V1_NUM_FIELDS,\n    PuffPtlMetadataV1FlagsField as METADATA_V1_FLAGS_INDEX,\n    PuffPtlMetadataV1ObjectNullableField as METADATA_V1_OBJECT_NULLABLE_INDEX,\n    PuffPtlMetadataV1FixedField as METADATA_V1_FIXED_INDEX,\n    PuffPtlMetadataV1LogicalField as METADATA_V1_LOGICAL_INDEX,\n    PuffPtlMetadataV1PhysicalField as METADATA_V1_PHYSICAL_INDEX,\n    PuffPtlMetadataV1LogicalBitwidthField as METADATA_V1_LOGICAL_BITWIDTH_INDEX,\n    PuffPtlMetadataV1PhysicalBitwidthField as METADATA_V1_PHYSICAL_BITWIDTH_INDEX,\n    PuffPtlMetadataV1FieldNamesField as METADATA_V1_FIELD_NAMES_INDEX,\n    PuffPtlMetadataV1FieldMetatypesField as METADATA_V1_FIELD_METATYPES_INDEX,\n    PuffPtlMetadataV1ItemsMetatypeField as METADATA_V1_ITEMS_METATYPE_INDEX,\n    PuffPtlMetadataV1KeyMetatypeField as METADATA_V1_KEY_METATYPE_INDEX,\n    PuffPtlMetadataV1ValueMetatypeField as METADATA_V1_VALUE_METATYPE_INDEX,\n    PuffPtlMetadataV1BasesField as METADATA_V1_BASES_INDEX,\n    PuffPtlMetadataV1SubtypeField as METADATA_V1_SUBTYPE_INDEX,\n    PuffPtlMetadataV1FormerAxisNameField as METADATA_V1_AXIS_NAME_INDEX,\n    PuffPtlMetadataV1SortedField as METADATA_V1_SORTED_INDEX,\n    PuffPtlMetadataV1UniqueField as METADATA_V1_UNIQUE_INDEX,\n    PuffPtlMetadataV1UnitField as METADATA_V1_UNIT_INDEX,\n    PuffPtlMetadataV1BasisField as METADATA_V1_BASIS_INDEX,\n    PuffPtlMetadataV2Fields as METADATA_V2_FIELD_NAMES,\n    PuffPtlMetadataV2FieldCount as METADATA_V2_NUM_FIELDS,\n    PuffPtlMetadataV2OwnerField as METADATA_V2_OWNER_INDEX,\n    PuffPtlMetadataV2ReadGroupsField as METADATA_V2_READ_GROUPS_INDEX,\n    PuffPtlMetadataV2WriteGroupsField as METADATA_V2_WRITE_GROUPS_INDEX,\n    PuffPtlMetadataV2AdminFlagsField as METADATA_V2_ADMIN_FLAGS_INDEX,\n    PuffPtlMetadataV2CreatedField as METADATA_V2_CREATED_INDEX,\n    PuffPtlMetadataV2ModifiedField as METADATA_V2_MODIFIED_INDEX,\n    PuffPtlMetadataV2DescriptionField as METADATA_V2_DESCRIPTION_INDEX,\n    PuffPtlMetadataV2TitleField as METADATA_V2_TITLE_INDEX,\n    PuffPtlMetadataV2IconField as METADATA_V2_ICON_INDEX,\n    PuffPtlMetadataV2DisplayWidthField as METADATA_V2_DISPLAY_WIDTH_INDEX,\n    PuffPtlMetadataV2DisplayHeightField as METADATA_V2_DISPLAY_HEIGHT_INDEX,\n    PuffPtlMetadataV2AbstractField as METADATA_V2_ABSTRACT_INDEX,\n    PuffPtlMetadataV2LegalRightsField as METADATA_V2_LEGAL_RIGHTS_INDEX,\n    PuffPtlMetadataV2CopyrightNoticeField as METADATA_V2_COPYRIGHT_NOTICE_INDEX,\n    PuffPtlMetadataV2AttributionField as METADATA_V2_ATTRIBUTION_INDEX,\n    PuffPtlMetadataV2PiiField as METADATA_V2_PII_INDEX,\n    PuffPtlMetadataV2ClassificationField as METADATA_V2_CLASSIFICATION_INDEX,\n    PuffPtlMetadataV2SourceUriField as METADATA_V2_SOURCE_URI_INDEX,\n    PuffPtlMetadataV2SourceKindField as METADATA_V2_SOURCE_KIND_INDEX,\n    PuffPtlMetadataV2ContentTypeField as METADATA_V2_CONTENT_TYPE_INDEX,\n    PuffPtlMetadataV2EncodingField as METADATA_V2_ENCODING_INDEX,\n    PuffPtlMetadataV2LanguageField as METADATA_V2_LANGUAGE_INDEX,\n    PuffPtlMetadataV2TagsField as METADATA_V2_TAGS_INDEX,\n    PuffPtlMetadataV2SourceLineageField as METADATA_V2_SOURCE_LINEAGE_INDEX,\n    PuffPtlMetadataV2ArtifactLineageField as METADATA_V2_ARTIFACT_LINEAGE_INDEX,\n    PuffPtlMetadataV2RetentionClassField as METADATA_V2_RETENTION_CLASS_INDEX,\n    PuffPtlMetadataV2PublicField as METADATA_V2_PUBLIC_INDEX,\n} from './base.gen.mjs';\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Core } from '../abstract/Core.mjs';\nimport * as ptlf from '../flags.mjs';\nimport {\n    METADATA_V1_FIELD_NAMES,\n    METADATA_V1_FIELD_NAMES_INDEX,\n    METADATA_V1_PHYSICAL_INDEX,\n} from '../concrete/MetadataFields.mjs';\nimport {\n    GraphState,\n    SELF_EDGE_REL,\n    isLazyPhysicalType,\n} from '../serialization-state.mjs';\nimport {\n    PuffPtlMetadataV1PhysicalType,\n} from '../concrete/base.gen.mjs';\n\n\nconst QWORD = 8;\nconst ARRAY_ALIGN = 64;\nfunction bytesForBits(bits) {\n    const bytes = bits / 8; // NB: fractional\n    return Math.ceil(bytes / ARRAY_ALIGN) * ARRAY_ALIGN;\n}\n\nfunction rowValueAt(value, index) {\n    if (typeof value?.rowAt === 'function') {\n        return value.rowAt(index);\n    }\n    if (typeof value?.length === 'function' && typeof value?.at === 'function') {\n        return value.at(index);\n    }\n    return value;\n}\n\n// A row is a view over an axis-free physical Struct.  LogicalAxis owns the\n// cardinality and presents this view; plain Struct itself is always scalar.\nexport class HeteroRow {\n    constructor(owner, index, cardinalityOwner = owner) {\n        this._owner = owner;\n        this._index = index;\n        this._cardinalityOwner = cardinalityOwner;\n    }\n\n    field(name) {\n        return rowValueAt(this._owner.field(name), this._index);\n    }\n\n    meta() {\n        return this._owner.meta();\n    }\n\n    fieldNames() {\n        return this._owner.fieldNames();\n    }\n\n    numFields() {\n        return this._owner.numFields();\n    }\n\n    at(n) {\n        return this.field(this.fieldNames()[n]);\n    }\n\n    valid() {\n        return this._cardinalityOwner.validAt(this._index);\n    }\n}\n\n\n/**\n    Common functionality between Struct, Tuple and NamedTuple.\n*/\nexport class Hetero extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        let numFields = Number(spine.getBigInt64(5 * QWORD, true));\n        const fieldsAdif = Number(spine.getBigInt64(6 * QWORD, true));\n        this._fieldAdifs = builder.bigInt64Array(offset + fieldsAdif, numFields);\n        this._validity = null;\n\n        const validityAdif = Number(spine.getBigInt64(4 * QWORD, true));\n        if (validityAdif) {\n            const length = Number(spine.getBigInt64(12 * QWORD, true));\n            this._validity = builder.uint8Array(offset + validityAdif, bytesForBits(length));\n        }\n\n        this._fields = new Array(numFields).fill(null);\n        this._fieldIndicesByName = null;\n        this._fieldNames = null;\n        this._publicFieldNames = null;\n    }\n\n    fieldNames() {\n        this._ensureFieldSchema();\n        if (!this._fieldIndicesByName) {\n            throw new Error(`Field names unknown for this object because no metadata was provided.`);\n        }\n\n        if (!this._publicFieldNames) {\n            this._publicFieldNames = Array.from(this._fieldIndicesByName.keys());\n        }\n        return this._publicFieldNames;\n    }\n\n    numFields() {\n        return Number(this._spine.getBigInt64(5 * QWORD, true));\n    }\n\n    storageNumFields() {\n        return Number(this._spine.getBigInt64(5 * QWORD, true));\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    rowAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`rowAt(${i}) illegal, as out-of-range for hetero of size ${length}.`);\n        }\n        return new HeteroRow(this, i);\n    }\n\n    numNulls() {\n        return Number(this._spine.getBigInt64(13 * QWORD, true));\n    }\n\n    validAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`validAt(${i}) illegal, as out-of-range for hetero of size ${length}.`);\n        } else if (!this._validity) {\n            return true;\n        }\n\n        return ((this._validity[Math.trunc(i / 8)] >> (i % 8)) & 1) !== 0;\n    }\n\n    valid() {\n        return this.length() === 0 || this.validAt(0);\n    }\n\n    field(name) {\n        this._ensureFieldSchema();\n        const fibn = this._fieldIndicesByName;\n        if (!fibn) {\n            throw new Error(`Field names unknown for this object because no metadata was provided.`);\n        }\n\n        let n = fibn.get(name);\n        if (n === undefined) {\n            throw new Error(`Field named '${name}' not found.`);\n        }\n\n        let fld = this._fields[n];\n        const fieldAdif = Number(this._fieldAdifs[n]);\n        if (fld === undefined || (fld === null && fieldAdif !== 0)) {\n            fld = this._materializeField(n, fieldAdif);\n            this._fields[n] = fld;\n        }\n\n        if (fld === null) {\n            if (name === 'axis_length') {\n                let physicalType = null;\n                let metaPhysicalType = null;\n                try {\n                    physicalType = typeof this.physicalType === 'function' ? this.physicalType() : null;\n                } catch (_err) {\n                    physicalType = '<physicalType threw>';\n                }\n                try {\n                    const meta = this._meta;\n                    const physical = meta && typeof meta.field === 'function' ? meta.field('physical') : null;\n                    metaPhysicalType = physical && typeof physical.toText === 'function' ? physical.toText() : null;\n                } catch (_err) {\n                    metaPhysicalType = '<metadata physical threw>';\n                }\n                console.error('ptrless Axis field has unused wire slot.', {\n                    offset: this._offset,\n                    field_index: n,\n                    field_name: name,\n                    field_adif: Number(this._fieldAdifs[n]),\n                    field_count: this.storageNumFields(),\n                    physical_type: physicalType,\n                    metadata_physical_type: metaPhysicalType,\n                });\n            }\n            throw new Error(`Field ${n} named '${name}' is an unused slot, and should not be dereferenced.`);\n        }\n        return fld;\n    }\n\n    at(n) {\n        let numFields = this.numFields();\n        if (n < 0 || n >= numFields) {\n            throw new Error(`at(${n}): index out of range for hetreogenous container with ${numFields} fields.`);\n        }\n        return this.storageAt(n);\n    }\n\n    storageAt(n) {\n        let numFields = this.storageNumFields();\n        if (n < 0 || n >= numFields) {\n            throw new Error(`storageAt(${n}): index out of range for hetreogenous container with ${numFields} storage fields.`);\n        }\n\n        let fld = this._fields[n];\n        const rel = Number(this._fieldAdifs[n]);\n        if (fld === undefined || (fld === null && rel !== 0)) {\n            fld = this._materializeField(n, rel);\n            this._fields[n] = fld;\n        }\n\n        if (fld === null) {\n            if (this._fieldName(n) === 'axis_length') {\n                let physicalType = null;\n                try {\n                    physicalType = typeof this.physicalType === 'function' ? this.physicalType() : null;\n                } catch (_err) {\n                    physicalType = '<physicalType threw>';\n                }\n                console.error('ptrless Axis positional field has unused wire slot.', {\n                    offset: this._offset,\n                    field_index: n,\n                    field_name: this._fieldName(n),\n                    field_adif: Number(this._fieldAdifs[n]),\n                    field_count: this.storageNumFields(),\n                    physical_type: physicalType,\n                });\n            }\n            throw new Error(`Field ${n} named '${this._fieldName(n)}' is an unused slot, and should not be dereferenced.`);\n        }\n        return fld;\n    }\n\n    _fieldName(n) {\n        this._ensureFieldSchema();\n        if (this._fieldNames && n < this._fieldNames.length) {\n            return this._fieldNames[n];\n        }\n        return `field${n}`;\n    }\n\n    _refreshFieldSchema(meta) {\n        if (Array.isArray(this._knownFieldNames)) {\n            this._fieldNames = Array.from(this._knownFieldNames);\n            this._fieldSchemaDeferred = false;\n            return;\n        }\n        if (!meta) {\n            this._fieldNames = [];\n            this._fieldSchemaDeferred = false;\n            return;\n        }\n        if (isLazyPhysicalType(meta)) {\n            this._fieldNames = [];\n            this._fieldSchemaDeferred = true;\n            return;\n        }\n\n        const physical = meta.at(METADATA_V1_PHYSICAL_INDEX, false);\n        const physicalName = typeof physical?.toText === 'function' ? physical.toText() : '';\n        if (physicalName === PuffPtlMetadataV1PhysicalType) {\n            this._fieldNames = Array.from(METADATA_V1_FIELD_NAMES);\n        } else {\n            const fieldNames = meta.at(METADATA_V1_FIELD_NAMES_INDEX, false);\n            if (typeof fieldNames?.toArray !== 'function') {\n                const physicalType = typeof fieldNames?.physicalType === 'function'\n                    ? fieldNames.physicalType()\n                    : String(fieldNames);\n                throw new TypeError(`metadata field_names must expose toArray(); got ${physicalType}`);\n            }\n            this._fieldNames = fieldNames.toArray();\n        }\n        this._fieldSchemaDeferred = false;\n    }\n\n    _rebuildFieldIndex() {\n        const numFields = this.storageNumFields();\n        this._fieldIndicesByName = new Map();\n        this._publicFieldNames = null;\n        for (let n = 0; n < numFields; n++) {\n            const name = this._fieldName(n);\n            if (n < this.numFields() && (name || name === '')) {\n                this._fieldIndicesByName.set(name, n);\n            }\n        }\n    }\n\n    _ensureFieldSchema() {\n        if (this._fieldSchemaDeferred !== true) {\n            return;\n        }\n        const meta = this._meta ?? null;\n        if (!meta || isLazyPhysicalType(meta)) {\n            return;\n        }\n        this._refreshFieldSchema(meta);\n        this._rebuildFieldIndex();\n    }\n\n    _buildField(fieldOffset, name, index) {\n        const declaredMeta = this._builder.declaredFieldMetatype(this, index);\n        return this._builder.build(\n            fieldOffset,\n            name,\n            GraphState.Payload,\n            this._builder.childContext(declaredMeta, {\n                ownerType: this.constructor?.name ?? typeof this,\n                ownerOffset: this._offset,\n                fieldIndex: index,\n                fieldName: name,\n            }),\n        );\n    }\n\n    _materializeField(index, rel = Number(this._fieldAdifs[index])) {\n        if (rel === 0) {\n            return null;\n        }\n        if (rel === SELF_EDGE_REL) {\n            throw new Error(\n                `ptrless.import: ordinary aggregate field ${index} at ${this._offset} self-references its owner`\n            );\n        }\n        return this._buildField(this._offset + rel, this._fieldName(index), index);\n    }\n\n    _prepopulate(meta) {\n        super._prepopulate(meta);\n\n        const offset = this._offset;\n        const numFields = this.storageNumFields();\n\n        this._refreshFieldSchema(meta);\n        if (!isLazyPhysicalType(meta)\n            && (this.flags() & ptlf.outer_MASK) === ptlf.outer_STRUCT\n            && this._fieldNames.length !== numFields) {\n            throw new Error(\n                `ptrless.import: aggregate at ${offset} has ${numFields} fields, `\n                + `but its metadata declares ${this._fieldNames.length}`\n            );\n        }\n        this._fieldIndicesByName = new Map();\n        this._publicFieldNames = null;\n\n        // A session frame may carry a reusable metadata placeholder. Keep\n        // field wrappers deferred until the session codec resolves that\n        // placeholder and supplies the concrete declared field contexts.\n        if (isLazyPhysicalType(meta)) {\n            this._fields.fill(undefined);\n            return;\n        }\n\n        for (let n = 0; n < numFields; n++) {\n            let name = this._fieldName(n);\n            if (n < this.numFields() && (name || name === '')) {\n                this._fieldIndicesByName.set(name, n);\n            }\n\n            const rel = Number(this._fieldAdifs[n]);\n            if (rel !== 0) {\n                this._fields[n] = this._materializeField(n, rel);\n            } else {\n                // Declared context supplies a child's schema, never its value.\n                // Every Hetero field therefore remains explicit on the wire,\n                // including metadata-role fields such as field_metatypes and\n                // items_metatype.\n                this._fields[n] = this._builder.rejectZeroAdifFieldValue(this, meta, n, name);\n            }\n        }\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Hetero } from '../abstract/Hetero.mjs';\n\n\nconst QWORD = 8;\n\n\nexport class Struct extends Hetero {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    at(n, warning) {\n        //console.warn(`Struct.at(${n}): should not access Struct fields by position.`);\n        return super.at(n);\n    }\n\n    logicalType() {\n        return 'Struct';\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    deepLogicalType(class_) {\n        class_ = class_ || 'Struct';\n\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o += 'o';\n        }\n\n        let ret = `${o}${class_}{`;\n        const fieldNames = this.fieldNames();\n        const numFields = fieldNames.length;\n\n        for (let n = 0; n < numFields; n++) {\n            const name = fieldNames.at(n);\n            if (n > 0) {\n                ret += ', ';\n            }\n\n            let nested = this.field(name).deepLogicalType();\n            ret += `${name}: ${nested}`;\n        }\n        ret += '}';\n\n        return ret;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.gen.mjs';\nimport { Core } from '../abstract/Core.mjs';\n\n\nexport class Scalar extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    valid() {\n        const flags = this._spine.getBigUint64(0, true);\n        return (flags & ptlf.SCALAR_VALID) != 0;\n    }\n\n    preview() {\n        if (!this.valid()) {\n            return null;\n        }\n        return this.toString();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Scalar } from '../abstract/Scalar.mjs';\n\n\nexport class BoolScalar extends Scalar {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    value() {\n        const flags = this._spine.getBigUint64(0, true);\n        if (!(flags & ptlf.SCALAR_VALID)) {\n            return null;\n        }\n\n        return (flags & ptlf.SCALAR_BOOL) != 0;\n    }\n\n    toString() {\n        return `${this.value()}`;\n    }\n\n    physicalType() {\n        return 'BoolScalar';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let ret = ``;\n        if (flags & ptlf.inner_NULLABLE) {\n            ret += 'o';\n        }\n\n        ret += 'Bool';\n        return ret;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Scalar } from '../abstract/Scalar.mjs';\n\n\nconst QWORD = 8;\n\n\nexport class BytesScalar extends Scalar {\n    constructor(builder, offset, spine) {\n        spine = builder.dataView(offset, 10 * QWORD);\n        super(builder, offset, spine);\n        if ((this.flags() & ptlf.HASH_POPULATED) === 0n) {\n            throw new Error(`ptrless.import: byte scalar ${offset} is missing HASH_POPULATED`);\n        }\n        this._dataHashHex = Array.from(builder.uint8Array(offset + 40, 32), b => b.toString(16).padStart(2, '0')).join('');\n        if (/^0+$/.test(this._dataHashHex)) {\n            throw new Error(`ptrless.import: byte scalar ${offset} has a zero payload hash`);\n        }\n        this._numBytes = builder.wireCount(spine, 3, `bytes scalar ${offset} length`);\n\n        const byteDataOffset = builder.wireRelative(\n            offset,\n            spine,\n            4,\n            `bytes scalar ${offset} values`,\n            { allowZero: false, minimumBytes: this._numBytes + 1 },\n        );\n        if (builder.uint8Array(byteDataOffset + this._numBytes, 1)[0] !== 0) {\n            throw new Error(`ptrless.import: bytes scalar ${offset} is not NUL terminated`);\n        }\n        this._byteData = builder.uint8Array(byteDataOffset, this._numBytes);\n    }\n\n    bytes() {\n        return this._numBytes;\n    }\n\n    dataHashHex() {\n        return this._dataHashHex;\n    }\n\n    toUint8Array() {\n        return this._byteData.slice();\n    }\n\n    toText() {\n        const flags = this._spine.getBigUint64(0, true);\n        if ((flags & ptlf.inner_MASK) != ptlf.inner_STR) {\n            throw new Error(`BytesScalar.toText: called on binary data.`);\n        }\n\n        const decoder = new TextDecoder();\n        return decoder.decode(this._byteData);\n    }\n\n    toString() {\n        return `'` + this.toText() + `'`;\n    }\n\n    physicalType() {\n        return 'BytesScalar';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${o}${inner}`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Scalar } from '../abstract/Scalar.mjs';\n\n\nconst QWORD = 8;\n\n\nexport class FloatScalar32 extends Scalar {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    value() {\n        if (!this.valid()) {\n            return null;\n        }\n\n        return this._spine.getFloat32(3 * QWORD, true);\n    }\n\n    toString() {\n        return `${this.value()}`;\n    }\n\n    physicalType() {\n        return 'FloatScalar32';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        return `${o}Float32`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class FloatScalar64 extends Scalar {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    value() {\n        if (!this.valid()) {\n            return null;\n        }\n\n        return this._spine.getFloat64(3 * QWORD, true);\n    }\n\n    toString() {\n        return `${this.value()}`;\n    }\n\n    physicalType() {\n        return 'FloatScalar64';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        return `${o}Float64`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Scalar } from '../abstract/Scalar.mjs';\n\n\nconst QWORD = 8;\n\n\nexport class IntegralScalar extends Scalar {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    value() {\n        if (!this.valid()) {\n            return null;\n        }\n\n        const big = this._spine.getBigInt64(3 * QWORD, true);\n        const val = Number(big);\n        if (val < Number.MIN_SAFE_INTEGER || val > Number.MAX_SAFE_INTEGER) {\n            throw new Error(`value() cannot represent ${big} as a Number without losing precision. Use valueBig() to retrieve as a BigInt, if needed.`);\n        }\n\n        return val;\n    }\n\n    valueBig() {\n        if (!this.valid()) {\n            return null;\n        }\n\n        return this._spine.getBigInt64(3 * QWORD, true);\n    }\n\n    toString() {\n        return `${this.valueBig()}`;\n    }\n\n    physicalType() {\n        return 'IntegralScalar';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${o}${inner}`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { sha256BytesSync } from '../hash.mjs';\nimport { BoolScalar } from './BoolScalar.mjs';\nimport { BytesScalar } from './BytesScalar.mjs';\nimport { FloatScalar32, FloatScalar64 } from './FloatScalar.mjs';\nimport { IntegralScalar } from './IntegralScalar.mjs';\n\n\nconst QWORD = 8;\nconst BYTES_SCALAR_HEAD_BYTES = 10 * QWORD;\n\nclass ScalarBufferBuilder {\n    constructor(buffer) {\n        this.buffer = buffer;\n        this.base = 0;\n    }\n\n    dataView(offset, length) {\n        return new DataView(this.buffer, offset, length);\n    }\n\n    uint8Array(offset, length) {\n        return new Uint8Array(this.buffer, offset, length);\n    }\n\n    wireCount(spine, slot, label) {\n        const value = spine.getBigInt64(slot * QWORD, true);\n        if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n            throw new Error(`ptrless scalar projection: ${label} is invalid: ${value}`);\n        }\n        return Number(value);\n    }\n\n    wireRelative(ownerOffset, spine, slot, label, { allowZero = true, minimumBytes = 0 } = {}) {\n        const rel = this.wireCount(spine, slot, label);\n        if (rel === 0 && !allowZero) {\n            throw new Error(`ptrless scalar projection: ${label} is zero`);\n        }\n        const absolute = ownerOffset + rel;\n        if (absolute < 0 || minimumBytes > this.buffer.byteLength - absolute) {\n            throw new Error(`ptrless scalar projection: ${label} exceeds its buffer`);\n        }\n        return absolute;\n    }\n}\n\nfunction requireIndex(owner, index) {\n    const length = owner.length();\n    if (!Number.isInteger(index) || index < 0 || index >= length) {\n        throw new Error(`${owner.physicalType()}.at(${index}) out of range for length ${length}.`);\n    }\n}\n\nfunction itemMetatype(owner) {\n    const meta = owner._meta ?? null;\n    if (!meta) {\n        return null;\n    }\n    const outer = typeof meta.flags === 'function' ? meta.flags() & ptlf.outer_MASK : 0n;\n    if (outer === ptlf.outer_LAZY_HASHED || outer === ptlf.outer_LAZY_HANDLE) {\n        return null;\n    }\n    if (typeof meta.itemsMetatype === 'function') {\n        return meta.itemsMetatype() ?? meta;\n    }\n    return meta;\n}\n\nfunction scalarFlags(owner, index, { boolValue = false } = {}) {\n    const source = owner.flags();\n    let flags = ptlf.BEACON_BIT\n        | ptlf.outer_SCALAR\n        | (source & (ptlf.inner_MASK | ptlf.bitwidth_MASK | ptlf.inner_NULLABLE));\n    if (owner.validAt(index)) {\n        flags |= ptlf.SCALAR_VALID;\n    }\n    if (boolValue) {\n        flags |= ptlf.SCALAR_BOOL;\n    }\n    return flags;\n}\n\nfunction finishScalar(owner, scalar) {\n    scalar._slot = null;\n    scalar._prepopulate(itemMetatype(owner));\n    return scalar;\n}\n\nfunction boolScalar(owner, index) {\n    const buffer = new ArrayBuffer(5 * QWORD);\n    const spine = new DataView(buffer);\n    const value = owner.valueAt(index) === true;\n    spine.setBigUint64(0, scalarFlags(owner, index, { boolValue: value }), true);\n    return finishScalar(owner, new BoolScalar(new ScalarBufferBuilder(buffer), 0, spine));\n}\n\nfunction integralScalar(owner, index) {\n    const buffer = new ArrayBuffer(5 * QWORD);\n    const spine = new DataView(buffer);\n    spine.setBigUint64(0, scalarFlags(owner, index), true);\n    let value;\n    if (owner._values instanceof BigInt64Array || owner._values instanceof BigUint64Array) {\n        value = owner._values[index];\n    } else if (owner._values) {\n        value = BigInt(owner._values[index]);\n    } else {\n        value = BigInt(owner.start() + index * owner.step());\n    }\n    spine.setBigInt64(3 * QWORD, value, true);\n    return finishScalar(owner, new IntegralScalar(new ScalarBufferBuilder(buffer), 0, spine));\n}\n\nfunction floatScalar(owner, index, bits) {\n    const buffer = new ArrayBuffer(5 * QWORD);\n    const spine = new DataView(buffer);\n    spine.setBigUint64(0, scalarFlags(owner, index), true);\n    const value = owner.valueAt(index) ?? 0;\n    if (bits === 32) {\n        spine.setFloat32(3 * QWORD, value, true);\n        return finishScalar(owner, new FloatScalar32(new ScalarBufferBuilder(buffer), 0, spine));\n    }\n    spine.setFloat64(3 * QWORD, value, true);\n    return finishScalar(owner, new FloatScalar64(new ScalarBufferBuilder(buffer), 0, spine));\n}\n\nfunction bytesScalar(owner, index) {\n    const [start, stop] = owner.rawSliceBounds(index);\n    const bytes = owner.rawValues().slice(start, stop);\n    const buffer = new ArrayBuffer(BYTES_SCALAR_HEAD_BYTES + bytes.length + 1);\n    const spine = new DataView(buffer, 0, BYTES_SCALAR_HEAD_BYTES);\n    const flags = scalarFlags(owner, index) | ptlf.HASH_POPULATED;\n    spine.setBigUint64(0, flags, true);\n    spine.setBigInt64(3 * QWORD, BigInt(bytes.length), true);\n    spine.setBigInt64(4 * QWORD, BigInt(BYTES_SCALAR_HEAD_BYTES), true);\n    const hashInput = new Uint8Array(bytes.length + 1);\n    hashInput[0] = (flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0;\n    hashInput.set(bytes, 1);\n    new Uint8Array(buffer, 5 * QWORD, 32).set(sha256BytesSync(hashInput));\n    new Uint8Array(buffer, BYTES_SCALAR_HEAD_BYTES).set(bytes);\n    return finishScalar(owner, new BytesScalar(new ScalarBufferBuilder(buffer), 0, spine));\n}\n\nexport function indexLeafArray(owner, index) {\n    requireIndex(owner, index);\n    if (!owner.isLeaf()) {\n        throw new Error(`${owner.physicalType()}.at(${index}) requires non-leaf structural indexing.`);\n    }\n    switch (owner.physicalType()) {\n    case 'BoolArrow':\n        return boolScalar(owner, index);\n    case 'IntegralArrow8':\n    case 'IntegralArrow16':\n    case 'IntegralArrow32':\n    case 'IntegralArrow64':\n    case 'IntegralArithmetic':\n    case 'IntegralArithmetic8':\n    case 'IntegralArithmetic16':\n    case 'IntegralArithmetic32':\n    case 'IntegralArithmetic64':\n        return integralScalar(owner, index);\n    case 'FloatArrow32':\n    case 'FloatArithmetic32':\n        return floatScalar(owner, index, 32);\n    case 'FloatArrow64':\n    case 'FloatArithmetic64':\n        return floatScalar(owner, index, 64);\n    case 'BytesArrow32':\n    case 'BytesArrow64':\n        return bytesScalar(owner, index);\n    default:\n        throw new Error(`${owner.physicalType()}.at(${index}) has no ptrless scalar projection.`);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\n\n\nconst QWORD = 8;\nconst SPINE_BYTES = 14 * QWORD;\n\nfunction requireSlice(root, start, stop) {\n    const length = root.length();\n    if (!Number.isInteger(start) || !Number.isInteger(stop) || start < 0 || stop < start || stop > length) {\n        throw new Error(`${root.physicalType()}.slice([${start},${stop})) exceeds length ${length}.`);\n    }\n}\n\nfunction sliceBitmap(bitmap, start, stop) {\n    if (!bitmap) {\n        return null;\n    }\n    const out = new Uint8Array(Math.ceil((stop - start) / 8));\n    for (let i = start; i < stop; i++) {\n        const byte = bitmap instanceof DataView\n            ? bitmap.getUint8(Math.trunc(i / 8))\n            : bitmap[Math.trunc(i / 8)];\n        if ((byte & (1 << (i % 8))) !== 0) {\n            const outIndex = i - start;\n            out[Math.trunc(outIndex / 8)] |= 1 << (outIndex % 8);\n        }\n    }\n    return out;\n}\n\nfunction slicedSpine(root, length, validity) {\n    const buffer = new ArrayBuffer(SPINE_BYTES);\n    const bytes = new Uint8Array(buffer);\n    const source = new Uint8Array(\n        root._spine.buffer,\n        root._spine.byteOffset,\n        Math.min(root._spine.byteLength, SPINE_BYTES),\n    );\n    bytes.set(source);\n    const spine = new DataView(buffer);\n    spine.setBigUint64(0, spine.getBigUint64(0, true) & ~(ptlf.BEACON_BIT | ptlf.HASH_POPULATED), true);\n    spine.setBigInt64(12 * QWORD, BigInt(length), true);\n    let nulls = 0;\n    if (validity) {\n        for (let i = 0; i < length; i++) {\n            if ((validity[Math.trunc(i / 8)] & (1 << (i % 8))) === 0) {\n                nulls++;\n            }\n        }\n    }\n    spine.setBigInt64(13 * QWORD, BigInt(nulls), true);\n    return spine;\n}\n\nfunction cloneRoot(root, start, stop) {\n    const out = Object.assign(Object.create(Object.getPrototypeOf(root)), root);\n    out._validity = sliceBitmap(root._validity, start, stop);\n    out._spine = slicedSpine(root, stop - start, out._validity);\n    out._iaxis = typeof root.iaxis === 'function' ? root.iaxis() : null;\n    out._dataHashHex = null;\n    out._totalHashHex = null;\n    return out;\n}\n\nfunction sliceBytes(root, out, start, stop) {\n    const OffsetArray = root._offsets.constructor;\n    const base = root._offsets[start];\n    out._offsets = new OffsetArray(stop - start + 1);\n    for (let i = start; i <= stop; i++) {\n        out._offsets[i - start] = root._offsets[i] - base;\n    }\n    const byteStart = Number(base);\n    const byteStop = Number(root._offsets[stop]);\n    out._values = root._values.slice(byteStart, byteStop);\n}\n\nfunction sliceHomo(root, out, start, stop) {\n    const OffsetArray = root._offsets.constructor;\n    const base = root._offsets[start];\n    out._offsets = new OffsetArray(stop - start + 1);\n    for (let i = start; i <= stop; i++) {\n        out._offsets[i - start] = root._offsets[i] - base;\n    }\n    out._items = slicePtrless(root.items(), Number(base), Number(root._offsets[stop]));\n}\n\nfunction sliceHetero(root, out, start, stop) {\n    const fields = new Array(root.storageNumFields());\n    for (let i = 0; i < fields.length; i++) {\n        fields[i] = slicePtrless(root.at(i), start, stop);\n    }\n    out._fields = fields;\n}\n\nexport function slicePtrless(root, start, stop) {\n    if (!root || typeof root.length !== 'function') {\n        throw new Error(`ptrless slice requires a collection, got ${root?.constructor?.name ?? typeof root}.`);\n    }\n    requireSlice(root, start, stop);\n    if (typeof root.isScalar === 'function' && root.isScalar()) {\n        if (start === 0 && stop === 1) {\n            return root;\n        }\n        throw new Error(`${root.physicalType()} cannot be sliced as [${start},${stop}).`);\n    }\n\n    const out = cloneRoot(root, start, stop);\n    const physical = root.physicalType();\n    switch (physical) {\n    case 'BoolArrow': {\n        const values = sliceBitmap(root._values, start, stop);\n        out._values = new DataView(values.buffer, values.byteOffset, values.byteLength);\n        break;\n    }\n    case 'IntegralArrow8':\n    case 'IntegralArrow16':\n    case 'IntegralArrow32':\n    case 'IntegralArrow64':\n    case 'FloatArrow32':\n    case 'FloatArrow64':\n        out._values = root._values.slice(start, stop);\n        break;\n    case 'IntegralArithmetic':\n    case 'IntegralArithmetic8':\n    case 'IntegralArithmetic16':\n    case 'IntegralArithmetic32':\n    case 'IntegralArithmetic64':\n    case 'FloatArithmetic32':\n    case 'FloatArithmetic64':\n        out._start = root._start + start * root._step;\n        break;\n    case 'BytesArrow32':\n    case 'BytesArrow64':\n        sliceBytes(root, out, start, stop);\n        break;\n    case 'HomoArrow32':\n    case 'HomoArrow64':\n        sliceHomo(root, out, start, stop);\n        break;\n    case 'VecArrow':\n        out._items = slicePtrless(root.items(), start * root.fixed(), stop * root.fixed());\n        break;\n    default:\n        if (typeof root.storageNumFields === 'function' && typeof root.at === 'function') {\n            sliceHetero(root, out, start, stop);\n            break;\n        }\n        throw new Error(`ptrless slice does not support physical type ${physical}.`);\n    }\n    return out;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.gen.mjs';\nimport { indexLeafArray } from '../concrete/ArrayIndex.mjs';\nimport { slicePtrless } from '../concrete/ArraySlice.mjs';\nimport { Core } from './Core.mjs';\n\n\nconst ARRAY_ALIGN = 64;\nconst QWORD = 8;\n\n\nfunction bytesForBits(bits) {\n    const bytes = bits / 8; // NB: fractional\n    return Math.ceil(bytes / ARRAY_ALIGN) * ARRAY_ALIGN;\n}\n\n\nexport class Arrow extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const validityAdif = Number(this._spine.getBigInt64(4 * QWORD, true));\n        if (validityAdif) {\n            const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n            this._validity = builder.uint8Array(offset + validityAdif, bytesForBits(length));\n        } else {\n            this._validity = null;\n        }\n    }\n\n    toArray() {\n        throw new Error(`${this.constructor.name}.toArray() not implemented.`);\n    }\n\n    at(i) {\n        return indexLeafArray(this, i);\n    }\n\n    slice(start, stop) {\n        return slicePtrless(this, start, stop);\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    numNulls() {\n        return Number(this._spine.getBigInt64(13 * QWORD, true));\n    }\n\n    validAt(i) {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        if (i < 0 || i >= length) {\n            return new Error(`validAt(${i}) illegal, as out-of-range for array of size ${length}.`);\n        } else if (!this._validity) {\n            return true;\n        }\n\n        return ((this._validity[Math.trunc(i / 8)] >> (i % 8)) & 1) !== 0;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Arrow } from '../abstract/Arrow.mjs';\n\n\nconst ARRAY_ALIGN = 64;\nconst QWORD = 8;\n\n\nfunction bytesForBits(bits) {\n    const bytes = bits / 8; // NB: fractional, not truncated\n    return Math.ceil(bytes / ARRAY_ALIGN) * ARRAY_ALIGN;\n}\n\n\nexport class BoolArrow extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const valuesStart = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.dataView(valuesStart, bytesForBits(length));\n    }\n\n    valueAt(i) {\n        if (!this.validAt(i)) {\n            return null;\n        }\n\n        return ((this._values.getUint8(Math.trunc(i / 8), true) >> (i % 8)) & 1) != 0;\n    }\n\n    toArray() {\n        const length = this.length();\n        let ret = new Array(length);\n        for (let i = 0; i < length; i++) {\n            if (!this.validAt(i)) {\n                ret[i] = null;\n            } else {\n                ret[i] = this.valueAt(i);\n            }\n        }\n        return ret;\n    }\n\n    toString() {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        let ret = '[';\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n\n            if (this.validAt(i)) {\n                ret += `${this.valueAt(i)}`;\n            } else {\n                ret += 'null';\n            }\n        }\n        ret += ']';\n        return ret;\n    }\n\n    physicalType() {\n        return 'BoolArrow';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        // TODO: axis\n        let outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        return `${outer}[${o}Bool]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Arrow } from '../abstract/Arrow.mjs';\nimport * as ptlf from '../flags.mjs';\n\n\nconst DWORD = 4;\nconst QWORD = 8;\n\n\nexport class BytesArrow32 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const offsetsStart = offset + Number(spine.getBigInt64(5 * QWORD, true));\n        this._offsets = builder.int32Array(offsetsStart, length + 1);\n\n        const valuesStart = offset + Number(spine.getBigInt64(6 * QWORD, true));\n        const valuesBytes = this._offsets[length];\n        this._values = builder.uint8Array(valuesStart, valuesBytes);\n    }\n\n    toArray() {\n        const decoder = new TextDecoder();\n        const n = this.length();\n        const offsets = this._offsets;\n        const values = this._values;\n        const ary = new Array(n);\n\n        let curOffset;\n        let nextOffset = offsets[0];\n        for (let i = 0; i < n; i++) {\n            curOffset = nextOffset;\n            nextOffset = offsets[i + 1];\n            if (!this.validAt(i)) {\n                ary[i] = null;\n                continue;\n            }\n            ary[i] = decoder.decode(values.slice(curOffset, nextOffset));\n        }\n\n        return ary;\n    }\n\n    /* Expose the authoritative offsets buffer so vectorised callers can stay on the ptrless binary contract. */\n    rawOffsets() {\n        return this._offsets;\n    }\n\n    /* Expose the authoritative values buffer so vectorised callers can decode directly from ptrless storage. */\n    rawValues() {\n        return this._values;\n    }\n\n    /* Resolve one row slice boundary without allocating a JS view or decoding a transient string. */\n    rawSliceBounds(i) {\n        const n = this.length();\n        if (i < 0 || i >= n) {\n            throw new Error(`rawSliceBounds(${i}) is undefined or out-of-range for array of length ${n}.`);\n        }\n        return [this._offsets[i], this._offsets[i + 1]];\n    }\n\n    toString() {\n        const flags = this.flags();\n        let outer = ptlf.decodeOuter(flags);\n        const decoder = new TextDecoder();\n        const n = this.length();\n        const offsets = this._offsets;\n        const values = this._values;\n\n        let s = '[';\n        let curOffset;\n        let nextOffset = offsets[0];\n        for (let i = 0; i < n; i++) {\n            curOffset = nextOffset;\n            nextOffset = offsets[i + 1];\n\n            if (i > 0) {\n                s += ', ';\n            }\n            s += this.validAt(i) ? '\"' + decoder.decode(values.slice(curOffset, nextOffset)) + '\"' : 'null';\n        }\n\n        s += ']';\n        return s;\n    }\n\n    valueAt(i) {\n        const n = this.length();\n        if (i < 0 || i >= n) {\n            return new Error(`valueAt(${i}) is undefined or out-of-range for array of length ${n}.`);\n        }\n        if (!this.validAt(i)) {\n            return null;\n        }\n\n        let decoder = new TextDecoder();\n        const offsets = this._offsets;\n        return decoder.decode(this._values.slice(offsets[i], offsets[i + 1]));\n    }\n\n    findFirst(value) {\n        if (!(value instanceof ArrayBuffer)) {\n            const encoder = new TextEncoder();\n            value = encoder.encode(value);\n        }\n        const valueLength = value.length;\n\n        const offsets = this._offsets;\n        const iCount = this.length();\n        const values = this._values;\n        for (let i = 0; i < iCount; i++) {       \n            if (!this.validAt(i)) {\n                continue;\n            } else if (offsets[i + 1] - offsets[i] !== valueLength) {\n                continue;\n            }\n\n            const iOffset = offsets[i];\n            const jCount = offsets[i + 1] - iOffset;\n            let diff = 0;\n            for (let j = 0; j < jCount; j++) {\n                diff += Math.abs(value[j] - values[iOffset + j]);\n            }\n    \n            if (diff == 0) {\n                return i;\n            }\n        }\n\n        return -1;\n    }\n\n    physicalType() {\n        return 'BytesArrow32';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        // TODO: axis\n        let outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class BytesArrow64 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const offsetsStart = offset + Number(spine.getBigInt64(5 * QWORD, true));\n        this._offsets = builder.bigInt64Array(offsetsStart, length + 1);\n\n        const valuesStart = offset + Number(spine.getBigInt64(6 * QWORD, true));\n        const valuesBytes = Number(this._offsets[length]);\n        this._values = builder.uint8Array(valuesStart, valuesBytes);\n    }\n\n    toArray() {\n        // FIXME: this is assuming its Str not Bin, which isn't necessarily the\n        // case (although it is with our current data).\n        const n = this.length();\n        const offsets = this._offsets;\n        const values = this._values;\n\n        let decoder = new TextDecoder();\n        let ary = new Array(n);\n        let curOffset;\n        let nextOffset = Number(offsets[0]);\n        for (let i = 0; i < n; i++) {\n            curOffset = nextOffset;\n            nextOffset = Number(offsets[i + 1]);\n            if (!this.validAt(i)) {\n                ary[i] = null;\n                continue;\n            }\n            ary[i] = decoder.decode(values.slice(curOffset, nextOffset));\n        }\n\n        return ary;\n    }\n\n    /* Expose the authoritative offsets buffer so vectorised callers can stay on the ptrless binary contract. */\n    rawOffsets() {\n        return this._offsets;\n    }\n\n    /* Expose the authoritative values buffer so vectorised callers can decode directly from ptrless storage. */\n    rawValues() {\n        return this._values;\n    }\n\n    /* Resolve one row slice boundary without allocating a JS view or decoding a transient string. */\n    rawSliceBounds(i) {\n        const n = this.length();\n        if (i < 0 || i >= n) {\n            throw new Error(`rawSliceBounds(${i}) is undefined or out-of-range for array of length ${n}.`);\n        }\n        return [Number(this._offsets[i]), Number(this._offsets[i + 1])];\n    }\n\n    toString() {\n        const decoder = new TextDecoder();\n        const n = this.length();\n        const offsets = this._offsets;\n        const values = this._values;\n\n        let s = '[';\n        let curOffset;\n        let nextOffset = Number(offsets[0]);\n        for (let i = 0; i < n; i++) {\n            curOffset = nextOffset;\n            nextOffset = Number(offsets[i + 1]);\n\n            if (i > 0) {\n                s += ', ';\n            }\n            s += this.validAt(i) ? '\"' + decoder.decode(values.slice(curOffset, nextOffset)) + '\"' : 'null';\n        }\n\n        s += ']';\n        return s;\n    }\n\n    valueAt(i) {\n        // FIXME: this is assuming its Str not Bin, which isn't necessarily the\n        // case (although it is with our current data).\n        const n = this.length();\n        if (i < 0 || i >= n) {\n            return new Error(`valueAt(${i}) is undefined or out-of-range for array of length ${n}.`);\n        }\n        if (!this.validAt(i)) {\n            return null;\n        }\n\n        let decoder = new TextDecoder();\n        const offsets = this._offsets;\n        return decoder.decode(this._values.slice(Number(offsets[i]), Number(offsets[i + 1])));\n    }\n\n    findFirst(value) {\n        if (!(value instanceof ArrayBuffer)) {\n            const encoder = new TextEncoder();\n            value = encoder.encode(value);\n        }\n        const valueLength = value.length;\n\n        const offsets = this._offsets;\n        const iCount = this.length();\n        const values = this._values;\n        for (let i = 0; i < iCount; i++) {       \n            if (!this.validAt(i)) {\n                continue;\n            }\n            const start = Number(offsets[i]);\n            const stop = Number(offsets[i + 1]);\n            if (stop - start !== valueLength) {\n                continue;\n            }\n\n            const iOffset = start;\n            const jCount = stop - start;\n            let diff = 0;\n            for (let j = 0; j < jCount; j++) {\n                diff += Math.abs(value[j] - values[iOffset + j]);\n            }\n    \n            if (diff == 0) {\n                return i;\n            }\n        }\n\n        return -1;\n    }\n\n    physicalType() {\n        return 'BytesArrow64';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        // TODO: axis\n        let outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Code generated by puff IDL. DO NOT EDIT.\n\nexport const PuffPtlErrSourceLocationFields = Object.freeze([\"pathname\", \"line\", \"funcname\"])\nexport const PuffPtlErrSourceLocationFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\"])\nexport const PuffPtlErrSourceLocationFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffPtlErrSourceLocationFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlErrSourceLocationFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlErrSourceLocationFieldNullable = Object.freeze([true, true, true])\nexport const PuffPtlErrSourceLocationFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffPtlErrSourceLocationFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffPtlErrSourceLocationSchemaIdentity = Object.freeze([0x3a, 0x8d, 0xfe, 0xd6, 0x0f, 0xf7, 0xf2, 0x28, 0xa8, 0x81, 0x92, 0x2e, 0x73, 0xab, 0x87, 0xcc, 0x22, 0x13, 0xf1, 0xc2, 0x0f, 0xa3, 0xb5, 0x1b, 0x4b, 0x66, 0xdf, 0x2a, 0x3d, 0xf3, 0x98, 0x24])\nexport const PuffPtlErrSourceLocationPhysicalType = \"err.SourceLocation\"\nexport const PuffPtlErrSourceLocationFieldCount = 3;\nexport const PuffPtlErrSourceLocationPathnameField = 0;\nexport const PuffPtlErrSourceLocationLineField = 1;\nexport const PuffPtlErrSourceLocationFuncnameField = 2;\n\nexport class PuffPtlErrSourceLocation {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrSourceLocation: expected a fixed-layout object\");\n    const names = PuffPtlErrSourceLocationFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrSourceLocation: fields must exactly match declaration order\");\n    if (source.pathname !== null && (typeof source.pathname !== \"string\")) throw new TypeError(\"field pathname has an incompatible value\");\n    this.pathname = source.pathname;\n    if (source.line !== null && (typeof source.line !== \"number\")) throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (source.funcname !== null && (typeof source.funcname !== \"string\")) throw new TypeError(\"field funcname has an incompatible value\");\n    this.funcname = source.funcname;\n    Object.freeze(this);\n  }\n\n  getPathname() { return this.pathname; }\n  getLine() { return this.line; }\n  getFuncname() { return this.funcname; }\n\n  static validate(value) { if (value instanceof PuffPtlErrSourceLocation) return true; try { new PuffPtlErrSourceLocation(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrSourceLocation) return value; return new PuffPtlErrSourceLocation(value); }\n\n  toObject() { return {pathname: this.pathname, line: this.line, funcname: this.funcname}; }\n}\n\nexport const PuffPtlErrOSourceLocationFields = Object.freeze([\"pathname\", \"line\", \"funcname\"])\nexport const PuffPtlErrOSourceLocationFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\"])\nexport const PuffPtlErrOSourceLocationFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffPtlErrOSourceLocationFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlErrOSourceLocationFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlErrOSourceLocationFieldNullable = Object.freeze([true, true, true])\nexport const PuffPtlErrOSourceLocationFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffPtlErrOSourceLocationFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffPtlErrOSourceLocationSchemaIdentity = Object.freeze([0x3a, 0x8d, 0xfe, 0xd6, 0x0f, 0xf7, 0xf2, 0x28, 0xa8, 0x81, 0x92, 0x2e, 0x73, 0xab, 0x87, 0xcc, 0x22, 0x13, 0xf1, 0xc2, 0x0f, 0xa3, 0xb5, 0x1b, 0x4b, 0x66, 0xdf, 0x2a, 0x3d, 0xf3, 0x98, 0x24])\nexport const PuffPtlErrOSourceLocationPhysicalType = \"err.SourceLocation\"\nexport const PuffPtlErrOSourceLocationFieldCount = 3;\nexport const PuffPtlErrOSourceLocationPathnameField = 0;\nexport const PuffPtlErrOSourceLocationLineField = 1;\nexport const PuffPtlErrOSourceLocationFuncnameField = 2;\n\nexport class PuffPtlErrOSourceLocation {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrOSourceLocation: expected a fixed-layout object\");\n    const names = PuffPtlErrOSourceLocationFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrOSourceLocation: fields must exactly match declaration order\");\n    if (source.pathname !== null && (typeof source.pathname !== \"string\")) throw new TypeError(\"field pathname has an incompatible value\");\n    this.pathname = source.pathname;\n    if (source.line !== null && (typeof source.line !== \"number\")) throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (source.funcname !== null && (typeof source.funcname !== \"string\")) throw new TypeError(\"field funcname has an incompatible value\");\n    this.funcname = source.funcname;\n    Object.freeze(this);\n  }\n\n  getPathname() { return this.pathname; }\n  getLine() { return this.line; }\n  getFuncname() { return this.funcname; }\n\n  static validate(value) { if (value instanceof PuffPtlErrOSourceLocation) return true; try { new PuffPtlErrOSourceLocation(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrOSourceLocation) return value; return new PuffPtlErrOSourceLocation(value); }\n\n  toObject() { return {pathname: this.pathname, line: this.line, funcname: this.funcname}; }\n}\n\nexport const PuffPtlDiagnosticV1Fields = Object.freeze([\"class_\", \"severity\", \"timestamp\", \"brief\", \"detail\", \"source_location\", \"stack_trace\"])\nexport const PuffPtlDiagnosticV1FieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Struct\", \"List\"])\nexport const PuffPtlDiagnosticV1FieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\", \"BytesArrow64\"])\nexport const PuffPtlDiagnosticV1FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\"])\nexport const PuffPtlDiagnosticV1FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null])\nexport const PuffPtlDiagnosticV1FieldNullable = Object.freeze([false, false, true, false, true, false, false])\nexport const PuffPtlDiagnosticV1FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlDiagnosticV1FieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\", \"BytesArrow64\"])\nexport const PuffPtlDiagnosticV1SchemaIdentity = Object.freeze([0x1b, 0x45, 0xa4, 0x42, 0xb4, 0xf7, 0x4a, 0x04, 0x6f, 0x51, 0x10, 0xfb, 0xe1, 0x18, 0xa4, 0x2d, 0x83, 0x5c, 0x0c, 0x45, 0x74, 0xa6, 0x2b, 0xbf, 0x8d, 0x7f, 0x45, 0xb8, 0xc3, 0xfd, 0x58, 0x0c])\nexport const PuffPtlDiagnosticV1PhysicalType = \"DiagnosticV1\"\nexport const PuffPtlDiagnosticV1FieldCount = 7;\nexport const PuffPtlDiagnosticV1ClassField = 0;\nexport const PuffPtlDiagnosticV1SeverityField = 1;\nexport const PuffPtlDiagnosticV1TimestampField = 2;\nexport const PuffPtlDiagnosticV1BriefField = 3;\nexport const PuffPtlDiagnosticV1DetailField = 4;\nexport const PuffPtlDiagnosticV1SourceLocationField = 5;\nexport const PuffPtlDiagnosticV1StackTraceField = 6;\n\nexport class PuffPtlDiagnosticV1 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlDiagnosticV1: expected a fixed-layout object\");\n    const names = PuffPtlDiagnosticV1Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlDiagnosticV1: fields must exactly match declaration order\");\n    if (typeof source.class_ !== \"string\") throw new TypeError(\"field class_ has an incompatible value\");\n    this.class_ = source.class_;\n    if (typeof source.severity !== \"string\") throw new TypeError(\"field severity has an incompatible value\");\n    this.severity = source.severity;\n    if (source.timestamp !== null && (typeof source.timestamp !== \"string\")) throw new TypeError(\"field timestamp has an incompatible value\");\n    this.timestamp = source.timestamp;\n    if (typeof source.brief !== \"string\") throw new TypeError(\"field brief has an incompatible value\");\n    this.brief = source.brief;\n    if (source.detail !== null && (typeof source.detail !== \"string\")) throw new TypeError(\"field detail has an incompatible value\");\n    this.detail = source.detail;\n    if (false) throw new TypeError(\"field source_location has an incompatible value\");\n    this.source_location = source.source_location;\n    if (!Array.isArray(source.stack_trace)) throw new TypeError(\"field stack_trace has an incompatible value\");\n    this.stack_trace = source.stack_trace;\n    Object.freeze(this);\n  }\n\n  getClass() { return this.class_; }\n  getSeverity() { return this.severity; }\n  getTimestamp() { return this.timestamp; }\n  getBrief() { return this.brief; }\n  getDetail() { return this.detail; }\n  getSourceLocation() { return this.source_location; }\n  getStackTrace() { return this.stack_trace; }\n\n  static validate(value) { if (value instanceof PuffPtlDiagnosticV1) return true; try { new PuffPtlDiagnosticV1(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlDiagnosticV1) return value; return new PuffPtlDiagnosticV1(value); }\n\n  toObject() { return {class_: this.class_, severity: this.severity, timestamp: this.timestamp, brief: this.brief, detail: this.detail, source_location: this.source_location, stack_trace: this.stack_trace}; }\n}\n\nexport const PuffPtlDiagnosticV2Fields = Object.freeze([\"flags\", \"brief\", \"detail\", \"class_\", \"source_location\"])\nexport const PuffPtlDiagnosticV2FieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Str\", \"Struct\"])\nexport const PuffPtlDiagnosticV2FieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\"])\nexport const PuffPtlDiagnosticV2FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlDiagnosticV2FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlDiagnosticV2FieldNullable = Object.freeze([false, false, true, true, false])\nexport const PuffPtlDiagnosticV2FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlDiagnosticV2FieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\"])\nexport const PuffPtlDiagnosticV2SchemaIdentity = Object.freeze([0x4d, 0x85, 0xfd, 0x85, 0xcc, 0x02, 0x37, 0x78, 0xdf, 0x67, 0x78, 0x2f, 0xae, 0xc6, 0x2a, 0x01, 0x1e, 0x7a, 0x6d, 0x5e, 0xb4, 0x56, 0xb3, 0x31, 0x75, 0x6d, 0x8b, 0xc5, 0x15, 0xcd, 0x21, 0xe9])\nexport const PuffPtlDiagnosticV2PhysicalType = \"DiagnosticV2\"\nexport const PuffPtlDiagnosticV2FieldCount = 5;\nexport const PuffPtlDiagnosticV2FlagsField = 0;\nexport const PuffPtlDiagnosticV2BriefField = 1;\nexport const PuffPtlDiagnosticV2DetailField = 2;\nexport const PuffPtlDiagnosticV2ClassField = 3;\nexport const PuffPtlDiagnosticV2SourceLocationField = 4;\n\nexport class PuffPtlDiagnosticV2 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlDiagnosticV2: expected a fixed-layout object\");\n    const names = PuffPtlDiagnosticV2Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlDiagnosticV2: fields must exactly match declaration order\");\n    if (typeof source.flags !== \"number\") throw new TypeError(\"field flags has an incompatible value\");\n    this.flags = source.flags;\n    if (typeof source.brief !== \"string\") throw new TypeError(\"field brief has an incompatible value\");\n    this.brief = source.brief;\n    if (source.detail !== null && (typeof source.detail !== \"string\")) throw new TypeError(\"field detail has an incompatible value\");\n    this.detail = source.detail;\n    if (source.class_ !== null && (typeof source.class_ !== \"string\")) throw new TypeError(\"field class_ has an incompatible value\");\n    this.class_ = source.class_;\n    if (false) throw new TypeError(\"field source_location has an incompatible value\");\n    this.source_location = source.source_location;\n    Object.freeze(this);\n  }\n\n  getFlags() { return this.flags; }\n  getBrief() { return this.brief; }\n  getDetail() { return this.detail; }\n  getClass() { return this.class_; }\n  getSourceLocation() { return this.source_location; }\n\n  static validate(value) { if (value instanceof PuffPtlDiagnosticV2) return true; try { new PuffPtlDiagnosticV2(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlDiagnosticV2) return value; return new PuffPtlDiagnosticV2(value); }\n\n  toObject() { return {flags: this.flags, brief: this.brief, detail: this.detail, class_: this.class_, source_location: this.source_location}; }\n}\n\nexport const PuffPtlErrODiagnosticV1Fields = Object.freeze([\"class_\", \"severity\", \"timestamp\", \"brief\", \"detail\", \"source_location\", \"stack_trace\"])\nexport const PuffPtlErrODiagnosticV1FieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Struct\", \"List\"])\nexport const PuffPtlErrODiagnosticV1FieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\", \"BytesArrow64\"])\nexport const PuffPtlErrODiagnosticV1FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\"])\nexport const PuffPtlErrODiagnosticV1FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null])\nexport const PuffPtlErrODiagnosticV1FieldNullable = Object.freeze([false, false, true, false, true, false, false])\nexport const PuffPtlErrODiagnosticV1FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlErrODiagnosticV1FieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\", \"BytesArrow64\"])\nexport const PuffPtlErrODiagnosticV1SchemaIdentity = Object.freeze([0x1b, 0x45, 0xa4, 0x42, 0xb4, 0xf7, 0x4a, 0x04, 0x6f, 0x51, 0x10, 0xfb, 0xe1, 0x18, 0xa4, 0x2d, 0x83, 0x5c, 0x0c, 0x45, 0x74, 0xa6, 0x2b, 0xbf, 0x8d, 0x7f, 0x45, 0xb8, 0xc3, 0xfd, 0x58, 0x0c])\nexport const PuffPtlErrODiagnosticV1PhysicalType = \"DiagnosticV1\"\nexport const PuffPtlErrODiagnosticV1FieldCount = 7;\nexport const PuffPtlErrODiagnosticV1ClassField = 0;\nexport const PuffPtlErrODiagnosticV1SeverityField = 1;\nexport const PuffPtlErrODiagnosticV1TimestampField = 2;\nexport const PuffPtlErrODiagnosticV1BriefField = 3;\nexport const PuffPtlErrODiagnosticV1DetailField = 4;\nexport const PuffPtlErrODiagnosticV1SourceLocationField = 5;\nexport const PuffPtlErrODiagnosticV1StackTraceField = 6;\n\nexport class PuffPtlErrODiagnosticV1 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrODiagnosticV1: expected a fixed-layout object\");\n    const names = PuffPtlErrODiagnosticV1Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrODiagnosticV1: fields must exactly match declaration order\");\n    if (typeof source.class_ !== \"string\") throw new TypeError(\"field class_ has an incompatible value\");\n    this.class_ = source.class_;\n    if (typeof source.severity !== \"string\") throw new TypeError(\"field severity has an incompatible value\");\n    this.severity = source.severity;\n    if (source.timestamp !== null && (typeof source.timestamp !== \"string\")) throw new TypeError(\"field timestamp has an incompatible value\");\n    this.timestamp = source.timestamp;\n    if (typeof source.brief !== \"string\") throw new TypeError(\"field brief has an incompatible value\");\n    this.brief = source.brief;\n    if (source.detail !== null && (typeof source.detail !== \"string\")) throw new TypeError(\"field detail has an incompatible value\");\n    this.detail = source.detail;\n    if (false) throw new TypeError(\"field source_location has an incompatible value\");\n    this.source_location = source.source_location;\n    if (!Array.isArray(source.stack_trace)) throw new TypeError(\"field stack_trace has an incompatible value\");\n    this.stack_trace = source.stack_trace;\n    Object.freeze(this);\n  }\n\n  getClass() { return this.class_; }\n  getSeverity() { return this.severity; }\n  getTimestamp() { return this.timestamp; }\n  getBrief() { return this.brief; }\n  getDetail() { return this.detail; }\n  getSourceLocation() { return this.source_location; }\n  getStackTrace() { return this.stack_trace; }\n\n  static validate(value) { if (value instanceof PuffPtlErrODiagnosticV1) return true; try { new PuffPtlErrODiagnosticV1(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrODiagnosticV1) return value; return new PuffPtlErrODiagnosticV1(value); }\n\n  toObject() { return {class_: this.class_, severity: this.severity, timestamp: this.timestamp, brief: this.brief, detail: this.detail, source_location: this.source_location, stack_trace: this.stack_trace}; }\n}\n\nexport const PuffPtlErrODiagnosticV2Fields = Object.freeze([\"flags\", \"brief\", \"detail\", \"class_\", \"source_location\"])\nexport const PuffPtlErrODiagnosticV2FieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Str\", \"Struct\"])\nexport const PuffPtlErrODiagnosticV2FieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\"])\nexport const PuffPtlErrODiagnosticV2FieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPtlErrODiagnosticV2FieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPtlErrODiagnosticV2FieldNullable = Object.freeze([false, false, true, true, false])\nexport const PuffPtlErrODiagnosticV2FieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPtlErrODiagnosticV2FieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"err.SourceLocation\"])\nexport const PuffPtlErrODiagnosticV2SchemaIdentity = Object.freeze([0x4d, 0x85, 0xfd, 0x85, 0xcc, 0x02, 0x37, 0x78, 0xdf, 0x67, 0x78, 0x2f, 0xae, 0xc6, 0x2a, 0x01, 0x1e, 0x7a, 0x6d, 0x5e, 0xb4, 0x56, 0xb3, 0x31, 0x75, 0x6d, 0x8b, 0xc5, 0x15, 0xcd, 0x21, 0xe9])\nexport const PuffPtlErrODiagnosticV2PhysicalType = \"DiagnosticV2\"\nexport const PuffPtlErrODiagnosticV2FieldCount = 5;\nexport const PuffPtlErrODiagnosticV2FlagsField = 0;\nexport const PuffPtlErrODiagnosticV2BriefField = 1;\nexport const PuffPtlErrODiagnosticV2DetailField = 2;\nexport const PuffPtlErrODiagnosticV2ClassField = 3;\nexport const PuffPtlErrODiagnosticV2SourceLocationField = 4;\n\nexport class PuffPtlErrODiagnosticV2 {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrODiagnosticV2: expected a fixed-layout object\");\n    const names = PuffPtlErrODiagnosticV2Fields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrODiagnosticV2: fields must exactly match declaration order\");\n    if (typeof source.flags !== \"number\") throw new TypeError(\"field flags has an incompatible value\");\n    this.flags = source.flags;\n    if (typeof source.brief !== \"string\") throw new TypeError(\"field brief has an incompatible value\");\n    this.brief = source.brief;\n    if (source.detail !== null && (typeof source.detail !== \"string\")) throw new TypeError(\"field detail has an incompatible value\");\n    this.detail = source.detail;\n    if (source.class_ !== null && (typeof source.class_ !== \"string\")) throw new TypeError(\"field class_ has an incompatible value\");\n    this.class_ = source.class_;\n    if (false) throw new TypeError(\"field source_location has an incompatible value\");\n    this.source_location = source.source_location;\n    Object.freeze(this);\n  }\n\n  getFlags() { return this.flags; }\n  getBrief() { return this.brief; }\n  getDetail() { return this.detail; }\n  getClass() { return this.class_; }\n  getSourceLocation() { return this.source_location; }\n\n  static validate(value) { if (value instanceof PuffPtlErrODiagnosticV2) return true; try { new PuffPtlErrODiagnosticV2(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrODiagnosticV2) return value; return new PuffPtlErrODiagnosticV2(value); }\n\n  toObject() { return {flags: this.flags, brief: this.brief, detail: this.detail, class_: this.class_, source_location: this.source_location}; }\n}\n\nexport const PuffPtlErrStackTraceFields = Object.freeze([\"naive\"])\nexport const PuffPtlErrStackTraceFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffPtlErrStackTraceFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffPtlErrStackTraceFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffPtlErrStackTraceFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffPtlErrStackTraceFieldNullable = Object.freeze([false])\nexport const PuffPtlErrStackTraceFieldRoles = Object.freeze([\"payload\"])\nexport const PuffPtlErrStackTraceFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffPtlErrStackTraceSchemaIdentity = Object.freeze([0x5e, 0x6b, 0xd6, 0x5a, 0xd1, 0x49, 0x4d, 0x5f, 0x0e, 0x71, 0x06, 0x52, 0x7c, 0xf4, 0x3a, 0x61, 0x62, 0x79, 0x75, 0x5f, 0x92, 0x91, 0x79, 0xdb, 0x24, 0x1d, 0xf4, 0x5c, 0x5c, 0x10, 0x1e, 0xc4])\nexport const PuffPtlErrStackTracePhysicalType = \"err.StackTrace\"\nexport const PuffPtlErrStackTraceFieldCount = 1;\nexport const PuffPtlErrStackTraceNaiveField = 0;\n\nexport class PuffPtlErrStackTrace {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrStackTrace: expected a fixed-layout object\");\n    const names = PuffPtlErrStackTraceFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrStackTrace: fields must exactly match declaration order\");\n    if (typeof source.naive !== \"string\") throw new TypeError(\"field naive has an incompatible value\");\n    this.naive = source.naive;\n    Object.freeze(this);\n  }\n\n  getNaive() { return this.naive; }\n\n  static validate(value) { if (value instanceof PuffPtlErrStackTrace) return true; try { new PuffPtlErrStackTrace(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrStackTrace) return value; return new PuffPtlErrStackTrace(value); }\n\n  toObject() { return {naive: this.naive}; }\n}\n\nexport const PuffPtlErrOStackTraceFields = Object.freeze([\"naive\"])\nexport const PuffPtlErrOStackTraceFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffPtlErrOStackTraceFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffPtlErrOStackTraceFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffPtlErrOStackTraceFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffPtlErrOStackTraceFieldNullable = Object.freeze([false])\nexport const PuffPtlErrOStackTraceFieldRoles = Object.freeze([\"payload\"])\nexport const PuffPtlErrOStackTraceFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffPtlErrOStackTraceSchemaIdentity = Object.freeze([0x5e, 0x6b, 0xd6, 0x5a, 0xd1, 0x49, 0x4d, 0x5f, 0x0e, 0x71, 0x06, 0x52, 0x7c, 0xf4, 0x3a, 0x61, 0x62, 0x79, 0x75, 0x5f, 0x92, 0x91, 0x79, 0xdb, 0x24, 0x1d, 0xf4, 0x5c, 0x5c, 0x10, 0x1e, 0xc4])\nexport const PuffPtlErrOStackTracePhysicalType = \"err.StackTrace\"\nexport const PuffPtlErrOStackTraceFieldCount = 1;\nexport const PuffPtlErrOStackTraceNaiveField = 0;\n\nexport class PuffPtlErrOStackTrace {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PtlErrOStackTrace: expected a fixed-layout object\");\n    const names = PuffPtlErrOStackTraceFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PtlErrOStackTrace: fields must exactly match declaration order\");\n    if (typeof source.naive !== \"string\") throw new TypeError(\"field naive has an incompatible value\");\n    this.naive = source.naive;\n    Object.freeze(this);\n  }\n\n  getNaive() { return this.naive; }\n\n  static validate(value) { if (value instanceof PuffPtlErrOStackTrace) return true; try { new PuffPtlErrOStackTrace(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPtlErrOStackTrace) return value; return new PuffPtlErrOStackTrace(value); }\n\n  toObject() { return {naive: this.naive}; }\n}\n\nexport const AllStructDescriptors = Object.freeze([\n  Object.freeze({ name: \"ptl_err_SourceLocation\", fields: PuffPtlErrSourceLocationFields, fieldCount: PuffPtlErrSourceLocationFieldCount, logicalTypes: PuffPtlErrSourceLocationFieldLogicalTypes, physicalTypes: PuffPtlErrSourceLocationFieldPhysicalTypes, physicalType: PuffPtlErrSourceLocationPhysicalType, nullable: PuffPtlErrSourceLocationFieldNullable, Type: PuffPtlErrSourceLocation, roles: PuffPtlErrSourceLocationFieldRoles, declaredMetadata: PuffPtlErrSourceLocationFieldDeclaredMetadata, accessors: PuffPtlErrSourceLocationFields, schemaIdentity: PuffPtlErrSourceLocationSchemaIdentity }),\n  Object.freeze({ name: \"ptl_err_oSourceLocation\", fields: PuffPtlErrOSourceLocationFields, fieldCount: PuffPtlErrOSourceLocationFieldCount, logicalTypes: PuffPtlErrOSourceLocationFieldLogicalTypes, physicalTypes: PuffPtlErrOSourceLocationFieldPhysicalTypes, physicalType: PuffPtlErrOSourceLocationPhysicalType, nullable: PuffPtlErrOSourceLocationFieldNullable, Type: PuffPtlErrOSourceLocation, roles: PuffPtlErrOSourceLocationFieldRoles, declaredMetadata: PuffPtlErrOSourceLocationFieldDeclaredMetadata, accessors: PuffPtlErrOSourceLocationFields, schemaIdentity: PuffPtlErrOSourceLocationSchemaIdentity }),\n  Object.freeze({ name: \"ptl_DiagnosticV1\", fields: PuffPtlDiagnosticV1Fields, fieldCount: PuffPtlDiagnosticV1FieldCount, logicalTypes: PuffPtlDiagnosticV1FieldLogicalTypes, physicalTypes: PuffPtlDiagnosticV1FieldPhysicalTypes, physicalType: PuffPtlDiagnosticV1PhysicalType, nullable: PuffPtlDiagnosticV1FieldNullable, Type: PuffPtlDiagnosticV1, roles: PuffPtlDiagnosticV1FieldRoles, declaredMetadata: PuffPtlDiagnosticV1FieldDeclaredMetadata, accessors: PuffPtlDiagnosticV1Fields, schemaIdentity: PuffPtlDiagnosticV1SchemaIdentity }),\n  Object.freeze({ name: \"ptl_DiagnosticV2\", fields: PuffPtlDiagnosticV2Fields, fieldCount: PuffPtlDiagnosticV2FieldCount, logicalTypes: PuffPtlDiagnosticV2FieldLogicalTypes, physicalTypes: PuffPtlDiagnosticV2FieldPhysicalTypes, physicalType: PuffPtlDiagnosticV2PhysicalType, nullable: PuffPtlDiagnosticV2FieldNullable, Type: PuffPtlDiagnosticV2, roles: PuffPtlDiagnosticV2FieldRoles, declaredMetadata: PuffPtlDiagnosticV2FieldDeclaredMetadata, accessors: PuffPtlDiagnosticV2Fields, schemaIdentity: PuffPtlDiagnosticV2SchemaIdentity }),\n  Object.freeze({ name: \"ptl_err_oDiagnosticV1\", fields: PuffPtlErrODiagnosticV1Fields, fieldCount: PuffPtlErrODiagnosticV1FieldCount, logicalTypes: PuffPtlErrODiagnosticV1FieldLogicalTypes, physicalTypes: PuffPtlErrODiagnosticV1FieldPhysicalTypes, physicalType: PuffPtlErrODiagnosticV1PhysicalType, nullable: PuffPtlErrODiagnosticV1FieldNullable, Type: PuffPtlErrODiagnosticV1, roles: PuffPtlErrODiagnosticV1FieldRoles, declaredMetadata: PuffPtlErrODiagnosticV1FieldDeclaredMetadata, accessors: PuffPtlErrODiagnosticV1Fields, schemaIdentity: PuffPtlErrODiagnosticV1SchemaIdentity }),\n  Object.freeze({ name: \"ptl_err_oDiagnosticV2\", fields: PuffPtlErrODiagnosticV2Fields, fieldCount: PuffPtlErrODiagnosticV2FieldCount, logicalTypes: PuffPtlErrODiagnosticV2FieldLogicalTypes, physicalTypes: PuffPtlErrODiagnosticV2FieldPhysicalTypes, physicalType: PuffPtlErrODiagnosticV2PhysicalType, nullable: PuffPtlErrODiagnosticV2FieldNullable, Type: PuffPtlErrODiagnosticV2, roles: PuffPtlErrODiagnosticV2FieldRoles, declaredMetadata: PuffPtlErrODiagnosticV2FieldDeclaredMetadata, accessors: PuffPtlErrODiagnosticV2Fields, schemaIdentity: PuffPtlErrODiagnosticV2SchemaIdentity }),\n  Object.freeze({ name: \"ptl_err_StackTrace\", fields: PuffPtlErrStackTraceFields, fieldCount: PuffPtlErrStackTraceFieldCount, logicalTypes: PuffPtlErrStackTraceFieldLogicalTypes, physicalTypes: PuffPtlErrStackTraceFieldPhysicalTypes, physicalType: PuffPtlErrStackTracePhysicalType, nullable: PuffPtlErrStackTraceFieldNullable, Type: PuffPtlErrStackTrace, roles: PuffPtlErrStackTraceFieldRoles, declaredMetadata: PuffPtlErrStackTraceFieldDeclaredMetadata, accessors: PuffPtlErrStackTraceFields, schemaIdentity: PuffPtlErrStackTraceSchemaIdentity }),\n  Object.freeze({ name: \"ptl_err_oStackTrace\", fields: PuffPtlErrOStackTraceFields, fieldCount: PuffPtlErrOStackTraceFieldCount, logicalTypes: PuffPtlErrOStackTraceFieldLogicalTypes, physicalTypes: PuffPtlErrOStackTraceFieldPhysicalTypes, physicalType: PuffPtlErrOStackTracePhysicalType, nullable: PuffPtlErrOStackTraceFieldNullable, Type: PuffPtlErrOStackTrace, roles: PuffPtlErrOStackTraceFieldRoles, declaredMetadata: PuffPtlErrOStackTraceFieldDeclaredMetadata, accessors: PuffPtlErrOStackTraceFields, schemaIdentity: PuffPtlErrOStackTraceSchemaIdentity }),\n]);\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Struct } from './Struct.mjs';\nimport {\n    PuffPtlErrSourceLocationFields,\n    PuffPtlErrSourceLocationPhysicalType,\n    PuffPtlDiagnosticV1Fields,\n    PuffPtlDiagnosticV1PhysicalType,\n    PuffPtlDiagnosticV2Fields,\n    PuffPtlDiagnosticV2PhysicalType,\n} from './err_meta.gen.mjs';\n\n\nfunction unquoteText(text) {\n    if (typeof text !== 'string') {\n        return text;\n    }\n    if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n        return text.slice(1, -1);\n    }\n    return text;\n}\n\nexport function scalarText(obj) {\n    if (!obj || typeof obj.valid === 'function' && !obj.valid()) {\n        return null;\n    }\n    if (typeof obj.toText === 'function') {\n        try {\n            return obj.toText();\n        } catch (_err) {\n        }\n    }\n    if (typeof obj.toString === 'function') {\n        try {\n            return unquoteText(obj.toString());\n        } catch (_err) {\n        }\n    }\n    return null;\n}\n\nfunction fieldText(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        return null;\n    }\n    try {\n        return scalarText(obj.field(name));\n    } catch (_err) {\n        return null;\n    }\n}\n\nexport function sourceLocationText(loc) {\n    if (!loc || typeof loc.field !== 'function') {\n        return null;\n    }\n    const pathname = fieldText(loc, 'pathname');\n    const line = fieldText(loc, 'line');\n    const funcname = fieldText(loc, 'funcname');\n    const parts = [];\n    if (pathname && line) {\n        parts.push(`${pathname}:${line}`);\n    } else if (pathname) {\n        parts.push(pathname);\n    } else if (line) {\n        parts.push(String(line));\n    }\n    if (funcname) {\n        parts.push(funcname);\n    }\n    return parts.length === 0 ? null : parts.join(' ');\n}\n\nexport function diagnosticSummaryText(diagnostic) {\n    const className = fieldText(diagnostic, 'class_');\n    const brief = fieldText(diagnostic, 'brief');\n    const detail = fieldText(diagnostic, 'detail');\n\n    if (brief && detail) {\n        return `${brief}: ${detail}`;\n    }\n    if (brief) {\n        return brief;\n    }\n    if (detail) {\n        return detail;\n    }\n    if (className) {\n        return className;\n    }\n    return 'diagnostic attached';\n}\n\nclass NamedStruct extends Struct {\n    constructor(builder, offset, spine, logicalName, knownFieldNames) {\n        super(builder, offset, spine);\n        this._logicalName = logicalName;\n        this._knownFieldNames = knownFieldNames;\n    }\n\n    physicalType() {\n        return this._logicalName;\n    }\n\n    logicalType() {\n        return this._logicalName;\n    }\n\n    deepLogicalType(class_ = this._logicalName) {\n        return super.deepLogicalType(class_);\n    }\n}\n\nexport class SourceLocation extends NamedStruct {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine, PuffPtlErrSourceLocationPhysicalType, PuffPtlErrSourceLocationFields);\n    }\n\n    pathname() {\n        return this.field('pathname');\n    }\n\n    line() {\n        return this.field('line');\n    }\n\n    funcname() {\n        return this.field('funcname');\n    }\n\n    toString() {\n        return sourceLocationText(this) ?? 'err.SourceLocation';\n    }\n}\n\nclass DiagnosticBase extends NamedStruct {\n    summaryText() {\n        return diagnosticSummaryText(this);\n    }\n\n    toString() {\n        return `ERROR: ${this.summaryText()}`;\n    }\n}\n\nexport class DiagnosticV1 extends DiagnosticBase {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine, PuffPtlDiagnosticV1PhysicalType, PuffPtlDiagnosticV1Fields);\n    }\n}\n\nexport class DiagnosticV2 extends DiagnosticBase {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine, PuffPtlDiagnosticV2PhysicalType, PuffPtlDiagnosticV2Fields);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Arrow } from '../abstract/Arrow.mjs';\n\n\nconst ARRAY_ALIGN = 64;\nconst DWORD = 4;\nconst QWORD = 8;\n\n\n// Padded number of bytes to store `bits` bits.\nfunction bytesForBits(bits) {\n    const bytes = bits / 8; // NB: fractional, not truncated\n    return Math.ceil(bytes / ARRAY_ALIGN) * ARRAY_ALIGN;\n}\n\nfunction arrowDelimiters(flags) {\n    switch (flags & ptlf.outer_MASK) {\n    case ptlf.outer_ARRAY_VEC:\n    case ptlf.outer_HOMO_VEC:\n        return ['<', '>'];\n    default:\n        return ['[', ']'];\n    }\n}\n\nfunction logicalTypeForIntegralArrow(obj) {\n    const flags = obj.flags();\n    let o = '';\n    if (flags & ptlf.inner_NULLABLE) {\n        o = 'o';\n    }\n\n    const outer = obj.outerWithAxis(ptlf.decodeOuter(flags));\n    const inner = ptlf.decodeInnerLogical(flags);\n    return `${outer}[${o}${inner}]`;\n}\n\nfunction formatIntegralArrow(obj, values) {\n    const flags = obj.flags();\n    const length = Number(obj._spine.getBigInt64(12 * QWORD, true));\n    const [open, close] = arrowDelimiters(flags);\n\n    let ret = open;\n    for (let i = 0; i < length; i++) {\n        if (i > 0) {\n            ret += ', ';\n        }\n        if (ret.length > 120) {\n            ret += '...';\n            break;\n        }\n\n        if (obj.validAt(i)) {\n            ret += `${values[i]}`;\n        } else {\n            ret += 'null';\n        }\n    }\n    ret += close;\n    return ret;\n}\n\nfunction findIntegralArrowValue(obj, values, needle) {\n    const length = Number(obj._spine.getBigInt64(12 * QWORD, true));\n    for (let i = 0; i < length; i++) {\n        if (obj.validAt(i) && values[i] == needle) {\n            return i;\n        }\n    }\n    return -1;\n}\n\nexport class IntegralArrow8 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const valsStart = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.int8Array(valsStart, length);\n    }\n\n    valueAt(i) {\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._values[i];\n    }\n\n    toArray() {\n        return this._values;\n    }\n\n    toString() {\n        return formatIntegralArrow(this, this._values);\n    }\n\n    findFirst(needle) {\n        return findIntegralArrowValue(this, this._values, needle);\n    }\n\n    physicalType() {\n        return 'IntegralArrow8';\n    }\n\n    logicalType() {\n        return logicalTypeForIntegralArrow(this);\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class IntegralArrow16 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const valsStart = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.int16Array(valsStart, length);\n    }\n\n    valueAt(i) {\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._values[i];\n    }\n\n    toArray() {\n        return this._values;\n    }\n\n    toString() {\n        return formatIntegralArrow(this, this._values);\n    }\n\n    findFirst(needle) {\n        return findIntegralArrowValue(this, this._values, needle);\n    }\n\n    physicalType() {\n        return 'IntegralArrow16';\n    }\n\n    logicalType() {\n        return logicalTypeForIntegralArrow(this);\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class IntegralArrow32 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const valsStart = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.int32Array(valsStart, length);\n    }\n\n    valueAt(i) {\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._values[i];\n    }\n\n    toString() {\n        return formatIntegralArrow(this, this._values);\n    }\n\n    toArray() {\n        return this._values;\n    }\n\n    findFirst(needle) {\n        return findIntegralArrowValue(this, this._values, needle);\n    }\n\n    physicalType() {\n        return 'IntegralArrow32';\n    }\n\n    logicalType() {\n        return logicalTypeForIntegralArrow(this);\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class IntegralArrow64 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const valsStart = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.bigInt64Array(valsStart, length);\n    }\n\n    valueAt(i) {\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return Number(this._values[i]);\n    }\n\n    toArray() {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const values = this._values;\n\n        let ret = new Array(length);\n        for (let i = 0; i < length; i++) {\n            ret[i] = Number(values[i]);\n        }\n\n        return ret;\n    }\n\n    toBigArray() {\n        return this._values;\n    }\n\n    toString() {\n        return formatIntegralArrow(this, this._values);\n    }\n\n    findFirst(needle) {\n        return findIntegralArrowValue(this, this._values, needle);\n    }\n\n    physicalType() {\n        return 'IntegralArrow64';\n    }\n\n    logicalType() {\n        return logicalTypeForIntegralArrow(this);\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class IntegralArithmetic extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._step = Number(this._spine.getBigInt64(5 * QWORD, true));\n        this._start = Number(this._spine.getBigInt64(6 * QWORD, true));\n    }\n\n    valueAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`valueAt(${i}) out of range for ${this.physicalType()} of length ${length}.`);\n        }\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._start + i * this._step;\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            out[i] = this.valueAt(i);\n        }\n        return out;\n    }\n\n    toString() {\n        const values = this.toArray();\n        const [open, close] = arrowDelimiters(this.flags());\n        return `${open}${values.join(', ')}${close}`;\n    }\n\n    start() {\n        return this._start;\n    }\n\n    step() {\n        return this._step;\n    }\n\n    physicalType() {\n        const bw = ptlf.decodeBitwidth(this.flags());\n        return bw > 1 ? `IntegralArithmetic${bw}` : 'IntegralArithmetic';\n    }\n\n    logicalType() {\n        return logicalTypeForIntegralArrow(this);\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Arrow } from '../abstract/Arrow.mjs';\n\n\nconst QWORD = 8;\n\nfunction arrowDelimiters(flags) {\n    switch (flags & ptlf.outer_MASK) {\n    case ptlf.outer_ARRAY_VEC:\n    case ptlf.outer_HOMO_VEC:\n        return ['<', '>'];\n    default:\n        return ['[', ']'];\n    }\n}\n\n\nexport class FloatArrow64 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const valuesOffset = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.float64Array(valuesOffset, length);\n    }\n\n    valueAt(i) {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        if (i < 0 || i >= length) {\n            throw new Error(`valueAt(${i}) out of range for FloatArrow64 of length ${length}.`);\n        }\n\n        if (this.validAt(i)) {\n            return this._values[i];\n        } else {\n            return null;\n        }\n    }\n\n    toArray() {\n        return this._values;\n    }\n\n    toString() {\n        const flags = this.flags();\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const values = this._values;\n        const [open, close] = arrowDelimiters(flags);\n\n        let ret = open;\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n\n            if (this.validAt(i)) {\n                ret += `${values[i]}`;\n            } else {\n                ret += 'null';\n            }\n        }\n        ret += close;\n        return ret;\n    }\n\n    physicalType() {\n        return 'FloatArrow64';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        // TODO: axis\n        let outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class FloatArrow32 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n\n        const valuesOffset = offset + Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._values = builder.float32Array(valuesOffset, length);\n    }\n\n    valueAt(i) {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        if (i < 0 || i >= length) {\n            throw new Error(`valueAt(${i}) out of range for FloatArrow32 of length ${length}.`);\n        }\n\n        if (this.validAt(i)) {\n            return this._values[i];\n        } else {\n            return null;\n        }\n    }\n\n    toArray() {\n        return this._values;\n    }\n\n    toString() {\n        const flags = this.flags();\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const values = this._values;\n        const [open, close] = arrowDelimiters(flags);\n\n        let ret = open;\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n\n            if (this.validAt(i)) {\n                ret += `${values[i]}`;\n            } else {\n                ret += 'null';\n            }\n        }\n        ret += close;\n        return ret;\n    }\n\n    physicalType() {\n        return 'FloatArrow32';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        // TODO: axis\n        let outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        let inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class FloatArithmetic32 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._start = this._spine.getFloat32(5 * QWORD, true);\n        this._step = this._spine.getFloat32(6 * QWORD, true);\n    }\n\n    valueAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`valueAt(${i}) out of range for FloatArithmetic32 of length ${length}.`);\n        }\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._start + i * this._step;\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            out[i] = this.valueAt(i);\n        }\n        return out;\n    }\n\n    physicalType() {\n        return 'FloatArithmetic32';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n        const outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        const inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n\nexport class FloatArithmetic64 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._start = this._spine.getFloat64(5 * QWORD, true);\n        this._step = this._spine.getFloat64(6 * QWORD, true);\n    }\n\n    valueAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`valueAt(${i}) out of range for FloatArithmetic64 of length ${length}.`);\n        }\n        if (!this.validAt(i)) {\n            return null;\n        }\n        return this._start + i * this._step;\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            out[i] = this.valueAt(i);\n        }\n        return out;\n    }\n\n    physicalType() {\n        return 'FloatArithmetic64';\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n        const outer = this.outerWithAxis(ptlf.decodeOuter(flags));\n        const inner = ptlf.decodeInnerLogical(flags);\n        return `${outer}[${o}${inner}]`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Core } from '../abstract/Core.mjs';\n\n\nconst QWORD = 8;\nfunction bytesPreview(bytes, totalBytes, open) {\n    const head = bytes.slice(0, 16);\n    const hex = Array.from(head, (b) => b.toString(16).padStart(2, '0')).join(' ');\n    const ascii = Array.from(head, (b) => (b >= 0x20 && b <= 0x7e) ? String.fromCharCode(b) : '.').join('');\n    const suffix = open ? ' open' : '';\n    return `Bin ${totalBytes} bytes${suffix} [${hex}] '${ascii}'`;\n}\n\n\nexport class Chunked extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        this._chunkCount = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const offsetsRel = Number(this._spine.getBigInt64(5 * QWORD, true));\n        const chunksRel = Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._offsets = builder.bigInt64Array(offset + offsetsRel, this._chunkCount + 1);\n        this._chunkAdifs = this._chunkCount > 0\n            ? builder.bigInt64Array(offset + chunksRel, this._chunkCount)\n            : new BigInt64Array(0);\n        this._chunks = new Array(this._chunkCount);\n    }\n\n    physicalType() {\n        return 'Chunked';\n    }\n\n    valid() {\n        return true;\n    }\n\n    chunkCount() {\n        return this._chunkCount;\n    }\n\n    length() {\n        if (this._chunkCount === 0) {\n            return 0;\n        }\n        return Number(this._offsets[this._chunkCount]);\n    }\n\n    bytes() {\n        return this.length();\n    }\n\n    open() {\n        return ptlf.isOpen(this.flags());\n    }\n\n    offsets() {\n        return Array.from(this._offsets, (x) => Number(x));\n    }\n\n    chunkAt(i) {\n        if (i < 0 || i >= this._chunkCount) {\n            throw new Error(`chunkAt(${i}) out-of-range for Chunked object with ${this._chunkCount} chunks.`);\n        }\n        let chunk = this._chunks[i];\n        if (chunk !== undefined) {\n            return chunk;\n        }\n\n        const rel = Number(this._chunkAdifs[i]);\n        chunk = this._builder.buildChild(\n            this,\n            rel,\n            `chunk${i}`,\n            this._builder.declaredItemsMetatype(this),\n        );\n        const expectedLength = Number(this._offsets[i + 1] - this._offsets[i]);\n        if (typeof chunk.length !== 'function' || chunk.length() !== expectedLength) {\n            throw new Error(\n                `ptrless.import: chunk ${i} at ${this._offset} has length `\n                + `${typeof chunk.length === 'function' ? chunk.length() : '<unavailable>'}; `\n                + `offset table declares ${expectedLength}`\n            );\n        }\n        this._chunks[i] = chunk;\n        return chunk;\n    }\n\n    at(i) {\n        return this.chunkAt(i);\n    }\n\n    firstChunk() {\n        if (this._chunkCount === 0) {\n            return null;\n        }\n        return this.chunkAt(0);\n    }\n\n    logicalType() {\n        const first = this.firstChunk();\n        if (first && typeof first.logicalType === 'function') {\n            return first.logicalType();\n        }\n        return 'Chunked';\n    }\n\n    deepLogicalType() {\n        const first = this.firstChunk();\n        if (first && typeof first.deepLogicalType === 'function') {\n            return first.deepLogicalType();\n        }\n        return this.logicalType();\n    }\n\n    previewBytes(maxBytes = 16) {\n        const first = this.firstChunk();\n        if (!first) {\n            return new Uint8Array(0);\n        }\n        if (typeof first.previewBytes === 'function') {\n            return first.previewBytes(maxBytes);\n        }\n        if (typeof first.toUint8Array === 'function') {\n            return first.toUint8Array().slice(0, maxBytes);\n        }\n        throw new Error(`Chunked.previewBytes: first chunk ${first.constructor?.name ?? typeof first} does not expose bytes.`);\n    }\n\n    toUint8Array() {\n        const first = this.firstChunk();\n        if (!first || typeof first.toUint8Array !== 'function') {\n            throw new Error('Chunked.toUint8Array: first chunk does not expose bytes.');\n        }\n        return first.toUint8Array();\n    }\n\n    toText() {\n        const first = this.firstChunk();\n        if (!first || typeof first.toText !== 'function') {\n            throw new Error('Chunked.toText: first chunk does not expose text.');\n        }\n        return first.toText();\n    }\n\n    toString() {\n        const first = this.firstChunk();\n        if (!first) {\n            return this.open() ? '<open empty Chunked>' : '<empty Chunked>';\n        }\n        if (this.logicalType().endsWith('Bin')) {\n            return bytesPreview(this.previewBytes(16), this.bytes(), this.open());\n        }\n        if (typeof first.toString === 'function') {\n            return first.toString();\n        }\n        return `<Chunked ${this._chunkCount} chunks${this.open() ? ' open' : ''}>`;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Core } from '../abstract/Core.mjs';\nimport { Hetero, HeteroRow } from '../abstract/Hetero.mjs';\n\n\nconst QWORD = 8;\nconst ARRAY_ALIGN = 64;\n\nfunction bytesForBits(bits) {\n    return Math.ceil((bits / 8) / ARRAY_ALIGN) * ARRAY_ALIGN;\n}\n\n// LogicalAxis is structural: it owns logical cardinality, row validity, and\n// one declared domain while its child remains the physical tensor subtree.\nexport class LogicalAxis extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        const validityRel = Number(spine.getBigInt64(4 * QWORD, true));\n        const length = this.length();\n        this._validity = validityRel === 0\n            ? null\n            : builder.uint8Array(offset + validityRel, bytesForBits(length));\n        this._items = null;\n    }\n\n    physicalType() {\n        return 'LogicalAxis';\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    numNulls() {\n        return Number(this._spine.getBigInt64(13 * QWORD, true));\n    }\n\n    parentAxis() {\n        return Number(this._spine.getBigInt64(5 * QWORD, true));\n    }\n\n    items() {\n        return this._items;\n    }\n\n    validAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`LogicalAxis.validAt(${i}) out of range for length ${length}.`);\n        }\n        return !this._validity || ((this._validity[Math.trunc(i / 8)] >> (i % 8)) & 1) !== 0;\n    }\n\n    valid() {\n        return this.length() === 0 || this.validAt(0);\n    }\n\n    // Dataframe rows are virtual records projected from the physical column\n    // Struct. Other LogicalAxis payloads retain their tensor indexing API.\n    rowAt(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`LogicalAxis.rowAt(${i}) out of range for length ${length}.`);\n        }\n        if (!(this._items instanceof Hetero)\n            || (this._items.flags() & ptlf.outer_MASK) !== ptlf.outer_STRUCT) {\n            throw new Error('LogicalAxis.rowAt requires the canonical dataframe Struct payload.');\n        }\n        return new HeteroRow(this._items, i, this);\n    }\n\n    at(i) {\n        if (this._items instanceof Hetero\n            && (this._items.flags() & ptlf.outer_MASK) === ptlf.outer_STRUCT) {\n            return this.rowAt(i);\n        }\n        if (!this._items || typeof this._items.at !== 'function') {\n            throw new Error('LogicalAxis.at requires an indexable physical payload.');\n        }\n        return this._items.at(i);\n    }\n\n    logicalType() {\n        return this.deepLogicalType();\n    }\n\n    deepLogicalType() {\n        const axis = this.axisName();\n        const item = this._items && typeof this._items.deepLogicalType === 'function'\n            ? this._items.deepLogicalType()\n            : '<unavailable>';\n        return `LogicalAxis${axis}[${item}]`;\n    }\n\n    _prepopulate(meta) {\n        super._prepopulate(meta);\n        const rel = Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._items = this._builder.buildChild(this, rel, 'items', this._builder.declaredItemsMetatype(this));\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Core } from '../abstract/Core.mjs';\n\n\nconst QWORD = 8;\nconst IDENTITY_HASH_OFFSET = 32;\nconst HASH_BYTES = 32;\nconst HANDLE_OFFSET = 128;\n\n\nfunction logicalTypeFromMeta(obj) {\n    if (typeof obj.meta !== 'function') {\n        return null;\n    }\n    try {\n        const meta = obj.meta();\n        if (!meta || typeof meta.field !== 'function') {\n            return null;\n        }\n        const logical = meta.field('logical');\n        if (!logical || typeof logical.valid === 'function' && !logical.valid()) {\n            return null;\n        }\n        if (typeof logical.toText === 'function') {\n            return logical.toText();\n        }\n        if (typeof logical.toString === 'function') {\n            const text = logical.toString();\n            if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n                return text.slice(1, -1);\n            }\n            return text;\n        }\n    } catch (_err) {\n    }\n    return null;\n}\n\nfunction throwLazyAccess(obj, action) {\n    const flags = obj.flags();\n    const detail = {\n        action,\n        offset: obj._offset,\n        flags_hex: `0x${flags.toString(16)}`,\n        physical: obj.physicalType(),\n        logical: obj.logicalType(),\n        stack: new Error('ptrless lazy access').stack,\n    };\n    try {\n        console.error('ptrless lazy access', detail);\n    } catch (_err) {\n    }\n    throw new Error(\n        `ptrless.Lazy.${action}: payload access is not available for ptrless-level lazy object `\n        + `at offset ${obj._offset} flags=0x${flags.toString(16)} `\n        + `physical=${obj.physicalType()} logical=${obj.logicalType()}`\n    );\n}\n\n\nexport class Lazy extends Core {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    physicalType() {\n        return 'Lazy';\n    }\n\n    logicalType() {\n        return logicalTypeFromMeta(this) ?? this.physicalType();\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    numNulls() {\n        return Number(this._spine.getBigInt64(13 * QWORD, true));\n    }\n\n    valid() {\n        return true;\n    }\n\n    touch() {\n        throwLazyAccess(this, 'touch');\n    }\n\n    preview() {\n        throwLazyAccess(this, 'preview');\n    }\n\n    toString() {\n        throwLazyAccess(this, 'toString');\n    }\n\n    field(_name) {\n        throwLazyAccess(this, 'field');\n    }\n\n    at(_n) {\n        throwLazyAccess(this, 'at');\n    }\n\n    storageAt(_n) {\n        throwLazyAccess(this, 'storageAt');\n    }\n\n    toArray() {\n        throwLazyAccess(this, 'toArray');\n    }\n\n    value() {\n        throwLazyAccess(this, 'value');\n    }\n\n    valueBig() {\n        throwLazyAccess(this, 'valueBig');\n    }\n\n    toText() {\n        throwLazyAccess(this, 'toText');\n    }\n\n    toUint8Array() {\n        throwLazyAccess(this, 'toUint8Array');\n    }\n\n    findFirst(_needle) {\n        throwLazyAccess(this, 'findFirst');\n    }\n\n    items() {\n        throwLazyAccess(this, 'items');\n    }\n}\n\nexport class LazyHash extends Lazy {\n    physicalType() {\n        return 'LazyHash';\n    }\n\n    identityHashHex() {\n        if (this._identityHashHex !== undefined) {\n            return this._identityHashHex;\n        }\n        const bytes = new Uint8Array(\n            this._builder.buffer,\n            this._offset - this._builder.base + IDENTITY_HASH_OFFSET,\n            HASH_BYTES,\n        );\n        let allZero = true;\n        for (const b of bytes) {\n            if (b !== 0) {\n                allZero = false;\n                break;\n            }\n        }\n        this._identityHashHex = allZero\n            ? null\n            : Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n        return this._identityHashHex;\n    }\n\n    toString() {\n        return `<LazyHash ${this.dataHashHex()}>`;\n    }\n}\n\nexport class LazyHandle extends Lazy {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._handle = null;\n    }\n\n    physicalType() {\n        return 'LazyHandle';\n    }\n\n    handle() {\n        if (this._handle !== null) {\n            return this._handle;\n        }\n\n        const bytes = new Uint8Array(this._builder.buffer, this._offset - this._builder.base + HANDLE_OFFSET);\n        let n = 0;\n        while (n < bytes.length && bytes[n] !== 0) {\n            n++;\n        }\n        if (n === bytes.length) {\n            throw new Error(`ptrless.import: LazyHandle at ${this._offset} is not NUL terminated`);\n        }\n        this._handle = new TextDecoder().decode(bytes.slice(0, n));\n        return this._handle;\n    }\n\n    toString() {\n        return `<LazyHandle '${this.handle()}'>`;\n    }\n}\n\nexport class LazyDerived extends Lazy {\n    physicalType() {\n        return 'LazyDerived';\n    }\n\n    toString() {\n        return '<LazyDerived>';\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Scalar } from '../abstract/Scalar.mjs';\nimport { diagnosticSummaryText } from './Diagnostic.mjs';\n\n\nexport class Untyped extends Scalar {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    valid() {\n        return false;\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        let ret = ``;\n        if (flags & ptlf.inner_NULLABLE) {\n            ret += 'o';\n        }\n\n        ret += 'Untyped';\n        return ret;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n\n    preview() {\n        return this.toString();\n    }\n\n    toString() {\n        const diagnostic = this.diagnostic();\n        if (!diagnostic) {\n            return '';\n        }\n        return `ERROR: ${diagnosticSummaryText(diagnostic)}`;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Arrow } from '../abstract/Arrow.mjs';\nimport { slicePtrless } from './ArraySlice.mjs';\n\n\nconst QWORD = 8;\nfunction nestedDelimiters(flags) {\n    switch (flags & ptlf.outer_MASK) {\n    case ptlf.outer_ARRAY_VEC:\n    case ptlf.outer_HOMO_VEC:\n        return ['<', '>'];\n    default:\n        return ['[', ']'];\n    }\n}\n\nfunction formatNestedValue(value, open, close) {\n    if (Array.isArray(value) || (ArrayBuffer.isView(value) && typeof value[Symbol.iterator] === 'function')) {\n        return `${open}${Array.from(value, v => formatNestedValue(v, open, close)).join(', ')}${close}`;\n    }\n    if (typeof value === 'string') {\n        return JSON.stringify(value);\n    }\n    if (typeof value === 'bigint') {\n        return value.toString();\n    }\n    return `${value}`;\n}\n\n\nexport class VecArrow extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    fixed() {\n        return Number(this._spine.getBigInt64(5 * QWORD, true));\n    }\n\n    items() {\n        return this._items;\n    }\n\n    at(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`VecArrow.at(${i}) out of range for length ${length}.`);\n        }\n        const fixed = this.fixed();\n        return slicePtrless(this.items(), i * fixed, (i + 1) * fixed);\n    }\n\n    valueAt(i) {\n        throw new Error(`VecArrow.valueAt(${i}) is invalid for a non-leaf ptrless collection; use at().`);\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            const row = this.at(i);\n            out[i] = typeof row.toArray === 'function' ? row.toArray() : row;\n        }\n        return out;\n    }\n\n    toString() {\n        const length = this.length();\n        const [rowOpen, rowClose] = nestedDelimiters(this.items().flags());\n        let ret = '<';\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n            const row = this.at(i);\n            const value = typeof row.toArray === 'function' ? row.toArray() : row;\n            ret += formatNestedValue(value, rowOpen, rowClose);\n        }\n        ret += '>';\n        return ret;\n    }\n\n    physicalType() {\n        return 'VecArrow';\n    }\n\n    logicalType() {\n        return this.deepLogicalType();\n    }\n\n    deepLogicalType() {\n        const flags = this.flags();\n\n        let o = '';\n        if (flags & ptlf.inner_NULLABLE) {\n            o = 'o';\n        }\n\n        let ax = `${this.fixed()}${this.axisName()}`;\n\n        let nested = this.items().deepLogicalType();\n        return `Vec${ax}[${o}${nested}]`;\n    }\n\n    _prepopulate(meta) {\n        super._prepopulate(meta);\n\n        const rel = Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._items = this._builder.buildChild(this, rel, 'items', this._builder.declaredItemsMetatype(this));\n        const expected = this.length() * this.fixed();\n        if (!Number.isSafeInteger(expected)) {\n            throw new Error(`ptrless.import: VecArrow at ${this._offset} item cardinality overflows JavaScript`);\n        }\n        if (typeof this._items.length !== 'function' || this._items.length() !== expected) {\n            throw new Error(\n                `ptrless.import: VecArrow at ${this._offset} requires ${expected} items, `\n                + `but its items value has ${typeof this._items.length === 'function' ? this._items.length() : '<unavailable>'}`\n            );\n        }\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from '../flags.mjs';\nimport { Arrow } from '../abstract/Arrow.mjs';\nimport { slicePtrless } from './ArraySlice.mjs';\n\n\nconst DWORD = 4;\nconst QWORD = 8;\nfunction homoLogicalType(flags, nested, axisName) {\n    let o = '';\n    if (flags & ptlf.inner_NULLABLE) {\n        o = 'o';\n    }\n\n    let head = '';\n\n    switch (flags & ptlf.outer_MASK) {\n    case ptlf.outer_ARRAY_VEC:\n    case ptlf.outer_HOMO_VEC:\n        head = 'Vec';\n        break;\n    case ptlf.outer_ARRAY_LIST:\n    case ptlf.outer_HOMO_LIST:\n        head = 'List';\n        break;\n    case ptlf.outer_ARRAY_BAG:\n    case ptlf.outer_HOMO_BAG:\n        head = 'Bag';\n        break;\n    case ptlf.outer_ARRAY_SET:\n    case ptlf.outer_HOMO_SET:\n        head = 'Set';\n        break;\n    }\n\n    if (head) {\n        return `${head}${axisName}[${o}${nested}]`;\n    }\n\n    return `<HomoArrow UNKNOWN flags=0x${flags.toString(16)}>`;\n}\n\nexport class HomoArrow32 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const offsetsStart = offset + Number(this._spine.getBigInt64(5 * QWORD, true));\n        this._offsets = builder.int32Array(offsetsStart, length + 1);\n\n        this._items = null; // see this._prepopulate\n    }\n\n    items() {\n        return this._items;\n    }\n\n    at(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`HomoArrow32.at(${i}) out of range for length ${length}.`);\n        }\n        return slicePtrless(this._items, this._offsets[i], this._offsets[i + 1]);\n    }\n\n    valueAt(i) {\n        throw new Error(`HomoArrow32.valueAt(${i}) is invalid for a non-leaf ptrless collection; use at().`);\n    }\n\n    lengthAt(i) {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        if (i < 0 || i >= length) {\n            return new Error(`lengthAt(${i}) out-of-range for array of size ${length}.`);\n        }\n\n        return this._offsets[i + 1] - this._offsets[i];\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            const row = this.at(i);\n            out[i] = typeof row.toArray === 'function' ? row.toArray() : row;\n        }\n        return out;\n    }\n\n    toString() {\n        const length = this.length();\n        let ret = '[';\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n            ret += this.at(i).toString();\n        }\n        ret += ']';\n        return ret;\n    }\n\n    physicalType() {\n        return 'HomoArrow32';\n    }\n\n    logicalType() {\n        return this.deepLogicalType();\n    }\n\n    deepLogicalType() {\n        return homoLogicalType(this.flags(), this.items().deepLogicalType(), this.axisName());\n    }\n\n    _prepopulate(meta) {\n        super._prepopulate(meta);\n\n        const rel = Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._items = this._builder.buildChild(this, rel, 'items', this._builder.declaredItemsMetatype(this));\n        const terminal = this._offsets[this.length()];\n        const expected = typeof terminal === 'bigint' ? Number(terminal) : terminal;\n        if (typeof this._items.length !== 'function' || this._items.length() !== expected) {\n            throw new Error(\n                `ptrless.import: HomoArrow32 at ${this._offset} declares ${expected} items, `\n                + `but its items value has ${typeof this._items.length === 'function' ? this._items.length() : '<unavailable>'}`\n            );\n        }\n    }\n}\n\nexport class HomoArrow64 extends Arrow {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        const offsetsStart = offset + Number(this._spine.getBigInt64(5 * QWORD, true));\n        this._offsets = builder.bigInt64Array(offsetsStart, length + 1);\n\n        this._items = null; // see this._prepopulate\n    }\n\n    items() {\n        return this._items;\n    }\n\n    at(i) {\n        const length = this.length();\n        if (i < 0 || i >= length) {\n            throw new Error(`HomoArrow64.at(${i}) out of range for length ${length}.`);\n        }\n        return slicePtrless(this._items, Number(this._offsets[i]), Number(this._offsets[i + 1]));\n    }\n\n    valueAt(i) {\n        throw new Error(`HomoArrow64.valueAt(${i}) is invalid for a non-leaf ptrless collection; use at().`);\n    }\n\n    lengthAt(i) {\n        const length = Number(this._spine.getBigInt64(12 * QWORD, true));\n        if (i < 0 || i >= length) {\n            return new Error(`lengthAt(${i}) out-of-range for array of size ${length}.`);\n        }\n\n        return Number(this._offsets[i + 1] - this._offsets[i]);\n    }\n\n    toArray() {\n        const length = this.length();\n        const out = new Array(length);\n        for (let i = 0; i < length; i++) {\n            const row = this.at(i);\n            out[i] = typeof row.toArray === 'function' ? row.toArray() : row;\n        }\n        return out;\n    }\n\n    toString() {\n        const length = this.length();\n        let ret = '[';\n        for (let i = 0; i < length; i++) {\n            if (i > 0) {\n                ret += ', ';\n            }\n            if (ret.length > 120) {\n                ret += '...';\n                break;\n            }\n            ret += this.at(i).toString();\n        }\n        ret += ']';\n        return ret;\n    }\n\n    physicalType() {\n        return 'HomoArrow64';\n    }\n\n    logicalType() {\n        return this.deepLogicalType();\n    }\n\n    deepLogicalType() {\n        return homoLogicalType(this.flags(), this.items().deepLogicalType(), this.axisName());\n    }\n\n    _prepopulate(meta) {\n        super._prepopulate(meta);\n\n        const rel = Number(this._spine.getBigInt64(6 * QWORD, true));\n        this._items = this._builder.buildChild(this, rel, 'items', this._builder.declaredItemsMetatype(this));\n        const expected = Number(this._offsets[this.length()]);\n        if (typeof this._items.length !== 'function' || this._items.length() !== expected) {\n            throw new Error(\n                `ptrless.import: HomoArrow64 at ${this._offset} declares ${expected} items, `\n                + `but its items value has ${typeof this._items.length === 'function' ? this._items.length() : '<unavailable>'}`\n            );\n        }\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Struct } from '../concrete/Struct.mjs';\nimport {\n    METADATA_V1_FIELD_NAMES,\n    METADATA_V1_NUM_FIELDS,\n    METADATA_V1_FIELD_NAMES_INDEX,\n    METADATA_V1_FIELD_METATYPES_INDEX,\n    METADATA_V1_ITEMS_METATYPE_INDEX,\n    METADATA_V1_KEY_METATYPE_INDEX,\n    METADATA_V1_VALUE_METATYPE_INDEX,\n    METADATA_V2_FIELD_NAMES,\n    METADATA_V2_NUM_FIELDS,\n    METADATA_V2_ABSTRACT_INDEX,\n} from './MetadataFields.mjs';\nimport { GraphState } from '../serialization-state.mjs';\nimport {\n    PuffPtlMetadataV1PhysicalType,\n    PuffPtlMetadataV2PhysicalType,\n} from './base.gen.mjs';\n\nexport {\n    METADATA_V1_FIELD_NAMES,\n    METADATA_V1_NUM_FIELDS,\n    METADATA_V1_FIELD_NAMES_INDEX,\n    METADATA_V1_FIELD_METATYPES_INDEX,\n    METADATA_V1_ITEMS_METATYPE_INDEX,\n    METADATA_V1_KEY_METATYPE_INDEX,\n    METADATA_V1_VALUE_METATYPE_INDEX,\n    METADATA_V2_FIELD_NAMES,\n    METADATA_V2_NUM_FIELDS,\n    METADATA_V2_ABSTRACT_INDEX,\n} from './MetadataFields.mjs';\n\nexport class MetadataTuple extends Struct {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n    }\n\n    _buildField(fieldOffset, _name, _index) {\n        return this._builder._buildMetadataEdge(fieldOffset);\n    }\n\n    physicalType() {\n        return 'Tuple';\n    }\n\n    logicalType() {\n        return 'Tuple';\n    }\n\n    deepLogicalType(class_) {\n        class_ = class_ || 'Tuple';\n        return super.deepLogicalType(class_);\n    }\n}\n\nexport class MetadataV1 extends Struct {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._knownFieldNames = METADATA_V1_FIELD_NAMES;\n    }\n\n    fieldNames() {\n        // MetadataV1 field names are fixed by the schema.\n        return METADATA_V1_FIELD_NAMES;\n    }\n\n    fieldMetatypes() {\n        return this.at(METADATA_V1_FIELD_METATYPES_INDEX);\n    }\n\n    itemsMetatype() {\n        return Number(this._fieldAdifs[METADATA_V1_ITEMS_METATYPE_INDEX]) === 0\n            ? null\n            : this.at(METADATA_V1_ITEMS_METATYPE_INDEX);\n    }\n\n    keyMetatype() {\n        return Number(this._fieldAdifs[METADATA_V1_KEY_METATYPE_INDEX]) === 0\n            ? null\n            : this.at(METADATA_V1_KEY_METATYPE_INDEX);\n    }\n\n    valueMetatype() {\n        return Number(this._fieldAdifs[METADATA_V1_VALUE_METATYPE_INDEX]) === 0\n            ? null\n            : this.at(METADATA_V1_VALUE_METATYPE_INDEX);\n    }\n\n    abstract() {\n        const v2 = castMetadataV2(this);\n        return v2.at(METADATA_V2_ABSTRACT_INDEX);\n    }\n\n    numFields() {\n        return METADATA_V1_NUM_FIELDS;\n    }\n\n    _buildField(fieldOffset, name, index) {\n        if (index === METADATA_V1_FIELD_METATYPES_INDEX) {\n            return this._builder.buildMetadataTuple(fieldOffset);\n        }\n        if (index === METADATA_V1_ITEMS_METATYPE_INDEX\n                || index === METADATA_V1_KEY_METATYPE_INDEX\n                || index === METADATA_V1_VALUE_METATYPE_INDEX) {\n            return this._builder._buildMetadataEdge(\n                fieldOffset,\n                this._builder.declaredFieldMetatype(this, index),\n            );\n        }\n        const declaredMeta = this._builder.declaredFieldMetatype(this, index);\n        return this._builder.build(\n            fieldOffset,\n            name,\n            GraphState.Metadata,\n            this._builder.childContext(declaredMeta, {\n                ownerType: this.constructor?.name ?? typeof this,\n                ownerOffset: this._offset,\n                fieldIndex: index,\n                fieldName: name,\n            }),\n        );\n    }\n\n    physicalType() {\n        return PuffPtlMetadataV1PhysicalType;\n    }\n\n    logicalType() {\n        return PuffPtlMetadataV1PhysicalType;\n    }\n\n    deepLogicalType(class_) {\n        class_ = class_ || 'MetadataV1';\n        return super.deepLogicalType(class_);\n    }\n}\n\nexport class MetadataV2 extends MetadataV1 {\n    constructor(builder, offset, spine) {\n        super(builder, offset, spine);\n        this._knownFieldNames = METADATA_V2_FIELD_NAMES;\n    }\n\n    fieldNames() {\n        // MetadataV2 field names include the rich metadata extension fields such as pii.\n        return METADATA_V2_FIELD_NAMES;\n    }\n\n    numFields() {\n        return METADATA_V2_NUM_FIELDS;\n    }\n\n    physicalType() {\n        return PuffPtlMetadataV2PhysicalType;\n    }\n\n    logicalType() {\n        return PuffPtlMetadataV2PhysicalType;\n    }\n\n    deepLogicalType(class_) {\n        class_ = class_ || 'MetadataV2';\n        return super.deepLogicalType(class_);\n    }\n}\n\nexport function metadataV2Cast(meta) {\n    if (!(meta instanceof MetadataV1)) {\n        throw new Error(`ptrless metadata cast failed: want MetadataV1-derived, got ${meta?.constructor?.name || typeof meta}`);\n    }\n    return meta instanceof MetadataV2 ? meta : null;\n}\n\nexport function castMetadataV2(meta) {\n    const ret = metadataV2Cast(meta);\n    if (ret === null) {\n        throw new Error(\n            `ptrless metadata cast failed: want MetadataV2, got ${meta?.constructor?.name || typeof meta}`\n        );\n    }\n    return ret;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Code generated from ptrless/core/src/ptrless/base.gen.c. DO NOT EDIT.\n\nexport const MetadataSchemaCurrentPayloadHashHex = '91d14af4d20fda15e072e347af1db2d33d10f5235e9bcac3fc4bf07f50d8d8c9';\nexport const MetadataSchemaCurrentPayloadHashBytes = Object.freeze([0x91, 0xd1, 0x4a, 0xf4, 0xd2, 0x0f, 0xda, 0x15, 0xe0, 0x72, 0xe3, 0x47, 0xaf, 0x1d, 0xb2, 0xd3, 0x3d, 0x10, 0xf5, 0x23, 0x5e, 0x9b, 0xca, 0xc3, 0xfc, 0x4b, 0xf0, 0x7f, 0x50, 0xd8, 0xd8, 0xc9]);\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.mjs';\nimport { Hetero } from './abstract/Hetero.mjs';\nimport { Struct } from './concrete/Struct.mjs';\nimport { BoolArrow } from './concrete/BoolArrow.mjs';\nimport { BoolScalar } from './concrete/BoolScalar.mjs';\nimport { BytesScalar } from './concrete/BytesScalar.mjs';\nimport { BytesArrow32, BytesArrow64 } from './concrete/BytesArrow.mjs';\nimport { DiagnosticV1, DiagnosticV2, SourceLocation } from './concrete/Diagnostic.mjs';\nimport { IntegralArithmetic, IntegralArrow8, IntegralArrow16, IntegralArrow32, IntegralArrow64 } from './concrete/IntegralArrow.mjs';\nimport { FloatArithmetic32, FloatArithmetic64, FloatArrow32, FloatArrow64 } from './concrete/FloatArrow.mjs';\nimport { FloatScalar32, FloatScalar64 } from './concrete/FloatScalar.mjs';\nimport { IntegralScalar } from './concrete/IntegralScalar.mjs';\nimport { Chunked } from './concrete/Chunked.mjs';\nimport { LogicalAxis } from './concrete/LogicalAxis.mjs';\nimport { LazyDerived, LazyHandle, LazyHash } from './concrete/Lazy.mjs';\nimport { Untyped } from './concrete/Untyped.mjs';\nimport { VecArrow } from './concrete/VecArrow.mjs';\nimport { HomoArrow32, HomoArrow64 } from './concrete/HomoArrow.mjs';\nimport { bytesToHex, hashIdentityHexSync, sha256BytesSync } from './hash.mjs';\nimport {\n    GraphState,\n    SELF_EDGE_REL,\n    TraversalContext,\n    assertGraphState,\n    isLazyPhysicalType,\n} from './serialization-state.mjs';\nimport {\n    METADATA_V1_FIELD_NAMES_INDEX,\n    METADATA_V1_ITEMS_METATYPE_INDEX,\n    METADATA_V1_PHYSICAL_INDEX,\n    METADATA_V1_VALUE_METATYPE_INDEX,\n    METADATA_V2_FIELD_NAMES,\n} from './concrete/MetadataFields.mjs';\nimport {\n    AllStructDescriptors as BaseStructDescriptors,\n    PuffPtlMetadataV1PhysicalType,\n    PuffPtlMetadataV2PhysicalType,\n} from './concrete/base.gen.mjs';\nimport {\n    AllStructDescriptors as ErrorStructDescriptors,\n} from './concrete/err_meta.gen.mjs';\nimport {\n    MetadataTuple,\n    MetadataV1,\n    MetadataV2,\n} from './concrete/MetadataV1.mjs';\nimport { MetadataSchemaCurrentPayloadHashHex } from './concrete/metadata_schema_current.gen.mjs';\n\n\nconst WORD = 2;\nconst DWORD = 4;\nconst QWORD = 8; // bytes\nconst METADATA_MAX_ACTIVE_DEPTH = 64;\nconst PTRLESS_TESTING_TOP_LIMIT = 16;\n\nconst g_liveBuilderRefs = [];\nlet g_nextBuilderID = 1;\n\n/* Keep one weak registry of builders so browser-side leak probes can inspect live ptrless imports without pinning them. */\nfunction noteLiveBuilder(builder) {\n    if (typeof WeakRef === 'function') {\n        g_liveBuilderRefs.push(new WeakRef(builder));\n        return;\n    }\n    g_liveBuilderRefs.push(builder);\n}\n\n/* Read the current live builders and prune dead weak entries so repeated probes stay bounded. */\nfunction liveBuilders() {\n    const out = [];\n    const kept = [];\n    for (const entry of g_liveBuilderRefs) {\n        const builder = typeof WeakRef === 'function' && entry instanceof WeakRef\n            ? entry.deref()\n            : entry;\n        if (!builder) {\n            continue;\n        }\n        out.push(builder);\n        kept.push(entry);\n    }\n    g_liveBuilderRefs.length = 0;\n    g_liveBuilderRefs.push(...kept);\n    return out;\n}\n\n/* Sort one count map into a compact deterministic array for testing and ad hoc browser inspection. */\nfunction topCountEntries(counts, keyName = 'key', countName = 'count', limit = PTRLESS_TESTING_TOP_LIMIT) {\n    return Array.from(counts.entries())\n        .map(([key, count]) => ({ [keyName]: key, [countName]: count }))\n        .sort((a, b) => b[countName] - a[countName] || String(a[keyName]).localeCompare(String(b[keyName])))\n        .slice(0, limit);\n}\n\n/* Sort one bytes/count map into a compact deterministic array so hot wrapper properties stand out immediately. */\nfunction topMetricEntries(metrics, limit = PTRLESS_TESTING_TOP_LIMIT) {\n    return Array.from(metrics.entries())\n        .map(([key, value]) => ({\n            key,\n            count: value.count,\n            bytes: value.bytes,\n            size: value.size,\n        }))\n        .sort((a, b) => b.bytes - a.bytes || b.count - a.count || String(a.key).localeCompare(String(b.key)))\n        .slice(0, limit);\n}\n\n/* Increment one bytes/count metric bucket without forcing every caller to repeat the same mutation boilerplate. */\nfunction addMetric(metrics, key, { count = 1, bytes = 0, size = 0 } = {}) {\n    const prev = metrics.get(key) ?? { count: 0, bytes: 0, size: 0 };\n    metrics.set(key, {\n        count: prev.count + count,\n        bytes: prev.bytes + bytes,\n        size: prev.size + size,\n    });\n}\n\n/* Describe one ptrless root briefly so builder summaries can be correlated back to the visible table/root object. */\nfunction summarizeRootObject(root) {\n    if (!root) {\n        return null;\n    }\n    let physicalType = null;\n    let logicalType = null;\n    let dataHash = null;\n    try {\n        physicalType = typeof root.physicalType === 'function' ? root.physicalType() : null;\n    } catch (_err) {\n    }\n    try {\n        logicalType = typeof root.logicalType === 'function' ? root.logicalType() : null;\n    } catch (_err) {\n    }\n    try {\n        dataHash = typeof root.dataHashHex === 'function' ? root.dataHashHex() : null;\n    } catch (_err) {\n    }\n    return {\n        offset: root._offset ?? null,\n        constructor: root.constructor?.name ?? typeof root,\n        physical_type: physicalType,\n        logical_type: logicalType,\n        data_hash_hex: dataHash,\n    };\n}\n\n/* Inspect one wrapper's own properties so leak probes can separate typed-array views from JS array/map shells. */\nfunction summariseWrapperShells(wrapper, seenViews, seenArrays, seenMaps, seenSets, seenWeakRefs) {\n    const out = {\n        buffer_view_count: 0,\n        buffer_view_bytes: 0,\n        array_count: 0,\n        array_slots: 0,\n        map_count: 0,\n        map_entries: 0,\n        set_count: 0,\n        set_entries: 0,\n        weakref_count: 0,\n        view_ctor_counts: new Map(),\n        view_prop_metrics: new Map(),\n        array_prop_metrics: new Map(),\n        map_prop_metrics: new Map(),\n        set_prop_metrics: new Map(),\n        weakref_prop_counts: new Map(),\n    };\n\n    for (const key of Object.getOwnPropertyNames(wrapper)) {\n        const value = wrapper[key];\n        if (!value) {\n            continue;\n        }\n        if (ArrayBuffer.isView(value)) {\n            if (seenViews.has(value)) {\n                continue;\n            }\n            seenViews.add(value);\n            out.buffer_view_count += 1;\n            out.buffer_view_bytes += value.byteLength;\n            addMetric(out.view_prop_metrics, key, { bytes: value.byteLength });\n            out.view_ctor_counts.set(value.constructor?.name ?? 'view', (out.view_ctor_counts.get(value.constructor?.name ?? 'view') ?? 0) + 1);\n            continue;\n        }\n        if (Array.isArray(value)) {\n            if (seenArrays.has(value)) {\n                continue;\n            }\n            seenArrays.add(value);\n            out.array_count += 1;\n            out.array_slots += value.length;\n            addMetric(out.array_prop_metrics, key, { size: value.length });\n            continue;\n        }\n        if (value instanceof Map) {\n            if (seenMaps.has(value)) {\n                continue;\n            }\n            seenMaps.add(value);\n            out.map_count += 1;\n            out.map_entries += value.size;\n            addMetric(out.map_prop_metrics, key, { size: value.size });\n            continue;\n        }\n        if (value instanceof Set) {\n            if (seenSets.has(value)) {\n                continue;\n            }\n            seenSets.add(value);\n            out.set_count += 1;\n            out.set_entries += value.size;\n            addMetric(out.set_prop_metrics, key, { size: value.size });\n            continue;\n        }\n        if (typeof WeakRef === 'function' && value instanceof WeakRef) {\n            if (seenWeakRefs.has(value)) {\n                continue;\n            }\n            seenWeakRefs.add(value);\n            out.weakref_count += 1;\n            out.weakref_prop_counts.set(key, (out.weakref_prop_counts.get(key) ?? 0) + 1);\n        }\n    }\n\n    return out;\n}\n\n/* Fold one shell summary into the running total without obscuring which bucket grew. */\nfunction addShellSummary(dst, src) {\n    dst.buffer_view_count += src.buffer_view_count;\n    dst.buffer_view_bytes += src.buffer_view_bytes;\n    dst.array_count += src.array_count;\n    dst.array_slots += src.array_slots;\n    dst.map_count += src.map_count;\n    dst.map_entries += src.map_entries;\n    dst.set_count += src.set_count;\n    dst.set_entries += src.set_entries;\n    dst.weakref_count += src.weakref_count;\n    for (const [key, count] of src.view_ctor_counts.entries()) {\n        dst.view_ctor_counts.set(key, (dst.view_ctor_counts.get(key) ?? 0) + count);\n    }\n    for (const [key, value] of src.view_prop_metrics.entries()) {\n        addMetric(dst.view_prop_metrics, key, value);\n    }\n    for (const [key, value] of src.array_prop_metrics.entries()) {\n        addMetric(dst.array_prop_metrics, key, value);\n    }\n    for (const [key, value] of src.map_prop_metrics.entries()) {\n        addMetric(dst.map_prop_metrics, key, value);\n    }\n    for (const [key, value] of src.set_prop_metrics.entries()) {\n        addMetric(dst.set_prop_metrics, key, value);\n    }\n    for (const [key, count] of src.weakref_prop_counts.entries()) {\n        dst.weakref_prop_counts.set(key, (dst.weakref_prop_counts.get(key) ?? 0) + count);\n    }\n}\n\n/* Render one internal builder summary into the stable JSON shape used by browser-side testing hooks. */\nfunction finalizeBuilderMemorySummary(summary) {\n    return {\n        builder_id: summary.builder_id,\n        base: summary.base,\n        raw_regions: {\n            count: 1,\n            bytes: summary.raw_bytes,\n        },\n        root: summary.root,\n        cache: {\n            entry_count: summary.cache.entry_count,\n            strong_entry_count: summary.cache.strong_entry_count,\n            weak_live_entry_count: summary.cache.weak_live_entry_count,\n            weak_dead_entry_count: summary.cache.weak_dead_entry_count,\n        },\n        wrappers: {\n            live_count: summary.wrappers.live_count,\n            by_constructor: topCountEntries(summary.wrappers.by_constructor),\n            by_physical_type: topCountEntries(summary.wrappers.by_physical_type),\n        },\n        js_shells: {\n            buffer_views: {\n                count: summary.js_shells.buffer_view_count,\n                total_span_bytes: summary.js_shells.buffer_view_bytes,\n                by_constructor: topCountEntries(summary.js_shells.view_ctor_counts),\n                by_property: topMetricEntries(summary.js_shells.view_prop_metrics),\n            },\n            arrays: {\n                count: summary.js_shells.array_count,\n                total_slots: summary.js_shells.array_slots,\n                by_property: topMetricEntries(summary.js_shells.array_prop_metrics),\n            },\n            maps: {\n                count: summary.js_shells.map_count,\n                total_entries: summary.js_shells.map_entries,\n                by_property: topMetricEntries(summary.js_shells.map_prop_metrics),\n            },\n            sets: {\n                count: summary.js_shells.set_count,\n                total_entries: summary.js_shells.set_entries,\n                by_property: topMetricEntries(summary.js_shells.set_prop_metrics),\n            },\n            weakrefs: {\n                count: summary.js_shells.weakref_count,\n                by_property: topCountEntries(summary.js_shells.weakref_prop_counts),\n            },\n        },\n    };\n}\n\n/* Reset the live-builder registry in tests so per-case assertions can stay deterministic. */\nexport function testingResetPtrlessLiveBuildersForTesting() {\n    g_liveBuilderRefs.length = 0;\n    g_nextBuilderID = 1;\n}\n\n/* Summarise every live ptrless builder so browser leak triage can spot duplicate raw payloads versus wrapper churn. */\nexport function testingPtrlessLiveMemorySummary() {\n    const builders = liveBuilders();\n    const seenBuffers = new Set();\n    const rawDetails = builders.map((builder) => builder._testingMemorySummaryRaw());\n    let rawBytes = 0;\n    let strongEntryCount = 0;\n    let weakLiveEntryCount = 0;\n    let weakDeadEntryCount = 0;\n    let wrapperCount = 0;\n    const wrapperCtorCounts = new Map();\n    const wrapperPhysicalCounts = new Map();\n    const shellTotals = {\n        buffer_view_count: 0,\n        buffer_view_bytes: 0,\n        array_count: 0,\n        array_slots: 0,\n        map_count: 0,\n        map_entries: 0,\n        set_count: 0,\n        set_entries: 0,\n        weakref_count: 0,\n        view_ctor_counts: new Map(),\n        view_prop_metrics: new Map(),\n        array_prop_metrics: new Map(),\n        map_prop_metrics: new Map(),\n        set_prop_metrics: new Map(),\n        weakref_prop_counts: new Map(),\n    };\n\n    for (let i = 0; i < builders.length; i += 1) {\n        const builder = builders[i];\n        const detail = rawDetails[i];\n        if (!seenBuffers.has(builder.buffer)) {\n            seenBuffers.add(builder.buffer);\n            rawBytes += builder.buffer?.byteLength ?? 0;\n        }\n        strongEntryCount += detail.cache.strong_entry_count;\n        weakLiveEntryCount += detail.cache.weak_live_entry_count;\n        weakDeadEntryCount += detail.cache.weak_dead_entry_count;\n        wrapperCount += detail.wrappers.live_count;\n        for (const [key, count] of detail.wrappers.by_constructor.entries()) {\n            wrapperCtorCounts.set(key, (wrapperCtorCounts.get(key) ?? 0) + count);\n        }\n        for (const [key, count] of detail.wrappers.by_physical_type.entries()) {\n            wrapperPhysicalCounts.set(key, (wrapperPhysicalCounts.get(key) ?? 0) + count);\n        }\n        addShellSummary(shellTotals, detail.js_shells);\n    }\n\n    return {\n        builders_live: builders.length,\n        raw_regions: {\n            unique_buffers: seenBuffers.size,\n            unique_bytes: rawBytes,\n        },\n        cache: {\n            strong_entry_count: strongEntryCount,\n            weak_live_entry_count: weakLiveEntryCount,\n            weak_dead_entry_count: weakDeadEntryCount,\n        },\n        wrappers: {\n            live_count: wrapperCount,\n            by_constructor: topCountEntries(wrapperCtorCounts),\n            by_physical_type: topCountEntries(wrapperPhysicalCounts),\n        },\n        js_shells: {\n            buffer_views: {\n                count: shellTotals.buffer_view_count,\n                total_span_bytes: shellTotals.buffer_view_bytes,\n                by_constructor: topCountEntries(shellTotals.view_ctor_counts),\n                by_property: topMetricEntries(shellTotals.view_prop_metrics),\n            },\n            arrays: {\n                count: shellTotals.array_count,\n                total_slots: shellTotals.array_slots,\n                by_property: topMetricEntries(shellTotals.array_prop_metrics),\n            },\n            maps: {\n                count: shellTotals.map_count,\n                total_entries: shellTotals.map_entries,\n                by_property: topMetricEntries(shellTotals.map_prop_metrics),\n            },\n            sets: {\n                count: shellTotals.set_count,\n                total_entries: shellTotals.set_entries,\n                by_property: topMetricEntries(shellTotals.set_prop_metrics),\n            },\n            weakrefs: {\n                count: shellTotals.weakref_count,\n                by_property: topCountEntries(shellTotals.weakref_prop_counts),\n            },\n        },\n        builders: rawDetails\n            .map((detail) => finalizeBuilderMemorySummary(detail))\n            .sort((a, b) => b.raw_regions.bytes - a.raw_regions.bytes || b.wrappers.live_count - a.wrappers.live_count || a.builder_id - b.builder_id),\n    };\n}\n\n\nclass MetadataGuardError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = 'MetadataGuardError';\n    }\n}\n\nclass UnsupportedPhysical {\n    constructor(offset, spine, reason) {\n        this._offset = offset;\n        this._spine = spine;\n        this._reason = reason;\n        this._meta = null;\n    }\n\n    _prepopulate(meta) {\n        this._meta = meta;\n    }\n\n    flags() {\n        return this._spine.getBigUint64(0, true);\n    }\n\n    valid() {\n        return true;\n    }\n\n    isScalar() {\n        return (this.flags() & ptlf.outer_MASK) === ptlf.outer_SCALAR;\n    }\n\n    isLeaf() {\n        return (this.flags() & ptlf.inner_MASK) !== ptlf.inner_NONE;\n    }\n\n    length() {\n        return Number(this._spine.getBigInt64(12 * QWORD, true));\n    }\n\n    preview() {\n        return this.toString();\n    }\n\n    physicalType() {\n        return `UnsupportedPhysical(${this._reason})`;\n    }\n\n    logicalType() {\n        const flags = this.flags();\n        return `<unsupported ${ptlf.decodeOuter(flags)}/${ptlf.decodeInner(flags)}/${ptlf.decodeBitwidth(flags)}>`;\n    }\n\n    deepLogicalType() {\n        return this.logicalType();\n    }\n\n    toString() {\n        return `'${this._reason}'`;\n    }\n}\n\nclass SynthesizedBytesScalar {\n    constructor(value, meta, label) {\n        this._value = value;\n        this._meta = meta;\n        this._label = label;\n        const bytes = this.toUint8Array();\n        const hashInput = new Uint8Array(bytes.length + 1);\n        hashInput[0] = 1; // Synthesized metadata strings are always valid.\n        hashInput.set(bytes, 1);\n        this._dataHashHex = bytesToHex(sha256BytesSync(hashInput));\n    }\n\n    flags() { return ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_STR; }\n    valid() { return true; }\n    isScalar() { return true; }\n    isLeaf() { return true; }\n    physicalType() { return 'BytesScalar'; }\n    logicalType() { return this._label === 'List[Str]' ? 'Str' : this._label; }\n    deepLogicalType() { return this.logicalType(); }\n    toText() { return this._value; }\n    toString() { return `'${this._value}'`; }\n    toUint8Array() { return new TextEncoder().encode(this._value); }\n    dataHashHex() { return this._dataHashHex; }\n    meta() {\n        if (!this._meta) {\n            throw new Error('SynthesizedBytesScalar did not come with metadata.');\n        }\n        return this._meta;\n    }\n}\n\nclass SynthesizedBytesArrow32 {\n    constructor(items, label) {\n        this._items = Array.from(items);\n        this._label = label;\n        this._meta = null;\n    }\n\n    _prepopulate(meta) {\n        this._meta = meta;\n    }\n\n    toArray() {\n        return Array.from(this._items);\n    }\n\n    toString() {\n        return '[' + this._items.map(x => `'${x}'`).join(', ') + ']';\n    }\n\n    physicalType() {\n        return 'BytesArrow32';\n    }\n\n    logicalType() {\n        return this._label;\n    }\n\n    deepLogicalType() {\n        return this._label;\n    }\n\n    valid() {\n        return true;\n    }\n\n    isScalar() {\n        return false;\n    }\n\n    isLeaf() {\n        return true;\n    }\n\n    length() {\n        return this._items.length;\n    }\n\n    valueAt(i) {\n        if (i < 0 || i >= this._items.length) {\n            return new Error(`valueAt(${i}) is undefined or out-of-range for array of length ${this._items.length}.`);\n        }\n        return this._items[i];\n    }\n\n    at(i) {\n        if (i < 0 || i >= this._items.length) {\n            throw new Error(`SynthesizedBytesArrow32.at(${i}) out of range for length ${this._items.length}.`);\n        }\n        const itemMeta = typeof this._meta?.itemsMetatype === 'function'\n            ? this._meta.itemsMetatype() ?? this._meta\n            : this._meta;\n        return new SynthesizedBytesScalar(this._items[i], itemMeta, this._label);\n    }\n\n    preview() {\n        return this.toString();\n    }\n}\n\n// A bootstrap metatype needs the same concrete field contexts as the\n// canonical MetadataV1 layout. It is used only when the wire omits the\n// metadata edge at a metadata root; it is not an Any carrier.\nclass ImportedMetadataFieldMetatype {\n    constructor(flags, logical, physical) {\n        this._flags = flags;\n        this._logical = logical;\n        this._physical = physical;\n    }\n\n    flags() {\n        return this._flags;\n    }\n\n    valid() {\n        return true;\n    }\n\n    isScalar() {\n        return (this._flags & ptlf.outer_SCALAR) === ptlf.outer_SCALAR;\n    }\n\n    isLeaf() {\n        return (this._flags & ptlf.inner_MASK) !== ptlf.inner_NONE;\n    }\n\n    length() {\n        return 1;\n    }\n\n    logicalType() {\n        return this._logical;\n    }\n\n    deepLogicalType() {\n        return this._logical;\n    }\n\n    physicalType() {\n        return this._physical;\n    }\n\n    preview() {\n        return `<${this._logical}>`;\n    }\n\n    toString() {\n        return this.preview();\n    }\n}\n\nfunction generatedStructDescriptor(descriptors, name) {\n    const descriptor = descriptors.find((candidate) => candidate.name === name);\n    if (!descriptor) {\n        throw new Error(`ptrless import: generated descriptor ${name} is missing`);\n    }\n    return descriptor;\n}\n\nfunction generatedFieldMetatype(descriptor, index, resolveNominal = () => null) {\n    const logical = descriptor.logicalTypes[index];\n    const physical = descriptor.physicalTypes[index];\n    const nullable = descriptor.nullable[index];\n    const nominal = resolveNominal(physical);\n    if (nominal !== null) return nominal;\n\n    let flags = ptlf.BEACON_BIT | ptlf.SCALAR_VALID;\n    switch (physical) {\n    case 'IntegralScalar':\n        flags |= ptlf.outer_SCALAR | ptlf.inner_INT;\n        break;\n    case 'BoolScalar':\n        flags |= ptlf.outer_SCALAR | ptlf.inner_BOOL;\n        break;\n    case 'BytesScalar':\n        flags |= ptlf.outer_SCALAR\n            | (logical === 'Bin' ? ptlf.inner_BIN : ptlf.inner_STR);\n        break;\n    case 'BytesArrow32':\n        flags |= ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.bitwidth_32;\n        break;\n    case 'BytesArrow64':\n        flags |= ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.bitwidth_64;\n        break;\n    case 'MetadataTuple':\n        flags |= ptlf.outer_TUPLE | ptlf.outer_NULLABLE;\n        break;\n    default:\n        throw new Error(\n            `ptrless import: generated ${descriptor.name}.${descriptor.fields[index]} `\n            + `has unsupported physical declaration ${physical}`,\n        );\n    }\n    if (nullable) {\n        flags |= (flags & ptlf.outer_MASK) === ptlf.outer_SCALAR\n            ? ptlf.inner_NULLABLE\n            : ptlf.outer_NULLABLE;\n    }\n    return new ImportedMetadataFieldMetatype(flags, logical, physical);\n}\n\nclass ImportedNominalMetadata {\n    constructor(descriptor, resolveNominal = () => null) {\n        if (descriptor.fieldCount !== descriptor.fields.length\n            || descriptor.logicalTypes.length !== descriptor.fieldCount\n            || descriptor.physicalTypes.length !== descriptor.fieldCount\n            || descriptor.nullable.length !== descriptor.fieldCount) {\n            throw new Error(`ptrless import: generated descriptor ${descriptor.name} is incoherent`);\n        }\n        this._descriptor = descriptor;\n        this._fieldNames = new SynthesizedBytesArrow32(\n            descriptor.fields,\n            'List[Str]',\n        );\n        this._physical = new SynthesizedBytesScalar(\n            descriptor.physicalType,\n            null,\n            'Str',\n        );\n        this._fieldMetatypes = new ImportedMetadataFieldMetatypes(\n            descriptor.fields.map((_name, index) => generatedFieldMetatype(\n                descriptor,\n                index,\n                resolveNominal,\n            )),\n        );\n    }\n\n    at(index) {\n        if (index === METADATA_V1_FIELD_NAMES_INDEX) return this._fieldNames;\n        if (index === METADATA_V1_PHYSICAL_INDEX) return this._physical;\n        return null;\n    }\n\n    field(name) {\n        if (name === 'physical') return this._physical;\n        if (name === 'field_names') return this._fieldNames;\n        return null;\n    }\n\n    fieldMetatypes() { return this._fieldMetatypes; }\n    fieldNames() { return this._descriptor.fields; }\n    physicalType() { return this._descriptor.physicalType; }\n    logicalType() { return 'Struct'; }\n}\n\n// Private in-memory projection of the generated current metadata schema. Its\n// null metadata attachment is the one bootstrap terminator; its field contract\n// comes exclusively from the generated IDL descriptor arrays above.\nclass GeneratedMetadataSchemaCurrent {\n    constructor() {\n        this._totalHashHex = null;\n        this._fieldMetatypes = null;\n    }\n\n    _prepopulate(meta) {\n        if (meta !== null) {\n            throw new Error(`GeneratedMetadataSchemaCurrent._prepopulate: schema root must keep meta=null`);\n        }\n    }\n\n    meta() {\n        return null;\n    }\n\n    // This is the one nominal object permitted to terminate the metadata\n    // attachment chain. Consumers must use this marker, never its physical\n    // name or field count, to recognise the bootstrap state.\n    isMetadataBootstrap() {\n        return true;\n    }\n\n    flags() {\n        return ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.HASH_POPULATED | ptlf.REUSABLE | ptlf.outer_STRUCT;\n    }\n\n    valid() {\n        return true;\n    }\n\n    physicalType() {\n        return PuffPtlMetadataV2PhysicalType;\n    }\n\n    logicalType() {\n        return 'Struct';\n    }\n\n    deepLogicalType() {\n        return 'Struct';\n    }\n\n    isScalar() {\n        return false;\n    }\n\n    isLeaf() {\n        return false;\n    }\n\n    length() {\n        return 1;\n    }\n\n    numFields() {\n        return METADATA_V2_FIELD_NAMES.length;\n    }\n\n    fieldNames() {\n        return METADATA_V2_FIELD_NAMES;\n    }\n\n    fieldMetatypes() {\n        if (this._fieldMetatypes === null) {\n            const descriptor = generatedStructDescriptor(\n                BaseStructDescriptors,\n                'ptl_MetadataV2',\n            );\n            this._fieldMetatypes = new ImportedMetadataFieldMetatypes(\n                descriptor.fields.map((_name, index) => generatedFieldMetatype(\n                    descriptor,\n                    index,\n                    (physical) => physical === PuffPtlMetadataV1PhysicalType\n                        ? this\n                        : null,\n                )),\n            );\n        }\n        return this._fieldMetatypes;\n    }\n\n    dataHashHex() {\n        return MetadataSchemaCurrentPayloadHashHex;\n    }\n\n    totalHashHex() {\n        if (this._totalHashHex === null) {\n            this._totalHashHex = hashIdentityHexSync(this);\n        }\n        return this._totalHashHex;\n    }\n\n    preview() {\n        return this.toString();\n    }\n\n    toString() {\n        return '<GeneratedMetadataSchemaCurrent>';\n    }\n}\n\nclass ImportedMetadataFieldMetatypes {\n    constructor(items) {\n        this._items = Object.freeze(Array.from(items));\n    }\n\n    numFields() {\n        return this._items.length;\n    }\n\n    at(index) {\n        if (!Number.isInteger(index) || index < 0 || index >= this._items.length) {\n            throw new Error(`ImportedMetadataFieldMetatypes.at(${index}) is out of range.`);\n        }\n        return this._items[index];\n    }\n}\n\nconst g_metadataSchemaCurrent = new GeneratedMetadataSchemaCurrent();\nconst g_importedSourceLocationMetadata = new ImportedNominalMetadata(\n    generatedStructDescriptor(ErrorStructDescriptors, 'ptl_err_SourceLocation'),\n);\nconst g_importedDiagnosticMetadata = new ImportedNominalMetadata(\n    generatedStructDescriptor(ErrorStructDescriptors, 'ptl_DiagnosticV1'),\n    (physical) => physical === g_importedSourceLocationMetadata.physicalType()\n        ? g_importedSourceLocationMetadata\n        : null,\n);\nconst g_importedAxisMetadata = new ImportedNominalMetadata(\n    generatedStructDescriptor(BaseStructDescriptors, 'ptl_Axis'),\n);\n\n\n\nexport class Builder {\n    // Buffer containing a ptrless object graph. The `base` here refers to\n    // *where* in the address space this buffer is, if its a subset of a larger\n    // one, so pass 0 by default. This zero is separate from where the root object\n    // is within the buffer, which is conventionally zero as well.\n    //\n    // tl;dr: new Builder(buffer, 0).build(0) is the usual way to hydrate a\n    // ptrless object graph.\n    constructor(buffer, base=0, options={}) {\n        if (base != 0) {\n            throw new Error(`base != 0 is not tested or debugged.`);\n        }\n        if (options === null || typeof options !== 'object' || Array.isArray(options)) {\n            throw new TypeError(`ptrless.Builder: options must be an object`);\n        }\n        if (options.declaredMetadata !== null\n            && options.declaredMetadata !== undefined\n            && (typeof options.declaredMetadata !== 'object' || options.declaredMetadata === null)) {\n            throw new TypeError(`ptrless.Builder: declaredMetadata must be an object or null`);\n        }\n        if (options.resolveImportedObject !== null\n            && options.resolveImportedObject !== undefined\n            && typeof options.resolveImportedObject !== 'function') {\n            throw new TypeError(`ptrless.Builder: resolveImportedObject must be a function or null`);\n        }\n        if (options.observeImportedObject !== null\n            && options.observeImportedObject !== undefined\n            && typeof options.observeImportedObject !== 'function') {\n            throw new TypeError(`ptrless.Builder: observeImportedObject must be a function or null`);\n        }\n        this.buffer = buffer;\n        this.base = base;\n        // This is the declared root context for an omitted root metadata edge.\n        // Descendant contexts are still supplied by the metadata graph itself.\n        this._rootContext = new TraversalContext({\n            declaredMetadata: options.declaredMetadata ?? null,\n        });\n        this._resolveImportedObject = options.resolveImportedObject ?? null;\n        this._observeImportedObject = options.observeImportedObject ?? null;\n        this._testingBuilderID = g_nextBuilderID++;\n        this._depth = 0;\n        this._metaDepth = 0;\n        this._cache = new Map();\n        this._activePayloadOffsets = new Set();\n        this._metadataFrames = [];\n        this._activeContext = null;\n        noteLiveBuilder(this);\n    }\n\n    _wireError(label, detail) {\n        throw new Error(`ptrless.import: ${label}: ${detail}`);\n    }\n\n    _safeWireInteger(value, label, { nonnegative = false } = {}) {\n        if (typeof value !== 'bigint') {\n            this._wireError(label, `expected int64, got ${typeof value}`);\n        }\n        if (value < BigInt(Number.MIN_SAFE_INTEGER)\n            || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n            this._wireError(label, `${value} exceeds JavaScript's safe integer range`);\n        }\n        if (nonnegative && value < 0n) {\n            this._wireError(label, `negative value ${value}`);\n        }\n        return Number(value);\n    }\n\n    wireCount(spine, slot, label) {\n        return this._safeWireInteger(\n            spine.getBigInt64(slot * QWORD, true),\n            label,\n            { nonnegative: true },\n        );\n    }\n\n    wireRelative(ownerOffset, spine, slot, label, {\n        allowZero = true,\n        allowSelf = false,\n        minimumBytes = 0,\n        alignment = 1,\n    } = {}) {\n        const relBig = spine.getBigInt64(slot * QWORD, true);\n        if (relBig === 0n) {\n            if (!allowZero) this._wireError(label, 'zero relative offset is not permitted');\n            return 0;\n        }\n        if (relBig === BigInt(SELF_EDGE_REL)) {\n            if (!allowSelf) this._wireError(label, 'self-reference is not permitted');\n            return SELF_EDGE_REL;\n        }\n        const absoluteBig = BigInt(ownerOffset) + relBig;\n        const absolute = this._safeWireInteger(absoluteBig, label, { nonnegative: true });\n        this._checkWireExtent(absolute, minimumBytes, 1, label, alignment);\n        return absolute;\n    }\n\n    _checkWireExtent(offset, count, itemBytes, label, alignment = 1) {\n        if (!Number.isSafeInteger(offset) || offset < 0) {\n            this._wireError(label, `invalid offset ${offset}`);\n        }\n        if (!Number.isSafeInteger(count) || count < 0) {\n            this._wireError(label, `invalid count ${count}`);\n        }\n        if (!Number.isSafeInteger(itemBytes) || itemBytes <= 0) {\n            this._wireError(label, `invalid item size ${itemBytes}`);\n        }\n        if (alignment > 1 && offset % alignment !== 0) {\n            this._wireError(label, `offset ${offset} is not ${alignment}-byte aligned`);\n        }\n        const bytes = count * itemBytes;\n        if (!Number.isSafeInteger(bytes) || bytes > this.buffer.byteLength - offset) {\n            this._wireError(\n                label,\n                `range offset=${offset} count=${count} item_bytes=${itemBytes} exceeds ${this.buffer.byteLength} bytes`,\n            );\n        }\n        return bytes;\n    }\n\n    _wireView(offset, count, itemBytes, label, alignment, construct) {\n        this._checkWireExtent(offset - this.base, count, itemBytes, label, alignment);\n        return construct();\n    }\n\n    _validateRelativeSlot(offset, spine, slot, label, options = {}) {\n        return this.wireRelative(offset, spine, slot, label, options);\n    }\n\n    _validateValidity(offset, spine, length, numNulls, label, objectNull = false) {\n        const validity = this._validateRelativeSlot(offset, spine, 4, `${label} validity`, {\n            allowZero: true,\n            minimumBytes: numNulls > 0 ? Math.ceil(length / 8) : 0,\n        });\n        if (objectNull) {\n            if (length !== 0 || numNulls !== 1 || validity !== 0) {\n                this._wireError(\n                    label,\n                    `null aggregate must have length=0, num_nulls=1, validity=0; `\n                    + `got length=${length}, num_nulls=${numNulls}, validity=${validity}`,\n                );\n            }\n            return;\n        }\n        if (validity === 0) {\n            if (numNulls !== 0) {\n                this._wireError(label, `num_nulls=${numNulls} without a validity bitmap`);\n            }\n            return;\n        }\n        const bytes = Math.ceil(length / 8);\n        this._checkWireExtent(validity, bytes, 1, `${label} validity`);\n        const bitmap = new Uint8Array(this.buffer, validity - this.base, bytes);\n        let nulls = 0;\n        for (let index = 0; index < length; index++) {\n            if (((bitmap[index >> 3] >> (index & 7)) & 1) === 0) nulls++;\n        }\n        if (nulls !== numNulls) {\n            this._wireError(label, `num_nulls=${numNulls}, but validity bitmap contains ${nulls}`);\n        }\n    }\n\n    _validateOffsets(offset, spine, slot, length, bits, label) {\n        const itemBytes = bits / 8;\n        const start = this._validateRelativeSlot(offset, spine, slot, `${label} offsets`, {\n            allowZero: false,\n            minimumBytes: (length + 1) * itemBytes,\n            alignment: itemBytes,\n        });\n        this._checkWireExtent(start, length + 1, itemBytes, `${label} offsets`, itemBytes);\n        const offsets = bits === 32\n            ? new Int32Array(this.buffer, start - this.base, length + 1)\n            : new BigInt64Array(this.buffer, start - this.base, length + 1);\n        let previous = 0n;\n        for (let index = 0; index <= length; index++) {\n            const current = bits === 32 ? BigInt(offsets[index]) : offsets[index];\n            if (index === 0 && current !== 0n) {\n                this._wireError(label, `offsets[0]=${current}, want 0`);\n            }\n            if (current < previous) {\n                this._wireError(label, `offsets are not monotonic at index ${index}: ${current} < ${previous}`);\n            }\n            this._safeWireInteger(current, `${label} offsets[${index}]`, { nonnegative: true });\n            previous = current;\n        }\n        return { start, offsets, terminal: Number(previous) };\n    }\n\n    _requireZeroSlot(spine, slot, label) {\n        const value = spine.getBigInt64(slot * QWORD, true);\n        if (value !== 0n) this._wireError(label, `reserved slot ${slot} is nonzero: ${value}`);\n    }\n\n    _validateFullWireHead(offset, spine, flags, physical) {\n        const length = this.wireCount(spine, 12, `object ${offset} length`);\n        const numNulls = this.wireCount(spine, 13, `object ${offset} num_nulls`);\n        const objectNull = length === 0\n            && (flags & ptlf.outer_NULLABLE) !== 0n\n            && (flags & ptlf.SCALAR_VALID) === 0n;\n        if (!objectNull && numNulls > length) {\n            this._wireError(`object ${offset}`, `num_nulls=${numNulls} exceeds length=${length}`);\n        }\n        this._validateRelativeSlot(offset, spine, 1, `object ${offset} metadata`, {\n            allowZero: true,\n            allowSelf: true,\n            minimumBytes: 32,\n        });\n        this._validateRelativeSlot(offset, spine, 2, `object ${offset} diagnostic`, {\n            allowZero: true,\n            minimumBytes: 32,\n        });\n\n        const numericWidths = new Map([\n            [ptlf.physical_BOOL_ARROW, 0],\n            [ptlf.physical_INTEGRAL_ARROW8, 1],\n            [ptlf.physical_INTEGRAL_ARROW16, 2],\n            [ptlf.physical_INTEGRAL_ARROW32, 4],\n            [ptlf.physical_INTEGRAL_ARROW64, 8],\n            [ptlf.physical_FLOAT_ARROW32, 4],\n            [ptlf.physical_FLOAT_ARROW64, 8],\n        ]);\n        if (numericWidths.has(physical)) {\n            this._validateRelativeSlot(offset, spine, 3, `leaf array ${offset} iaxis`, {\n                allowZero: true,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 5, `leaf array ${offset}`);\n            this._requireZeroSlot(spine, 7, `leaf array ${offset}`);\n            const valueBytes = numericWidths.get(physical);\n            const minimumBytes = valueBytes === 0 ? Math.ceil(length / 8) : length * valueBytes;\n            this._validateRelativeSlot(offset, spine, 6, `leaf array ${offset} values`, {\n                allowZero: length === 0,\n                minimumBytes,\n                alignment: valueBytes > 1 ? valueBytes : 1,\n            });\n            this._validateValidity(offset, spine, length, numNulls, `leaf array ${offset}`, objectNull);\n            return;\n        }\n\n        const arithmeticPhysical = new Set([\n            ptlf.physical_INTEGRAL_ARITHMETIC,\n            ptlf.physical_INTEGRAL_ARITHMETIC8,\n            ptlf.physical_INTEGRAL_ARITHMETIC16,\n            ptlf.physical_INTEGRAL_ARITHMETIC32,\n            ptlf.physical_INTEGRAL_ARITHMETIC64,\n            ptlf.physical_UINTEGRAL_ARITHMETIC,\n            ptlf.physical_UINTEGRAL_ARITHMETIC8,\n            ptlf.physical_UINTEGRAL_ARITHMETIC16,\n            ptlf.physical_UINTEGRAL_ARITHMETIC32,\n            ptlf.physical_UINTEGRAL_ARITHMETIC64,\n            ptlf.physical_FLOAT_ARITHMETIC32,\n            ptlf.physical_FLOAT_ARITHMETIC64,\n        ]);\n        if (arithmeticPhysical.has(physical)) {\n            this._requireZeroSlot(spine, 7, `arithmetic array ${offset}`);\n            this._validateValidity(offset, spine, length, numNulls, `arithmetic array ${offset}`, objectNull);\n            return;\n        }\n\n        if (physical === ptlf.physical_BYTES_ARROW32 || physical === ptlf.physical_BYTES_ARROW64) {\n            this._validateRelativeSlot(offset, spine, 3, `bytes array ${offset} iaxis`, {\n                allowZero: true,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 7, `bytes array ${offset}`);\n            const bits = physical === ptlf.physical_BYTES_ARROW32 ? 32 : 64;\n            const offsets = this._validateOffsets(offset, spine, 5, length, bits, `bytes array ${offset}`);\n            this._validateRelativeSlot(offset, spine, 6, `bytes array ${offset} values`, {\n                allowZero: offsets.terminal === 0,\n                minimumBytes: offsets.terminal,\n            });\n            this._validateValidity(offset, spine, length, numNulls, `bytes array ${offset}`, objectNull);\n            return;\n        }\n\n        if (physical === ptlf.physical_HOMO_ARROW32 || physical === ptlf.physical_HOMO_ARROW64) {\n            this._validateRelativeSlot(offset, spine, 3, `homo array ${offset} iaxis`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 7, `homo array ${offset}`);\n            this._validateOffsets(\n                offset, spine, 5, length,\n                physical === ptlf.physical_HOMO_ARROW32 ? 32 : 64,\n                `homo array ${offset}`,\n            );\n            this._validateRelativeSlot(offset, spine, 6, `homo array ${offset} items`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._validateValidity(offset, spine, length, numNulls, `homo array ${offset}`, objectNull);\n            return;\n        }\n\n        if (physical === ptlf.physical_VEC_ARROW) {\n            this._validateRelativeSlot(offset, spine, 3, `vec array ${offset} iaxis`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 7, `vec array ${offset}`);\n            const fixed = this.wireCount(spine, 5, `vec array ${offset} fixed`);\n            if (fixed === 0) this._wireError(`vec array ${offset}`, 'fixed cardinality is zero');\n            this._validateRelativeSlot(offset, spine, 6, `vec array ${offset} items`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._validateValidity(offset, spine, length, numNulls, `vec array ${offset}`, objectNull);\n            return;\n        }\n\n        const outer = flags & ptlf.outer_MASK;\n        if (outer === ptlf.outer_LOGICAL_AXIS_VEC\n            || outer === ptlf.outer_LOGICAL_AXIS_LIST\n            || outer === ptlf.outer_LOGICAL_AXIS_SET\n            || outer === ptlf.outer_LOGICAL_AXIS_BAG) {\n            this._validateRelativeSlot(offset, spine, 3, `LogicalAxis ${offset} iaxis`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._validateRelativeSlot(offset, spine, 6, `LogicalAxis ${offset} items`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 7, `LogicalAxis ${offset}`);\n            this._requireZeroSlot(spine, 14, `LogicalAxis ${offset}`);\n            this._requireZeroSlot(spine, 15, `LogicalAxis ${offset}`);\n            this._validateValidity(offset, spine, length, numNulls, `LogicalAxis ${offset}`, objectNull);\n            return;\n        }\n        if (outer === ptlf.outer_CHUNKED) {\n            this._validateRelativeSlot(offset, spine, 3, `chunked ${offset} iaxis`, {\n                allowZero: false,\n                minimumBytes: 32,\n            });\n            this._requireZeroSlot(spine, 4, `chunked ${offset}`);\n            this._requireZeroSlot(spine, 7, `chunked ${offset}`);\n            this._requireZeroSlot(spine, 13, `chunked ${offset}`);\n            this._requireZeroSlot(spine, 14, `chunked ${offset}`);\n            this._requireZeroSlot(spine, 15, `chunked ${offset}`);\n            this._validateOffsets(offset, spine, 5, length, 64, `chunked ${offset}`);\n            const chunksRel = spine.getBigInt64(6 * QWORD, true);\n            if (length === 0) {\n                if (chunksRel !== 0n) this._wireError(`chunked ${offset}`, 'empty chunk table pointer is nonzero');\n            } else {\n                const chunks = this._validateRelativeSlot(offset, spine, 6, `chunked ${offset} chunks`, {\n                    allowZero: false,\n                    minimumBytes: length * 8,\n                    alignment: 8,\n                });\n                const adifs = new BigInt64Array(this.buffer, chunks - this.base, length);\n                for (let index = 0; index < length; index++) {\n                    const rel = this._safeWireInteger(adifs[index], `chunked ${offset} chunk[${index}]`);\n                    if (rel === 0 || rel === SELF_EDGE_REL) {\n                        this._wireError(`chunked ${offset}`, `invalid chunk relative offset ${rel} at index ${index}`);\n                    }\n                    this._checkWireExtent(offset + rel, 32, 1, `chunked ${offset} chunk[${index}]`);\n                }\n            }\n            return;\n        }\n\n        if (outer === ptlf.outer_STRUCT\n            || outer === ptlf.outer_TUPLE\n            || outer === ptlf.outer_NAMED_TUPLE) {\n            // Struct is one scalar record.  An explicit LogicalAxis owns row\n            // cardinality for a dataframe; Axis and Metadata are also Struct\n            // layouts and likewise have no independent axis edge.  Tuple forms\n            // retain their own axis semantics.\n            if (outer === ptlf.outer_STRUCT) {\n                this._requireZeroSlot(spine, 3, `Struct ${offset} iaxis`);\n            }\n            const numFields = this.wireCount(spine, 5, `hetero ${offset} field count`);\n            const fields = this._validateRelativeSlot(offset, spine, 6, `hetero ${offset} fields`, {\n                allowZero: numFields === 0,\n                minimumBytes: numFields * 8,\n                alignment: 8,\n            });\n            const deepSize = this.wireCount(spine, 7, `hetero ${offset} deep size`);\n            if (deepSize === 0) this._wireError(`hetero ${offset}`, 'stored aggregate size is zero');\n            this._requireZeroSlot(spine, 14, `hetero ${offset}`);\n            this._requireZeroSlot(spine, 15, `hetero ${offset}`);\n            if (numFields > 0) {\n                const adifs = new BigInt64Array(this.buffer, fields - this.base, numFields);\n                for (let index = 0; index < numFields; index++) {\n                    const rel = this._safeWireInteger(adifs[index], `hetero ${offset} field[${index}]`);\n                    if (rel === 0 || rel === SELF_EDGE_REL) {\n                        this._wireError(`hetero ${offset}`, `invalid field relative offset ${rel} at index ${index}`);\n                    }\n                    this._checkWireExtent(offset + rel, 32, 1, `hetero ${offset} field[${index}]`);\n                }\n            }\n            this._validateValidity(offset, spine, length, numNulls, `hetero ${offset}`);\n        }\n    }\n\n    _cacheKey(offset, graphState=GraphState.Payload) {\n        assertGraphState(graphState, 'ptrless.import._cacheKey');\n        // One wire object may be visited through both payload and metadata\n        // edges. The traversal role selects the wrapper, so cache only a\n        // wrapper for the matching incoming role; physical wire identity is\n        // still the offset carried by each wrapper.\n        return graphState === GraphState.Payload ? offset : `${offset}:${graphState}`;\n    }\n\n    /* Read one cached wrapper, transparently dropping dead weak entries once GC has reclaimed them. */\n    _cacheGet(offset, graphState=GraphState.Payload) {\n        const key = this._cacheKey(offset, graphState);\n        const entry = this._cache.get(key);\n        if (!entry) {\n            return null;\n        }\n        if (typeof WeakRef !== 'function' || !(entry instanceof WeakRef)) {\n            return entry;\n        }\n        const value = entry.deref();\n        if (value) {\n            return value;\n        }\n        this._cache.delete(key);\n        return null;\n    }\n\n    /* Publish one cache entry strongly during active build work so recursive edges still resolve deterministically. */\n    _cacheSetStrong(offset, value, graphState=GraphState.Payload) {\n        const key = this._cacheKey(offset, graphState);\n        this._cache.set(key, value);\n        return value;\n    }\n\n    // The import boundary observes every materialised contextual definition\n    // after the complete root has been materialised. One wire offset can be\n    // reached through payload and metadata edges; those visits can have\n    // distinct declared metadata and therefore distinct semantic identities.\n    // Keep that context in this bounded import-local walk rather than\n    // collapsing it by physical offset.\n    _observeImportedObjects() {\n        if (this._observeImportedObject === null) {\n            return;\n        }\n        for (const [cacheKey, obj] of this._cache.entries()) {\n            const concrete = typeof WeakRef === 'function' && obj instanceof WeakRef\n                ? obj.deref()\n                : obj;\n            if (!concrete) {\n                continue;\n            }\n            this._observeImportedObject(concrete, concrete._offset ?? cacheKey);\n        }\n    }\n\n    _metadataLabel(meta) {\n        if (!meta) return null;\n        if (typeof meta.logicalType === 'function') return meta.logicalType();\n        return this._metaFieldText(meta, 'logical');\n    }\n\n    _validateVisit(offset, hit, graphState, context = null) {\n        assertGraphState(graphState, 'ptrless.import._validateVisit');\n        let spine = new DataView(this.buffer, offset - this.base, 16);\n        const flags = spine.getBigUint64(0, true);\n        const outer = flags & ptlf.outer_MASK;\n        if (graphState === GraphState.Metadata) {\n            if (outer === ptlf.outer_STRUCT) {\n                spine = new DataView(this.buffer, offset - this.base, 128);\n                const numFields = Number(spine.getBigInt64(5 * QWORD, true));\n                if (numFields !== METADATA_V2_FIELD_NAMES.length) {\n                    throw new Error(\n                        `ptrless.import: position ${offset} reused as MetadataV2 with ${numFields} fields; `\n                        + `want ${METADATA_V2_FIELD_NAMES.length}`\n                    );\n                }\n                if (!(hit instanceof MetadataV1)\n                    && !(hit instanceof Struct && hit._meta === null)) {\n                    throw new Error(\n                        `ptrless.import: position ${offset} materialised as ${hit.constructor?.name || typeof hit} `\n                        + `is incompatible with a metadata-role Struct visit`\n                    );\n                }\n            } else if ((outer === ptlf.outer_TUPLE || outer === ptlf.outer_NAMED_TUPLE)\n                && !(hit instanceof MetadataTuple)\n                && !(hit instanceof Struct && hit._meta === null)) {\n                throw new Error(\n                    `ptrless.import: position ${offset} materialised as ${hit.constructor?.name || typeof hit} `\n                    + `is incompatible with a metadata-role Tuple visit`\n                );\n            }\n        }\n\n    }\n\n    _declaredFlags(meta) {\n        if (!meta) return null;\n        if (!(meta instanceof MetadataV1) && typeof meta.flags === 'function') {\n            return meta.flags();\n        }\n        if (typeof meta.field !== 'function') return null;\n        const flags = meta.field('flags');\n        if (!flags || typeof flags.valid === 'function' && !flags.valid()) return null;\n        if (typeof flags.valueBig === 'function') return flags.valueBig();\n        if (typeof flags.value === 'function') return BigInt(flags.value());\n        return null;\n    }\n\n    _validateObjectDeclaration(offset, object, actualMeta, declared, graphState) {\n        if (!declared) return;\n        const actualOuter = object.flags() & ptlf.outer_MASK;\n        if (actualOuter === ptlf.outer_LAZY_HASHED\n            || actualOuter === ptlf.outer_LAZY\n            || actualOuter === ptlf.outer_LAZY_HANDLE\n            || actualOuter === ptlf.outer_LAZY_DERIVED) return;\n        const declaredLogical = this._metadataLabel(declared);\n        if (declaredLogical === 'Any' || declaredLogical === 'recursive_frontier') return;\n\n        const declaredFlags = this._declaredFlags(declared);\n        if (declaredFlags !== null) {\n            const shapeMask = ptlf.outer_MASK | ptlf.inner_MASK;\n            const actualShape = object.flags() & shapeMask;\n            const declaredShape = declaredFlags & shapeMask;\n            // Metadata describes the caller-visible collection.  A\n            // LogicalAxis is a structural wrapper around its physical tensor,\n            // so a declared Vec/List/Set/Bag accepts the matching wrapper\n            // subtype without pretending the wrapper is a second tensor\n            // representation.\n            const actualOuter = actualShape & ptlf.outer_MASK;\n            const declaredOuter = declaredShape & ptlf.outer_MASK;\n            const logicalAxisWrapper = (actualOuter === ptlf.outer_LOGICAL_AXIS_VEC\n                || actualOuter === ptlf.outer_LOGICAL_AXIS_LIST\n                || actualOuter === ptlf.outer_LOGICAL_AXIS_SET\n                || actualOuter === ptlf.outer_LOGICAL_AXIS_BAG)\n                && (actualShape & ptlf.inner_MASK) === (declaredShape & ptlf.inner_MASK)\n                && (actualOuter & ptlf.outer_pure_MASK) === (declaredOuter & ptlf.outer_pure_MASK)\n                && ((declaredOuter & ptlf.outer_shared_MASK) === ptlf.outer_shared_ARRAY\n                    || (declaredOuter & ptlf.outer_shared_MASK) === ptlf.outer_shared_HOMO);\n            if (actualShape !== declaredShape && !logicalAxisWrapper) {\n                throw new Error(\n                    `ptrless.import: position ${offset} reused with conflicting declared metadata; `\n                    + `role=${graphState} actual_flags=0x${actualShape.toString(16)} `\n                    + `declared_flags=0x${declaredShape.toString(16)}`\n                );\n            }\n        }\n\n        const outer = object.flags() & ptlf.outer_MASK;\n        if (outer !== ptlf.outer_STRUCT && outer !== ptlf.outer_TUPLE\n            && outer !== ptlf.outer_NAMED_TUPLE) return;\n        if (graphState === GraphState.Metadata) return;\n        const actualPhysical = this._metaFieldText(actualMeta, 'physical')\n            ?? (typeof actualMeta?.physicalType === 'function' ? actualMeta.physicalType() : null);\n        const declaredPhysical = this._metaFieldText(declared, 'physical')\n            ?? (typeof declared?.physicalType === 'function' ? declared.physicalType() : null);\n        const metadataCompatible = (actualPhysical === 'MetadataV1' || actualPhysical === 'MetadataV2')\n            && (declaredPhysical === 'MetadataV1' || declaredPhysical === 'MetadataV2');\n        if (!metadataCompatible && actualPhysical && declaredPhysical\n            && actualPhysical !== declaredPhysical) {\n            throw new Error(\n                `ptrless.import: position ${offset} conflicts with declared nominal type; `\n                + `role=${graphState} actual=${actualPhysical} declared=${declaredPhysical}`\n            );\n        }\n    }\n\n    /* Demote settled cache entries to weak refs so lazy reads do not pin every touched wrapper indefinitely. */\n    _weakenSettledCache() {\n        if (typeof WeakRef !== 'function') {\n            return;\n        }\n        for (const [offset, entry] of this._cache.entries()) {\n            if (!entry || entry instanceof WeakRef) {\n                continue;\n            }\n            this._cache.set(offset, new WeakRef(entry));\n        }\n    }\n\n    _isMetadataLike(owner) {\n        return owner instanceof MetadataV1;\n    }\n\n    _metadataPath(nextFrame = null) {\n        const frames = nextFrame === null\n            ? this._metadataFrames\n            : this._metadataFrames.concat([nextFrame]);\n        if (frames.length === 0) {\n            return '<root>';\n        }\n        return frames.map(frame => `${frame.kind}@${frame.offset}`).join(' -> ');\n    }\n\n    _pushMetadataFrame(kind, offset) {\n        if (this._metadataFrames.length >= METADATA_MAX_ACTIVE_DEPTH) {\n            throw new MetadataGuardError(\n                `ptrless metadata decode guard tripped: active depth exceeded `\n                + `(depth=${this._metadataFrames.length + 1}, limit=${METADATA_MAX_ACTIVE_DEPTH}); `\n                + `path=${this._metadataPath({ kind, offset })}`\n            );\n        }\n        this._metadataFrames.push({ kind, offset });\n    }\n\n    _popMetadataFrame(kind, offset) {\n        const frame = this._metadataFrames.pop();\n        if (!frame || frame.kind !== kind || frame.offset !== offset) {\n            throw new Error(\n                `ptrless metadata frame stack mismatch: expected ${kind}@${offset}, `\n                + `got ${frame ? `${frame.kind}@${frame.offset}` : 'empty stack'}`\n            );\n        }\n    }\n\n    _metaForObject(ret, offset, graphState=GraphState.Payload, context=null) {\n        assertGraphState(graphState, 'ptrless.import._metaForObject');\n        const metaAdif = Number(ret._spine.getBigInt64(1 * QWORD, true));\n        if (metaAdif === 0) {\n            if (context?.declaredMetadata) {\n                return context.declaredMetadata;\n            }\n            // Metadata traversal supplies the bootstrap declaration explicitly.\n            // Payload traversal must not classify a value from its shape.\n            if (graphState === GraphState.Metadata) {\n                return g_metadataSchemaCurrent;\n            }\n            // Deferred transport placeholders intentionally carry no local metadata edge.\n            if (typeof ret.flags === 'function') {\n                switch (ret.flags() & ptlf.outer_MASK) {\n                case ptlf.outer_LAZY_HASHED:\n                case ptlf.outer_LAZY:\n                case ptlf.outer_LAZY_HANDLE:\n                case ptlf.outer_LAZY_DERIVED:\n                    return null;\n                }\n            }\n            throw new Error(\n                `ptrless.import: object at offset ${offset} has meta=0 without an inferable context; `\n                + `state=${graphState}, type=${ret.constructor?.name ?? typeof ret}`\n                + (context?.ownerType\n                    ? `, owner=${context.ownerType}@${context.ownerOffset} field=${context.fieldName ?? context.fieldIndex}`\n                    : '')\n                + (context?.ownerMetaType\n                    ? `, owner_meta=${context.ownerMetaType}@${context.ownerMetaOffset} `\n                        + `physical=${context.ownerMetaPhysical} fields=${context.ownerMetaFields} `\n                        + `field_metatypes=${context.ownerMetaFieldMetatypesType}(${context.ownerMetaFieldMetatypesFields})`\n                    : '')\n            );\n        }\n        if (metaAdif === SELF_EDGE_REL) {\n            return ret;\n        }\n        return this._buildMetadataEdge(offset + metaAdif, context?.declaredMetadata ?? null);\n    }\n\n    // Decode the root shell and establish its first metadata object before\n    // ordinary payload traversal begins. The root import API has no declared\n    // metadata context, so this is the explicit self-describing bootstrap\n    // boundary; descendant role and metadata context still come from edges.\n    bootstrap(offset) {\n        const root = this._buildUncached(offset, GraphState.Payload, this._rootContext);\n        const metaAdif = Number(root._spine.getBigInt64(1 * QWORD, true));\n        if (metaAdif === 0 || metaAdif === SELF_EDGE_REL) {\n            if (this._rootContext.declaredMetadata !== null) {\n                this._validateMetadataGraph(this._rootContext.declaredMetadata);\n            }\n            return root;\n        }\n        const metadata = this._buildMetadataEdge(offset + metaAdif);\n        this._validateMetadataGraph(metadata);\n        return root;\n    }\n\n    // Metadata is structural control information. Resolve its reachable\n    // structural graph before payload access can observe a partially decoded\n    // schema; repeated objects are ordinary DAG sharing, not repeated work.\n    _validateMetadataGraph(root) {\n        const seen = new Set();\n        const visit = (obj) => {\n            if (obj === null || obj === undefined || typeof obj !== 'object' || seen.has(obj)) {\n                return;\n            }\n            seen.add(obj);\n            if (typeof obj.numFields !== 'function' || typeof obj.at !== 'function') {\n                return;\n            }\n            const numFields = Number(obj.numFields());\n            for (let index = 0; index < numFields; index++) {\n                visit(obj.at(index));\n            }\n        };\n        visit(root);\n    }\n\n    _buildMetadataEdge(offset, declaredMetadata = null) {\n        const flags = new DataView(this.buffer, offset - this.base, QWORD).getBigUint64(0, true);\n        switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_LAZY_HASHED:\n        case ptlf.outer_LAZY:\n        case ptlf.outer_LAZY_HANDLE:\n        case ptlf.outer_LAZY_DERIVED:\n            return this.build(offset, 'meta', GraphState.Metadata, this.childContext(declaredMetadata));\n        default:\n            return this.buildMetadata(offset, declaredMetadata);\n        }\n    }\n\n    rejectZeroAdifFieldValue(owner, meta, index, name) {\n        const ownerType = typeof owner?.physicalType === 'function'\n            ? owner.physicalType()\n            : owner?.constructor?.name || typeof owner;\n        const metaType = meta && typeof meta.physicalType === 'function'\n            ? meta.physicalType()\n            : String(meta);\n        throw new Error(\n            `Unexpected zero ADIF for field ${index} (${name}) on ${ownerType}; `\n            + `meta=${metaType}. MetadataV2 fields must be explicit by contract.`\n        );\n    }\n\n    // Hydrate the pointerless object at the given offset into the buffer. A\n    // basic sanity check is done that there really is ptrless data starting at\n    // that offset (by looking for the BEACON_BIT), however this is not robust\n    // nor secure. So you should only build with an offset you know is good.\n    // Conventionally, the root of the ptrless object graph will be at offset\n    // zero within the buffer, and the other addresses can be discovered by\n    // ptrless itself as you navigate through the graph.\n    buildChild(owner, rel, name, declaredMeta = null, graphState = GraphState.Payload) {\n        if (rel === 0) {\n            return null;\n        }\n        if (rel === SELF_EDGE_REL) {\n            throw new Error(\n                `ptrless.import: ordinary child self-reference is invalid; `\n                + `owner=${owner._offset} field=${String(name)} role=${graphState}`\n            );\n        }\n        if (!Number.isSafeInteger(rel)) {\n            throw new Error(`ptrless.import: child relative offset is not a safe integer: ${String(rel)}`);\n        }\n        this._checkWireExtent(owner._offset + rel, 32, 1, `child ${String(name)} of ${owner._offset}`);\n        return this.build(\n            owner._offset + rel,\n            name,\n            graphState,\n            this.childContext(declaredMeta),\n        );\n    }\n\n    childContext(declaredMetadata, details = {}) {\n        const parent = this._activeContext ?? this._rootContext;\n        const binders = declaredMetadata === null || declaredMetadata === undefined\n            ? parent.binders\n            : [...parent.binders, declaredMetadata];\n        return new TraversalContext({\n            declaredMetadata: declaredMetadata ?? null,\n            binders,\n            identity: parent.identity,\n            ...details,\n        });\n    }\n\n    declaredFieldMetatype(owner, index) {\n        const tuple = owner instanceof MetadataV1\n            ? g_metadataSchemaCurrent.fieldMetatypes()\n            : typeof owner?._meta?.fieldMetatypes === 'function'\n                ? owner._meta.fieldMetatypes()\n                : null;\n        if (!tuple || typeof tuple.at !== 'function' || index < 0 || index >= tuple.numFields()) {\n            return null;\n        }\n        return tuple.at(index);\n    }\n\n    declaredItemsMetatype(owner) {\n        const meta = owner._meta;\n        if (!meta || typeof meta.itemsMetatype !== 'function') {\n            return null;\n        }\n        return meta.itemsMetatype();\n    }\n\n    declaredAxisMetadata() {\n        return g_importedAxisMetadata;\n    }\n\n    build(offset, name=null, graphState=GraphState.Payload, context=null) {\n        assertGraphState(graphState, 'ptrless.import.build');\n        const rootCall = this._depth === 0;\n        if (rootCall && graphState === GraphState.Payload\n            && this._rootContext.declaredMetadata !== null) {\n            if (context !== null && context?.declaredMetadata !== this._rootContext.declaredMetadata) {\n                throw new Error(`ptrless.import.build: conflicting declared root metadata context`);\n            }\n            context = this._rootContext;\n        }\n        const previousContext = this._activeContext;\n        this._activeContext = context ?? this._rootContext;\n        let enteredPayload = false;\n        this._depth++;\n        try {\n            const hit = this._cacheGet(offset, graphState);\n            if (hit) {\n                if (graphState === GraphState.Payload && this._activePayloadOffsets.has(offset)) {\n                    throw new Error(`ptrless.import: ordinary payload cycle reaches active offset ${offset}`);\n                }\n                this._validateVisit(offset, hit, graphState, context ?? this._rootContext);\n                this._validateObjectDeclaration(\n                    offset,\n                    hit,\n                    hit._meta ?? null,\n                    context?.declaredMetadata ?? null,\n                    graphState,\n                );\n                return hit;\n            }\n\n            if (graphState === GraphState.Payload) {\n                this._activePayloadOffsets.add(offset);\n                enteredPayload = true;\n            }\n            let ret = this._buildUncached(offset, graphState, context);\n            const initialMetaRel = Number(ret._spine.getBigInt64(QWORD, true));\n            if (initialMetaRel === 0 && ret._meta === null) {\n                ret._meta = context?.declaredMetadata\n                    ?? (graphState === GraphState.Metadata ? g_metadataSchemaCurrent : null);\n            }\n            this._validateVisit(offset, ret, graphState, context ?? this._rootContext);\n            // Add to cache here, so by the time we're calling _prepopulate, the cache is already in place.\n            this._cacheSetStrong(offset, ret, graphState);\n\n            const meta = this._metaForObject(ret, offset, graphState, context);\n            this._validateObjectDeclaration(\n                offset,\n                ret,\n                meta,\n                context?.declaredMetadata ?? null,\n                graphState,\n            );\n            ret = this._specializeObject(ret, offset, meta);\n            ret._slot = name;\n            this._cacheSetStrong(offset, ret, graphState);\n            ret._prepopulate(meta);\n\n            if (this._resolveImportedObject !== null\n                && (ret.flags() & ptlf.outer_MASK) === ptlf.outer_LAZY_HASHED) {\n                const resolved = this._resolveImportedObject(ret, offset, graphState);\n                if (!resolved || typeof resolved !== 'object') {\n                    throw new Error(`ptrless.import: resolver returned an invalid object at offset ${offset}`);\n                }\n                if (resolved !== ret) {\n                    this._cacheSetStrong(offset, resolved, graphState);\n                    return resolved;\n                }\n            }\n\n            const diagnosticAdif = Number(ret._spine.getBigInt64(2 * QWORD, true));\n            if (diagnosticAdif !== 0) {\n                ret._diagnostic = this.buildChild(ret, diagnosticAdif, 'diagnostic', g_importedDiagnosticMetadata);\n            }\n            if (rootCall) {\n                this._observeImportedObjects();\n            }\n            return ret;\n        } finally {\n            if (enteredPayload) {\n                this._activePayloadOffsets.delete(offset);\n            }\n            this._depth--;\n            this._activeContext = previousContext;\n            if (rootCall) {\n                this._weakenSettledCache();\n            }\n        }\n    }\n\n    _specializeObject(ret, offset, meta) {\n        if (!(ret instanceof Struct) || ret instanceof MetadataV1 || ret instanceof MetadataTuple) {\n            return ret;\n        }\n        if (isLazyPhysicalType(meta)) {\n            return ret;\n        }\n\n        const physical = this._metaFieldText(meta, 'physical') ?? this._metaFieldText(meta, 'logical');\n        switch (physical) {\n        case 'MetadataV1':\n        case 'MetadataV2':\n            return this._buildMetadataStruct(offset, ret._spine);\n        case 'DiagnosticV1':\n            return new DiagnosticV1(this, offset, ret._spine);\n        case 'DiagnosticV2':\n            return new DiagnosticV2(this, offset, ret._spine);\n        case 'err.SourceLocation':\n            return new SourceLocation(this, offset, ret._spine);\n        default:\n            return ret;\n        }\n    }\n\n    _metaFieldText(meta, name) {\n        if (!meta || isLazyPhysicalType(meta) || typeof meta.field !== 'function') {\n            return null;\n        }\n        const field = meta.field(name);\n        if (!field || typeof field.valid === 'function' && !field.valid()) {\n            return null;\n        }\n        if (typeof field.toText === 'function') {\n            return field.toText();\n        }\n        if (typeof field.toString === 'function') {\n            const text = field.toString();\n            if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n                return text.slice(1, -1);\n            }\n            return text;\n        }\n        return null;\n    }\n\n    _buildUncached(offset, graphState, context = null) {\n        assertGraphState(graphState, 'ptrless.import._buildUncached');\n        this._checkWireExtent(offset, 32, 1, `object head at ${offset}`, 8);\n        // Initially we only assume the first 32 bytes exist (i.e. a scalar), just in case.\n        let spine = new DataView(this.buffer, offset - this.base, 32);\n        const flags = spine.getBigUint64(0 * QWORD, true);\n\n        if ((flags & ptlf.BEACON_BIT) == 0) {\n            let txt = new TextDecoder().decode(this.buffer);\n            throw new Error(`Missing beacon bit: not ptrless data. data=${txt}`);\n        } else if (flags & ptlf.FLAGS_MUST_BE_ZERO) {\n            const badFlags = flags & ptlf.FLAGS_MUST_BE_ZERO;\n            throw new Error(`Erronously set bit(s) flags=${flags.toString(16)} bad_flags=${badFlags.toString(16)}.`);\n        }\n\n        const physical = flags & ptlf.physical_MASK;\n        this._validateRelativeSlot(offset, spine, 1, `object ${offset} metadata`, {\n            allowZero: true,\n            allowSelf: true,\n            minimumBytes: 32,\n        });\n        this._validateRelativeSlot(offset, spine, 2, `object ${offset} diagnostic`, {\n            allowZero: true,\n            minimumBytes: 32,\n        });\n        let fullHeadValidated = false;\n        const fullSpine = () => {\n            if (spine.byteLength < 128) {\n                this._checkWireExtent(offset, 128, 1, `full object head at ${offset}`, 8);\n                spine = new DataView(this.buffer, offset - this.base, 128);\n            }\n            if (!fullHeadValidated) {\n                this._validateFullWireHead(offset, spine, flags, physical);\n                fullHeadValidated = true;\n            }\n            return spine;\n        };\n\n        switch (physical) {\n        case ptlf.physical_BOOL_SCALAR:\n            this._requireZeroSlot(spine, 3, `bool scalar ${offset}`);\n            return new BoolScalar(this, offset, spine);\n        case ptlf.physical_BYTES_SCALAR:\n            this._checkWireExtent(offset, 40, 1, `bytes scalar head at ${offset}`, 8);\n            return new BytesScalar(this, offset, spine);\n        case ptlf.physical_FLOAT_SCALAR32:\n            return new FloatScalar32(this, offset, spine);\n        case ptlf.physical_FLOAT_SCALAR64:\n            return new FloatScalar64(this, offset, spine);\n        case ptlf.physical_INTEGRAL_SCALAR:\n        case ptlf.physical_INTEGRAL_SCALAR8:\n        case ptlf.physical_INTEGRAL_SCALAR16:\n        case ptlf.physical_INTEGRAL_SCALAR32:\n        case ptlf.physical_INTEGRAL_SCALAR64:\n            return new IntegralScalar(this, offset, spine);\n\n        case ptlf.physical_VEC_ARROW:\n            return new VecArrow(this, offset, fullSpine());\n        case ptlf.physical_HOMO_ARROW32:\n            return new HomoArrow32(this, offset, fullSpine());\n        case ptlf.physical_HOMO_ARROW64:\n            return new HomoArrow64(this, offset, fullSpine());\n        case ptlf.physical_BOOL_ARROW:\n            return new BoolArrow(this, offset, fullSpine());\n        case ptlf.physical_INTEGRAL_ARROW8:\n            return new IntegralArrow8(this, offset, fullSpine());\n        case ptlf.physical_INTEGRAL_ARROW16:\n            return new IntegralArrow16(this, offset, fullSpine());\n        case ptlf.physical_INTEGRAL_ARROW32:\n            return new IntegralArrow32(this, offset, fullSpine());\n        case ptlf.physical_INTEGRAL_ARROW64:\n            return new IntegralArrow64(this, offset, fullSpine());\n        case ptlf.physical_INTEGRAL_ARITHMETIC:\n        case ptlf.physical_INTEGRAL_ARITHMETIC8:\n        case ptlf.physical_INTEGRAL_ARITHMETIC16:\n        case ptlf.physical_INTEGRAL_ARITHMETIC32:\n        case ptlf.physical_INTEGRAL_ARITHMETIC64:\n            return new IntegralArithmetic(this, offset, fullSpine());\n        case ptlf.physical_FLOAT_ARROW32:\n            return new FloatArrow32(this, offset, fullSpine());\n        case ptlf.physical_FLOAT_ARROW64:\n            return new FloatArrow64(this, offset, fullSpine());\n        case ptlf.physical_FLOAT_ARITHMETIC32:\n            return new FloatArithmetic32(this, offset, fullSpine());\n        case ptlf.physical_FLOAT_ARITHMETIC64:\n            return new FloatArithmetic64(this, offset, fullSpine());\n        case ptlf.physical_BYTES_ARROW32:\n            return new BytesArrow32(this, offset, fullSpine());\n        case ptlf.physical_BYTES_ARROW64:\n            return new BytesArrow64(this, offset, fullSpine());\n        default:\n            if ((flags & (ptlf.inner_MASK | ptlf.bitwidth_MASK)) === (ptlf.inner_UNTYPED | ptlf.bitwidth_UNTYPED_NULL)) {\n                return new Untyped(this, offset, spine);\n            }\n\n            switch (flags & ptlf.outer_MASK) {\n            case ptlf.outer_LAZY_HASHED:\n            case ptlf.outer_LAZY:\n                return new LazyHash(this, offset, fullSpine());\n            case ptlf.outer_LAZY_HANDLE:\n                return new LazyHandle(this, offset, fullSpine());\n            case ptlf.outer_LAZY_DERIVED:\n                return new LazyDerived(this, offset, fullSpine());\n            case ptlf.outer_CHUNKED:\n                return new Chunked(this, offset, fullSpine());\n            case ptlf.outer_LOGICAL_AXIS_VEC:\n            case ptlf.outer_LOGICAL_AXIS_LIST:\n            case ptlf.outer_LOGICAL_AXIS_SET:\n            case ptlf.outer_LOGICAL_AXIS_BAG:\n                return new LogicalAxis(this, offset, fullSpine());\n            case ptlf.outer_STRUCT:\n            case ptlf.outer_TUPLE:\n            case ptlf.outer_NAMED_TUPLE:\n                return this._buildHeteroUncached(offset, fullSpine(), graphState, context);\n            }\n\n            throw new Error(`Unsupported physical flags: ${ptlf.decodeFlags(flags)}.`);\n        }\n    }\n\n    _buildHeteroUncached(offset, spine, graphState, context = null) {\n        assertGraphState(graphState, 'ptrless.import._buildHeteroUncached');\n        // The incoming traversal role selects the metadata wrapper. Physical\n        // field count is data, never a metadata classifier.\n        const outer = spine.getBigUint64(0, true) & ptlf.outer_MASK;\n        const metadata = graphState === GraphState.Metadata;\n        if (outer === ptlf.outer_TUPLE || outer === ptlf.outer_NAMED_TUPLE) {\n            return metadata\n                ? this._buildMetadataTuple(offset, spine)\n                : this._buildPayloadTuple(offset, spine);\n        }\n        return metadata\n            ? this._buildMetadataStruct(offset, spine, context)\n            : this._buildPayloadStruct(offset, spine);\n    }\n\n    _buildPayloadStruct(offset, spine) {\n        return new Struct(this, offset, spine);\n    }\n\n    _buildMetadataStruct(offset, spine, context = null) {\n        const numFields = Number(spine.getBigInt64(5 * QWORD, true));\n        if (numFields !== METADATA_V2_FIELD_NAMES.length) {\n            throw new Error(\n                `ptrless metadata import: current MetadataV2 has ${numFields} fields, `\n                + `want generated layout ${METADATA_V2_FIELD_NAMES.length}`\n            );\n        }\n        return new MetadataV2(this, offset, spine);\n    }\n\n    _buildPayloadTuple(offset, spine) {\n        return new Struct(this, offset, spine);\n    }\n\n    _buildMetadataTuple(offset, spine) {\n        return new MetadataTuple(this, offset, spine);\n    }\n\n    // Call this to receive a MetadataV1 strongly-typed JS object.\n    buildMetadata(offset, declaredMetadata = null) {\n        this._metaDepth++;\n        this._pushMetadataFrame('Metadata', offset);\n        try {\n            const hit = this._cacheGet(offset, GraphState.Metadata);\n            if (hit) {\n                if (!(hit instanceof MetadataV1)) {\n                    throw new Error(`metadata offset ${offset} was already cached as ${hit.constructor?.name || typeof hit}`);\n                }\n                this._validateVisit(\n                    offset,\n                    hit,\n                    GraphState.Metadata,\n                    this.childContext(declaredMetadata),\n                );\n                return hit;\n            }\n\n            const spine = new DataView(this.buffer, offset - this.base, 128);\n            const numFields = Number(spine.getBigInt64(5 * QWORD, true));\n            if (numFields !== METADATA_V2_FIELD_NAMES.length) {\n                throw new Error(\n                    `ptrless metadata import: current MetadataV2 has ${numFields} fields, `\n                    + `want generated layout ${METADATA_V2_FIELD_NAMES.length}`\n                );\n            }\n            const ret = new MetadataV2(this, offset, spine);\n            if (Number(spine.getBigInt64(QWORD, true)) === 0) {\n                ret._meta = g_metadataSchemaCurrent;\n            }\n            this._validateVisit(\n                offset,\n                ret,\n                GraphState.Metadata,\n                this.childContext(declaredMetadata),\n            );\n            this._cacheSetStrong(offset, ret, GraphState.Metadata);\n\n            const meta = this._metaForObject(ret, offset, GraphState.Metadata);\n            ret._prepopulate(meta);\n\n            return ret;\n        } finally {\n            this._popMetadataFrame('Metadata', offset);\n            this._metaDepth--;\n        }\n    }\n\n    buildMetadataTuple(offset) {\n        this._pushMetadataFrame('MetadataTuple', offset);\n        try {\n        const hit = this._cacheGet(offset, GraphState.Metadata);\n        if (hit) {\n            if (!(hit instanceof MetadataTuple)) {\n                throw new Error(`metadata tuple offset ${offset} was already cached as ${hit.constructor?.name || typeof hit}`);\n            }\n            return hit;\n        }\n\n        const spine = new DataView(this.buffer, offset - this.base, 128);\n        const ret = new MetadataTuple(this, offset, spine);\n        this._cacheSetStrong(offset, ret, GraphState.Metadata);\n        ret._prepopulate(null);\n        return ret;\n        } finally {\n            this._popMetadataFrame('MetadataTuple', offset);\n        }\n    }\n\n    dataView(offset, bytes) {\n        return this._wireView(offset, bytes, 1, 'DataView', 1,\n            () => new DataView(this.buffer, offset - this.base, bytes));\n    }\n\n    int8Array(offset, bytes) {\n        return this._wireView(offset, bytes, 1, 'Int8Array', 1,\n            () => new Int8Array(this.buffer, offset - this.base, bytes));\n    }\n\n    int16Array(offset, length) {\n        return this._wireView(offset, length, 2, 'Int16Array', 2,\n            () => new Int16Array(this.buffer, offset - this.base, length));\n    }\n\n    int32Array(offset, length) {\n        return this._wireView(offset, length, 4, 'Int32Array', 4,\n            () => new Int32Array(this.buffer, offset - this.base, length));\n    }\n\n    bigInt64Array(offset, length) {\n        return this._wireView(offset, length, 8, 'BigInt64Array', 8,\n            () => new BigInt64Array(this.buffer, offset - this.base, length));\n    }\n\n    uint8Array(offset, bytes) {\n        return this._wireView(offset, bytes, 1, 'Uint8Array', 1,\n            () => new Uint8Array(this.buffer, offset - this.base, bytes));\n    }\n\n    uint16Array(offset, length) {\n        return this._wireView(offset, length, 2, 'Uint16Array', 2,\n            () => new Uint16Array(this.buffer, offset - this.base, length));\n    }\n\n    uint32Array(offset, length) {\n        return this._wireView(offset, length, 4, 'Uint32Array', 4,\n            () => new Uint32Array(this.buffer, offset - this.base, length));\n    }\n\n    bigUInt64Array(offset, length) {\n        return this._wireView(offset, length, 8, 'BigUint64Array', 8,\n            () => new BigUint64Array(this.buffer, offset - this.base, length));\n    }\n\n    float32Array(offset, length) {\n        return this._wireView(offset, length, 4, 'Float32Array', 4,\n            () => new Float32Array(this.buffer, offset - this.base, length));\n    }\n\n    float64Array(offset, length) {\n        return this._wireView(offset, length, 8, 'Float64Array', 8,\n            () => new Float64Array(this.buffer, offset - this.base, length));\n    }\n\n    /* Collect one exact live-builder summary in raw map form so higher-level views can aggregate without truncation. */\n    _testingMemorySummaryRaw(root = null) {\n        const wrappers = [];\n        let strongEntryCount = 0;\n        let weakLiveEntryCount = 0;\n        let weakDeadEntryCount = 0;\n\n        for (const entry of this._cache.values()) {\n            if (!entry) {\n                continue;\n            }\n            if (typeof WeakRef === 'function' && entry instanceof WeakRef) {\n                const value = entry.deref();\n                if (value) {\n                    weakLiveEntryCount += 1;\n                    wrappers.push(value);\n                } else {\n                    weakDeadEntryCount += 1;\n                }\n                continue;\n            }\n            strongEntryCount += 1;\n            wrappers.push(entry);\n        }\n\n        const seenViews = new Set();\n        const seenArrays = new Set();\n        const seenMaps = new Set();\n        const seenSets = new Set();\n        const seenWeakRefs = new Set();\n        const wrapperCtorCounts = new Map();\n        const wrapperPhysicalCounts = new Map();\n        const shellTotals = {\n            buffer_view_count: 0,\n            buffer_view_bytes: 0,\n            array_count: 0,\n            array_slots: 0,\n            map_count: 0,\n            map_entries: 0,\n            set_count: 0,\n            set_entries: 0,\n            weakref_count: 0,\n            view_ctor_counts: new Map(),\n            view_prop_metrics: new Map(),\n            array_prop_metrics: new Map(),\n            map_prop_metrics: new Map(),\n            set_prop_metrics: new Map(),\n            weakref_prop_counts: new Map(),\n        };\n\n        for (const wrapper of wrappers) {\n            const ctor = wrapper?.constructor?.name ?? typeof wrapper;\n            wrapperCtorCounts.set(ctor, (wrapperCtorCounts.get(ctor) ?? 0) + 1);\n            let physicalType = null;\n            try {\n                physicalType = typeof wrapper?.physicalType === 'function' ? wrapper.physicalType() : null;\n            } catch (_err) {\n            }\n            if (physicalType) {\n                wrapperPhysicalCounts.set(physicalType, (wrapperPhysicalCounts.get(physicalType) ?? 0) + 1);\n            }\n            addShellSummary(shellTotals, summariseWrapperShells(wrapper, seenViews, seenArrays, seenMaps, seenSets, seenWeakRefs));\n        }\n\n        return {\n            builder_id: this._testingBuilderID,\n            base: this.base,\n            raw_bytes: this.buffer?.byteLength ?? 0,\n            root: summarizeRootObject(root),\n            cache: {\n                entry_count: this._cache.size,\n                strong_entry_count: strongEntryCount,\n                weak_live_entry_count: weakLiveEntryCount,\n                weak_dead_entry_count: weakDeadEntryCount,\n            },\n            wrappers: {\n                live_count: wrappers.length,\n                by_constructor: wrapperCtorCounts,\n                by_physical_type: wrapperPhysicalCounts,\n            },\n            js_shells: shellTotals,\n        };\n    }\n\n    /* Summarise one live builder so leak triage can compare raw wire bytes against JS wrapper/view shells. */\n    testingMemorySummary(root = null) {\n        return finalizeBuilderMemorySummary(this._testingMemorySummaryRaw(root));\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Builder } from './builder.mjs';\n\n\nexport const FILE_ROOT_OFFSET = 64;\nconst FILE_MAGIC = Uint8Array.of(0x70, 0x74, 0x6c, 0x00, 0xFF, 0x8A, 0x4C, 0xB7);\nconst OLD_FILE_MAGIC = Uint8Array.of(0x70, 0x74, 0x6c, 0x01);\nconst FILE_FORMAT_REVISION_V2 = 2n;\n\n\nfunction pushTestingPortalTrace(event, fields = {}) {\n    try {\n        globalThis.__testingPortalWSTracePush?.(event, fields);\n    } catch (_err) {\n    }\n}\n\nfunction roundMS(ms) {\n    return Math.round(ms * 1000) / 1000;\n}\n\n\n/**\n    :param buffer ArrayBuffer: a raw ptrless object buffer.\n    :param offset Number: offset into buffer where the object to import starts.\n    :param base Number: TBC.\n*/\nfunction importBytes(buffer, offset=0, base=0, options={}) {\n    const started = performance.now();\n    pushTestingPortalTrace('ptrless_import_bytes_start', {\n        offset,\n        base,\n        bytes: buffer?.byteLength ?? null,\n    });\n    let builder = new Builder(buffer, base, options);\n    const buildStarted = performance.now();\n    builder.bootstrap(offset);\n    const obj = builder.build(offset);\n    const buildMS = roundMS(performance.now() - buildStarted);\n    pushTestingPortalTrace('ptrless_import_bytes_build_done', {\n        offset,\n        base,\n        bytes: buffer?.byteLength ?? null,\n        duration_ms: buildMS,\n        object_type: obj?.constructor?.name ?? typeof obj,\n        logical_type: typeof obj?.logicalType === 'function' ? obj.logicalType() : null,\n        physical_type: typeof obj?.physicalType === 'function' ? obj.physicalType() : null,\n    });\n    pushTestingPortalTrace('ptrless_import_bytes_done', {\n        offset,\n        base,\n        bytes: buffer?.byteLength ?? null,\n        duration_ms: roundMS(performance.now() - started),\n        build_duration_ms: buildMS,\n        object_type: obj?.constructor?.name ?? typeof obj,\n        logical_type: typeof obj?.logicalType === 'function' ? obj.logicalType() : null,\n        physical_type: typeof obj?.physicalType === 'function' ? obj.physicalType() : null,\n    });\n    return obj;\n}\n\nexport function importFile(buffer, rootOffset=undefined, base=0, options={}) {\n    const bytes = new Uint8Array(buffer);\n    const started = performance.now();\n    pushTestingPortalTrace('ptrless_import_file_start', {\n        root_offset: rootOffset ?? null,\n        base,\n        bytes: bytes.byteLength,\n    });\n    if (bytes.byteLength < FILE_ROOT_OFFSET) {\n        throw new Error(`ptrless.importFile: file too short: ${bytes.byteLength} bytes`);\n    }\n    for (let i = 0; i < OLD_FILE_MAGIC.length; i++) {\n        if (bytes[i] !== OLD_FILE_MAGIC[i]) {\n            break;\n        }\n        if (i === OLD_FILE_MAGIC.length - 1) {\n            throw new Error(`ptrless.importFile: deprecated V1 ptrless header is not supported`);\n        }\n    }\n    for (let i = 0; i < FILE_MAGIC.length; i++) {\n        if (bytes[i] !== FILE_MAGIC[i]) {\n            throw new Error(`ptrless.importFile: missing ptrless file magic`);\n        }\n    }\n    if (rootOffset === undefined || rootOffset === null) {\n        const view = new DataView(buffer);\n        const rootOffsetBig = view.getBigInt64(8, true);\n        if (rootOffsetBig > BigInt(Number.MAX_SAFE_INTEGER)) {\n            throw new Error(`ptrless.importFile: root offset ${rootOffsetBig} exceeds JavaScript's safe integer range`);\n        }\n        rootOffset = Number(rootOffsetBig);\n    }\n    const header = new DataView(buffer);\n    const reserved = header.getBigInt64(16, true);\n    const revision = header.getBigInt64(24, true);\n    const features = header.getBigUint64(32, true);\n    if (reserved !== 0n) {\n        throw new Error(`ptrless.importFile: reserved header field is nonzero: ${reserved}`);\n    }\n    if (revision !== FILE_FORMAT_REVISION_V2) {\n        throw new Error(`ptrless.importFile: unsupported format revision ${revision}`);\n    }\n    if (features !== 0n) {\n        throw new Error(`ptrless.importFile: unsupported feature bits 0x${features.toString(16)}`);\n    }\n    if (!Number.isSafeInteger(rootOffset)\n        || rootOffset < FILE_ROOT_OFFSET\n        || rootOffset > bytes.byteLength - 32) {\n        throw new Error(`ptrless.importFile: root offset ${rootOffset} is invalid`);\n    }\n    pushTestingPortalTrace('ptrless_import_file_header_done', {\n        root_offset: rootOffset,\n        base,\n        bytes: bytes.byteLength,\n        duration_ms: roundMS(performance.now() - started),\n    });\n    const obj = importBytes(buffer, rootOffset, base, options);\n    pushTestingPortalTrace('ptrless_import_file_done', {\n        root_offset: rootOffset,\n        base,\n        bytes: bytes.byteLength,\n        duration_ms: roundMS(performance.now() - started),\n        object_type: obj?.constructor?.name ?? typeof obj,\n        logical_type: typeof obj?.logicalType === 'function' ? obj.logicalType() : null,\n        physical_type: typeof obj?.physicalType === 'function' ? obj.physicalType() : null,\n    });\n    return obj;\n}\n\nexport { importBytes as import };\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// DO NOT EDIT -- changes are made through ptrless/common/constants.csv\n\n\n/**\n    Size of object hash values in bytes. We use 32 bytes * 8 bits = 256 bit\n    hashes, specifically SHA256.\n*/\nexport const HASH_SIZE = 0x20n;\n/**\n    Alignment of array data, set for compatibility with AVX512 i.e. 64 byte\n    alignment.\n*/\nexport const ARRAY_ALIGN = 0x40n;\n/**\n    Alignment of header data, set to 16 bytes. This is used for `ptl_Obj *`\n    objects themselves.\n*/\nexport const HEAD_ALIGN = 0x10n;\n/** Maximum length of a single array is 2^47 = approx 140 trillion. */\nexport const MAX_LENGTH = 0x800000000000n;\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.gen.mjs';\nimport { hashIdentityBytesSync, sha256BytesSync } from './hash.mjs';\nimport { ARRAY_ALIGN, HASH_SIZE, HEAD_ALIGN } from './ptrless.gen.mjs';\nimport {\n    GraphState,\n    assertGraphState,\n    canonicalClosedFrontierHashBytes,\n} from './serialization-state.mjs';\nimport {\n    METADATA_V1_FIELD_NAMES,\n    METADATA_V2_FIELD_NAMES,\n    METADATA_V1_FLAGS_INDEX,\n    METADATA_V1_OBJECT_NULLABLE_INDEX,\n    METADATA_V1_FIXED_INDEX,\n    METADATA_V1_LOGICAL_INDEX,\n    METADATA_V1_PHYSICAL_INDEX,\n    METADATA_V1_LOGICAL_BITWIDTH_INDEX,\n    METADATA_V1_PHYSICAL_BITWIDTH_INDEX,\n    METADATA_V1_FIELD_NAMES_INDEX,\n    METADATA_V1_FIELD_METATYPES_INDEX,\n    METADATA_V1_ITEMS_METATYPE_INDEX,\n    METADATA_V1_KEY_METATYPE_INDEX,\n    METADATA_V1_VALUE_METATYPE_INDEX,\n    METADATA_V1_BASES_INDEX,\n    METADATA_V1_SUBTYPE_INDEX,\n    METADATA_V1_AXIS_NAME_INDEX,\n    METADATA_V1_SORTED_INDEX,\n    METADATA_V1_UNIQUE_INDEX,\n    METADATA_V1_UNIT_INDEX,\n    METADATA_V1_BASIS_INDEX,\n    METADATA_V2_OWNER_INDEX,\n    METADATA_V2_READ_GROUPS_INDEX,\n    METADATA_V2_WRITE_GROUPS_INDEX,\n    METADATA_V2_ADMIN_FLAGS_INDEX,\n    METADATA_V2_CREATED_INDEX,\n    METADATA_V2_MODIFIED_INDEX,\n    METADATA_V2_DESCRIPTION_INDEX,\n    METADATA_V2_TITLE_INDEX,\n    METADATA_V2_ICON_INDEX,\n    METADATA_V2_DISPLAY_WIDTH_INDEX,\n    METADATA_V2_DISPLAY_HEIGHT_INDEX,\n    METADATA_V2_ABSTRACT_INDEX,\n    METADATA_V2_LEGAL_RIGHTS_INDEX,\n    METADATA_V2_COPYRIGHT_NOTICE_INDEX,\n    METADATA_V2_ATTRIBUTION_INDEX,\n    METADATA_V2_PII_INDEX,\n    METADATA_V2_CLASSIFICATION_INDEX,\n    METADATA_V2_SOURCE_URI_INDEX,\n    METADATA_V2_SOURCE_KIND_INDEX,\n    METADATA_V2_CONTENT_TYPE_INDEX,\n    METADATA_V2_ENCODING_INDEX,\n    METADATA_V2_LANGUAGE_INDEX,\n    METADATA_V2_TAGS_INDEX,\n    METADATA_V2_SOURCE_LINEAGE_INDEX,\n    METADATA_V2_ARTIFACT_LINEAGE_INDEX,\n    METADATA_V2_RETENTION_CLASS_INDEX,\n    METADATA_V2_PUBLIC_INDEX,\n} from './concrete/MetadataFields.mjs';\nimport { MetadataSchemaCurrentPayloadHashBytes } from './concrete/metadata_schema_current.gen.mjs';\n\n\nconst FILE_MAGIC = Uint8Array.of(0x70, 0x74, 0x6c, 0x00, 0xFF, 0x8A, 0x4C, 0xB7);\nconst HASH_BYTES = Number(HASH_SIZE);\nconst ROOT_POS = 64;\nconst SELF_EDGE_REL = 1;\nconst FILE_FORMAT_REVISION_V2 = 2n;\nconst FILE_FEATURE_BITS_NONE = 0n;\nconst HEAD_ALIGN_BYTES = Number(HEAD_ALIGN);\nconst ARRAY_ALIGN_BYTES = Number(ARRAY_ALIGN);\n\nconst scalarHeadSize = 32;\nconst bytesScalarHeadSize = 80;\nconst arrayHeadSize = 128;\nconst heteroBaseHeadSize = 128;\n\nconst textEncoder = new TextEncoder();\nlet g_metadataMeta = null;\nlet g_listStrMeta = null;\nlet g_plainListStrMeta = null;\nlet g_listStr64Meta = null;\nlet g_plainListStr64Meta = null;\nlet g_tupleMeta = null;\nlet g_nullableTupleMeta = null;\nlet g_metadataTupleMeta = null;\nlet g_nullTuple = null;\nlet g_nullMetadata = null;\nlet g_anyMetadata = null;\nlet g_recursiveFrontierMetadata = null;\nconst g_basicMetaCache = new Map();\nconst g_scalarIntMeta = new Map();\nconst g_nullableIntMeta = new Map();\nlet g_nullableBoolMeta = null;\nlet g_nullableStrLeafMeta = null;\nconst g_listIntMeta = new Map();\nconst g_scalarFloatMeta = new Map();\nconst g_listFloatMeta = new Map();\nconst g_scalarLeafMeta = new Map();\nconst g_structMetaCache = new Map();\nconst g_structMetaIDs = new WeakMap();\nlet g_nextStructMetaID = 1;\n\n\nexport function newBool(value) {\n    return {\n        kind: 'BoolScalar',\n        flags: ptlf.BEACON_BIT | ptlf.outer_SCALAR | ptlf.inner_BOOL | (value ? ptlf.SCALAR_VALID | ptlf.SCALAR_BOOL : ptlf.SCALAR_VALID),\n        value: !!value,\n        meta: null,\n    };\n}\n\nexport function newInt(value) {\n    return newSignedIntScalar('newInt', value, 64);\n}\n\nexport function newInt8(value) {\n    return newSignedIntScalar('newInt8', value, 8);\n}\n\nexport function newInt16(value) {\n    return newSignedIntScalar('newInt16', value, 16);\n}\n\nexport function newInt32(value) {\n    return newSignedIntScalar('newInt32', value, 32);\n}\n\nexport function newStr(value) {\n    if (typeof value !== 'string') {\n        throw new Error(`ptrless.export.newStr: value must be a string`);\n    }\n    return {\n        kind: 'BytesScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_STR,\n        value: textEncoder.encode(value),\n        meta: null,\n    };\n}\n\nexport function newNullableStr(value) {\n    if (value === null) return zeroStr(nullableStrMetadata());\n    if (typeof value !== 'string') throw new Error('ptrless.export.newNullableStr: value must be a string or null');\n    return validStr(nullableStrMetadata(), value);\n}\n\nexport function newInt64Array(values, axisName = null) {\n    return newSignedIntArray('newInt64Array', values, 64, axisName);\n}\n\nexport function newInt8Array(values, axisName = null) {\n    return newSignedIntArray('newInt8Array', values, 8, axisName);\n}\n\nexport function newInt16Array(values, axisName = null) {\n    return newSignedIntArray('newInt16Array', values, 16, axisName);\n}\n\nexport function newInt32Array(values, axisName = null) {\n    return newSignedIntArray('newInt32Array', values, 32, axisName);\n}\n\nexport function newStrArray(values, axisName = undefined) {\n    if (!Array.isArray(values)) {\n        throw new Error(`ptrless.export.newStrArray: values must be an array`);\n    }\n    for (let i = 0; i < values.length; i++) {\n        if (values[i] !== null && typeof values[i] !== 'string') {\n            throw new Error(`ptrless.export.newStrArray: values[${i}] must be a string or null`);\n        }\n    }\n    const nullable = values.some(value => value === null);\n    const effectiveAxis = axisName === undefined ? null : axisName;\n    return strList(\n        nullable ? listStrMetadata(effectiveAxis) : listPlainStrMetadata(effectiveAxis),\n        values,\n        true,\n        nullable,\n        effectiveAxis,\n    );\n}\n\nexport function newStrArray64(values, axisName = undefined) {\n    if (!Array.isArray(values)) {\n        throw new Error(`ptrless.export.newStrArray64: values must be an array`);\n    }\n    for (let i = 0; i < values.length; i++) {\n        if (values[i] !== null && typeof values[i] !== 'string') {\n            throw new Error(`ptrless.export.newStrArray64: values[${i}] must be a string or null`);\n        }\n    }\n    const nullable = values.some(value => value === null);\n    const effectiveAxis = axisName === undefined ? null : axisName;\n    return strList64(\n        nullable ? listStr64Metadata(effectiveAxis) : listPlainStr64Metadata(effectiveAxis),\n        values,\n        true,\n        nullable,\n        effectiveAxis,\n    );\n}\n\nexport function newFloat32(value) {\n    return newFloatScalar('newFloat32', value, 32);\n}\n\nexport function newFloat64(value) {\n    return newFloatScalar('newFloat64', value, 64);\n}\n\nexport function newFloat32Array(values) {\n    return newFloatArray('newFloat32Array', values, 32, null);\n}\n\nexport function newFloat64Array(values) {\n    return newFloatArray('newFloat64Array', values, 64, null);\n}\n\nexport function newBin(value) {\n    const bytes = toUint8Array(value, 'ptrless.export.newBin');\n    return {\n        kind: 'BytesScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_BIN,\n        value: bytes,\n        meta: null,\n    };\n}\n\nexport function newNullableBin(value) {\n    if (value === null) {\n        return {\n            kind: 'BytesScalar',\n            flags: ptlf.BEACON_BIT | ptlf.outer_SCALAR | ptlf.inner_BIN | ptlf.inner_NULLABLE,\n            value: new Uint8Array(0),\n            meta: null,\n        };\n    }\n    const obj = newBin(value);\n    obj.flags |= ptlf.inner_NULLABLE;\n    obj.meta = basicMetadata(ptlf.outer_SCALAR | ptlf.inner_BIN | ptlf.inner_NULLABLE, 'Bin', 'BytesScalar');\n    return obj;\n}\n\nexport function newNullableInt(value, bits = 64) {\n    if (value === null) {\n        return {\n            kind: 'IntScalar',\n            flags: ptlf.BEACON_BIT | ptlf.outer_SCALAR | ptlf.inner_INT | ptlf.inner_NULLABLE | bitwidthForBits(bits),\n            value: 0n,\n            meta: scalarIntMetadata(bits, true),\n        };\n    }\n    requireSignedInt('newNullableInt', value, bits);\n    return {\n        kind: 'IntScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_INT | ptlf.inner_NULLABLE | bitwidthForBits(bits),\n        value: BigInt(value),\n        meta: scalarIntMetadata(bits, true),\n    };\n}\n\nexport function newNullableBool(value) {\n    if (value === null) return zeroBool(nullableBoolMetadata());\n    if (typeof value !== 'boolean') throw new Error('ptrless.export.newNullableBool: value must be a boolean or null');\n    return validBool(nullableBoolMetadata(), value);\n}\n\nexport function newUntypedNull() {\n    return {\n        kind: 'UntypedScalar',\n        flags: ptlf.BEACON_BIT | ptlf.outer_SCALAR | ptlf.inner_UNTYPED | ptlf.bitwidth_UNTYPED_NULL,\n        value: null,\n        meta: null,\n    };\n}\n\nexport function newStruct(fields) {\n    return newNominalStruct(fields, null, 'newStruct');\n}\n\nexport function newNominalStruct(fields, physicalName, errorName = 'newNominalStruct') {\n    if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n        throw new Error(`ptrless.export.${errorName}: fields must be an object`);\n    }\n    const names = Object.keys(fields);\n    const values = names.map((name) => {\n        const value = fields[name];\n        if (!value || typeof value !== 'object') {\n            throw new Error(`ptrless.export.${errorName}: field '${name}' must be a ptrless object`);\n        }\n        return value;\n    });\n    const obj = {\n        kind: 'Hetero',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT,\n        fields: values,\n        length: 1,\n        numNulls: 0,\n        validity: null,\n        meta: null,\n    };\n    obj.meta = structMetadata(names, values.map((value) => ensureMeta(value)), physicalName);\n    return obj;\n}\n\n// exportFile writes one canonical ptrless file. `onObjectWritten` observes\n// only physical definitions emitted by this successful operation.\nexport async function exportFile(root, { onObjectWritten = null } = {}) {\n    if (onObjectWritten !== null && typeof onObjectWritten !== 'function') {\n        throw new TypeError('ptrless.exportFile: onObjectWritten must be a function or null');\n    }\n    const planned = await planExport(root, true);\n    if (onObjectWritten !== null) {\n        for (const obj of planned.writtenObjects) {\n            await onObjectWritten(obj);\n        }\n    }\n    return planned.buffer;\n}\n\n// deepPlanObjectOccurrences runs the canonical layout planner without writing\n// a file. Its WeakMap is operation-local and keyed only by physical object.\nexport async function deepPlanObjectOccurrences(root) {\n    const state = await planExport(root, true, { write: false });\n    return state.occurrences;\n}\n\nfunction newSignedIntScalar(name, value, bits) {\n    requireSignedInt(name, value, bits);\n    return {\n        kind: 'IntScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_INT | bitwidthForBits(bits),\n        value: BigInt(value),\n        meta: scalarIntMetadata(bits, false),\n    };\n}\n\nfunction newSignedIntArray(name, values, bits, axisName) {\n    if (!Array.isArray(values)) {\n        throw new Error(`ptrless.export.${name}: values must be an array`);\n    }\n    const out = makeSignedIntTypedArray(bits, values.length);\n    const validity = new Uint8Array(bitmapBytes(values.length));\n    let numNulls = 0;\n    for (let i = 0; i < values.length; i++) {\n        if (values[i] === null) {\n            numNulls++;\n            continue;\n        }\n        out[i] = castSignedInt(name, values[i], bits, i);\n        validity[Math.trunc(i / 8)] |= 1 << (i % 8);\n    }\n    const nullable = numNulls > 0;\n    return withAxis({\n        kind: `IntegralArrow${bits}`,\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_ARRAY_LIST | ptlf.inner_INT | bitwidthForBits(bits)\n            | (nullable ? ptlf.inner_NULLABLE : 0n),\n        values: out,\n        length: BigInt(values.length),\n        numNulls: BigInt(numNulls),\n        validity: nullable ? validity : null,\n        meta: listIntMetadata(bits, nullable, axisName),\n    }, axisName);\n}\n\nfunction newFloatScalar(name, value, bits) {\n    requireFloat(name, value);\n    return {\n        kind: `FloatScalar${bits}`,\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_SCALAR | ptlf.inner_FLOATNN | bitwidthForBits(bits),\n        value,\n        meta: scalarFloatMetadata(bits, false),\n    };\n}\n\nfunction newFloatArray(name, values, bits, axisName) {\n    if (!Array.isArray(values)) {\n        throw new Error(`ptrless.export.${name}: values must be an array`);\n    }\n    const out = bits === 32 ? new Float32Array(values.length) : new Float64Array(values.length);\n    const validity = new Uint8Array(bitmapBytes(values.length));\n    let numNulls = 0;\n    for (let i = 0; i < values.length; i++) {\n        if (values[i] === null) {\n            numNulls++;\n            continue;\n        }\n        requireFloat(`${name}: values[${i}]`, values[i]);\n        out[i] = values[i];\n        validity[Math.trunc(i / 8)] |= 1 << (i % 8);\n    }\n    const nullable = numNulls > 0;\n    return withAxis({\n        kind: `FloatArrow${bits}`,\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_ARRAY_LIST | ptlf.inner_FLOATNN | bitwidthForBits(bits)\n            | (nullable ? ptlf.inner_NULLABLE : 0n),\n        values: out,\n        length: BigInt(values.length),\n        numNulls: BigInt(numNulls),\n        validity: nullable ? validity : null,\n        meta: listFloatMetadata(bits, nullable),\n    }, axisName);\n}\n\nfunction axisGuid(length) {\n    const bytes = new Uint8Array(9);\n    bytes[0] = 1;\n    new DataView(bytes.buffer).setBigInt64(1, BigInt(length), true);\n    return sha256BytesSync(bytes);\n}\n\nfunction newAxis(length, name) {\n    if (!Number.isSafeInteger(length) || length < 0) {\n        throw new Error(`ptrless.export.newAxis: invalid axis length ${length}`);\n    }\n    if (name !== null && (typeof name !== 'string' || !name.startsWith(':'))) {\n        throw new Error(`ptrless.export.newAxis: axis name must be null or start with ':'`);\n    }\n    return {\n        kind: 'Axis',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT,\n        fields: [newInt(length), newNullableStr(name), newBin(axisGuid(length))],\n        length: 1,\n        numNulls: 0,\n        validity: null,\n        // Axis metadata is supplied by the incoming iaxis declaration. Keeping\n        // it omitted here is the canonical declared-context wire form.\n        meta: null,\n    };\n}\n\nfunction withAxis(obj, axisName) {\n    obj.iaxis = newAxis(Number(obj.length), axisName ?? null);\n    return obj;\n}\n\nfunction makeSignedIntTypedArray(bits, length) {\n    switch (bits) {\n    case 8:\n        return new Int8Array(length);\n    case 16:\n        return new Int16Array(length);\n    case 32:\n        return new Int32Array(length);\n    case 64:\n        return new BigInt64Array(length);\n    default:\n        throw new Error(`ptrless.export: unsupported signed integer bitwidth ${bits}`);\n    }\n}\n\nfunction requireSignedInt(name, value, bits) {\n    if (!Number.isInteger(value)) {\n        throw new Error(`ptrless.export.${name}: value must be an integer`);\n    }\n    if (bits < 64) {\n        const min = -(2 ** (bits - 1));\n        const max = (2 ** (bits - 1)) - 1;\n        if (value < min || value > max) {\n            throw new Error(`ptrless.export.${name}: value ${value} is out of int${bits} range`);\n        }\n    }\n}\n\nfunction castSignedInt(name, value, bits, i) {\n    if (!Number.isInteger(value)) {\n        throw new Error(`ptrless.export.${name}: values[${i}] must be an integer`);\n    }\n    if (bits < 64) {\n        const min = -(2 ** (bits - 1));\n        const max = (2 ** (bits - 1)) - 1;\n        if (value < min || value > max) {\n            throw new Error(`ptrless.export.${name}: values[${i}] = ${value} is out of int${bits} range`);\n        }\n        return value;\n    }\n    return BigInt(value);\n}\n\nfunction requireFloat(name, value) {\n    if (typeof value !== 'number') {\n        throw new Error(`ptrless.export.${name}: value must be a number`);\n    }\n}\n\nfunction zeroStr(meta) {\n    return {\n        kind: 'BytesScalar',\n        flags: ptlf.BEACON_BIT | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_STR | ptlf.inner_NULLABLE),\n        value: new Uint8Array(0),\n        meta,\n    };\n}\n\nfunction validStr(meta, text) {\n    return {\n        kind: 'BytesScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_STR),\n        value: textEncoder.encode(text),\n        meta,\n    };\n}\n\nfunction zeroInt(meta) {\n    return {\n        kind: 'IntScalar',\n        flags: ptlf.BEACON_BIT | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_INT | ptlf.inner_NULLABLE),\n        value: 0n,\n        meta,\n    };\n}\n\nfunction validInt(meta, value) {\n    return {\n        kind: 'IntScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_INT),\n        value: BigInt(value),\n        meta,\n    };\n}\n\nfunction validBool(meta, value) {\n    return {\n        kind: 'BoolScalar',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_BOOL)\n            | (value ? ptlf.SCALAR_BOOL : 0n),\n        value: !!value,\n        meta,\n    };\n}\n\nfunction zeroBool(meta) {\n    return {\n        kind: 'BoolScalar',\n        flags: ptlf.BEACON_BIT | metadataTypeFlags(meta, ptlf.outer_SCALAR | ptlf.inner_BOOL | ptlf.inner_NULLABLE),\n        value: false,\n        meta,\n    };\n}\n\nfunction metadataTypeFlags(meta, fallback) {\n    const value = meta?.fields?.[METADATA_V1_FLAGS_INDEX]?.value;\n    return value === undefined || value === null ? fallback : BigInt(value);\n}\n\nfunction strList(meta, values, valid, nullable = true, axisName = null) {\n    const strs = Array.isArray(values) ? values : [];\n    const offsets = new Int32Array(strs.length + 1);\n    const validity = new Uint8Array(bitmapBytes(strs.length));\n    let numNulls = 0;\n    let total = 0;\n    for (let i = 0; i < strs.length; i++) {\n        if (strs[i] === null) {\n            numNulls++;\n            offsets[i + 1] = total;\n            continue;\n        }\n        validity[Math.trunc(i / 8)] |= 1 << (i % 8);\n        total += textEncoder.encode(strs[i]).length;\n        offsets[i + 1] = total;\n    }\n    const buf = new Uint8Array(total);\n    let cursor = 0;\n    for (const value of strs) {\n        if (value === null) {\n            continue;\n        }\n        const bytes = textEncoder.encode(value);\n        buf.set(bytes, cursor);\n        cursor += bytes.length;\n    }\n    return withAxis({\n        kind: 'BytesArrow32',\n        flags: ptlf.BEACON_BIT | ptlf.outer_ARRAY_LIST | ptlf.inner_STR | (nullable ? ptlf.inner_NULLABLE : 0n) | ptlf.bitwidth_32 | (valid ? ptlf.SCALAR_VALID : 0n),\n        offsets,\n        values: buf,\n        length: valid ? BigInt(strs.length) : 0n,\n        numNulls: BigInt(numNulls),\n        validity: numNulls > 0 ? validity : null,\n        meta,\n    }, axisName);\n}\n\nfunction nullStrList(meta) {\n    return withAxis({\n        kind: 'BytesArrow32',\n        flags: ptlf.BEACON_BIT | ptlf.outer_ARRAY_LIST | ptlf.inner_STR\n            | ptlf.outer_NULLABLE | ptlf.bitwidth_32,\n        offsets: new Int32Array([0]),\n        values: new Uint8Array(0),\n        length: 0n,\n        numNulls: 1n,\n        validity: null,\n        meta,\n    }, null);\n}\n\nfunction strList64(meta, values, valid, nullable = true, axisName = null) {\n    const strs = Array.isArray(values) ? values : [];\n    const offsets = new BigInt64Array(strs.length + 1);\n    const validity = new Uint8Array(bitmapBytes(strs.length));\n    let numNulls = 0;\n    let total = 0;\n    for (let i = 0; i < strs.length; i++) {\n        if (strs[i] === null) {\n            numNulls++;\n            offsets[i + 1] = BigInt(total);\n            continue;\n        }\n        validity[Math.trunc(i / 8)] |= 1 << (i % 8);\n        total += textEncoder.encode(strs[i]).length;\n        offsets[i + 1] = BigInt(total);\n    }\n    const buf = new Uint8Array(total);\n    let cursor = 0;\n    for (const value of strs) {\n        if (value === null) {\n            continue;\n        }\n        const bytes = textEncoder.encode(value);\n        buf.set(bytes, cursor);\n        cursor += bytes.length;\n    }\n    return withAxis({\n        kind: 'BytesArrow64',\n        flags: ptlf.BEACON_BIT | ptlf.outer_ARRAY_LIST | ptlf.inner_STR | (nullable ? ptlf.inner_NULLABLE : 0n) | ptlf.bitwidth_64 | (valid ? ptlf.SCALAR_VALID : 0n),\n        offsets,\n        values: buf,\n        length: valid ? BigInt(strs.length) : 0n,\n        numNulls: BigInt(numNulls),\n        validity: numNulls > 0 ? validity : null,\n        meta,\n    }, axisName);\n}\n\nfunction basicMetadata(flags, logical, physical) {\n    const key = `${flags}:${logical}:${physical}`;\n    const hit = g_basicMetaCache.get(key);\n    if (hit) {\n        return hit;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    g_basicMetaCache.set(key, meta);\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(intMeta, Number(flags & ptlf.TYPE_MASK));\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, objectNullableFromFlags(flags));\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = logical ? validStr(strMeta, logical) : zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = physical ? validStr(nullStrMeta, physical) : zeroStr(nullStrMeta);\n    const physicalBits = decodeNumericBitwidth(flags, 0);\n    meta.fields[METADATA_V1_PHYSICAL_BITWIDTH_INDEX] = physicalBits\n        ? validInt(intMeta, physicalBits)\n        : zeroInt(nullIntMeta);\n    if ((flags & ptlf.outer_MASK) !== ptlf.outer_SCALAR) {\n        meta.fields[METADATA_V1_UNIT_INDEX] = zeroStr(nullStrMeta);\n    }\n    return meta;\n}\n\nfunction structMetadata(fieldNames, fieldMetas, physicalName = null) {\n    const key = JSON.stringify(fieldNames);\n    const fieldMetaKey = fieldMetas.map(structMetadataID).join(',');\n    const cacheKey = `${key}:${fieldMetaKey}:${physicalName ?? ''}`;\n    const hit = g_structMetaCache.get(cacheKey);\n    if (hit) {\n        return hit;\n    }\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(intMeta, Number(ptlf.outer_STRUCT));\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'Struct');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(nullStrMeta, physicalName ?? 'Hetero');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = strList(listMeta, fieldNames, true);\n    meta.fields[METADATA_V1_FIELD_METATYPES_INDEX] = fieldMetatypesTuple(fieldMetas);\n    g_structMetaCache.set(cacheKey, meta);\n    return meta;\n}\n\n/* Struct schemas are immutable and their children are already canonical when\n   newStruct reaches this point, so identity gives a cheap exact schema key. */\nfunction structMetadataID(meta) {\n    let id = g_structMetaIDs.get(meta);\n    if (id === undefined) {\n        id = g_nextStructMetaID++;\n        g_structMetaIDs.set(meta, id);\n    }\n    return id;\n}\n\nfunction metadataMeta() {\n    if (g_metadataMeta) {\n        return g_metadataMeta;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.HASH_POPULATED | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: null,\n        hash: Uint8Array.from(MetadataSchemaCurrentPayloadHashBytes),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    g_metadataMeta = meta;\n\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(intMeta, Number(ptlf.outer_STRUCT));\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'Struct');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(nullStrMeta, 'MetadataV2');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = strList(listMeta, METADATA_V2_FIELD_NAMES, true);\n    meta.fields[METADATA_V1_FIELD_METATYPES_INDEX] = fieldMetatypesTuple(metadataSchemaFieldMetatypes());\n    return meta;\n}\n\nfunction metadataSchemaFieldMetatypes() {\n    const intMeta = basicMetadataScalarInt();\n    const nullIntMeta = nullableIntMetadata();\n    const boolMeta = basicMetadataScalarBool();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listStrMeta = listStrMetadata();\n    const frontierMeta = recursiveFrontierMetadata();\n\n    const fieldMetatypes = [\n        intMeta,\n        boolMeta,\n        nullIntMeta,\n        strMeta,\n        nullStrMeta,\n        nullIntMeta,\n        nullIntMeta,\n        listStrMeta,\n        metadataTupleMetadata(),\n        frontierMeta,\n        frontierMeta,\n        frontierMeta,\n        listStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        strMeta,\n        boolMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        listStrMeta,\n        listStrMeta,\n        nullIntMeta,\n        nullIntMeta,\n        nullIntMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullIntMeta,\n        nullIntMeta,\n        boolMeta,\n        listStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullableBoolMetadata(),\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        nullStrMeta,\n        listStrMeta,\n        listStrMeta,\n        listStrMeta,\n        nullStrMeta,\n        nullableBoolMetadata(),\n    ];\n    if (fieldMetatypes.length !== METADATA_V2_FIELD_NAMES.length) {\n        throw new Error(\n            `ptrless.export: generated MetadataV2 has ${METADATA_V2_FIELD_NAMES.length} fields, `\n            + `but schema construction produced ${fieldMetatypes.length} metatypes`\n        );\n    }\n    return fieldMetatypes;\n}\n\nfunction anyMetadata() {\n    if (g_anyMetadata) {\n        return g_anyMetadata;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    g_anyMetadata = meta;\n\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(\n        intMeta,\n        Number(ptlf.outer_SCALAR | ptlf.inner_UNTYPED),\n    );\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'Any');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_ABSTRACT_INDEX] = validBool(boolMeta, true);\n    return meta;\n}\n\nfunction recursiveFrontierMetadata() {\n    if (g_recursiveFrontierMetadata) {\n        return g_recursiveFrontierMetadata;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    g_recursiveFrontierMetadata = meta;\n\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(intMeta, Number(ptlf.outer_STRUCT));\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIXED_INDEX] = validInt(intMeta, 1);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'recursive_frontier');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(strMeta, 'MetadataV1');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = strList(listMeta, [], false);\n    meta.fields[METADATA_V1_SUBTYPE_INDEX] = validStr(nullStrMeta, 'recursive_frontier');\n    meta.fields[METADATA_V2_ABSTRACT_INDEX] = validBool(boolMeta, true);\n    // The frontier is terminal; its descriptive Self slots are not recursive\n    // descendants of the graph it closes.\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = nullMetadata();\n    meta.fields[METADATA_V1_KEY_METATYPE_INDEX] = nullMetadata();\n    meta.fields[METADATA_V1_VALUE_METATYPE_INDEX] = nullMetadata();\n    return meta;\n}\n\nfunction setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta) {\n    meta.fields[METADATA_V1_LOGICAL_BITWIDTH_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_PHYSICAL_BITWIDTH_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = strList(listMeta, [], false);\n    meta.fields[METADATA_V1_FIELD_METATYPES_INDEX] = nullTuple();\n    const selfFrontier = recursiveFrontierMetadata();\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_KEY_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_VALUE_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_BASES_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V1_SUBTYPE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_AXIS_NAME_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_SORTED_INDEX] = validStr(strMeta, '');\n    meta.fields[METADATA_V1_UNIQUE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_UNIT_INDEX] = validStr(nullStrMeta, '');\n    meta.fields[METADATA_V1_BASIS_INDEX] = validStr(nullStrMeta, '');\n}\n\nfunction setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta) {\n    const nullBoolMeta = nullableBoolMetadata();\n    meta.fields[METADATA_V2_OWNER_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_READ_GROUPS_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_WRITE_GROUPS_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_ADMIN_FLAGS_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V2_CREATED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V2_MODIFIED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V2_DESCRIPTION_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_TITLE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_ICON_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_DISPLAY_WIDTH_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V2_DISPLAY_HEIGHT_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V2_ABSTRACT_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V2_LEGAL_RIGHTS_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_COPYRIGHT_NOTICE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_ATTRIBUTION_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_PII_INDEX] = zeroBool(nullBoolMeta);\n    meta.fields[METADATA_V2_CLASSIFICATION_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_SOURCE_URI_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_SOURCE_KIND_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_CONTENT_TYPE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_ENCODING_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_LANGUAGE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_TAGS_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_SOURCE_LINEAGE_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_ARTIFACT_LINEAGE_INDEX] = strList(listMeta, [], true);\n    meta.fields[METADATA_V2_RETENTION_CLASS_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V2_PUBLIC_INDEX] = zeroBool(nullBoolMeta);\n}\n\nfunction basicMetadataScalarBool() {\n    return basicMetadata(ptlf.outer_SCALAR | ptlf.inner_BOOL, 'Bool', 'BoolScalar');\n}\n\nfunction nullableBoolMetadata() {\n    if (g_nullableBoolMeta) {\n        return g_nullableBoolMeta;\n    }\n    g_nullableBoolMeta = basicMetadata(\n        ptlf.outer_SCALAR | ptlf.inner_BOOL | ptlf.inner_NULLABLE,\n        'Bool',\n        'BoolScalar',\n    );\n    return g_nullableBoolMeta;\n}\n\nfunction basicMetadataScalarInt() {\n    return scalarIntMetadata(null, false);\n}\n\nfunction scalarIntMetadata(bits, nullable) {\n    const cache = nullable ? g_nullableIntMeta : g_scalarIntMeta;\n    const key = bits === null ? 'canonical' : bits;\n    const hit = cache.get(key);\n    if (hit) {\n        return hit;\n    }\n    const bitwidth = bits === null ? 0n : bitwidthForBits(bits);\n    const meta = basicMetadata(\n        ptlf.outer_SCALAR | ptlf.inner_INT | bitwidth | (nullable ? ptlf.inner_NULLABLE : 0n),\n        'Int',\n        'IntegralScalar',\n    );\n    cache.set(key, meta);\n    return meta;\n}\n\nfunction nullableIntMetadata() {\n    return scalarIntMetadata(null, true);\n}\n\nfunction basicMetadataScalarStr() {\n    return basicMetadata(ptlf.outer_SCALAR | ptlf.inner_STR, 'Str', 'BytesScalar');\n}\n\nfunction nullableStrMetadata() {\n    return basicMetadata(ptlf.outer_SCALAR | ptlf.inner_STR | ptlf.inner_NULLABLE, 'Str', 'BytesScalar');\n}\n\nfunction nullableStrLeafMetadata() {\n    if (g_nullableStrLeafMeta) {\n        return g_nullableStrLeafMeta;\n    }\n    g_nullableStrLeafMeta = basicMetadata(\n        ptlf.outer_SCALAR | ptlf.inner_STR | ptlf.inner_NULLABLE,\n        'Str',\n        '',\n    );\n    g_nullableStrLeafMeta.fields[METADATA_V1_FLAGS_INDEX] = validInt(\n        basicMetadataScalarInt(),\n        Number((ptlf.outer_SCALAR | ptlf.inner_STR) & ptlf.TYPE_MASK),\n    );\n    g_nullableStrLeafMeta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(\n        basicMetadataScalarBool(),\n        false,\n    );\n    return g_nullableStrLeafMeta;\n}\n\nfunction listStrMetadata(axisName = null) {\n    if (axisName === null && g_listStrMeta) {\n        return g_listStrMeta;\n    }\n    const meta = basicMetadata(ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.outer_NULLABLE | ptlf.bitwidth_32, 'List', 'BytesArrow32');\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = nullableStrLeafMetadata();\n    if (axisName !== null) meta.fields[METADATA_V1_AXIS_NAME_INDEX] = validStr(nullableStrMetadata(), axisName);\n    if (axisName === null) g_listStrMeta = meta;\n    return meta;\n}\n\nfunction listPlainStrMetadata(axisName = ':lit0') {\n    if (axisName === ':lit0' && g_plainListStrMeta) {\n        return g_plainListStrMeta;\n    }\n    const meta = basicMetadata(ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.bitwidth_32, 'List', 'BytesArrow32');\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = scalarLeafMetadata(ptlf.inner_STR, 'Str');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = nullStrList(meta);\n    meta.fields[METADATA_V1_AXIS_NAME_INDEX] = axisName === null\n        ? zeroStr(nullableStrMetadata())\n        : validStr(nullableStrMetadata(), axisName);\n    if (axisName === ':lit0') g_plainListStrMeta = meta;\n    return meta;\n}\n\nfunction listStr64Metadata(axisName = null) {\n    if (axisName === null && g_listStr64Meta) {\n        return g_listStr64Meta;\n    }\n    const meta = basicMetadata(ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.outer_NULLABLE | ptlf.bitwidth_64, 'List', 'BytesArrow64');\n    if (axisName !== null) meta.fields[METADATA_V1_AXIS_NAME_INDEX] = validStr(nullableStrMetadata(), axisName);\n    if (axisName === null) g_listStr64Meta = meta;\n    return meta;\n}\n\nfunction listPlainStr64Metadata(axisName = ':lit0') {\n    if (axisName === ':lit0' && g_plainListStr64Meta) {\n        return g_plainListStr64Meta;\n    }\n    const meta = basicMetadata(ptlf.outer_ARRAY_LIST | ptlf.inner_STR | ptlf.bitwidth_64, 'List', 'BytesArrow64');\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = scalarLeafMetadata(ptlf.inner_STR, 'Str');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = nullStrList(meta);\n    meta.fields[METADATA_V1_AXIS_NAME_INDEX] = axisName === null\n        ? zeroStr(nullableStrMetadata())\n        : validStr(nullableStrMetadata(), axisName);\n    if (axisName === ':lit0') g_plainListStr64Meta = meta;\n    return meta;\n}\n\nfunction listIntMetadata(bits, nullable = false, axisName = ':lit0') {\n    const key = `${bits}:${nullable ? 1 : 0}:${axisName ?? ''}`;\n    const hit = g_listIntMeta.get(key);\n    if (hit) {\n        return hit;\n    }\n    const nullableFlags = nullable ? ptlf.inner_NULLABLE | ptlf.outer_NULLABLE : 0n;\n    const meta = basicMetadata(\n        ptlf.outer_ARRAY_LIST | ptlf.inner_INT | bitwidthForBits(bits) | nullableFlags,\n        'List',\n        `IntegralArrow${bits}`,\n    );\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = scalarLeafMetadata(\n        ptlf.inner_INT | (nullable ? ptlf.inner_NULLABLE : 0n),\n        'Int',\n    );\n    if (axisName) meta.fields[METADATA_V1_AXIS_NAME_INDEX] = validStr(nullableStrMetadata(), axisName);\n    g_listIntMeta.set(key, meta);\n    return meta;\n}\n\nfunction scalarFloatMetadata(bits, nullable) {\n    const key = `${bits}:${nullable ? 1 : 0}`;\n    const hit = g_scalarFloatMeta.get(key);\n    if (hit) {\n        return hit;\n    }\n    const logical = `Float${bits}`;\n    const meta = basicMetadata(\n        ptlf.outer_SCALAR | ptlf.inner_FLOATNN | bitwidthForBits(bits) | (nullable ? ptlf.inner_NULLABLE : 0n),\n        logical,\n        `FloatScalar${bits}`,\n    );\n    g_scalarFloatMeta.set(key, meta);\n    return meta;\n}\n\nfunction listFloatMetadata(bits, nullable = false) {\n    const key = `${bits}:${nullable ? 1 : 0}`;\n    const hit = g_listFloatMeta.get(key);\n    if (hit) {\n        return hit;\n    }\n    const nullableFlags = nullable ? ptlf.inner_NULLABLE | ptlf.outer_NULLABLE : 0n;\n    const meta = basicMetadata(\n        ptlf.outer_ARRAY_LIST | ptlf.inner_FLOATNN | bitwidthForBits(bits) | nullableFlags,\n        'List',\n        `FloatArrow${bits}`,\n    );\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = scalarLeafMetadata(\n        ptlf.inner_FLOATNN | bitwidthForBits(bits) | (nullable ? ptlf.inner_NULLABLE : 0n),\n        `Float${bits}`,\n    );\n    meta.fields[METADATA_V1_AXIS_NAME_INDEX] = zeroStr(nullableStrMetadata());\n    g_listFloatMeta.set(key, meta);\n    return meta;\n}\n\n// scalarLeafMetadata builds the abstract item metatype used by concrete arrays.\n// It deliberately has a logical type but no physical payload type, matching the\n// C/Go metadata builder's scalarLeafMetadata contract.\nfunction scalarLeafMetadata(flags, logical) {\n    const key = `${flags}:${logical}`;\n    const hit = g_scalarLeafMeta.get(key);\n    if (hit) {\n        return hit;\n    }\n\n    const meta = basicMetadata(ptlf.outer_SCALAR | flags, logical, '');\n    g_scalarLeafMeta.set(key, meta);\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_PHYSICAL_BITWIDTH_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_UNIT_INDEX] = validStr(nullStrMeta, '');\n    meta.fields[METADATA_V1_BASIS_INDEX] = validStr(nullStrMeta, '');\n    meta.fields[METADATA_V1_UNIQUE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V2_ABSTRACT_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = nullStrList(listMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(\n        intMeta,\n        Number((ptlf.outer_SCALAR | flags) & ptlf.TYPE_MASK),\n    );\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    return meta;\n}\n\nfunction tupleMetadata(objectNullable) {\n    if (objectNullable && g_nullableTupleMeta) {\n        return g_nullableTupleMeta;\n    }\n    if (!objectNullable && g_tupleMeta) {\n        return g_tupleMeta;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    if (objectNullable) {\n        g_nullableTupleMeta = meta;\n    } else {\n        g_tupleMeta = meta;\n    }\n\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(\n        intMeta,\n        Number(ptlf.outer_TUPLE | (objectNullable ? ptlf.outer_NULLABLE : 0n))\n    );\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, objectNullable);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'Tuple');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(nullStrMeta, 'Hetero');\n    return meta;\n}\n\nfunction metadataTupleMetadata() {\n    if (g_metadataTupleMeta) {\n        return g_metadataTupleMeta;\n    }\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_STRUCT | ptlf.REUSABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n    };\n    g_metadataTupleMeta = meta;\n\n    const intMeta = basicMetadataScalarInt();\n    const boolMeta = basicMetadataScalarBool();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = validInt(intMeta, Number(ptlf.outer_TUPLE));\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, 'Tuple');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(nullStrMeta, 'MetadataTuple');\n    meta.fields[METADATA_V1_FIELD_METATYPES_INDEX] = {\n        kind: 'Hetero',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_TUPLE,\n        fields: [],\n        length: 1,\n        numNulls: 0,\n        validity: null,\n        meta: tupleMetadata(true),\n    };\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = recursiveFrontierMetadata();\n    meta.fields[METADATA_V2_ABSTRACT_INDEX] = validBool(boolMeta, false);\n    return meta;\n}\n\nfunction nullTuple() {\n    if (g_nullTuple) {\n        return g_nullTuple;\n    }\n    g_nullTuple = {\n        kind: 'Hetero',\n        flags: ptlf.BEACON_BIT | ptlf.outer_TUPLE,\n        fields: [],\n        length: 1,\n        numNulls: 1,\n        validity: Uint8Array.of(0),\n        meta: tupleMetadata(true),\n    };\n    return g_nullTuple;\n}\n\nfunction nullMetadata() {\n    if (g_nullMetadata) {\n        return g_nullMetadata;\n    }\n\n    const meta = {\n        kind: 'Metadata',\n        flags: ptlf.BEACON_BIT | ptlf.REUSABLE | ptlf.outer_STRUCT | ptlf.inner_NULLABLE | ptlf.outer_NULLABLE,\n        meta: metadataMeta(),\n        fields: new Array(METADATA_V2_FIELD_NAMES.length).fill(null),\n        length: 1,\n        numNulls: 1,\n        validity: Uint8Array.of(0),\n    };\n    g_nullMetadata = meta;\n\n    const boolMeta = basicMetadataScalarBool();\n    const intMeta = basicMetadataScalarInt();\n    const nullIntMeta = nullableIntMetadata();\n    const strMeta = basicMetadataScalarStr();\n    const nullStrMeta = nullableStrMetadata();\n    const listMeta = listStrMetadata();\n\n    setMetadataV1Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta, strMeta);\n    setMetadataV2Defaults(meta, nullIntMeta, nullStrMeta, listMeta, boolMeta);\n    meta.fields[METADATA_V1_FLAGS_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_OBJECT_NULLABLE_INDEX] = validBool(boolMeta, true);\n    meta.fields[METADATA_V1_FIXED_INDEX] = zeroInt(nullIntMeta);\n    meta.fields[METADATA_V1_LOGICAL_INDEX] = validStr(strMeta, '');\n    meta.fields[METADATA_V1_PHYSICAL_INDEX] = validStr(strMeta, '');\n    meta.fields[METADATA_V1_FIELD_NAMES_INDEX] = strList(listMeta, [], false);\n    meta.fields[METADATA_V1_FIELD_METATYPES_INDEX] = nullTuple();\n    const selfFrontier = recursiveFrontierMetadata();\n    meta.fields[METADATA_V1_ITEMS_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_KEY_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_VALUE_METATYPE_INDEX] = selfFrontier;\n    meta.fields[METADATA_V1_BASES_INDEX] = strList(listMeta, [], false);\n    meta.fields[METADATA_V1_SUBTYPE_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_AXIS_NAME_INDEX] = zeroStr(nullStrMeta);\n    meta.fields[METADATA_V1_SORTED_INDEX] = validStr(strMeta, '');\n    meta.fields[METADATA_V1_UNIQUE_INDEX] = validBool(boolMeta, false);\n    meta.fields[METADATA_V1_UNIT_INDEX] = validStr(nullStrMeta, '');\n    meta.fields[METADATA_V1_BASIS_INDEX] = validStr(nullStrMeta, '');\n    return meta;\n}\n\nfunction fieldMetatypesTuple(metas) {\n    const fields = Array.isArray(metas) ? metas : [];\n    if (fields.length === 0) {\n        return nullTuple();\n    }\n    for (let i = 0; i < fields.length; i++) {\n        if (!fields[i] || typeof fields[i] !== 'object') {\n            throw new Error(`ptrless.export.fieldMetatypesTuple: field metatype ${i} must be a ptrless object`);\n        }\n    }\n    return {\n        kind: 'Hetero',\n        flags: ptlf.BEACON_BIT | ptlf.SCALAR_VALID | ptlf.outer_TUPLE,\n        fields: Array.from(fields),\n        length: 1,\n        numNulls: 0,\n        validity: null,\n        meta: metadataTupleMetadata(),\n    };\n}\n\nfunction ensureMeta(obj) {\n    if (obj.meta) {\n        return obj.meta;\n    }\n    switch (obj.kind) {\n    case 'BoolScalar':\n        obj.meta = basicMetadataScalarBool();\n        return obj.meta;\n    case 'IntScalar': {\n        obj.meta = scalarIntMetadata(decodeNumericBitwidth(obj.flags, 64), (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    }\n    case 'FloatScalar32':\n        obj.meta = scalarFloatMetadata(32, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'FloatScalar64':\n        obj.meta = scalarFloatMetadata(64, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'BytesScalar':\n        if ((obj.flags & ptlf.inner_MASK) === ptlf.inner_BIN) {\n            obj.meta = basicMetadata(ptlf.outer_SCALAR | ptlf.inner_BIN | ((obj.flags & ptlf.inner_NULLABLE) !== 0n ? ptlf.inner_NULLABLE : 0n), 'Bin', 'BytesScalar');\n        } else {\n            obj.meta = basicMetadataScalarStr();\n        }\n        return obj.meta;\n    case 'IntegralArrow8':\n        obj.meta = listIntMetadata(8, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'IntegralArrow16':\n        obj.meta = listIntMetadata(16, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'IntegralArrow32':\n        obj.meta = listIntMetadata(32, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'IntegralArrow64':\n        obj.meta = listIntMetadata(64, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'FloatArrow32':\n        obj.meta = listFloatMetadata(32, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'FloatArrow64':\n        obj.meta = listFloatMetadata(64, (obj.flags & ptlf.inner_NULLABLE) !== 0n);\n        return obj.meta;\n    case 'BytesArrow32':\n        obj.meta = (obj.flags & ptlf.inner_NULLABLE) !== 0n ? listStrMetadata() : listPlainStrMetadata();\n        return obj.meta;\n    case 'BytesArrow64':\n        obj.meta = (obj.flags & ptlf.inner_NULLABLE) !== 0n ? listStr64Metadata() : listPlainStr64Metadata();\n        return obj.meta;\n    case 'Hetero':\n    case 'Metadata':\n        if (!obj.meta && obj !== g_metadataMeta) {\n            throw new Error(`ptrless.export.ensureMeta: ${obj.kind} requires explicit metadata`);\n        }\n        return obj.meta;\n    case 'Axis':\n        return null;\n    case 'UntypedScalar':\n        return null;\n    case 'LazyHash':\n        if (!(obj.identityHash instanceof Uint8Array) || obj.identityHash.length !== HASH_BYTES) {\n            throw new Error(`ptrless.export.ensureMeta: LazyHash requires a ${HASH_BYTES}-byte identityHash`);\n        }\n        return null;\n    default:\n        throw new Error(`ptrless.export.ensureMeta: unsupported object kind '${obj.kind}'`);\n    }\n}\n\nfunction safeExportCount(value, label) {\n    if (typeof value !== 'bigint' || value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n        throw new Error(`ptrless.export: ${label} must be a nonnegative safe bigint; got ${String(value)}`);\n    }\n    return Number(value);\n}\n\nfunction validateExportValidity(obj, length) {\n    const objectNull = length === 0\n        && (obj.flags & ptlf.outer_NULLABLE) !== 0n\n        && (obj.flags & ptlf.SCALAR_VALID) === 0n;\n    const numNulls = safeExportCount(obj.numNulls, `${obj.kind}.numNulls`);\n    if (objectNull) {\n        if (length !== 0 || numNulls !== 1 || obj.validity !== null) {\n            throw new Error(\n                `ptrless.export: null ${obj.kind} must have length=0, numNulls=1, validity=null`\n            );\n        }\n        return;\n    }\n    if (numNulls > length) {\n        throw new Error(`ptrless.export: ${obj.kind}.numNulls=${numNulls} exceeds length=${length}`);\n    }\n    if (numNulls === 0) {\n        if (obj.validity !== null) {\n            throw new Error(`ptrless.export: ${obj.kind} has a validity bitmap but numNulls is zero`);\n        }\n        return;\n    }\n    if (!(obj.validity instanceof Uint8Array) || obj.validity.length !== bitmapBytes(length)) {\n        throw new Error(`ptrless.export: ${obj.kind} validity bitmap has the wrong extent`);\n    }\n    let counted = 0;\n    for (let index = 0; index < length; index++) {\n        if (((obj.validity[index >> 3] >> (index & 7)) & 1) === 0) counted++;\n    }\n    if (counted !== numNulls) {\n        throw new Error(\n            `ptrless.export: ${obj.kind}.numNulls=${numNulls}, but validity bitmap contains ${counted}`\n        );\n    }\n}\n\nfunction validateExportOffsets(obj, length, bits) {\n    const offsets = obj.offsets;\n    const expectedType = bits === 32 ? Int32Array : BigInt64Array;\n    if (!(offsets instanceof expectedType) || offsets.length !== length + 1) {\n        throw new Error(`ptrless.export: ${obj.kind} requires exactly length+1 ${bits}-bit offsets`);\n    }\n    let previous = 0n;\n    for (let index = 0; index <= length; index++) {\n        const current = bits === 32 ? BigInt(offsets[index]) : offsets[index];\n        if (index === 0 && current !== 0n) {\n            throw new Error(`ptrless.export: ${obj.kind}.offsets[0] must be zero`);\n        }\n        if (current < previous || current > BigInt(Number.MAX_SAFE_INTEGER)) {\n            throw new Error(`ptrless.export: ${obj.kind} offsets are invalid at index ${index}`);\n        }\n        previous = current;\n    }\n    if (!(obj.values instanceof Uint8Array) || obj.values.length !== Number(previous)) {\n        throw new Error(\n            `ptrless.export: ${obj.kind} terminal offset ${previous} does not match values length `\n            + `${obj.values?.length ?? '<unavailable>'}`\n        );\n    }\n}\n\nfunction validateRequiredAxis(obj, length) {\n    if (!obj.iaxis || obj.iaxis.kind !== 'Axis') {\n        throw new Error(`ptrless.export: ${obj.kind} requires an explicit Axis`);\n    }\n    const axisLength = obj.iaxis.fields?.[0];\n    if (axisLength?.kind !== 'IntScalar' || axisLength.value !== BigInt(length)) {\n        throw new Error(\n            `ptrless.export: ${obj.kind} length=${length} disagrees with its axis length`\n        );\n    }\n}\n\nfunction validateExportObject(obj) {\n    if (!obj || typeof obj !== 'object' || typeof obj.flags !== 'bigint') {\n        throw new Error('ptrless.export: every graph node must be a ptrless object with bigint flags');\n    }\n    if ((obj.flags & ptlf.BEACON_BIT) === 0n) {\n        throw new Error(`ptrless.export: ${obj.kind} is missing the ptrless beacon bit`);\n    }\n    switch (obj.kind) {\n    case 'BoolScalar':\n        if (typeof obj.value !== 'boolean') throw new Error('ptrless.export: BoolScalar.value must be boolean');\n        return;\n    case 'IntScalar':\n        if (typeof obj.value !== 'bigint') throw new Error('ptrless.export: IntScalar.value must be bigint');\n        return;\n    case 'FloatScalar32':\n    case 'FloatScalar64':\n        if (typeof obj.value !== 'number') throw new Error(`ptrless.export: ${obj.kind}.value must be numeric`);\n        return;\n    case 'BytesScalar':\n        if (!(obj.value instanceof Uint8Array)) throw new Error('ptrless.export: BytesScalar.value must be Uint8Array');\n        return;\n    case 'IntegralArrow8':\n    case 'IntegralArrow16':\n    case 'IntegralArrow32':\n    case 'IntegralArrow64':\n    case 'FloatArrow32':\n    case 'FloatArrow64': {\n        const length = safeExportCount(obj.length, `${obj.kind}.length`);\n        if (!ArrayBuffer.isView(obj.values) || obj.values.length !== length) {\n            throw new Error(`ptrless.export: ${obj.kind}.values length does not match its declared length`);\n        }\n        validateExportValidity(obj, length);\n        validateRequiredAxis(obj, length);\n        return;\n    }\n    case 'BytesArrow32':\n    case 'BytesArrow64': {\n        const length = safeExportCount(obj.length, `${obj.kind}.length`);\n        validateExportOffsets(obj, length, obj.kind === 'BytesArrow32' ? 32 : 64);\n        validateExportValidity(obj, length);\n        validateRequiredAxis(obj, length);\n        return;\n    }\n    case 'Axis': {\n        if (!Array.isArray(obj.fields) || obj.fields.length !== 3) {\n            throw new Error('ptrless.export: Axis requires exactly three fields');\n        }\n        const [axisLength, name, guid] = obj.fields;\n        if (axisLength?.kind !== 'IntScalar' || axisLength.value < 0n\n            || name?.kind !== 'BytesScalar' || guid?.kind !== 'BytesScalar'\n            || (guid.flags & ptlf.inner_MASK) !== ptlf.inner_BIN\n            || guid.value.length !== HASH_BYTES) {\n            throw new Error('ptrless.export: Axis fields violate the nominal Axis declaration');\n        }\n        if (obj.meta !== null || obj.length !== 1 || obj.numNulls !== 0 || obj.validity !== null) {\n            throw new Error('ptrless.export: Axis shell is not canonical');\n        }\n        return;\n    }\n    case 'Hetero':\n    case 'Metadata': {\n        if (obj.kind === 'Hetero'\n            && (obj.flags & ptlf.outer_MASK) === ptlf.outer_STRUCT\n            && obj.iaxis) {\n            throw new Error('ptrless.export: plain Struct must not carry an iaxis; use a LogicalAxis dataframe wrapper');\n        }\n        if (!Array.isArray(obj.fields) || obj.fields.some(field => !field)) {\n            throw new Error(`ptrless.export: ${obj.kind} requires explicit non-null fields`);\n        }\n        const length = safeExportCount(BigInt(obj.length), `${obj.kind}.length`);\n        validateExportValidity({ ...obj, numNulls: BigInt(obj.numNulls) }, length);\n        return;\n    }\n    case 'LazyHash':\n        if (!(obj.hash instanceof Uint8Array) || obj.hash.length !== HASH_BYTES) {\n            throw new Error(`ptrless.export: LazyHash requires a ${HASH_BYTES}-byte hash`);\n        }\n        return;\n    default:\n        throw new Error(`ptrless.export: unsupported object kind '${obj.kind}'`);\n    }\n}\n\nfunction validateExportGraph(root) {\n    const seen = new WeakSet();\n    const visit = (obj) => {\n        if (!obj || typeof obj !== 'object' || seen.has(obj)) return;\n        seen.add(obj);\n        validateExportObject(obj);\n        if (obj.meta) visit(obj.meta);\n        if (obj.diagnostic) visit(obj.diagnostic);\n        if (obj.iaxis) visit(obj.iaxis);\n        if (Array.isArray(obj.fields)) {\n            for (const field of obj.fields) visit(field);\n        }\n    };\n    visit(root);\n}\n\nasync function planExport(root, includeMagic, { write = true } = {}) {\n    ensureMeta(root);\n    validateExportGraph(root);\n    await populateStoredHashes(root, new WeakMap());\n    const state = {\n        entries: new WeakMap(),\n        occurrences: new WeakMap(),\n        written: new WeakSet(),\n        activePayload: new WeakSet(),\n        root,\n        buffer: null,\n        writtenObjects: [],\n    };\n    const rootSpace = planAt(state, includeMagic ? ROOT_POS : 0, root, GraphState.Payload);\n    if (!write) return state;\n    const buffer = new Uint8Array(rootSpace.pos + rootSpace.size);\n    if (includeMagic) {\n        writeFileHeaderV2(buffer);\n    }\n    state.buffer = buffer;\n    writeObj(state, root, GraphState.Payload);\n    return state;\n}\n\nfunction writeFileHeaderV2(buffer) {\n    buffer.set(FILE_MAGIC, 0);\n    const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n    view.setBigInt64(8, BigInt(ROOT_POS), true);\n    view.setBigInt64(16, 0n, true);\n    view.setBigInt64(24, FILE_FORMAT_REVISION_V2, true);\n    view.setBigUint64(32, FILE_FEATURE_BITS_NONE, true);\n}\n\nfunction entryFor(state, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.entryFor');\n    return state.entries.get(obj) ?? null;\n}\n\nfunction setEntry(state, obj, graphState, entry) {\n    assertGraphState(graphState, 'ptrless.export.setEntry');\n    state.entries.set(obj, entry);\n}\n\nfunction wasWritten(state, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.wasWritten');\n    return state.written.has(obj);\n}\n\nfunction markWritten(state, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.markWritten');\n    state.written.add(obj);\n}\n\nfunction metadataScalarValue(meta, index) {\n    const field = meta?.fields?.[index];\n    if (!field || (field.flags & ptlf.SCALAR_VALID) === 0n) return null;\n    return field.value ?? null;\n}\n\nfunction declaredFlags(meta) {\n    const value = metadataScalarValue(meta, METADATA_V1_FLAGS_INDEX);\n    return value === null ? null : BigInt(value);\n}\n\nfunction declaredLabel(meta, index) {\n    const value = metadataScalarValue(meta, index);\n    return typeof value === 'string' ? value : null;\n}\n\nfunction validateDeclaration(obj, declared, graphState) {\n    if (!declared) return;\n    const actualOuter = obj.flags & ptlf.outer_MASK;\n    if (actualOuter === ptlf.outer_LAZY_HASHED\n        || actualOuter === ptlf.outer_LAZY\n        || actualOuter === ptlf.outer_LAZY_HANDLE\n        || actualOuter === ptlf.outer_LAZY_DERIVED) {\n        // Deferred transport nodes preserve the declaration out of band and\n        // are resolved before feature code observes the concrete value.\n        return;\n    }\n    const logical = declaredLabel(declared, METADATA_V1_LOGICAL_INDEX);\n    if (logical === 'Any' || logical === 'recursive_frontier') return;\n    const expectedFlags = declaredFlags(declared);\n    if (expectedFlags !== null) {\n        const shapeMask = ptlf.outer_MASK | ptlf.inner_MASK;\n        const actualShape = obj.flags & shapeMask;\n        const expectedShape = expectedFlags & shapeMask;\n        if (actualShape !== expectedShape) {\n            throw new Error(\n                `ptrless.export: ${obj.kind} conflicts with declared metadata; `\n                + `role=${graphState} actual_flags=0x${actualShape.toString(16)} `\n                + `declared_flags=0x${expectedShape.toString(16)}`\n            );\n        }\n    }\n    if (graphState === GraphState.Metadata) return;\n    const outer = obj.flags & ptlf.outer_MASK;\n    if (outer !== ptlf.outer_STRUCT && outer !== ptlf.outer_TUPLE\n        && outer !== ptlf.outer_NAMED_TUPLE) return;\n    const actualPhysical = declaredLabel(obj.meta, METADATA_V1_PHYSICAL_INDEX);\n    const expectedPhysical = declaredLabel(declared, METADATA_V1_PHYSICAL_INDEX);\n    const metadataCompatible = (actualPhysical === 'MetadataV1' || actualPhysical === 'MetadataV2')\n        && (expectedPhysical === 'MetadataV1' || expectedPhysical === 'MetadataV2');\n    if (!metadataCompatible && actualPhysical && expectedPhysical\n        && actualPhysical !== expectedPhysical) {\n        throw new Error(\n            `ptrless.export: ${obj.kind} conflicts with declared nominal type; `\n            + `actual=${actualPhysical} declared=${expectedPhysical}`\n        );\n    }\n}\n\nfunction validateVisit(obj, graphState, declared = null) {\n    assertGraphState(graphState, 'ptrless.export.validateVisit');\n    if (!obj || typeof obj !== 'object') {\n        throw new Error('ptrless.export: nil object cannot be serialized');\n    }\n    validateDeclaration(obj, declared, graphState);\n    if (graphState !== GraphState.Metadata) {\n        ensureMeta(obj);\n        return;\n    }\n    // Metadata is a traversal role, not a physical type. Scalar fields inside\n    // a metadata value remain scalar visits; aggregate interpretation is\n    // selected later at the aggregate boundary.\n}\n\nfunction planAt(state, pos, obj, graphState, declared = null) {\n    assertGraphState(graphState, 'ptrless.export.planAt');\n    // Validate every incoming instruction before object-only deduplication.\n    validateVisit(obj, graphState, declared);\n    const occurrence = state.occurrences.get(obj) ?? { count: 0, metadata: false };\n    occurrence.count++;\n    occurrence.metadata = occurrence.metadata || graphState === GraphState.Metadata;\n    state.occurrences.set(obj, occurrence);\n    const existing = entryFor(state, obj, graphState);\n    if (existing) {\n        if (graphState === GraphState.Payload && state.activePayload.has(obj)) {\n            throw new Error(`ptrless.export: ordinary payload cycle reaches active ${obj.kind}`);\n        }\n        return { pos: existing.pos, size: 0 };\n    }\n    const entry = { pos, size: 0 };\n    setEntry(state, obj, graphState, entry);\n    const enteredPayload = graphState === GraphState.Payload;\n    if (enteredPayload) state.activePayload.add(obj);\n    try {\n        entry.size = planSize(state, pos, obj, graphState);\n        if (obj.diagnostic) {\n            entry.size += planChild(\n                state,\n                pos + entry.size,\n                obj.diagnostic,\n                GraphState.Payload,\n            ).size;\n        }\n        return { pos, size: entry.size };\n    } finally {\n        if (enteredPayload) state.activePayload.delete(obj);\n    }\n}\n\nfunction planSize(state, pos, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.planSize');\n    switch (obj.kind) {\n    case 'BoolScalar':\n    case 'IntScalar':\n        return planScalar(state, pos, obj, scalarHeadSize, graphState);\n    case 'FloatScalar32':\n    case 'FloatScalar64':\n        return planScalar(state, pos, obj, scalarHeadSize, graphState);\n    case 'BytesScalar':\n        return planBytesScalar(state, pos, obj, graphState);\n    case 'IntegralArrow8':\n        return planIntegralArrow(state, pos, obj, 1, graphState);\n    case 'IntegralArrow16':\n        return planIntegralArrow(state, pos, obj, 2, graphState);\n    case 'IntegralArrow32':\n        return planIntegralArrow(state, pos, obj, 4, graphState);\n    case 'IntegralArrow64':\n        return planIntegralArrow(state, pos, obj, 8, graphState);\n    case 'FloatArrow32':\n        return planFloatArrow(state, pos, obj, 4, graphState);\n    case 'FloatArrow64':\n        return planFloatArrow(state, pos, obj, 8, graphState);\n    case 'BytesArrow32':\n        return planBytesArrow32(state, pos, obj, graphState);\n    case 'BytesArrow64':\n        return planBytesArrow64(state, pos, obj, graphState);\n    case 'LazyHash':\n        return planLazyHash(state, pos, obj, graphState);\n    case 'Hetero':\n    case 'Metadata':\n    case 'Axis':\n        return planAggregate(state, pos, obj, graphState);\n    default:\n        throw new Error(`ptrless.export: unsupported root type '${obj.kind}'`);\n    }\n}\n\nfunction planScalar(state, pos, obj, headSize, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + headSize;\n    const metaSpace = planMetadataChild(state, current, obj, meta, graphState);\n    current += metaSpace.size;\n    return current - pos;\n}\n\nfunction planBytesScalar(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + bytesScalarHeadSize + alignUp(obj.value.length + 1, ARRAY_ALIGN_BYTES);\n    const metaSpace = planMetadataChild(state, current, obj, meta, graphState);\n    current += metaSpace.size;\n    return current - pos;\n}\n\nfunction planIntegralArrow(state, pos, obj, valueBytes, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += planAxisChild(state, current, obj).size;\n    current += planMetadataChild(state, current, obj, meta, graphState).size;\n    if (obj.length > 0n) {\n        current += alignUp(obj.values.length * valueBytes, ARRAY_ALIGN_BYTES);\n        if (obj.validity) {\n            current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n        }\n    }\n    return current - pos;\n}\n\nfunction planFloatArrow(state, pos, obj, valueBytes, graphState) {\n    return planIntegralArrow(state, pos, obj, valueBytes, graphState);\n}\n\nfunction planBytesArrow32(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += planAxisChild(state, current, obj).size;\n    current += planMetadataChild(state, current, obj, meta, graphState).size;\n    current += alignUp((obj.offsets.length) * 4, ARRAY_ALIGN_BYTES);\n    const valueBytes = obj.offsets.length > 0 ? obj.offsets[obj.offsets.length - 1] : 0;\n    if (obj.length > 0n && valueBytes > 0) {\n        current += alignUp(valueBytes, ARRAY_ALIGN_BYTES);\n    }\n    if (obj.length > 0n && obj.validity) {\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    return current - pos;\n}\n\nfunction planBytesArrow64(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += planAxisChild(state, current, obj).size;\n    current += planMetadataChild(state, current, obj, meta, graphState).size;\n    current += alignUp(obj.offsets.length * 8, ARRAY_ALIGN_BYTES);\n    const valueBytes = obj.offsets.length > 0 ? Number(obj.offsets[obj.offsets.length - 1]) : 0;\n    if (obj.length > 0n && valueBytes > 0) {\n        current += alignUp(valueBytes, ARRAY_ALIGN_BYTES);\n    }\n    if (obj.length > 0n && obj.validity) {\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    return current - pos;\n}\n\nfunction planLazyHash(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    if (meta) {\n        current += planMetadataChild(state, current, obj, meta, graphState).size;\n    }\n    return current - pos;\n}\n\nfunction heteroHeadSize(numFields) {\n    return alignUp(heteroBaseHeadSize + numFields * 8, HEAD_ALIGN_BYTES);\n}\n\nfunction planHeteroLike(state, pos, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.planHeteroLike');\n    const meta = ensureMeta(obj);\n    const fields = obj.fields;\n    let current = pos + heteroHeadSize(fields.length);\n    if (obj.validity) {\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    current += planMetadataChild(state, current, obj, meta, graphState).size;\n    for (let index = 0; index < fields.length; index++) {\n        current += planChild(\n            state,\n            current,\n            fields[index],\n            graphState,\n            declaredFieldMetadata(meta, index),\n        ).size;\n    }\n    return current - pos;\n}\n\n// Struct/Tuple are the only aggregate boundaries that select the graph role.\n// Keep the physical implementation shared, but make the four semantic paths\n// explicit so role cannot be recovered from the value or field count.\nfunction planAggregate(state, pos, obj, graphState) {\n    const outer = obj.flags & ptlf.outer_MASK;\n    if (outer === ptlf.outer_TUPLE || outer === ptlf.outer_NAMED_TUPLE) {\n        return graphState === GraphState.Metadata\n            ? planMetadataTuple(state, pos, obj, graphState)\n            : planPayloadTuple(state, pos, obj, graphState);\n    }\n    return graphState === GraphState.Metadata\n        ? planMetadataStruct(state, pos, obj, graphState)\n        : planPayloadStruct(state, pos, obj, graphState);\n}\n\nfunction planPayloadStruct(state, pos, obj, graphState) {\n    return planHeteroLike(state, pos, obj, graphState);\n}\n\nfunction planMetadataStruct(state, pos, obj, graphState) {\n    return planHeteroLike(state, pos, obj, graphState);\n}\n\nfunction planPayloadTuple(state, pos, obj, graphState) {\n    return planHeteroLike(state, pos, obj, graphState);\n}\n\nfunction planMetadataTuple(state, pos, obj, graphState) {\n    return planHeteroLike(state, pos, obj, graphState);\n}\n\nfunction declaredFieldMetadata(meta, index) {\n    const fieldMetatypes = meta?.fields?.[METADATA_V1_FIELD_METATYPES_INDEX];\n    if (Array.isArray(fieldMetatypes?.fields) && index < fieldMetatypes.fields.length) {\n        return fieldMetatypes.fields[index];\n    }\n    return meta?.fields?.[METADATA_V1_ITEMS_METATYPE_INDEX] ?? null;\n}\n\nfunction planChild(state, pos, obj, graphState, declared = null) {\n    assertGraphState(graphState, 'ptrless.export.planChild');\n    if (!obj) {\n        return { pos: 0, size: 0 };\n    }\n    return planAt(state, pos, obj, graphState, declared);\n}\n\nfunction planAxisChild(state, pos, obj) {\n    return planChild(state, pos, obj.iaxis, GraphState.Payload);\n}\n\nfunction metadataEdgeIsOmitted(state, obj, meta, graphState) {\n    assertGraphState(graphState, 'ptrless.export.metadataEdgeIsOmitted');\n    if (graphState === GraphState.Metadata) {\n        // Metadata-role visits are declared by schema-current context. Emitting\n        // their private JS metatype graph creates a second, non-canonical\n        // metadata-of-metadata hierarchy instead of the canonical rel=0 edge.\n        return true;\n    }\n    if (graphState === GraphState.Payload && obj !== state.root) {\n        return true;\n    }\n    return meta === null || meta === undefined;\n}\n\nfunction declaredMetadataFor(_state, _obj, meta, graphState) {\n    assertGraphState(graphState, 'ptrless.export.declaredMetadataFor');\n    return meta;\n}\n\nfunction planMetadataChild(state, pos, obj, meta, graphState) {\n    meta = declaredMetadataFor(state, obj, meta, graphState);\n    if (metadataEdgeIsOmitted(state, obj, meta, graphState)) {\n        return { pos: 0, size: 0 };\n    }\n    return planChild(state, pos, meta, GraphState.Metadata);\n}\n\nfunction childContribution(state, current, child, graphState) {\n    assertGraphState(graphState, 'ptrless.export.childContribution');\n    if (!child) {\n        return 0;\n    }\n    const entry = entryFor(state, child, graphState);\n    if (!entry) {\n        return 0;\n    }\n    if (entry.pos === current) {\n        return entry.size;\n    }\n    return 0;\n}\n\nfunction relForChild(state, pos, child, graphState) {\n    assertGraphState(graphState, 'ptrless.export.relForChild');\n    if (!child) {\n        return 0;\n    }\n    const entry = entryFor(state, child, graphState);\n    if (!entry) {\n        throw new Error(`ptrless.export.relForChild: child was not planned in ${graphState} state`);\n    }\n    const rel = entry.pos - pos;\n    if (rel === 0) {\n        return SELF_EDGE_REL;\n    }\n    return rel;\n}\n\nfunction metadataRel(state, pos, obj, meta, graphState) {\n    meta = declaredMetadataFor(state, obj, meta, graphState);\n    if (metadataEdgeIsOmitted(state, obj, meta, graphState)) {\n        return 0;\n    }\n    return relForChild(state, pos, meta, GraphState.Metadata);\n}\n\nfunction axisRel(state, pos, obj) {\n    return relForChild(state, pos, obj.iaxis, GraphState.Payload);\n}\n\nfunction axisContribution(state, current, obj) {\n    return childContribution(state, current, obj.iaxis, GraphState.Payload);\n}\n\nfunction writeAxisChild(state, obj) {\n    writeObj(state, obj.iaxis, GraphState.Payload);\n}\n\nfunction metadataContribution(state, current, obj, meta, graphState) {\n    meta = declaredMetadataFor(state, obj, meta, graphState);\n    if (metadataEdgeIsOmitted(state, obj, meta, graphState)) {\n        return 0;\n    }\n    return childContribution(state, current, meta, GraphState.Metadata);\n}\n\nfunction writeMetadataChild(state, obj, meta, graphState) {\n    meta = declaredMetadataFor(state, obj, meta, graphState);\n    if (!metadataEdgeIsOmitted(state, obj, meta, graphState)) {\n        writeObj(state, meta, GraphState.Metadata);\n    }\n}\n\nfunction writeObj(state, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.writeObj');\n    if (!obj || wasWritten(state, obj, graphState)) {\n        return;\n    }\n    markWritten(state, obj, graphState);\n    state.writtenObjects.push(obj);\n    const entry = entryFor(state, obj, graphState);\n    if (!entry) {\n        throw new Error(`ptrless.export.writeObj: object was not planned in ${graphState} state`);\n    }\n    const pos = entry.pos;\n    if (obj.diagnostic === obj) {\n        throw new Error(`ptrless.export: diagnostic self-reference is invalid`);\n    }\n    putI64(\n        state.buffer,\n        pos + 16,\n        obj.diagnostic\n            ? relForChild(state, pos, obj.diagnostic, GraphState.Payload)\n            : 0,\n    );\n    if (obj.diagnostic) {\n        writeObj(state, obj.diagnostic, GraphState.Payload);\n    }\n    switch (obj.kind) {\n    case 'BoolScalar':\n        return writeBoolScalar(state, pos, obj, graphState);\n    case 'IntScalar':\n        return writeIntScalar(state, pos, obj, graphState);\n    case 'FloatScalar32':\n        return writeFloatScalar32(state, pos, obj, graphState);\n    case 'FloatScalar64':\n        return writeFloatScalar64(state, pos, obj, graphState);\n    case 'BytesScalar':\n        return writeBytesScalar(state, pos, obj, graphState);\n    case 'IntegralArrow8':\n        return writeIntegralArrow(state, pos, obj, 8, graphState);\n    case 'IntegralArrow16':\n        return writeIntegralArrow(state, pos, obj, 16, graphState);\n    case 'IntegralArrow32':\n        return writeIntegralArrow(state, pos, obj, 32, graphState);\n    case 'IntegralArrow64':\n        return writeIntegralArrow(state, pos, obj, 64, graphState);\n    case 'FloatArrow32':\n        return writeFloatArrow(state, pos, obj, 32, graphState);\n    case 'FloatArrow64':\n        return writeFloatArrow(state, pos, obj, 64, graphState);\n    case 'BytesArrow32':\n        return writeBytesArrow32(state, pos, obj, graphState);\n    case 'BytesArrow64':\n        return writeBytesArrow64(state, pos, obj, graphState);\n    case 'LazyHash':\n        return writeLazyHash(state, pos, obj, graphState);\n    case 'Hetero':\n    case 'Metadata':\n    case 'Axis':\n        return writeAggregate(state, pos, obj, graphState);\n    default:\n        throw new Error(`ptrless.export: unsupported write type '${obj.kind}'`);\n    }\n}\n\nfunction writeBoolScalar(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeIntScalar(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, obj.value);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeFloatScalar32(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    new DataView(state.buffer.buffer, state.buffer.byteOffset, state.buffer.byteLength).setFloat32(pos + 24, obj.value, true);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeFloatScalar64(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    new DataView(state.buffer.buffer, state.buffer.byteOffset, state.buffer.byteLength).setFloat64(pos + 24, obj.value, true);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeBytesScalar(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    const value = obj.value;\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, value.length);\n    putI64(state.buffer, pos + 32, bytesScalarHeadSize);\n    state.buffer.set(obj.hash, pos + 40);\n    state.buffer.set(value, pos + bytesScalarHeadSize);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeIntegralArrow(state, pos, obj, bits, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += axisContribution(state, current, obj);\n    current += metadataContribution(state, current, obj, meta, graphState);\n    let valuesRel = 0;\n    if (obj.length > 0n) {\n        valuesRel = current - pos;\n        current += alignUp(obj.values.length * (bits / 8), ARRAY_ALIGN_BYTES);\n    }\n    let validityRel = 0;\n    if (obj.length > 0n && obj.validity) {\n        validityRel = current - pos;\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, axisRel(state, pos, obj));\n    putI64(state.buffer, pos + 32, validityRel);\n    putI64(state.buffer, pos + 40, 0);\n    putI64(state.buffer, pos + 48, valuesRel);\n    putI64(state.buffer, pos + 56, 0);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length);\n    putI64(state.buffer, pos + 104, obj.numNulls);\n    if (valuesRel !== 0) {\n        writeNumericValues(state.buffer, pos + valuesRel, obj.values, bits, false);\n    }\n    if (validityRel !== 0) {\n        state.buffer.set(obj.validity, pos + validityRel);\n    }\n    writeAxisChild(state, obj);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeFloatArrow(state, pos, obj, bits, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += axisContribution(state, current, obj);\n    current += metadataContribution(state, current, obj, meta, graphState);\n    let valuesRel = 0;\n    if (obj.length > 0n) {\n        valuesRel = current - pos;\n        current += alignUp(obj.values.length * (bits / 8), ARRAY_ALIGN_BYTES);\n    }\n    let validityRel = 0;\n    if (obj.length > 0n && obj.validity) {\n        validityRel = current - pos;\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, axisRel(state, pos, obj));\n    putI64(state.buffer, pos + 32, validityRel);\n    putI64(state.buffer, pos + 40, 0);\n    putI64(state.buffer, pos + 48, valuesRel);\n    putI64(state.buffer, pos + 56, 0);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length);\n    putI64(state.buffer, pos + 104, obj.numNulls);\n    if (valuesRel !== 0) {\n        writeNumericValues(state.buffer, pos + valuesRel, obj.values, bits, true);\n    }\n    if (validityRel !== 0) {\n        state.buffer.set(obj.validity, pos + validityRel);\n    }\n    writeAxisChild(state, obj);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeBytesArrow32(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += axisContribution(state, current, obj);\n    current += metadataContribution(state, current, obj, meta, graphState);\n    const offsetsRel = current - pos;\n    current += alignUp(obj.offsets.length * 4, ARRAY_ALIGN_BYTES);\n    let valuesRel = 0;\n    const valueBytes = obj.offsets.length > 0 ? obj.offsets[obj.offsets.length - 1] : 0;\n    if (obj.length > 0n && valueBytes > 0) {\n        valuesRel = current - pos;\n        current += alignUp(valueBytes, ARRAY_ALIGN_BYTES);\n    }\n    let validityRel = 0;\n    if (obj.length > 0n && obj.validity) {\n        validityRel = current - pos;\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, axisRel(state, pos, obj));\n    putI64(state.buffer, pos + 32, validityRel);\n    putI64(state.buffer, pos + 40, offsetsRel);\n    putI64(state.buffer, pos + 48, valuesRel);\n    putI64(state.buffer, pos + 56, 0);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length);\n    putI64(state.buffer, pos + 104, obj.numNulls);\n    const dv = new DataView(state.buffer.buffer, state.buffer.byteOffset, state.buffer.byteLength);\n    for (let i = 0; i < obj.offsets.length; i++) {\n        dv.setInt32(pos + offsetsRel + i * 4, obj.offsets[i], true);\n    }\n    if (valuesRel !== 0) {\n        state.buffer.set(obj.values, pos + valuesRel);\n    }\n    if (validityRel !== 0) {\n        state.buffer.set(obj.validity, pos + validityRel);\n    }\n    writeAxisChild(state, obj);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeBytesArrow64(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    let current = pos + arrayHeadSize;\n    current += axisContribution(state, current, obj);\n    current += metadataContribution(state, current, obj, meta, graphState);\n    const offsetsRel = current - pos;\n    current += alignUp(obj.offsets.length * 8, ARRAY_ALIGN_BYTES);\n    let valuesRel = 0;\n    const valueBytes = obj.offsets.length > 0 ? Number(obj.offsets[obj.offsets.length - 1]) : 0;\n    if (obj.length > 0n && valueBytes > 0) {\n        valuesRel = current - pos;\n        current += alignUp(valueBytes, ARRAY_ALIGN_BYTES);\n    }\n    let validityRel = 0;\n    if (obj.length > 0n && obj.validity) {\n        validityRel = current - pos;\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, axisRel(state, pos, obj));\n    putI64(state.buffer, pos + 32, validityRel);\n    putI64(state.buffer, pos + 40, offsetsRel);\n    putI64(state.buffer, pos + 48, valuesRel);\n    putI64(state.buffer, pos + 56, 0);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length);\n    putI64(state.buffer, pos + 104, obj.numNulls);\n    const dv = new DataView(state.buffer.buffer, state.buffer.byteOffset, state.buffer.byteLength);\n    for (let i = 0; i < obj.offsets.length; i++) {\n        dv.setBigInt64(pos + offsetsRel + i * 8, obj.offsets[i], true);\n    }\n    if (valuesRel !== 0 && valueBytes > 0) {\n        state.buffer.set(obj.values, pos + valuesRel);\n    }\n    if (validityRel !== 0) {\n        state.buffer.set(obj.validity, pos + validityRel);\n    }\n    writeAxisChild(state, obj);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeLazyHash(state, pos, obj, graphState) {\n    const meta = ensureMeta(obj);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, 0);\n    putHash(state.buffer, pos + 32, obj.identityHash);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length ?? 0);\n    putI64(state.buffer, pos + 104, obj.numNulls ?? 0);\n    writeMetadataChild(state, obj, meta, graphState);\n}\n\nfunction writeHeteroLike(state, pos, obj, graphState) {\n    assertGraphState(graphState, 'ptrless.export.writeHeteroLike');\n    const meta = ensureMeta(obj);\n    const fields = obj.fields;\n    let current = pos + heteroHeadSize(fields.length);\n    let validityRel = 0;\n    if (obj.validity) {\n        validityRel = current - pos;\n        current += alignUp(obj.validity.length, ARRAY_ALIGN_BYTES);\n    }\n    current += metadataContribution(state, current, obj, meta, graphState);\n    putU64(state.buffer, pos, obj.flags);\n    putI64(state.buffer, pos + 8, metadataRel(state, pos, obj, meta, graphState));\n    putI64(state.buffer, pos + 24, 0);\n    putI64(state.buffer, pos + 32, validityRel);\n    putI64(state.buffer, pos + 40, fields.length);\n    putI64(state.buffer, pos + 48, heteroBaseHeadSize);\n    putI64(state.buffer, pos + 56, obj.deepSize);\n    putHash(state.buffer, pos + 64, obj.hash);\n    putI64(state.buffer, pos + 96, obj.length);\n    putI64(state.buffer, pos + 104, obj.numNulls);\n    if (validityRel !== 0) {\n        state.buffer.set(obj.validity, pos + validityRel);\n    }\n    for (let i = 0; i < fields.length; i++) {\n        const field = fields[i];\n        putI64(state.buffer, pos + heteroBaseHeadSize + i * 8, relForChild(state, pos, field, graphState));\n        current += childContribution(state, current, field, graphState);\n    }\n    writeMetadataChild(state, obj, meta, graphState);\n    for (const field of fields) {\n        if (field) {\n            writeObj(state, field, graphState);\n        }\n    }\n}\n\nfunction writeAggregate(state, pos, obj, graphState) {\n    const outer = obj.flags & ptlf.outer_MASK;\n    if (outer === ptlf.outer_TUPLE || outer === ptlf.outer_NAMED_TUPLE) {\n        return graphState === GraphState.Metadata\n            ? writeMetadataTuple(state, pos, obj, graphState)\n            : writePayloadTuple(state, pos, obj, graphState);\n    }\n    return graphState === GraphState.Metadata\n        ? writeMetadataStruct(state, pos, obj, graphState)\n        : writePayloadStruct(state, pos, obj, graphState);\n}\n\nfunction writePayloadStruct(state, pos, obj, graphState) {\n    return writeHeteroLike(state, pos, obj, graphState);\n}\n\nfunction writeMetadataStruct(state, pos, obj, graphState) {\n    return writeHeteroLike(state, pos, obj, graphState);\n}\n\nfunction writePayloadTuple(state, pos, obj, graphState) {\n    return writeHeteroLike(state, pos, obj, graphState);\n}\n\nfunction writeMetadataTuple(state, pos, obj, graphState) {\n    return writeHeteroLike(state, pos, obj, graphState);\n}\n\nasync function populateStoredHashes(obj, seen) {\n    if (!obj || seen.get(obj)) {\n        return;\n    }\n    seen.set(obj, true);\n    if (obj.kind === 'BytesScalar') {\n        sealBytesScalarValue(obj);\n    }\n    if (obj.kind === 'Hetero' || obj.kind === 'Metadata' || obj.kind === 'Axis') {\n        // Publish the local shell size before descending so the canonical\n        // closed-frontier/null-metadata knot has a terminal aggregate value.\n        // Ordinary cycles are still rejected by payload hashing.\n        obj.deepSize = heteroLocalPhysicalSize(obj);\n    }\n    if ((obj.flags & ptlf.HASH_POPULATED) !== 0n) {\n        if (!(obj.hash instanceof Uint8Array) || obj.hash.length !== HASH_BYTES) {\n            throw new Error(`ptrless.export: HASH_POPULATED ${obj.kind} requires a ${HASH_BYTES}-byte stored hash`);\n        }\n    }\n    if (obj.iaxis) {\n        // Axis identity is transported and hashed independently. It is not a\n        // child of the parent's payload hash.\n        await populateStoredHashes(obj.iaxis, seen);\n    }\n    for (const child of hashChildren(obj)) {\n        await populateStoredHashes(child, seen);\n    }\n    if (obj.kind === 'Hetero' || obj.kind === 'Metadata' || obj.kind === 'Axis') {\n        obj.deepSize = recursiveShallowAggregateSize(obj);\n    }\n    if ((obj.flags & ptlf.HASH_POPULATED) !== 0n) {\n        return;\n    }\n    if (obj.kind === 'LazyHash') {\n        if (!(obj.hash instanceof Uint8Array) || obj.hash.length !== HASH_BYTES) {\n            throw new Error(`ptrless.export: LazyHash requires a stored payload hash`);\n        }\n        obj.flags |= ptlf.HASH_POPULATED;\n        return;\n    }\n    if (obj.kind === 'BytesScalar') {\n        obj.hash = await calculateHash(obj, new WeakMap(), []);\n        obj.flags |= ptlf.HASH_POPULATED;\n        return;\n    }\n    if ((obj.flags & ptlf.outer_MASK) === ptlf.outer_SCALAR) {\n        return;\n    }\n    obj.hash = await calculateHash(obj, new WeakMap(), []);\n    obj.flags |= ptlf.HASH_POPULATED;\n}\n\nfunction rejectSealedBytesScalarValue() {\n    throw new Error('ptrless.export: sealed BytesScalar.value cannot be replaced');\n}\n\n// A typed array cannot be frozen. Keep the exported bytes in the scalar's\n// accessor closure and return copies so callers cannot mutate a hashed value.\nfunction sealBytesScalarValue(obj) {\n    const descriptor = Object.getOwnPropertyDescriptor(obj, 'value');\n    if (descriptor?.set === rejectSealedBytesScalarValue) return;\n    if (!descriptor || !(descriptor.value instanceof Uint8Array)) {\n        throw new Error('ptrless.export: BytesScalar.value must be Uint8Array');\n    }\n    const value = descriptor.value.slice();\n    Object.defineProperty(obj, 'value', {\n        enumerable: true,\n        get: () => value.slice(),\n        set: rejectSealedBytesScalarValue,\n    });\n}\n\nfunction recursiveShallowAggregateSize(obj) {\n    let total = heteroLocalPhysicalSize(obj);\n    for (const field of obj.fields) {\n        if (!field) {\n            throw new Error(`ptrless.export: ${obj.kind} aggregate has a null field`);\n        }\n        if (field.kind === 'Hetero' || field.kind === 'Metadata' || field.kind === 'Axis') {\n            if (!Number.isSafeInteger(field.deepSize) || field.deepSize <= 0) {\n                throw new Error(`ptrless.export: ${obj.kind} child ${field.kind} has no stored aggregate size`);\n            }\n            total += field.deepSize;\n        } else {\n            total += onDemandPhysicalSize(field);\n        }\n    }\n    return total;\n}\n\nfunction heteroLocalPhysicalSize(obj) {\n    return heteroHeadSize(obj.fields.length)\n        + (obj.validity ? alignUp(obj.validity.length, ARRAY_ALIGN_BYTES) : 0);\n}\n\nfunction onDemandPhysicalSize(obj) {\n    switch (obj.kind) {\n    case 'BoolScalar':\n    case 'IntScalar':\n    case 'FloatScalar32':\n    case 'FloatScalar64':\n    case 'UntypedScalar':\n        return scalarHeadSize;\n    case 'BytesScalar':\n        return bytesScalarHeadSize + alignUp(obj.value.length, ARRAY_ALIGN_BYTES);\n    case 'IntegralArrow8':\n        return arrayHeadSize + alignedOptionalValiditySize(obj) + alignUp(obj.values.byteLength, ARRAY_ALIGN_BYTES);\n    case 'IntegralArrow16':\n    case 'IntegralArrow32':\n    case 'IntegralArrow64':\n    case 'FloatArrow32':\n    case 'FloatArrow64':\n        return arrayHeadSize + alignedOptionalValiditySize(obj) + alignUp(obj.values.byteLength, ARRAY_ALIGN_BYTES);\n    case 'BytesArrow32':\n        return arrayHeadSize + alignedOptionalValiditySize(obj)\n            + alignUp(obj.offsets.byteLength, ARRAY_ALIGN_BYTES)\n            + alignUp(obj.values.byteLength, ARRAY_ALIGN_BYTES);\n    case 'BytesArrow64':\n        return arrayHeadSize + alignedOptionalValiditySize(obj)\n            + alignUp(obj.offsets.byteLength, ARRAY_ALIGN_BYTES)\n            + alignUp(obj.values.byteLength, ARRAY_ALIGN_BYTES);\n    case 'LazyHash':\n        return arrayHeadSize;\n    default:\n        throw new Error(`ptrless.export: unsupported on-demand aggregate child '${obj.kind}'`);\n    }\n}\n\nfunction alignedOptionalValiditySize(obj) {\n    return obj.validity ? alignUp(obj.validity.length, ARRAY_ALIGN_BYTES) : 0;\n}\n\nfunction hashChildren(obj) {\n    const out = [];\n    if (obj.meta) {\n        out.push(obj.meta);\n    }\n    if (obj.diagnostic) {\n        out.push(obj.diagnostic);\n    }\n    switch (obj.kind) {\n    case 'BoolScalar':\n    case 'IntScalar':\n    case 'FloatScalar32':\n    case 'FloatScalar64':\n    case 'BytesScalar':\n    case 'IntegralArrow8':\n    case 'IntegralArrow16':\n    case 'IntegralArrow32':\n    case 'IntegralArrow64':\n    case 'FloatArrow32':\n    case 'FloatArrow64':\n    case 'BytesArrow32':\n    case 'BytesArrow64':\n    case 'LazyHash':\n        return out;\n    case 'Hetero':\n    case 'Metadata':\n    case 'Axis':\n        for (const field of obj.fields) {\n            if (field) {\n                out.push(field);\n            }\n        }\n        return out;\n    default:\n        throw new Error(`ptrless.export: unsupported hash walk kind '${obj.kind}'`);\n    }\n}\n\nasync function calculateHash(obj, cache, path) {\n    if (!obj) {\n        throw new Error(`ptrless.export: cannot hash null object`);\n    }\n    const hit = cache.get(obj);\n    if (hit) {\n        return hit;\n    }\n    if ((obj.flags & ptlf.outer_MASK) === ptlf.outer_SCALAR) {\n        const sum = await addDiagnosticHash(obj, await scalarHash(obj), cache, path);\n        cache.set(obj, sum);\n        return sum;\n    }\n\n    const frontierDepth = recursiveFrontierEscapeDepth(obj);\n    if (frontierDepth !== null) {\n        const sum = canonicalClosedFrontierHashBytes(frontierDepth, recursiveFrontierQualifiers(obj));\n        cache.set(obj, sum);\n        return sum;\n    }\n\n    const pos = path.lastIndexOf(obj);\n    if (pos >= 0) {\n        throw new Error(`ptrless.export: recursive payload hashing is not implemented for ${obj.kind}`);\n    }\n    path.push(obj);\n\n    if (obj.kind === 'LazyHash') {\n        if (!(obj.hash instanceof Uint8Array) || obj.hash.length !== HASH_BYTES) {\n            throw new Error(`ptrless.export: LazyHash requires a stored payload hash`);\n        }\n        cache.set(obj, obj.hash);\n        return obj.hash;\n    }\n\n    let bytes = null;\n    switch (obj.kind) {\n    case 'IntegralArrow8':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), valuesBytes8(obj.values));\n        break;\n    case 'IntegralArrow16':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), valuesBytes16(obj.values));\n        break;\n    case 'IntegralArrow32':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), valuesBytes32(obj.values));\n        break;\n    case 'IntegralArrow64':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), valuesBytes64(obj.values));\n        break;\n    case 'FloatArrow32':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), floatValuesBytes32(obj.values));\n        break;\n    case 'FloatArrow64':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), floatValuesBytes64(obj.values));\n        break;\n    case 'BytesArrow32':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), offsetsBytes32(obj.offsets), obj.values);\n        break;\n    case 'BytesArrow64':\n        bytes = concatBytes(hashValidityBytes(obj.validity, Number(obj.length)), offsetsBytes64(obj.offsets), obj.values);\n        break;\n    case 'Hetero':\n        if ((obj.flags & ptlf.SCALAR_VALID) === 0n) {\n            bytes = hashValidityBytes(obj.validity, obj.length);\n            break;\n        }\n        bytes = new Uint8Array(hashValidityBytes(obj.validity, obj.length).length);\n        bytes.set(hashValidityBytes(obj.validity, obj.length), 0);\n        for (const field of obj.fields) {\n            if (!field) {\n                throw new Error(`ptrless.export: hetero field was null`);\n            }\n            bytes = concatBytes(bytes, await childHash(field, cache, path));\n        }\n        break;\n    case 'Axis':\n        bytes = new Uint8Array(hashValidityBytes(obj.validity, obj.length).length);\n        bytes.set(hashValidityBytes(obj.validity, obj.length), 0);\n        for (const field of obj.fields) {\n            bytes = concatBytes(bytes, await childHash(field, cache, path));\n        }\n        break;\n    case 'Metadata': {\n        if ((obj.flags & ptlf.SCALAR_VALID) === 0n) {\n            bytes = hashValidityBytes(obj.validity, obj.length);\n            break;\n        }\n        bytes = new Uint8Array(hashValidityBytes(obj.validity, obj.length).length);\n        bytes.set(hashValidityBytes(obj.validity, obj.length), 0);\n        for (let i = 0; i < obj.fields.length; i++) {\n            const field = obj.fields[i];\n            if (field) {\n                bytes = concatBytes(bytes, await childHash(field, cache, path));\n                continue;\n            }\n            throw new Error(`ptrless.export: metadata field ${i} was null`);\n        }\n        break;\n    }\n    default:\n        throw new Error(`ptrless.export: unsupported hash kind '${obj.kind}'`);\n    }\n\n    path.pop();\n    const sum = await addDiagnosticHash(obj, await sha256(bytes), cache, path);\n    cache.set(obj, sum);\n    return sum;\n}\n\nfunction recursiveFrontierEscapeDepth(obj) {\n    if (obj?.kind !== 'Metadata' || !Array.isArray(obj.fields)) {\n        return null;\n    }\n    const fixed = obj.fields[METADATA_V1_FIXED_INDEX];\n    const subtype = obj.fields[METADATA_V1_SUBTYPE_INDEX];\n    if (!fixed || !subtype || (fixed.flags & ptlf.SCALAR_VALID) === 0n || (subtype.flags & ptlf.SCALAR_VALID) === 0n) {\n        return null;\n    }\n    if (!(subtype.value instanceof Uint8Array) || new TextDecoder().decode(subtype.value) !== 'recursive_frontier') {\n        return null;\n    }\n    const depth = BigInt(fixed.value);\n    if (depth <= 0n) {\n        throw new Error(`ptrless.export: recursive frontier escape depth must be positive, got ${depth}`);\n    }\n    return depth;\n}\n\nfunction recursiveFrontierQualifiers(obj) {\n    const nullable = obj.fields[METADATA_V1_OBJECT_NULLABLE_INDEX];\n    return nullable?.value === true ? 1n : 0n;\n}\n\nasync function childHash(obj, cache, path) {\n    let hash = obj.hash;\n    if (!hash || hash.length !== HASH_BYTES) {\n        hash = await calculateHash(obj, cache, path);\n    }\n    return hash;\n}\n\nasync function addDiagnosticHash(obj, payloadHash, cache, path) {\n    if (!obj.diagnostic) {\n        return payloadHash;\n    }\n    const diagnosticHash = await childHash(obj.diagnostic, cache, path);\n    return await sha256(concatBytes(payloadHash, diagnosticHash));\n}\n\n// payloadHash returns the payload hash, including the diagnostic when present,\n// for one constructed object.\nexport async function payloadHash(obj) {\n    if (!obj) {\n        throw new Error(`ptrless.export.payloadHash: cannot hash null object`);\n    }\n    return await childHash(obj, new WeakMap(), []);\n}\n\n// hashIdentity returns the semantic identity for one constructed object.\nexport async function hashIdentity(obj) {\n    if (!obj) {\n        throw new Error(`ptrless.export.hashIdentity: cannot hash null object`);\n    }\n    // Reusable transport substitution is a payload-edge policy. This hash is\n    // value-based and does not assign a role to the object's identity.\n    const cache = new WeakMap();\n    const path = [];\n    const dataHash = await childHash(obj, cache, path);\n    const meta = obj.meta ?? null;\n    // Constructed metadata nodes represent the generated schema bootstrap.\n    // As in C and the imported-object hash path, their effective direct\n    // metadata hash is their own payload hash.\n    let metaHash;\n    if (meta) {\n        metaHash = await childHash(meta, cache, path);\n    } else if (obj.kind === 'Metadata') {\n        metaHash = dataHash;\n    } else {\n        throw new Error(`ptrless.export.hashIdentity: object ${obj.kind ?? typeof obj} has no metadata`);\n    }\n    const iaxisHash = obj.iaxis ? await childHash(domainGuid(obj.iaxis), cache, path) : new Uint8Array(HASH_BYTES);\n    return hashIdentityBytesSync(dataHash, metaHash, iaxisHash);\n}\n\nfunction domainGuid(axis) {\n    if (axis?.kind !== 'Axis' || !Array.isArray(axis.fields) || axis.fields.length !== 3 || !axis.fields[2]) {\n        throw new Error(`ptrless.export.hashIdentity: invalid Axis domain attachment`);\n    }\n    return axis.fields[2];\n}\n\nasync function scalarHash(obj) {\n    switch (obj.kind) {\n    case 'BoolScalar':\n        return sha256(Uint8Array.of((obj.flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0, (obj.flags & (ptlf.SCALAR_VALID | ptlf.SCALAR_BOOL)) === (ptlf.SCALAR_VALID | ptlf.SCALAR_BOOL) ? 1 : 0));\n    case 'IntScalar':\n        // Signed scalar hashing follows the canonical int64 runtime cell, not the nominal bitwidth.\n        return sha256(concatBytes(Uint8Array.of((obj.flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0), i64Bytes(obj.value)));\n    case 'FloatScalar32':\n        return sha256(concatBytes(Uint8Array.of((obj.flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0), f32Bytes(obj.value)));\n    case 'FloatScalar64':\n        return sha256(concatBytes(Uint8Array.of((obj.flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0), f64Bytes(obj.value)));\n    case 'BytesScalar':\n        return sha256(concatBytes(Uint8Array.of((obj.flags & ptlf.SCALAR_VALID) !== 0n ? 1 : 0), obj.value));\n    default:\n        throw new Error(`ptrless.export: unsupported scalar hash kind '${obj.kind}'`);\n    }\n}\n\nfunction hashValidityBytes(validity, lengthValue) {\n    const length = Number(lengthValue);\n    if (!validity) {\n        const out = new Uint8Array(bitmapBytes(length));\n        out.fill(0xFF);\n        if (length % 8 !== 0 && out.length > 0) {\n            out[out.length - 1] = (1 << (length % 8)) - 1;\n        }\n        return out;\n    }\n    return validity.slice(0, bitmapBytes(length));\n}\n\nfunction offsetsBytes32(offsets) {\n    const out = new Uint8Array(offsets.length * 4);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < offsets.length; i++) {\n        dv.setUint32(i * 4, offsets[i], true);\n    }\n    return out;\n}\n\nfunction offsetsBytes64(offsets) {\n    const out = new Uint8Array(offsets.length * 8);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < offsets.length; i++) {\n        dv.setBigInt64(i * 8, offsets[i], true);\n    }\n    return out;\n}\n\nfunction valuesBytes8(values) {\n    return new Uint8Array(values.buffer.slice(values.byteOffset, values.byteOffset + values.byteLength));\n}\n\nfunction valuesBytes16(values) {\n    const out = new Uint8Array(values.length * 2);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < values.length; i++) {\n        dv.setInt16(i * 2, values[i], true);\n    }\n    return out;\n}\n\nfunction valuesBytes32(values) {\n    const out = new Uint8Array(values.length * 4);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < values.length; i++) {\n        dv.setInt32(i * 4, values[i], true);\n    }\n    return out;\n}\n\nfunction valuesBytes64(values) {\n    const out = new Uint8Array(values.length * 8);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < values.length; i++) {\n        dv.setBigInt64(i * 8, values[i], true);\n    }\n    return out;\n}\n\nfunction floatValuesBytes32(values) {\n    const out = new Uint8Array(values.length * 4);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < values.length; i++) {\n        dv.setFloat32(i * 4, values[i], true);\n    }\n    return out;\n}\n\nfunction floatValuesBytes64(values) {\n    const out = new Uint8Array(values.length * 8);\n    const dv = new DataView(out.buffer);\n    for (let i = 0; i < values.length; i++) {\n        dv.setFloat64(i * 8, values[i], true);\n    }\n    return out;\n}\n\nfunction bitmapBytes(length) {\n    return Math.ceil(length / 8);\n}\n\nfunction writeNumericValues(buf, pos, values, bits, isFloat) {\n    const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n    for (let i = 0; i < values.length; i++) {\n        const off = pos + i * (bits / 8);\n        if (isFloat) {\n            if (bits === 32) {\n                dv.setFloat32(off, values[i], true);\n            } else {\n                dv.setFloat64(off, values[i], true);\n            }\n            continue;\n        }\n        switch (bits) {\n        case 8:\n            dv.setInt8(off, values[i]);\n            break;\n        case 16:\n            dv.setInt16(off, values[i], true);\n            break;\n        case 32:\n            dv.setInt32(off, values[i], true);\n            break;\n        case 64:\n            dv.setBigInt64(off, values[i], true);\n            break;\n        default:\n            throw new Error(`ptrless.export: unsupported numeric write bitwidth ${bits}`);\n        }\n    }\n}\n\nfunction objectNullableFromFlags(flags) {\n    if ((flags & ptlf.outer_MASK) === ptlf.outer_SCALAR) {\n        return (flags & ptlf.inner_NULLABLE) !== 0n;\n    }\n    return (flags & ptlf.outer_NULLABLE) !== 0n;\n}\n\nfunction alignUp(n, align) {\n    if (n <= 0) {\n        return 0;\n    }\n    return Math.ceil(n / align) * align;\n}\n\nfunction putHash(buf, pos, hash) {\n    if (!hash || hash.length !== HASH_BYTES) {\n        throw new Error(`ptrless.export: missing stored hash`);\n    }\n    buf.set(hash, pos);\n}\n\nfunction putU64(buf, pos, value) {\n    new DataView(buf.buffer, buf.byteOffset, buf.byteLength).setBigUint64(pos, BigInt(value), true);\n}\n\nfunction putI64(buf, pos, value) {\n    new DataView(buf.buffer, buf.byteOffset, buf.byteLength).setBigInt64(pos, BigInt(value), true);\n}\n\nfunction i64Bytes(value) {\n    const out = new Uint8Array(8);\n    new DataView(out.buffer).setBigInt64(0, BigInt(value), true);\n    return out;\n}\n\nfunction f32Bytes(value) {\n    const out = new Uint8Array(4);\n    new DataView(out.buffer).setFloat32(0, value, true);\n    return out;\n}\n\nfunction f64Bytes(value) {\n    const out = new Uint8Array(8);\n    new DataView(out.buffer).setFloat64(0, value, true);\n    return out;\n}\n\nfunction bitwidthForBits(bits) {\n    switch (bits) {\n    case 8:\n        return ptlf.bitwidth_8;\n    case 16:\n        return ptlf.bitwidth_16;\n    case 32:\n        return ptlf.bitwidth_32;\n    case 64:\n        return ptlf.bitwidth_64;\n    default:\n        throw new Error(`ptrless.export: unsupported bitwidth ${bits}`);\n    }\n}\n\nfunction decodeNumericBitwidth(flags, fallback) {\n    switch (flags & ptlf.bitwidth_MASK) {\n    case ptlf.bitwidth_8:\n        return 8;\n    case ptlf.bitwidth_16:\n        return 16;\n    case ptlf.bitwidth_32:\n        return 32;\n    case ptlf.bitwidth_64:\n        return 64;\n    default:\n        return fallback;\n    }\n}\n\nasync function sha256(bytes) {\n    const sum = await crypto.subtle.digest('SHA-256', bytes);\n    return new Uint8Array(sum);\n}\n\nfunction concatBytes(...parts) {\n    const total = parts.reduce((sum, part) => sum + part.length, 0);\n    const out = new Uint8Array(total);\n    let offset = 0;\n    for (const part of parts) {\n        out.set(part, offset);\n        offset += part.length;\n    }\n    return out;\n}\n\nfunction toUint8Array(value, where) {\n    if (value instanceof Uint8Array) {\n        return value.slice();\n    }\n    if (value instanceof ArrayBuffer) {\n        return new Uint8Array(value.slice(0));\n    }\n    if (ArrayBuffer.isView(value)) {\n        return new Uint8Array(value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength));\n    }\n    throw new Error(`${where}: value must be a Uint8Array-like object`);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Code generated by puff IDL. DO NOT EDIT.\n\nexport const PuffEditFields = Object.freeze([\"kind\", \"line\", \"col\", \"old_text\", \"new_text\"])\nexport const PuffEditFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"List\", \"List\"])\nexport const PuffEditFieldPhysicalTypes = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\", \"IntegralArrow64\", \"BytesArrow32\", \"BytesArrow32\"])\nexport const PuffEditFieldItemLogicalTypes = Object.freeze([\"Int\", \"Int\", \"Int\", \"Str\", \"Str\"])\nexport const PuffEditFieldItemPhysicalTypes = Object.freeze([null, null, null, null, null])\nexport const PuffEditFieldNullable = Object.freeze([false, false, false, false, false])\nexport const PuffEditFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffEditFieldDeclaredMetadata = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\", \"IntegralArrow64\", \"BytesArrow32\", \"BytesArrow32\"])\nexport const PuffEditSchemaIdentity = Object.freeze([0x81, 0xa0, 0x60, 0x55, 0x6c, 0xba, 0x62, 0x4d, 0x94, 0x3a, 0x61, 0x95, 0xe7, 0xb3, 0xf5, 0x96, 0x08, 0x1c, 0x14, 0xef, 0xfb, 0xc5, 0xb9, 0xbc, 0xf4, 0xca, 0x84, 0x32, 0x64, 0xfe, 0xb3, 0x8e])\nexport const PuffEditPhysicalType = \"puff_Edit\"\nexport const PuffEditFieldCount = 5;\nexport const PuffEditKindField = 0;\nexport const PuffEditLineField = 1;\nexport const PuffEditColField = 2;\nexport const PuffEditOldTextField = 3;\nexport const PuffEditNewTextField = 4;\n\nexport class PuffEdit {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffEdit: expected a fixed-layout object\");\n    const names = PuffEditFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffEdit: fields must exactly match declaration order\");\n    if (!Array.isArray(source.kind)) throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (!Array.isArray(source.line)) throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (!Array.isArray(source.col)) throw new TypeError(\"field col has an incompatible value\");\n    this.col = source.col;\n    if (!Array.isArray(source.old_text)) throw new TypeError(\"field old_text has an incompatible value\");\n    this.old_text = source.old_text;\n    if (!Array.isArray(source.new_text)) throw new TypeError(\"field new_text has an incompatible value\");\n    this.new_text = source.new_text;\n    Object.freeze(this);\n  }\n\n  getKind() { return this.kind; }\n  getLine() { return this.line; }\n  getCol() { return this.col; }\n  getOldText() { return this.old_text; }\n  getNewText() { return this.new_text; }\n\n  static validate(value) { if (value instanceof PuffEdit) return true; try { new PuffEdit(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffEdit) return value; return new PuffEdit(value); }\n\n  toObject() { return {kind: this.kind, line: this.line, col: this.col, old_text: this.old_text, new_text: this.new_text}; }\n}\n\nexport const PuffSessionOpenFields = Object.freeze([\"session_uuid\"])\nexport const PuffSessionOpenFieldLogicalTypes = Object.freeze([\"Bin\"])\nexport const PuffSessionOpenFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffSessionOpenFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffSessionOpenFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffSessionOpenFieldNullable = Object.freeze([false])\nexport const PuffSessionOpenFieldRoles = Object.freeze([\"payload\"])\nexport const PuffSessionOpenFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffSessionOpenSchemaIdentity = Object.freeze([0xdc, 0x09, 0x0b, 0x8c, 0x22, 0x19, 0xda, 0x08, 0xdf, 0x71, 0x3a, 0x32, 0x14, 0xa4, 0x23, 0xfe, 0x5a, 0x31, 0xb6, 0xed, 0xbb, 0x71, 0x74, 0x58, 0x15, 0x5c, 0x00, 0x40, 0xb7, 0x9c, 0x08, 0x9a])\nexport const PuffSessionOpenPhysicalType = \"puff_SessionOpen\"\nexport const PuffSessionOpenFieldCount = 1;\nexport const PuffSessionOpenSessionUuidField = 0;\n\nexport class PuffSessionOpen {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffSessionOpen: expected a fixed-layout object\");\n    const names = PuffSessionOpenFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffSessionOpen: fields must exactly match declaration order\");\n    if (!(source.session_uuid instanceof Uint8Array)) throw new TypeError(\"field session_uuid has an incompatible value\");\n    this.session_uuid = source.session_uuid;\n    Object.freeze(this);\n  }\n\n  getSessionUuid() { return this.session_uuid; }\n\n  static validate(value) { if (value instanceof PuffSessionOpen) return true; try { new PuffSessionOpen(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffSessionOpen) return value; return new PuffSessionOpen(value); }\n\n  toObject() { return {session_uuid: this.session_uuid}; }\n}\n\nexport const PuffEnvelopeFields = Object.freeze([\"uuid\", \"type\", \"method\", \"priority\", \"body\"])\nexport const PuffEnvelopeFieldLogicalTypes = Object.freeze([\"Bin\", \"Str\", \"Str\", \"Int32\", \"Any\"])\nexport const PuffEnvelopeFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", null])\nexport const PuffEnvelopeFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffEnvelopeFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffEnvelopeFieldNullable = Object.freeze([false, false, true, false, false])\nexport const PuffEnvelopeFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffEnvelopeFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", null])\nexport const PuffEnvelopeSchemaIdentity = Object.freeze([0xf4, 0x1a, 0x0a, 0xf4, 0xaa, 0x8b, 0x4b, 0x33, 0xac, 0x68, 0x5a, 0x84, 0xcc, 0x6a, 0x63, 0xae, 0x8d, 0xa7, 0xbc, 0x9f, 0xfa, 0x3b, 0x45, 0x89, 0xda, 0x98, 0x14, 0xf0, 0x30, 0xee, 0xae, 0x6d])\nexport const PuffEnvelopePhysicalType = \"puff_Envelope\"\nexport const PuffEnvelopeFieldCount = 5;\nexport const PuffEnvelopeUuidField = 0;\nexport const PuffEnvelopeTypeField = 1;\nexport const PuffEnvelopeMethodField = 2;\nexport const PuffEnvelopePriorityField = 3;\nexport const PuffEnvelopeBodyField = 4;\n\nexport class PuffEnvelope {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffEnvelope: expected a fixed-layout object\");\n    const names = PuffEnvelopeFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffEnvelope: fields must exactly match declaration order\");\n    if (!(source.uuid instanceof Uint8Array)) throw new TypeError(\"field uuid has an incompatible value\");\n    this.uuid = source.uuid;\n    if (typeof source.type !== \"string\") throw new TypeError(\"field type has an incompatible value\");\n    this.type = source.type;\n    if (source.method !== null && (typeof source.method !== \"string\")) throw new TypeError(\"field method has an incompatible value\");\n    this.method = source.method;\n    if (typeof source.priority !== \"number\") throw new TypeError(\"field priority has an incompatible value\");\n    this.priority = source.priority;\n    if (false) throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    Object.freeze(this);\n  }\n\n  getUuid() { return this.uuid; }\n  getType() { return this.type; }\n  getMethod() { return this.method; }\n  getPriority() { return this.priority; }\n  getBody() { return this.body; }\n\n  static validate(value) { if (value instanceof PuffEnvelope) return true; try { new PuffEnvelope(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffEnvelope) return value; return new PuffEnvelope(value); }\n\n  toObject() { return {uuid: this.uuid, type: this.type, method: this.method, priority: this.priority, body: this.body}; }\n}\n\nexport const PuffAdvanceBookRequestFields = Object.freeze([\"book_id\", \"version\", \"edits\"])\nexport const PuffAdvanceBookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Struct\"])\nexport const PuffAdvanceBookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"puff_Edit\"])\nexport const PuffAdvanceBookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffAdvanceBookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffAdvanceBookRequestFieldNullable = Object.freeze([false, false, false])\nexport const PuffAdvanceBookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffAdvanceBookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"puff_Edit\"])\nexport const PuffAdvanceBookRequestSchemaIdentity = Object.freeze([0xe4, 0x27, 0x77, 0x1d, 0xb6, 0x91, 0x50, 0xbf, 0xfe, 0x19, 0xc5, 0x75, 0xb2, 0x0b, 0x89, 0xe9, 0x37, 0xf9, 0xac, 0x62, 0xa5, 0x22, 0x9e, 0x36, 0xa1, 0x6d, 0xc6, 0xab, 0x97, 0x56, 0x31, 0x38])\nexport const PuffAdvanceBookRequestPhysicalType = \"puff_AdvanceBookRequest\"\nexport const PuffAdvanceBookRequestFieldCount = 3;\nexport const PuffAdvanceBookRequestBookIdField = 0;\nexport const PuffAdvanceBookRequestVersionField = 1;\nexport const PuffAdvanceBookRequestEditsField = 2;\n\nexport class PuffAdvanceBookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAdvanceBookRequest: expected a fixed-layout object\");\n    const names = PuffAdvanceBookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAdvanceBookRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    if (source.edits === null || typeof source.edits !== \"object\") throw new TypeError(\"field edits has an incompatible value\");\n    this.edits = source.edits;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n  getEdits() { return this.edits; }\n\n  static validate(value) { if (value instanceof PuffAdvanceBookRequest) return true; try { new PuffAdvanceBookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAdvanceBookRequest) return value; return new PuffAdvanceBookRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version, edits: this.edits}; }\n}\n\nexport const PuffProjectionLineChangeFields = Object.freeze([\"line\", \"export_name\", \"lifecycle\", \"result_kind\", \"output\", \"error_payload\", \"preview_hints\"])\nexport const PuffProjectionLineChangeFieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Str\", \"Any\", \"Bin\", \"Any\"])\nexport const PuffProjectionLineChangeFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", null, \"BytesScalar\", null])\nexport const PuffProjectionLineChangeFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffProjectionLineChangeFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffProjectionLineChangeFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffProjectionLineChangeFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffProjectionLineChangeFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", null, \"BytesScalar\", null])\nexport const PuffProjectionLineChangeSchemaIdentity = Object.freeze([0x07, 0xd2, 0xd1, 0x19, 0x65, 0xca, 0xa1, 0xd4, 0xa7, 0xb1, 0xbc, 0x8e, 0x0f, 0x79, 0x21, 0xf7, 0x79, 0xee, 0xdc, 0x41, 0xbf, 0xf7, 0x72, 0x0f, 0x48, 0xb3, 0xc3, 0x7d, 0xf2, 0xe8, 0x2c, 0xa2])\nexport const PuffProjectionLineChangePhysicalType = \"puff_ProjectionLineChange\"\nexport const PuffProjectionLineChangeFieldCount = 7;\nexport const PuffProjectionLineChangeLineField = 0;\nexport const PuffProjectionLineChangeExportNameField = 1;\nexport const PuffProjectionLineChangeLifecycleField = 2;\nexport const PuffProjectionLineChangeResultKindField = 3;\nexport const PuffProjectionLineChangeOutputField = 4;\nexport const PuffProjectionLineChangeErrorPayloadField = 5;\nexport const PuffProjectionLineChangePreviewHintsField = 6;\n\nexport class PuffProjectionLineChange {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffProjectionLineChange: expected a fixed-layout object\");\n    const names = PuffProjectionLineChangeFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffProjectionLineChange: fields must exactly match declaration order\");\n    if (typeof source.line !== \"number\") throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (typeof source.export_name !== \"string\") throw new TypeError(\"field export_name has an incompatible value\");\n    this.export_name = source.export_name;\n    if (typeof source.lifecycle !== \"string\") throw new TypeError(\"field lifecycle has an incompatible value\");\n    this.lifecycle = source.lifecycle;\n    if (typeof source.result_kind !== \"string\") throw new TypeError(\"field result_kind has an incompatible value\");\n    this.result_kind = source.result_kind;\n    if (false) throw new TypeError(\"field output has an incompatible value\");\n    this.output = source.output;\n    if (!(source.error_payload instanceof Uint8Array)) throw new TypeError(\"field error_payload has an incompatible value\");\n    this.error_payload = source.error_payload;\n    if (false) throw new TypeError(\"field preview_hints has an incompatible value\");\n    this.preview_hints = source.preview_hints;\n    Object.freeze(this);\n  }\n\n  getLine() { return this.line; }\n  getExportName() { return this.export_name; }\n  getLifecycle() { return this.lifecycle; }\n  getResultKind() { return this.result_kind; }\n  getOutput() { return this.output; }\n  getErrorPayload() { return this.error_payload; }\n  getPreviewHints() { return this.preview_hints; }\n\n  static validate(value) { if (value instanceof PuffProjectionLineChange) return true; try { new PuffProjectionLineChange(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffProjectionLineChange) return value; return new PuffProjectionLineChange(value); }\n\n  toObject() { return {line: this.line, export_name: this.export_name, lifecycle: this.lifecycle, result_kind: this.result_kind, output: this.output, error_payload: this.error_payload, preview_hints: this.preview_hints}; }\n}\n\nexport const PuffMaintenanceSourceCutFields = Object.freeze([\"edits\"])\nexport const PuffMaintenanceSourceCutFieldLogicalTypes = Object.freeze([\"Struct\"])\nexport const PuffMaintenanceSourceCutFieldPhysicalTypes = Object.freeze([\"puff_Edit\"])\nexport const PuffMaintenanceSourceCutFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffMaintenanceSourceCutFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffMaintenanceSourceCutFieldNullable = Object.freeze([false])\nexport const PuffMaintenanceSourceCutFieldRoles = Object.freeze([\"payload\"])\nexport const PuffMaintenanceSourceCutFieldDeclaredMetadata = Object.freeze([\"puff_Edit\"])\nexport const PuffMaintenanceSourceCutSchemaIdentity = Object.freeze([0x10, 0x0c, 0x69, 0x38, 0xe1, 0x4c, 0x59, 0x63, 0xed, 0x92, 0x6e, 0xe5, 0xa3, 0x53, 0x91, 0x18, 0x46, 0xa1, 0x16, 0x2d, 0x33, 0xf3, 0x2e, 0x29, 0x3c, 0x17, 0xe6, 0xce, 0x50, 0xfe, 0x72, 0xb2])\nexport const PuffMaintenanceSourceCutPhysicalType = \"puff_MaintenanceSourceCut\"\nexport const PuffMaintenanceSourceCutFieldCount = 1;\nexport const PuffMaintenanceSourceCutEditsField = 0;\n\nexport class PuffMaintenanceSourceCut {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenanceSourceCut: expected a fixed-layout object\");\n    const names = PuffMaintenanceSourceCutFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenanceSourceCut: fields must exactly match declaration order\");\n    if (source.edits === null || typeof source.edits !== \"object\") throw new TypeError(\"field edits has an incompatible value\");\n    this.edits = source.edits;\n    Object.freeze(this);\n  }\n\n  getEdits() { return this.edits; }\n\n  static validate(value) { if (value instanceof PuffMaintenanceSourceCut) return true; try { new PuffMaintenanceSourceCut(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenanceSourceCut) return value; return new PuffMaintenanceSourceCut(value); }\n\n  toObject() { return {edits: this.edits}; }\n}\n\nexport const PuffMaintenanceLineChangesFields = Object.freeze([\"changes\"])\nexport const PuffMaintenanceLineChangesFieldLogicalTypes = Object.freeze([\"Any\"])\nexport const PuffMaintenanceLineChangesFieldPhysicalTypes = Object.freeze([null])\nexport const PuffMaintenanceLineChangesFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffMaintenanceLineChangesFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffMaintenanceLineChangesFieldNullable = Object.freeze([false])\nexport const PuffMaintenanceLineChangesFieldRoles = Object.freeze([\"payload\"])\nexport const PuffMaintenanceLineChangesFieldDeclaredMetadata = Object.freeze([null])\nexport const PuffMaintenanceLineChangesSchemaIdentity = Object.freeze([0x4c, 0x22, 0xc8, 0x94, 0xe6, 0x4c, 0x3d, 0x87, 0x4b, 0xb9, 0x21, 0xff, 0x28, 0xfb, 0xd5, 0xe3, 0x13, 0xd2, 0xc9, 0x12, 0x39, 0x26, 0xcc, 0xef, 0x1e, 0x18, 0xd2, 0xbe, 0x48, 0x97, 0x73, 0x24])\nexport const PuffMaintenanceLineChangesPhysicalType = \"puff_MaintenanceLineChanges\"\nexport const PuffMaintenanceLineChangesFieldCount = 1;\nexport const PuffMaintenanceLineChangesChangesField = 0;\n\nexport class PuffMaintenanceLineChanges {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenanceLineChanges: expected a fixed-layout object\");\n    const names = PuffMaintenanceLineChangesFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenanceLineChanges: fields must exactly match declaration order\");\n    if (false) throw new TypeError(\"field changes has an incompatible value\");\n    this.changes = source.changes;\n    Object.freeze(this);\n  }\n\n  getChanges() { return this.changes; }\n\n  static validate(value) { if (value instanceof PuffMaintenanceLineChanges) return true; try { new PuffMaintenanceLineChanges(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenanceLineChanges) return value; return new PuffMaintenanceLineChanges(value); }\n\n  toObject() { return {changes: this.changes}; }\n}\n\nexport const PuffMaintenanceSnapshotInstallFields = Object.freeze([\"source_body\", \"line_changes\"])\nexport const PuffMaintenanceSnapshotInstallFieldLogicalTypes = Object.freeze([\"Str\", \"Any\"])\nexport const PuffMaintenanceSnapshotInstallFieldPhysicalTypes = Object.freeze([\"BytesScalar\", null])\nexport const PuffMaintenanceSnapshotInstallFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffMaintenanceSnapshotInstallFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffMaintenanceSnapshotInstallFieldNullable = Object.freeze([false, false])\nexport const PuffMaintenanceSnapshotInstallFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffMaintenanceSnapshotInstallFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", null])\nexport const PuffMaintenanceSnapshotInstallSchemaIdentity = Object.freeze([0xb6, 0x36, 0x68, 0xa5, 0xa1, 0x55, 0x30, 0xdc, 0x1e, 0x64, 0xd7, 0x5f, 0x2b, 0x15, 0x00, 0x3c, 0x3b, 0x68, 0x7d, 0x23, 0x93, 0x25, 0x99, 0x76, 0x63, 0x7e, 0x0a, 0xe9, 0x02, 0x1c, 0xc0, 0xb9])\nexport const PuffMaintenanceSnapshotInstallPhysicalType = \"puff_MaintenanceSnapshotInstall\"\nexport const PuffMaintenanceSnapshotInstallFieldCount = 2;\nexport const PuffMaintenanceSnapshotInstallSourceBodyField = 0;\nexport const PuffMaintenanceSnapshotInstallLineChangesField = 1;\n\nexport class PuffMaintenanceSnapshotInstall {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenanceSnapshotInstall: expected a fixed-layout object\");\n    const names = PuffMaintenanceSnapshotInstallFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenanceSnapshotInstall: fields must exactly match declaration order\");\n    if (typeof source.source_body !== \"string\") throw new TypeError(\"field source_body has an incompatible value\");\n    this.source_body = source.source_body;\n    if (false) throw new TypeError(\"field line_changes has an incompatible value\");\n    this.line_changes = source.line_changes;\n    Object.freeze(this);\n  }\n\n  getSourceBody() { return this.source_body; }\n  getLineChanges() { return this.line_changes; }\n\n  static validate(value) { if (value instanceof PuffMaintenanceSnapshotInstall) return true; try { new PuffMaintenanceSnapshotInstall(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenanceSnapshotInstall) return value; return new PuffMaintenanceSnapshotInstall(value); }\n\n  toObject() { return {source_body: this.source_body, line_changes: this.line_changes}; }\n}\n\nexport const PuffMaintenanceStreamFrameFields = Object.freeze([\"session_id\", \"branch\", \"source_path\", \"stream_epoch\", \"stream_seq\", \"kind\", \"payload\"])\nexport const PuffMaintenanceStreamFrameFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Str\", \"Any\"])\nexport const PuffMaintenanceStreamFrameFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", null])\nexport const PuffMaintenanceStreamFrameFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffMaintenanceStreamFrameFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffMaintenanceStreamFrameFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffMaintenanceStreamFrameFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffMaintenanceStreamFrameFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", null])\nexport const PuffMaintenanceStreamFrameSchemaIdentity = Object.freeze([0xed, 0xf7, 0xe6, 0xcc, 0xc9, 0x34, 0xeb, 0x1e, 0xbb, 0xb6, 0xfd, 0x1c, 0x22, 0x6d, 0x21, 0x8a, 0x50, 0x17, 0xc6, 0x4f, 0x55, 0x50, 0x04, 0x5f, 0xbd, 0x5b, 0x9e, 0x80, 0x11, 0x0d, 0x1e, 0xe3])\nexport const PuffMaintenanceStreamFramePhysicalType = \"puff_MaintenanceStreamFrame\"\nexport const PuffMaintenanceStreamFrameFieldCount = 7;\nexport const PuffMaintenanceStreamFrameSessionIdField = 0;\nexport const PuffMaintenanceStreamFrameBranchField = 1;\nexport const PuffMaintenanceStreamFrameSourcePathField = 2;\nexport const PuffMaintenanceStreamFrameStreamEpochField = 3;\nexport const PuffMaintenanceStreamFrameStreamSeqField = 4;\nexport const PuffMaintenanceStreamFrameKindField = 5;\nexport const PuffMaintenanceStreamFramePayloadField = 6;\n\nexport class PuffMaintenanceStreamFrame {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenanceStreamFrame: expected a fixed-layout object\");\n    const names = PuffMaintenanceStreamFrameFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenanceStreamFrame: fields must exactly match declaration order\");\n    if (typeof source.session_id !== \"string\") throw new TypeError(\"field session_id has an incompatible value\");\n    this.session_id = source.session_id;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.stream_epoch !== \"number\") throw new TypeError(\"field stream_epoch has an incompatible value\");\n    this.stream_epoch = source.stream_epoch;\n    if (typeof source.stream_seq !== \"number\") throw new TypeError(\"field stream_seq has an incompatible value\");\n    this.stream_seq = source.stream_seq;\n    if (typeof source.kind !== \"string\") throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (false) throw new TypeError(\"field payload has an incompatible value\");\n    this.payload = source.payload;\n    Object.freeze(this);\n  }\n\n  getSessionId() { return this.session_id; }\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getStreamEpoch() { return this.stream_epoch; }\n  getStreamSeq() { return this.stream_seq; }\n  getKind() { return this.kind; }\n  getPayload() { return this.payload; }\n\n  static validate(value) { if (value instanceof PuffMaintenanceStreamFrame) return true; try { new PuffMaintenanceStreamFrame(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenanceStreamFrame) return value; return new PuffMaintenanceStreamFrame(value); }\n\n  toObject() { return {session_id: this.session_id, branch: this.branch, source_path: this.source_path, stream_epoch: this.stream_epoch, stream_seq: this.stream_seq, kind: this.kind, payload: this.payload}; }\n}\n\nexport const PuffPuffbookOutputRecordFields = Object.freeze([\"line\", \"state\", \"status\", \"payload_ref\", \"result_kind\"])\nexport const PuffPuffbookOutputRecordFieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Str\", \"Str\"])\nexport const PuffPuffbookOutputRecordFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookOutputRecordFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookOutputRecordFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookOutputRecordFieldNullable = Object.freeze([false, false, false, true, false])\nexport const PuffPuffbookOutputRecordFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookOutputRecordFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookOutputRecordSchemaIdentity = Object.freeze([0xc3, 0x15, 0xc0, 0xdd, 0x85, 0x99, 0x81, 0xed, 0x97, 0x0e, 0xa0, 0xfe, 0x22, 0xe4, 0xee, 0x15, 0x51, 0xb2, 0x2e, 0x0d, 0x3c, 0xae, 0x4a, 0x94, 0x6c, 0x99, 0x90, 0x5f, 0x9c, 0x90, 0xa2, 0xae])\nexport const PuffPuffbookOutputRecordPhysicalType = \"puff_PuffbookOutputRecord\"\nexport const PuffPuffbookOutputRecordFieldCount = 5;\nexport const PuffPuffbookOutputRecordLineField = 0;\nexport const PuffPuffbookOutputRecordStateField = 1;\nexport const PuffPuffbookOutputRecordStatusField = 2;\nexport const PuffPuffbookOutputRecordPayloadRefField = 3;\nexport const PuffPuffbookOutputRecordResultKindField = 4;\n\nexport class PuffPuffbookOutputRecord {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookOutputRecord: expected a fixed-layout object\");\n    const names = PuffPuffbookOutputRecordFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookOutputRecord: fields must exactly match declaration order\");\n    if (typeof source.line !== \"number\") throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (typeof source.state !== \"string\") throw new TypeError(\"field state has an incompatible value\");\n    this.state = source.state;\n    if (typeof source.status !== \"string\") throw new TypeError(\"field status has an incompatible value\");\n    this.status = source.status;\n    if (source.payload_ref !== null && (typeof source.payload_ref !== \"string\")) throw new TypeError(\"field payload_ref has an incompatible value\");\n    this.payload_ref = source.payload_ref;\n    if (typeof source.result_kind !== \"string\") throw new TypeError(\"field result_kind has an incompatible value\");\n    this.result_kind = source.result_kind;\n    Object.freeze(this);\n  }\n\n  getLine() { return this.line; }\n  getState() { return this.state; }\n  getStatus() { return this.status; }\n  getPayloadRef() { return this.payload_ref; }\n  getResultKind() { return this.result_kind; }\n\n  static validate(value) { if (value instanceof PuffPuffbookOutputRecord) return true; try { new PuffPuffbookOutputRecord(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookOutputRecord) return value; return new PuffPuffbookOutputRecord(value); }\n\n  toObject() { return {line: this.line, state: this.state, status: this.status, payload_ref: this.payload_ref, result_kind: this.result_kind}; }\n}\n\nexport const PuffPuffbookInlineOutputRecordFields = Object.freeze([\"line\", \"state\", \"status\", \"payload_ref\", \"result_kind\", \"output\"])\nexport const PuffPuffbookInlineOutputRecordFieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\"])\nexport const PuffPuffbookInlineOutputRecordFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookInlineOutputRecordFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookInlineOutputRecordFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookInlineOutputRecordFieldNullable = Object.freeze([false, false, false, true, false, true])\nexport const PuffPuffbookInlineOutputRecordFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookInlineOutputRecordFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookInlineOutputRecordSchemaIdentity = Object.freeze([0x50, 0x38, 0x3a, 0x40, 0x84, 0xf3, 0xaa, 0xe4, 0xef, 0xbd, 0x48, 0x3b, 0xdb, 0xf6, 0x32, 0x62, 0x76, 0x04, 0x8b, 0xa2, 0x28, 0x3b, 0x1e, 0x03, 0xdb, 0x5c, 0xa6, 0x49, 0x39, 0xac, 0xbc, 0xbe])\nexport const PuffPuffbookInlineOutputRecordPhysicalType = \"puff_PuffbookInlineOutputRecord\"\nexport const PuffPuffbookInlineOutputRecordFieldCount = 6;\nexport const PuffPuffbookInlineOutputRecordLineField = 0;\nexport const PuffPuffbookInlineOutputRecordStateField = 1;\nexport const PuffPuffbookInlineOutputRecordStatusField = 2;\nexport const PuffPuffbookInlineOutputRecordPayloadRefField = 3;\nexport const PuffPuffbookInlineOutputRecordResultKindField = 4;\nexport const PuffPuffbookInlineOutputRecordOutputField = 5;\n\nexport class PuffPuffbookInlineOutputRecord {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookInlineOutputRecord: expected a fixed-layout object\");\n    const names = PuffPuffbookInlineOutputRecordFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookInlineOutputRecord: fields must exactly match declaration order\");\n    if (typeof source.line !== \"number\") throw new TypeError(\"field line has an incompatible value\");\n    this.line = source.line;\n    if (typeof source.state !== \"string\") throw new TypeError(\"field state has an incompatible value\");\n    this.state = source.state;\n    if (typeof source.status !== \"string\") throw new TypeError(\"field status has an incompatible value\");\n    this.status = source.status;\n    if (source.payload_ref !== null && (typeof source.payload_ref !== \"string\")) throw new TypeError(\"field payload_ref has an incompatible value\");\n    this.payload_ref = source.payload_ref;\n    if (typeof source.result_kind !== \"string\") throw new TypeError(\"field result_kind has an incompatible value\");\n    this.result_kind = source.result_kind;\n    if (source.output !== null && (typeof source.output !== \"string\")) throw new TypeError(\"field output has an incompatible value\");\n    this.output = source.output;\n    Object.freeze(this);\n  }\n\n  getLine() { return this.line; }\n  getState() { return this.state; }\n  getStatus() { return this.status; }\n  getPayloadRef() { return this.payload_ref; }\n  getResultKind() { return this.result_kind; }\n  getOutput() { return this.output; }\n\n  static validate(value) { if (value instanceof PuffPuffbookInlineOutputRecord) return true; try { new PuffPuffbookInlineOutputRecord(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookInlineOutputRecord) return value; return new PuffPuffbookInlineOutputRecord(value); }\n\n  toObject() { return {line: this.line, state: this.state, status: this.status, payload_ref: this.payload_ref, result_kind: this.result_kind, output: this.output}; }\n}\n\nexport const PuffPuffbookProjectionSnapshotFields = Object.freeze([\"event_type\", \"seq\", \"version\", \"body\", \"body_start_line\", \"body_end_line\", \"total_lines\", \"outputs\", \"start_line\", \"end_line\"])\nexport const PuffPuffbookProjectionSnapshotFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"Str\", \"Int\", \"Int\", \"Int\", \"Any\", \"Int\", \"Int\"])\nexport const PuffPuffbookProjectionSnapshotFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", null, \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffPuffbookProjectionSnapshotFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookProjectionSnapshotFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookProjectionSnapshotFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false])\nexport const PuffPuffbookProjectionSnapshotFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookProjectionSnapshotFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", null, \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffPuffbookProjectionSnapshotSchemaIdentity = Object.freeze([0x73, 0x15, 0x86, 0x1a, 0x0c, 0x33, 0x90, 0x85, 0x33, 0x7d, 0xa3, 0xce, 0x0b, 0xe0, 0x2c, 0x5b, 0x73, 0x05, 0x5f, 0x82, 0xfb, 0x60, 0x5d, 0x69, 0xf7, 0xb9, 0x49, 0x08, 0x42, 0x10, 0x98, 0x89])\nexport const PuffPuffbookProjectionSnapshotPhysicalType = \"puff_PuffbookProjectionSnapshot\"\nexport const PuffPuffbookProjectionSnapshotFieldCount = 10;\nexport const PuffPuffbookProjectionSnapshotEventTypeField = 0;\nexport const PuffPuffbookProjectionSnapshotSeqField = 1;\nexport const PuffPuffbookProjectionSnapshotVersionField = 2;\nexport const PuffPuffbookProjectionSnapshotBodyField = 3;\nexport const PuffPuffbookProjectionSnapshotBodyStartLineField = 4;\nexport const PuffPuffbookProjectionSnapshotBodyEndLineField = 5;\nexport const PuffPuffbookProjectionSnapshotTotalLinesField = 6;\nexport const PuffPuffbookProjectionSnapshotOutputsField = 7;\nexport const PuffPuffbookProjectionSnapshotStartLineField = 8;\nexport const PuffPuffbookProjectionSnapshotEndLineField = 9;\n\nexport class PuffPuffbookProjectionSnapshot {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookProjectionSnapshot: expected a fixed-layout object\");\n    const names = PuffPuffbookProjectionSnapshotFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookProjectionSnapshot: fields must exactly match declaration order\");\n    if (typeof source.event_type !== \"string\") throw new TypeError(\"field event_type has an incompatible value\");\n    this.event_type = source.event_type;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    if (typeof source.body !== \"string\") throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    if (typeof source.body_start_line !== \"number\") throw new TypeError(\"field body_start_line has an incompatible value\");\n    this.body_start_line = source.body_start_line;\n    if (typeof source.body_end_line !== \"number\") throw new TypeError(\"field body_end_line has an incompatible value\");\n    this.body_end_line = source.body_end_line;\n    if (typeof source.total_lines !== \"number\") throw new TypeError(\"field total_lines has an incompatible value\");\n    this.total_lines = source.total_lines;\n    if (false) throw new TypeError(\"field outputs has an incompatible value\");\n    this.outputs = source.outputs;\n    if (typeof source.start_line !== \"number\") throw new TypeError(\"field start_line has an incompatible value\");\n    this.start_line = source.start_line;\n    if (typeof source.end_line !== \"number\") throw new TypeError(\"field end_line has an incompatible value\");\n    this.end_line = source.end_line;\n    Object.freeze(this);\n  }\n\n  getEventType() { return this.event_type; }\n  getSeq() { return this.seq; }\n  getVersion() { return this.version; }\n  getBody() { return this.body; }\n  getBodyStartLine() { return this.body_start_line; }\n  getBodyEndLine() { return this.body_end_line; }\n  getTotalLines() { return this.total_lines; }\n  getOutputs() { return this.outputs; }\n  getStartLine() { return this.start_line; }\n  getEndLine() { return this.end_line; }\n\n  static validate(value) { if (value instanceof PuffPuffbookProjectionSnapshot) return true; try { new PuffPuffbookProjectionSnapshot(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookProjectionSnapshot) return value; return new PuffPuffbookProjectionSnapshot(value); }\n\n  toObject() { return {event_type: this.event_type, seq: this.seq, version: this.version, body: this.body, body_start_line: this.body_start_line, body_end_line: this.body_end_line, total_lines: this.total_lines, outputs: this.outputs, start_line: this.start_line, end_line: this.end_line}; }\n}\n\nexport const PuffPuffbookViewportWindowFields = Object.freeze([\"event_type\", \"seq\", \"body\", \"body_start_line\", \"body_end_line\", \"total_lines\", \"outputs\", \"start_line\", \"end_line\", \"emitted_at\", \"body_mode\", \"body_prefix\", \"body_suffix\"])\nexport const PuffPuffbookViewportWindowFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\", \"Int\", \"Int\", \"Int\", \"Any\", \"Int\", \"Int\", \"Int\", \"Str\", \"Str\", \"Str\"])\nexport const PuffPuffbookViewportWindowFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", null, \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookViewportWindowFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookViewportWindowFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookViewportWindowFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false, false, false, false])\nexport const PuffPuffbookViewportWindowFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookViewportWindowFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", null, \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffPuffbookViewportWindowSchemaIdentity = Object.freeze([0x12, 0x81, 0xca, 0xdb, 0x9e, 0xd5, 0xed, 0x49, 0x39, 0xb9, 0xca, 0x14, 0x80, 0x93, 0x77, 0x09, 0x8e, 0x2b, 0x5b, 0xdb, 0xb1, 0x78, 0xa9, 0xf9, 0x8a, 0xdf, 0x22, 0xcf, 0x7d, 0x8b, 0x23, 0x58])\nexport const PuffPuffbookViewportWindowPhysicalType = \"puff_PuffbookViewportWindow\"\nexport const PuffPuffbookViewportWindowFieldCount = 13;\nexport const PuffPuffbookViewportWindowEventTypeField = 0;\nexport const PuffPuffbookViewportWindowSeqField = 1;\nexport const PuffPuffbookViewportWindowBodyField = 2;\nexport const PuffPuffbookViewportWindowBodyStartLineField = 3;\nexport const PuffPuffbookViewportWindowBodyEndLineField = 4;\nexport const PuffPuffbookViewportWindowTotalLinesField = 5;\nexport const PuffPuffbookViewportWindowOutputsField = 6;\nexport const PuffPuffbookViewportWindowStartLineField = 7;\nexport const PuffPuffbookViewportWindowEndLineField = 8;\nexport const PuffPuffbookViewportWindowEmittedAtField = 9;\nexport const PuffPuffbookViewportWindowBodyModeField = 10;\nexport const PuffPuffbookViewportWindowBodyPrefixField = 11;\nexport const PuffPuffbookViewportWindowBodySuffixField = 12;\n\nexport class PuffPuffbookViewportWindow {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookViewportWindow: expected a fixed-layout object\");\n    const names = PuffPuffbookViewportWindowFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookViewportWindow: fields must exactly match declaration order\");\n    if (typeof source.event_type !== \"string\") throw new TypeError(\"field event_type has an incompatible value\");\n    this.event_type = source.event_type;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (typeof source.body !== \"string\") throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    if (typeof source.body_start_line !== \"number\") throw new TypeError(\"field body_start_line has an incompatible value\");\n    this.body_start_line = source.body_start_line;\n    if (typeof source.body_end_line !== \"number\") throw new TypeError(\"field body_end_line has an incompatible value\");\n    this.body_end_line = source.body_end_line;\n    if (typeof source.total_lines !== \"number\") throw new TypeError(\"field total_lines has an incompatible value\");\n    this.total_lines = source.total_lines;\n    if (false) throw new TypeError(\"field outputs has an incompatible value\");\n    this.outputs = source.outputs;\n    if (typeof source.start_line !== \"number\") throw new TypeError(\"field start_line has an incompatible value\");\n    this.start_line = source.start_line;\n    if (typeof source.end_line !== \"number\") throw new TypeError(\"field end_line has an incompatible value\");\n    this.end_line = source.end_line;\n    if (typeof source.emitted_at !== \"number\") throw new TypeError(\"field emitted_at has an incompatible value\");\n    this.emitted_at = source.emitted_at;\n    if (typeof source.body_mode !== \"string\") throw new TypeError(\"field body_mode has an incompatible value\");\n    this.body_mode = source.body_mode;\n    if (typeof source.body_prefix !== \"string\") throw new TypeError(\"field body_prefix has an incompatible value\");\n    this.body_prefix = source.body_prefix;\n    if (typeof source.body_suffix !== \"string\") throw new TypeError(\"field body_suffix has an incompatible value\");\n    this.body_suffix = source.body_suffix;\n    Object.freeze(this);\n  }\n\n  getEventType() { return this.event_type; }\n  getSeq() { return this.seq; }\n  getBody() { return this.body; }\n  getBodyStartLine() { return this.body_start_line; }\n  getBodyEndLine() { return this.body_end_line; }\n  getTotalLines() { return this.total_lines; }\n  getOutputs() { return this.outputs; }\n  getStartLine() { return this.start_line; }\n  getEndLine() { return this.end_line; }\n  getEmittedAt() { return this.emitted_at; }\n  getBodyMode() { return this.body_mode; }\n  getBodyPrefix() { return this.body_prefix; }\n  getBodySuffix() { return this.body_suffix; }\n\n  static validate(value) { if (value instanceof PuffPuffbookViewportWindow) return true; try { new PuffPuffbookViewportWindow(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookViewportWindow) return value; return new PuffPuffbookViewportWindow(value); }\n\n  toObject() { return {event_type: this.event_type, seq: this.seq, body: this.body, body_start_line: this.body_start_line, body_end_line: this.body_end_line, total_lines: this.total_lines, outputs: this.outputs, start_line: this.start_line, end_line: this.end_line, emitted_at: this.emitted_at, body_mode: this.body_mode, body_prefix: this.body_prefix, body_suffix: this.body_suffix}; }\n}\n\nexport const PuffPuffbookSourceEditAppliedFields = Object.freeze([\"event_type\", \"seq\", \"edits\", \"who\", \"puffbook_instance_id\", \"edit_ordinal\", \"emitted_at\"])\nexport const PuffPuffbookSourceEditAppliedFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Any\", \"Str\", \"Str\", \"Int\", \"Int\"])\nexport const PuffPuffbookSourceEditAppliedFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", null, \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffPuffbookSourceEditAppliedFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookSourceEditAppliedFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookSourceEditAppliedFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffPuffbookSourceEditAppliedFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookSourceEditAppliedFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", null, \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffPuffbookSourceEditAppliedSchemaIdentity = Object.freeze([0xd1, 0x26, 0xb1, 0x9a, 0xef, 0x25, 0x19, 0xa4, 0xdc, 0xf6, 0xdc, 0xfe, 0x97, 0x94, 0xd2, 0xf7, 0x4c, 0xaa, 0xcd, 0xd7, 0x42, 0xab, 0xd4, 0x27, 0xc3, 0x74, 0x06, 0xb9, 0x52, 0xd0, 0x27, 0x70])\nexport const PuffPuffbookSourceEditAppliedPhysicalType = \"puff_PuffbookSourceEditApplied\"\nexport const PuffPuffbookSourceEditAppliedFieldCount = 7;\nexport const PuffPuffbookSourceEditAppliedEventTypeField = 0;\nexport const PuffPuffbookSourceEditAppliedSeqField = 1;\nexport const PuffPuffbookSourceEditAppliedEditsField = 2;\nexport const PuffPuffbookSourceEditAppliedWhoField = 3;\nexport const PuffPuffbookSourceEditAppliedPuffbookInstanceIdField = 4;\nexport const PuffPuffbookSourceEditAppliedEditOrdinalField = 5;\nexport const PuffPuffbookSourceEditAppliedEmittedAtField = 6;\n\nexport class PuffPuffbookSourceEditApplied {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookSourceEditApplied: expected a fixed-layout object\");\n    const names = PuffPuffbookSourceEditAppliedFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookSourceEditApplied: fields must exactly match declaration order\");\n    if (typeof source.event_type !== \"string\") throw new TypeError(\"field event_type has an incompatible value\");\n    this.event_type = source.event_type;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (false) throw new TypeError(\"field edits has an incompatible value\");\n    this.edits = source.edits;\n    if (typeof source.who !== \"string\") throw new TypeError(\"field who has an incompatible value\");\n    this.who = source.who;\n    if (typeof source.puffbook_instance_id !== \"string\") throw new TypeError(\"field puffbook_instance_id has an incompatible value\");\n    this.puffbook_instance_id = source.puffbook_instance_id;\n    if (typeof source.edit_ordinal !== \"number\") throw new TypeError(\"field edit_ordinal has an incompatible value\");\n    this.edit_ordinal = source.edit_ordinal;\n    if (typeof source.emitted_at !== \"number\") throw new TypeError(\"field emitted_at has an incompatible value\");\n    this.emitted_at = source.emitted_at;\n    Object.freeze(this);\n  }\n\n  getEventType() { return this.event_type; }\n  getSeq() { return this.seq; }\n  getEdits() { return this.edits; }\n  getWho() { return this.who; }\n  getPuffbookInstanceId() { return this.puffbook_instance_id; }\n  getEditOrdinal() { return this.edit_ordinal; }\n  getEmittedAt() { return this.emitted_at; }\n\n  static validate(value) { if (value instanceof PuffPuffbookSourceEditApplied) return true; try { new PuffPuffbookSourceEditApplied(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookSourceEditApplied) return value; return new PuffPuffbookSourceEditApplied(value); }\n\n  toObject() { return {event_type: this.event_type, seq: this.seq, edits: this.edits, who: this.who, puffbook_instance_id: this.puffbook_instance_id, edit_ordinal: this.edit_ordinal, emitted_at: this.emitted_at}; }\n}\n\nexport const PuffPuffbookApplyLineChangesFields = Object.freeze([\"event_type\", \"seq\", \"line_changes\", \"emitted_at\"])\nexport const PuffPuffbookApplyLineChangesFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Any\", \"Int\"])\nexport const PuffPuffbookApplyLineChangesFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", null, \"IntegralScalar\"])\nexport const PuffPuffbookApplyLineChangesFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookApplyLineChangesFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookApplyLineChangesFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffPuffbookApplyLineChangesFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookApplyLineChangesFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", null, \"IntegralScalar\"])\nexport const PuffPuffbookApplyLineChangesSchemaIdentity = Object.freeze([0x1b, 0xd6, 0x92, 0x32, 0xde, 0x89, 0x4c, 0x0e, 0xc2, 0x18, 0x57, 0x04, 0x19, 0xd8, 0xcf, 0x78, 0xe0, 0x55, 0x80, 0x32, 0x0a, 0xe1, 0x46, 0x40, 0xb0, 0x4e, 0x80, 0xdc, 0xe0, 0xe8, 0x9b, 0x2a])\nexport const PuffPuffbookApplyLineChangesPhysicalType = \"puff_PuffbookApplyLineChanges\"\nexport const PuffPuffbookApplyLineChangesFieldCount = 4;\nexport const PuffPuffbookApplyLineChangesEventTypeField = 0;\nexport const PuffPuffbookApplyLineChangesSeqField = 1;\nexport const PuffPuffbookApplyLineChangesLineChangesField = 2;\nexport const PuffPuffbookApplyLineChangesEmittedAtField = 3;\n\nexport class PuffPuffbookApplyLineChanges {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookApplyLineChanges: expected a fixed-layout object\");\n    const names = PuffPuffbookApplyLineChangesFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookApplyLineChanges: fields must exactly match declaration order\");\n    if (typeof source.event_type !== \"string\") throw new TypeError(\"field event_type has an incompatible value\");\n    this.event_type = source.event_type;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (false) throw new TypeError(\"field line_changes has an incompatible value\");\n    this.line_changes = source.line_changes;\n    if (typeof source.emitted_at !== \"number\") throw new TypeError(\"field emitted_at has an incompatible value\");\n    this.emitted_at = source.emitted_at;\n    Object.freeze(this);\n  }\n\n  getEventType() { return this.event_type; }\n  getSeq() { return this.seq; }\n  getLineChanges() { return this.line_changes; }\n  getEmittedAt() { return this.emitted_at; }\n\n  static validate(value) { if (value instanceof PuffPuffbookApplyLineChanges) return true; try { new PuffPuffbookApplyLineChanges(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookApplyLineChanges) return value; return new PuffPuffbookApplyLineChanges(value); }\n\n  toObject() { return {event_type: this.event_type, seq: this.seq, line_changes: this.line_changes, emitted_at: this.emitted_at}; }\n}\n\nexport const PuffPuffbookPayloadValueFields = Object.freeze([\"subscription_uuid\", \"payload_ref\", \"value\", \"preview_hints\"])\nexport const PuffPuffbookPayloadValueFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Any\", \"Any\"])\nexport const PuffPuffbookPayloadValueFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", null, null])\nexport const PuffPuffbookPayloadValueFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPuffbookPayloadValueFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPuffbookPayloadValueFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffPuffbookPayloadValueFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPuffbookPayloadValueFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", null, null])\nexport const PuffPuffbookPayloadValueSchemaIdentity = Object.freeze([0xc0, 0x46, 0x90, 0x55, 0x7d, 0xe2, 0x6a, 0xcf, 0x56, 0x9e, 0x40, 0x4e, 0xec, 0x21, 0xab, 0x6c, 0xd4, 0x9c, 0x39, 0x06, 0x92, 0x11, 0x61, 0x03, 0xe4, 0xcd, 0x10, 0xb9, 0x97, 0xc8, 0xf9, 0xd9])\nexport const PuffPuffbookPayloadValuePhysicalType = \"puff_PuffbookPayloadValue\"\nexport const PuffPuffbookPayloadValueFieldCount = 4;\nexport const PuffPuffbookPayloadValueSubscriptionUuidField = 0;\nexport const PuffPuffbookPayloadValuePayloadRefField = 1;\nexport const PuffPuffbookPayloadValueValueField = 2;\nexport const PuffPuffbookPayloadValuePreviewHintsField = 3;\n\nexport class PuffPuffbookPayloadValue {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPuffbookPayloadValue: expected a fixed-layout object\");\n    const names = PuffPuffbookPayloadValueFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPuffbookPayloadValue: fields must exactly match declaration order\");\n    if (typeof source.subscription_uuid !== \"string\") throw new TypeError(\"field subscription_uuid has an incompatible value\");\n    this.subscription_uuid = source.subscription_uuid;\n    if (typeof source.payload_ref !== \"string\") throw new TypeError(\"field payload_ref has an incompatible value\");\n    this.payload_ref = source.payload_ref;\n    if (false) throw new TypeError(\"field value has an incompatible value\");\n    this.value = source.value;\n    if (false) throw new TypeError(\"field preview_hints has an incompatible value\");\n    this.preview_hints = source.preview_hints;\n    Object.freeze(this);\n  }\n\n  getSubscriptionUuid() { return this.subscription_uuid; }\n  getPayloadRef() { return this.payload_ref; }\n  getValue() { return this.value; }\n  getPreviewHints() { return this.preview_hints; }\n\n  static validate(value) { if (value instanceof PuffPuffbookPayloadValue) return true; try { new PuffPuffbookPayloadValue(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPuffbookPayloadValue) return value; return new PuffPuffbookPayloadValue(value); }\n\n  toObject() { return {subscription_uuid: this.subscription_uuid, payload_ref: this.payload_ref, value: this.value, preview_hints: this.preview_hints}; }\n}\n\nexport const PuffCompileRequestFields = Object.freeze([\"src\"])\nexport const PuffCompileRequestFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffCompileRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffCompileRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffCompileRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffCompileRequestFieldNullable = Object.freeze([false])\nexport const PuffCompileRequestFieldRoles = Object.freeze([\"payload\"])\nexport const PuffCompileRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffCompileRequestSchemaIdentity = Object.freeze([0xef, 0x21, 0x19, 0x09, 0x52, 0xd9, 0xaa, 0x39, 0xeb, 0x6d, 0x37, 0xc1, 0xae, 0x54, 0x84, 0x0a, 0x24, 0xdf, 0x68, 0x71, 0x4b, 0xc0, 0xfb, 0x13, 0x3f, 0x70, 0xa5, 0x71, 0x9f, 0x9e, 0x8f, 0x22])\nexport const PuffCompileRequestPhysicalType = \"puff_CompileRequest\"\nexport const PuffCompileRequestFieldCount = 1;\nexport const PuffCompileRequestSrcField = 0;\n\nexport class PuffCompileRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffCompileRequest: expected a fixed-layout object\");\n    const names = PuffCompileRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffCompileRequest: fields must exactly match declaration order\");\n    if (typeof source.src !== \"string\") throw new TypeError(\"field src has an incompatible value\");\n    this.src = source.src;\n    Object.freeze(this);\n  }\n\n  getSrc() { return this.src; }\n\n  static validate(value) { if (value instanceof PuffCompileRequest) return true; try { new PuffCompileRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffCompileRequest) return value; return new PuffCompileRequest(value); }\n\n  toObject() { return {src: this.src}; }\n}\n\nexport const PuffAmendRequestFields = Object.freeze([\"handle\", \"line_num\", \"change\"])\nexport const PuffAmendRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\"])\nexport const PuffAmendRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffAmendRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffAmendRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffAmendRequestFieldNullable = Object.freeze([false, false, false])\nexport const PuffAmendRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffAmendRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffAmendRequestSchemaIdentity = Object.freeze([0x45, 0x8e, 0xb6, 0xb6, 0x52, 0x3e, 0xb5, 0x68, 0x8e, 0x20, 0xac, 0x01, 0x14, 0x83, 0x8a, 0x2f, 0x41, 0xda, 0x2b, 0x5e, 0x12, 0xcf, 0x8b, 0xfe, 0xab, 0x04, 0xd3, 0xd1, 0xe3, 0x65, 0xa1, 0xdd])\nexport const PuffAmendRequestPhysicalType = \"puff_AmendRequest\"\nexport const PuffAmendRequestFieldCount = 3;\nexport const PuffAmendRequestHandleField = 0;\nexport const PuffAmendRequestLineNumField = 1;\nexport const PuffAmendRequestChangeField = 2;\n\nexport class PuffAmendRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAmendRequest: expected a fixed-layout object\");\n    const names = PuffAmendRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAmendRequest: fields must exactly match declaration order\");\n    if (typeof source.handle !== \"string\") throw new TypeError(\"field handle has an incompatible value\");\n    this.handle = source.handle;\n    if (typeof source.line_num !== \"number\") throw new TypeError(\"field line_num has an incompatible value\");\n    this.line_num = source.line_num;\n    if (typeof source.change !== \"string\") throw new TypeError(\"field change has an incompatible value\");\n    this.change = source.change;\n    Object.freeze(this);\n  }\n\n  getHandle() { return this.handle; }\n  getLineNum() { return this.line_num; }\n  getChange() { return this.change; }\n\n  static validate(value) { if (value instanceof PuffAmendRequest) return true; try { new PuffAmendRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAmendRequest) return value; return new PuffAmendRequest(value); }\n\n  toObject() { return {handle: this.handle, line_num: this.line_num, change: this.change}; }\n}\n\nexport const PuffComputeRequestFields = Object.freeze([\"handle\", \"line_num\", \"username\"])\nexport const PuffComputeRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\"])\nexport const PuffComputeRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffComputeRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffComputeRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffComputeRequestFieldNullable = Object.freeze([false, false, false])\nexport const PuffComputeRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffComputeRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffComputeRequestSchemaIdentity = Object.freeze([0xbd, 0xe3, 0x55, 0x91, 0xcf, 0xa8, 0xd9, 0x30, 0x88, 0xb4, 0xc3, 0xea, 0xde, 0x6c, 0x09, 0x0d, 0xc9, 0xc2, 0xb8, 0xf7, 0x77, 0xd8, 0x4a, 0xfa, 0x98, 0xc7, 0x32, 0xc5, 0x26, 0x22, 0xf9, 0x87])\nexport const PuffComputeRequestPhysicalType = \"puff_ComputeRequest\"\nexport const PuffComputeRequestFieldCount = 3;\nexport const PuffComputeRequestHandleField = 0;\nexport const PuffComputeRequestLineNumField = 1;\nexport const PuffComputeRequestUsernameField = 2;\n\nexport class PuffComputeRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffComputeRequest: expected a fixed-layout object\");\n    const names = PuffComputeRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffComputeRequest: fields must exactly match declaration order\");\n    if (typeof source.handle !== \"string\") throw new TypeError(\"field handle has an incompatible value\");\n    this.handle = source.handle;\n    if (typeof source.line_num !== \"number\") throw new TypeError(\"field line_num has an incompatible value\");\n    this.line_num = source.line_num;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    Object.freeze(this);\n  }\n\n  getHandle() { return this.handle; }\n  getLineNum() { return this.line_num; }\n  getUsername() { return this.username; }\n\n  static validate(value) { if (value instanceof PuffComputeRequest) return true; try { new PuffComputeRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffComputeRequest) return value; return new PuffComputeRequest(value); }\n\n  toObject() { return {handle: this.handle, line_num: this.line_num, username: this.username}; }\n}\n\nexport const PuffSeedBookRequestFields = Object.freeze([\"book_id\", \"version\", \"body\"])\nexport const PuffSeedBookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\"])\nexport const PuffSeedBookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffSeedBookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffSeedBookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffSeedBookRequestFieldNullable = Object.freeze([false, false, false])\nexport const PuffSeedBookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffSeedBookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffSeedBookRequestSchemaIdentity = Object.freeze([0xf6, 0x69, 0x76, 0xaf, 0x10, 0xd6, 0x81, 0xc2, 0x0f, 0xc0, 0x7b, 0x5c, 0xde, 0x24, 0xc5, 0x85, 0x2c, 0xd9, 0xac, 0xf2, 0x9f, 0xe6, 0xd4, 0x9c, 0x58, 0xff, 0xd8, 0x78, 0x2e, 0x4d, 0x43, 0xcd])\nexport const PuffSeedBookRequestPhysicalType = \"puff_SeedBookRequest\"\nexport const PuffSeedBookRequestFieldCount = 3;\nexport const PuffSeedBookRequestBookIdField = 0;\nexport const PuffSeedBookRequestVersionField = 1;\nexport const PuffSeedBookRequestBodyField = 2;\n\nexport class PuffSeedBookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffSeedBookRequest: expected a fixed-layout object\");\n    const names = PuffSeedBookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffSeedBookRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    if (typeof source.body !== \"string\") throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n  getBody() { return this.body; }\n\n  static validate(value) { if (value instanceof PuffSeedBookRequest) return true; try { new PuffSeedBookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffSeedBookRequest) return value; return new PuffSeedBookRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version, body: this.body}; }\n}\n\nexport const PuffAdvanceEarliestRequestFields = Object.freeze([\"book_id\", \"version\"])\nexport const PuffAdvanceEarliestRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\"])\nexport const PuffAdvanceEarliestRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\"])\nexport const PuffAdvanceEarliestRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffAdvanceEarliestRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffAdvanceEarliestRequestFieldNullable = Object.freeze([false, false])\nexport const PuffAdvanceEarliestRequestFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffAdvanceEarliestRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\"])\nexport const PuffAdvanceEarliestRequestSchemaIdentity = Object.freeze([0xa7, 0x90, 0xca, 0xf0, 0x86, 0x9e, 0x45, 0xcb, 0xe5, 0x19, 0xbe, 0x59, 0x6f, 0xfd, 0xfa, 0xbd, 0x95, 0xed, 0x57, 0x0d, 0x08, 0x7a, 0x74, 0x2e, 0xf7, 0x23, 0xb9, 0x2b, 0xbb, 0x7f, 0x5f, 0xe2])\nexport const PuffAdvanceEarliestRequestPhysicalType = \"puff_AdvanceEarliestRequest\"\nexport const PuffAdvanceEarliestRequestFieldCount = 2;\nexport const PuffAdvanceEarliestRequestBookIdField = 0;\nexport const PuffAdvanceEarliestRequestVersionField = 1;\n\nexport class PuffAdvanceEarliestRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAdvanceEarliestRequest: expected a fixed-layout object\");\n    const names = PuffAdvanceEarliestRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAdvanceEarliestRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n\n  static validate(value) { if (value instanceof PuffAdvanceEarliestRequest) return true; try { new PuffAdvanceEarliestRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAdvanceEarliestRequest) return value; return new PuffAdvanceEarliestRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version}; }\n}\n\nexport const PuffOutputBookLinesRequestFields = Object.freeze([\"book_id\", \"version\"])\nexport const PuffOutputBookLinesRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\"])\nexport const PuffOutputBookLinesRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\"])\nexport const PuffOutputBookLinesRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffOutputBookLinesRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffOutputBookLinesRequestFieldNullable = Object.freeze([false, false])\nexport const PuffOutputBookLinesRequestFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffOutputBookLinesRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\"])\nexport const PuffOutputBookLinesRequestSchemaIdentity = Object.freeze([0x3c, 0x4f, 0xef, 0x76, 0xba, 0xfc, 0x29, 0x52, 0xdf, 0x3c, 0x2a, 0xc4, 0x1b, 0xa4, 0x21, 0x9a, 0xe7, 0x1c, 0xb9, 0xf9, 0xce, 0xfe, 0x93, 0x5b, 0xbe, 0x14, 0x2c, 0x21, 0xcc, 0xd6, 0x1f, 0xb4])\nexport const PuffOutputBookLinesRequestPhysicalType = \"puff_OutputBookLinesRequest\"\nexport const PuffOutputBookLinesRequestFieldCount = 2;\nexport const PuffOutputBookLinesRequestBookIdField = 0;\nexport const PuffOutputBookLinesRequestVersionField = 1;\n\nexport class PuffOutputBookLinesRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffOutputBookLinesRequest: expected a fixed-layout object\");\n    const names = PuffOutputBookLinesRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffOutputBookLinesRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n\n  static validate(value) { if (value instanceof PuffOutputBookLinesRequest) return true; try { new PuffOutputBookLinesRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffOutputBookLinesRequest) return value; return new PuffOutputBookLinesRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version}; }\n}\n\nexport const PuffExportBookRequestFields = Object.freeze([\"book_id\", \"version\", \"export_name\", \"username\", \"lake\", \"branch\", \"source_path\", \"ambient_at_unix_ms\", \"load_snapshot_physical\"])\nexport const PuffExportBookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Str\"])\nexport const PuffExportBookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffExportBookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffExportBookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffExportBookRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false])\nexport const PuffExportBookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffExportBookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffExportBookRequestSchemaIdentity = Object.freeze([0x0b, 0xb6, 0x0b, 0x97, 0xa6, 0x3b, 0x3b, 0xac, 0xa4, 0x04, 0x0b, 0x32, 0x31, 0x60, 0x3a, 0x39, 0xda, 0x98, 0x73, 0xa2, 0xef, 0x9e, 0x5c, 0x02, 0x2e, 0xb4, 0xb2, 0xb8, 0xe2, 0x48, 0x31, 0xbe])\nexport const PuffExportBookRequestPhysicalType = \"puff_ExportBookRequest\"\nexport const PuffExportBookRequestFieldCount = 9;\nexport const PuffExportBookRequestBookIdField = 0;\nexport const PuffExportBookRequestVersionField = 1;\nexport const PuffExportBookRequestExportNameField = 2;\nexport const PuffExportBookRequestUsernameField = 3;\nexport const PuffExportBookRequestLakeField = 4;\nexport const PuffExportBookRequestBranchField = 5;\nexport const PuffExportBookRequestSourcePathField = 6;\nexport const PuffExportBookRequestAmbientAtUnixMsField = 7;\nexport const PuffExportBookRequestLoadSnapshotPhysicalField = 8;\n\nexport class PuffExportBookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffExportBookRequest: expected a fixed-layout object\");\n    const names = PuffExportBookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffExportBookRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    if (typeof source.export_name !== \"string\") throw new TypeError(\"field export_name has an incompatible value\");\n    this.export_name = source.export_name;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.ambient_at_unix_ms !== \"number\") throw new TypeError(\"field ambient_at_unix_ms has an incompatible value\");\n    this.ambient_at_unix_ms = source.ambient_at_unix_ms;\n    if (typeof source.load_snapshot_physical !== \"string\") throw new TypeError(\"field load_snapshot_physical has an incompatible value\");\n    this.load_snapshot_physical = source.load_snapshot_physical;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n  getExportName() { return this.export_name; }\n  getUsername() { return this.username; }\n  getLake() { return this.lake; }\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getAmbientAtUnixMs() { return this.ambient_at_unix_ms; }\n  getLoadSnapshotPhysical() { return this.load_snapshot_physical; }\n\n  static validate(value) { if (value instanceof PuffExportBookRequest) return true; try { new PuffExportBookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffExportBookRequest) return value; return new PuffExportBookRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version, export_name: this.export_name, username: this.username, lake: this.lake, branch: this.branch, source_path: this.source_path, ambient_at_unix_ms: this.ambient_at_unix_ms, load_snapshot_physical: this.load_snapshot_physical}; }\n}\n\nexport const PuffExportSourceRequestFields = Object.freeze([\"source_path\", \"body\", \"export_name\", \"username\", \"lake\", \"branch\", \"ambient_at_unix_ms\", \"load_snapshot_physical\"])\nexport const PuffExportSourceRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Str\"])\nexport const PuffExportSourceRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffExportSourceRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffExportSourceRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffExportSourceRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false])\nexport const PuffExportSourceRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffExportSourceRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffExportSourceRequestSchemaIdentity = Object.freeze([0x50, 0xb0, 0xcc, 0xb0, 0x18, 0xd5, 0xaa, 0xc5, 0x51, 0x1f, 0x83, 0xab, 0xb0, 0xbe, 0xa0, 0x14, 0xd3, 0x29, 0x11, 0x33, 0x25, 0x60, 0x93, 0x7f, 0x8e, 0x9f, 0x10, 0x62, 0x05, 0x9b, 0x74, 0x60])\nexport const PuffExportSourceRequestPhysicalType = \"puff_ExportSourceRequest\"\nexport const PuffExportSourceRequestFieldCount = 8;\nexport const PuffExportSourceRequestSourcePathField = 0;\nexport const PuffExportSourceRequestBodyField = 1;\nexport const PuffExportSourceRequestExportNameField = 2;\nexport const PuffExportSourceRequestUsernameField = 3;\nexport const PuffExportSourceRequestLakeField = 4;\nexport const PuffExportSourceRequestBranchField = 5;\nexport const PuffExportSourceRequestAmbientAtUnixMsField = 6;\nexport const PuffExportSourceRequestLoadSnapshotPhysicalField = 7;\n\nexport class PuffExportSourceRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffExportSourceRequest: expected a fixed-layout object\");\n    const names = PuffExportSourceRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffExportSourceRequest: fields must exactly match declaration order\");\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.body !== \"string\") throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    if (typeof source.export_name !== \"string\") throw new TypeError(\"field export_name has an incompatible value\");\n    this.export_name = source.export_name;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.ambient_at_unix_ms !== \"number\") throw new TypeError(\"field ambient_at_unix_ms has an incompatible value\");\n    this.ambient_at_unix_ms = source.ambient_at_unix_ms;\n    if (typeof source.load_snapshot_physical !== \"string\") throw new TypeError(\"field load_snapshot_physical has an incompatible value\");\n    this.load_snapshot_physical = source.load_snapshot_physical;\n    Object.freeze(this);\n  }\n\n  getSourcePath() { return this.source_path; }\n  getBody() { return this.body; }\n  getExportName() { return this.export_name; }\n  getUsername() { return this.username; }\n  getLake() { return this.lake; }\n  getBranch() { return this.branch; }\n  getAmbientAtUnixMs() { return this.ambient_at_unix_ms; }\n  getLoadSnapshotPhysical() { return this.load_snapshot_physical; }\n\n  static validate(value) { if (value instanceof PuffExportSourceRequest) return true; try { new PuffExportSourceRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffExportSourceRequest) return value; return new PuffExportSourceRequest(value); }\n\n  toObject() { return {source_path: this.source_path, body: this.body, export_name: this.export_name, username: this.username, lake: this.lake, branch: this.branch, ambient_at_unix_ms: this.ambient_at_unix_ms, load_snapshot_physical: this.load_snapshot_physical}; }\n}\n\nexport const PuffSeedBookResultFields = Object.freeze([\"line_kinds\", \"line_from_lines\"])\nexport const PuffSeedBookResultFieldLogicalTypes = Object.freeze([\"List\", \"List\"])\nexport const PuffSeedBookResultFieldPhysicalTypes = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\"])\nexport const PuffSeedBookResultFieldItemLogicalTypes = Object.freeze([\"Int\", \"Int\"])\nexport const PuffSeedBookResultFieldItemPhysicalTypes = Object.freeze([null, null])\nexport const PuffSeedBookResultFieldNullable = Object.freeze([false, false])\nexport const PuffSeedBookResultFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffSeedBookResultFieldDeclaredMetadata = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\"])\nexport const PuffSeedBookResultSchemaIdentity = Object.freeze([0xf9, 0x4b, 0x2b, 0x76, 0xca, 0x48, 0xdf, 0xfd, 0xa9, 0xfb, 0x00, 0x70, 0x49, 0x09, 0xad, 0xac, 0xb4, 0x6e, 0x3b, 0xfb, 0xcf, 0x57, 0xa9, 0xf2, 0x53, 0xcd, 0x70, 0xfe, 0x7f, 0x2d, 0x88, 0x05])\nexport const PuffSeedBookResultPhysicalType = \"puff_SeedBookResult\"\nexport const PuffSeedBookResultFieldCount = 2;\nexport const PuffSeedBookResultLineKindsField = 0;\nexport const PuffSeedBookResultLineFromLinesField = 1;\n\nexport class PuffSeedBookResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffSeedBookResult: expected a fixed-layout object\");\n    const names = PuffSeedBookResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffSeedBookResult: fields must exactly match declaration order\");\n    if (!Array.isArray(source.line_kinds)) throw new TypeError(\"field line_kinds has an incompatible value\");\n    this.line_kinds = source.line_kinds;\n    if (!Array.isArray(source.line_from_lines)) throw new TypeError(\"field line_from_lines has an incompatible value\");\n    this.line_from_lines = source.line_from_lines;\n    Object.freeze(this);\n  }\n\n  getLineKinds() { return this.line_kinds; }\n  getLineFromLines() { return this.line_from_lines; }\n\n  static validate(value) { if (value instanceof PuffSeedBookResult) return true; try { new PuffSeedBookResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffSeedBookResult) return value; return new PuffSeedBookResult(value); }\n\n  toObject() { return {line_kinds: this.line_kinds, line_from_lines: this.line_from_lines}; }\n}\n\nexport const PuffAdvanceBookResultFields = Object.freeze([\"line_kinds\", \"line_from_lines\"])\nexport const PuffAdvanceBookResultFieldLogicalTypes = Object.freeze([\"List\", \"List\"])\nexport const PuffAdvanceBookResultFieldPhysicalTypes = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\"])\nexport const PuffAdvanceBookResultFieldItemLogicalTypes = Object.freeze([\"Int\", \"Int\"])\nexport const PuffAdvanceBookResultFieldItemPhysicalTypes = Object.freeze([null, null])\nexport const PuffAdvanceBookResultFieldNullable = Object.freeze([false, false])\nexport const PuffAdvanceBookResultFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffAdvanceBookResultFieldDeclaredMetadata = Object.freeze([\"IntegralArrow64\", \"IntegralArrow64\"])\nexport const PuffAdvanceBookResultSchemaIdentity = Object.freeze([0xa6, 0x3b, 0x96, 0xf5, 0x4b, 0xb4, 0x2b, 0x7c, 0xb4, 0x7d, 0xd9, 0xc8, 0x4d, 0xcc, 0x54, 0xfd, 0xc7, 0xef, 0x46, 0xf2, 0xe2, 0x33, 0x7e, 0xe0, 0x72, 0x53, 0xe2, 0xce, 0xd5, 0x27, 0x1a, 0x1a])\nexport const PuffAdvanceBookResultPhysicalType = \"puff_AdvanceBookResult\"\nexport const PuffAdvanceBookResultFieldCount = 2;\nexport const PuffAdvanceBookResultLineKindsField = 0;\nexport const PuffAdvanceBookResultLineFromLinesField = 1;\n\nexport class PuffAdvanceBookResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAdvanceBookResult: expected a fixed-layout object\");\n    const names = PuffAdvanceBookResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAdvanceBookResult: fields must exactly match declaration order\");\n    if (!Array.isArray(source.line_kinds)) throw new TypeError(\"field line_kinds has an incompatible value\");\n    this.line_kinds = source.line_kinds;\n    if (!Array.isArray(source.line_from_lines)) throw new TypeError(\"field line_from_lines has an incompatible value\");\n    this.line_from_lines = source.line_from_lines;\n    Object.freeze(this);\n  }\n\n  getLineKinds() { return this.line_kinds; }\n  getLineFromLines() { return this.line_from_lines; }\n\n  static validate(value) { if (value instanceof PuffAdvanceBookResult) return true; try { new PuffAdvanceBookResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAdvanceBookResult) return value; return new PuffAdvanceBookResult(value); }\n\n  toObject() { return {line_kinds: this.line_kinds, line_from_lines: this.line_from_lines}; }\n}\n\nexport const PuffPartialResultFields = Object.freeze([\"seq\", \"replaces_seq\", \"result\", \"note\"])\nexport const PuffPartialResultFieldLogicalTypes = Object.freeze([\"Int\", \"Int\", \"Any\", \"Str\"])\nexport const PuffPartialResultFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"IntegralScalar\", null, \"BytesScalar\"])\nexport const PuffPartialResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffPartialResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffPartialResultFieldNullable = Object.freeze([false, true, false, true])\nexport const PuffPartialResultFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffPartialResultFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"IntegralScalar\", null, \"BytesScalar\"])\nexport const PuffPartialResultSchemaIdentity = Object.freeze([0x30, 0xc7, 0x88, 0x24, 0x13, 0xf2, 0x25, 0x77, 0x7e, 0x9a, 0xe7, 0x22, 0x31, 0xe1, 0x87, 0x55, 0x5b, 0x89, 0x5c, 0x2c, 0xa0, 0x66, 0xf3, 0x00, 0x7a, 0x7b, 0x63, 0x99, 0x5e, 0xec, 0x15, 0x00])\nexport const PuffPartialResultPhysicalType = \"puff_PartialResult\"\nexport const PuffPartialResultFieldCount = 4;\nexport const PuffPartialResultSeqField = 0;\nexport const PuffPartialResultReplacesSeqField = 1;\nexport const PuffPartialResultResultField = 2;\nexport const PuffPartialResultNoteField = 3;\n\nexport class PuffPartialResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffPartialResult: expected a fixed-layout object\");\n    const names = PuffPartialResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffPartialResult: fields must exactly match declaration order\");\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (source.replaces_seq !== null && (typeof source.replaces_seq !== \"number\")) throw new TypeError(\"field replaces_seq has an incompatible value\");\n    this.replaces_seq = source.replaces_seq;\n    if (false) throw new TypeError(\"field result has an incompatible value\");\n    this.result = source.result;\n    if (source.note !== null && (typeof source.note !== \"string\")) throw new TypeError(\"field note has an incompatible value\");\n    this.note = source.note;\n    Object.freeze(this);\n  }\n\n  getSeq() { return this.seq; }\n  getReplacesSeq() { return this.replaces_seq; }\n  getResult() { return this.result; }\n  getNote() { return this.note; }\n\n  static validate(value) { if (value instanceof PuffPartialResult) return true; try { new PuffPartialResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffPartialResult) return value; return new PuffPartialResult(value); }\n\n  toObject() { return {seq: this.seq, replaces_seq: this.replaces_seq, result: this.result, note: this.note}; }\n}\n\nexport const PuffComputeBookResultFields = Object.freeze([\"output\", \"preview_hints\"])\nexport const PuffComputeBookResultFieldLogicalTypes = Object.freeze([\"Any\", \"Any\"])\nexport const PuffComputeBookResultFieldPhysicalTypes = Object.freeze([null, null])\nexport const PuffComputeBookResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffComputeBookResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffComputeBookResultFieldNullable = Object.freeze([false, false])\nexport const PuffComputeBookResultFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffComputeBookResultFieldDeclaredMetadata = Object.freeze([null, null])\nexport const PuffComputeBookResultSchemaIdentity = Object.freeze([0x34, 0x42, 0xd8, 0xd4, 0xb2, 0x9c, 0x1f, 0x9b, 0xb9, 0x5d, 0xa4, 0x8b, 0x48, 0xbe, 0xa3, 0x15, 0xa9, 0xd7, 0xe9, 0xd0, 0xbf, 0x72, 0x9d, 0x32, 0xaf, 0x8f, 0x18, 0xdf, 0x81, 0xe8, 0xde, 0x93])\nexport const PuffComputeBookResultPhysicalType = \"puff_ComputeBookResult\"\nexport const PuffComputeBookResultFieldCount = 2;\nexport const PuffComputeBookResultOutputField = 0;\nexport const PuffComputeBookResultPreviewHintsField = 1;\n\nexport class PuffComputeBookResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffComputeBookResult: expected a fixed-layout object\");\n    const names = PuffComputeBookResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffComputeBookResult: fields must exactly match declaration order\");\n    if (false) throw new TypeError(\"field output has an incompatible value\");\n    this.output = source.output;\n    if (false) throw new TypeError(\"field preview_hints has an incompatible value\");\n    this.preview_hints = source.preview_hints;\n    Object.freeze(this);\n  }\n\n  getOutput() { return this.output; }\n  getPreviewHints() { return this.preview_hints; }\n\n  static validate(value) { if (value instanceof PuffComputeBookResult) return true; try { new PuffComputeBookResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffComputeBookResult) return value; return new PuffComputeBookResult(value); }\n\n  toObject() { return {output: this.output, preview_hints: this.preview_hints}; }\n}\n\nexport const PuffProjectionBatchResultFields = Object.freeze([\"subscription_ids\", \"branches\", \"paths\", \"projections\", \"kinds\", \"snapshot_physicals\", \"payload\"])\nexport const PuffProjectionBatchResultFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"List\", \"List\", \"List\", \"Any\"])\nexport const PuffProjectionBatchResultFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null])\nexport const PuffProjectionBatchResultFieldItemLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"recursive_frontier\"])\nexport const PuffProjectionBatchResultFieldItemPhysicalTypes = Object.freeze([null, null, null, null, null, null, \"MetadataV1\"])\nexport const PuffProjectionBatchResultFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffProjectionBatchResultFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffProjectionBatchResultFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null])\nexport const PuffProjectionBatchResultSchemaIdentity = Object.freeze([0x38, 0x4f, 0x59, 0x40, 0xd4, 0xb0, 0x28, 0x6d, 0x59, 0xa1, 0xdb, 0xa5, 0x21, 0xe6, 0x8e, 0x82, 0xf6, 0x3f, 0x38, 0x3a, 0x16, 0x8b, 0x5d, 0x14, 0x32, 0x1b, 0x12, 0x68, 0x41, 0xdf, 0x03, 0x92])\nexport const PuffProjectionBatchResultPhysicalType = \"puff_ProjectionBatchResult\"\nexport const PuffProjectionBatchResultFieldCount = 7;\nexport const PuffProjectionBatchResultSubscriptionIdsField = 0;\nexport const PuffProjectionBatchResultBranchesField = 1;\nexport const PuffProjectionBatchResultPathsField = 2;\nexport const PuffProjectionBatchResultProjectionsField = 3;\nexport const PuffProjectionBatchResultKindsField = 4;\nexport const PuffProjectionBatchResultSnapshotPhysicalsField = 5;\nexport const PuffProjectionBatchResultPayloadField = 6;\n\nexport class PuffProjectionBatchResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffProjectionBatchResult: expected a fixed-layout object\");\n    const names = PuffProjectionBatchResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffProjectionBatchResult: fields must exactly match declaration order\");\n    if (!Array.isArray(source.subscription_ids)) throw new TypeError(\"field subscription_ids has an incompatible value\");\n    this.subscription_ids = source.subscription_ids;\n    if (!Array.isArray(source.branches)) throw new TypeError(\"field branches has an incompatible value\");\n    this.branches = source.branches;\n    if (!Array.isArray(source.paths)) throw new TypeError(\"field paths has an incompatible value\");\n    this.paths = source.paths;\n    if (!Array.isArray(source.projections)) throw new TypeError(\"field projections has an incompatible value\");\n    this.projections = source.projections;\n    if (!Array.isArray(source.kinds)) throw new TypeError(\"field kinds has an incompatible value\");\n    this.kinds = source.kinds;\n    if (!Array.isArray(source.snapshot_physicals)) throw new TypeError(\"field snapshot_physicals has an incompatible value\");\n    this.snapshot_physicals = source.snapshot_physicals;\n    if (false) throw new TypeError(\"field payload has an incompatible value\");\n    this.payload = source.payload;\n    Object.freeze(this);\n  }\n\n  getSubscriptionIds() { return this.subscription_ids; }\n  getBranches() { return this.branches; }\n  getPaths() { return this.paths; }\n  getProjections() { return this.projections; }\n  getKinds() { return this.kinds; }\n  getSnapshotPhysicals() { return this.snapshot_physicals; }\n  getPayload() { return this.payload; }\n\n  static validate(value) { if (value instanceof PuffProjectionBatchResult) return true; try { new PuffProjectionBatchResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffProjectionBatchResult) return value; return new PuffProjectionBatchResult(value); }\n\n  toObject() { return {subscription_ids: this.subscription_ids, branches: this.branches, paths: this.paths, projections: this.projections, kinds: this.kinds, snapshot_physicals: this.snapshot_physicals, payload: this.payload}; }\n}\n\nexport const PuffOpenMaintenancePuffbookRequestFields = Object.freeze([\"lake\", \"branch\", \"source_path\", \"book_id\", \"source_snapshot_physical\", \"demand_id\", \"lease_epoch\", \"lease_ttl_ms\", \"max_bytes\", \"max_updates\", \"source_baseline\", \"username\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Int\", \"Int\", \"Struct\", \"Str\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_ProjectionBatchResult\", \"BytesScalar\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false, false, false])\nexport const PuffOpenMaintenancePuffbookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffOpenMaintenancePuffbookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_ProjectionBatchResult\", \"BytesScalar\"])\nexport const PuffOpenMaintenancePuffbookRequestSchemaIdentity = Object.freeze([0xea, 0x42, 0x9e, 0x7a, 0x5d, 0x27, 0xdf, 0x21, 0x4f, 0x8b, 0x4f, 0x64, 0x4b, 0x21, 0xf3, 0x1c, 0x15, 0x55, 0x8d, 0xe2, 0x29, 0xc9, 0xcf, 0x72, 0xef, 0x52, 0xc4, 0xdf, 0x2a, 0x13, 0x7b, 0x2e])\nexport const PuffOpenMaintenancePuffbookRequestPhysicalType = \"puff_OpenMaintenancePuffbookRequest\"\nexport const PuffOpenMaintenancePuffbookRequestFieldCount = 12;\nexport const PuffOpenMaintenancePuffbookRequestLakeField = 0;\nexport const PuffOpenMaintenancePuffbookRequestBranchField = 1;\nexport const PuffOpenMaintenancePuffbookRequestSourcePathField = 2;\nexport const PuffOpenMaintenancePuffbookRequestBookIdField = 3;\nexport const PuffOpenMaintenancePuffbookRequestSourceSnapshotPhysicalField = 4;\nexport const PuffOpenMaintenancePuffbookRequestDemandIdField = 5;\nexport const PuffOpenMaintenancePuffbookRequestLeaseEpochField = 6;\nexport const PuffOpenMaintenancePuffbookRequestLeaseTtlMsField = 7;\nexport const PuffOpenMaintenancePuffbookRequestMaxBytesField = 8;\nexport const PuffOpenMaintenancePuffbookRequestMaxUpdatesField = 9;\nexport const PuffOpenMaintenancePuffbookRequestSourceBaselineField = 10;\nexport const PuffOpenMaintenancePuffbookRequestUsernameField = 11;\n\nexport class PuffOpenMaintenancePuffbookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffOpenMaintenancePuffbookRequest: expected a fixed-layout object\");\n    const names = PuffOpenMaintenancePuffbookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffOpenMaintenancePuffbookRequest: fields must exactly match declaration order\");\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.source_snapshot_physical !== \"string\") throw new TypeError(\"field source_snapshot_physical has an incompatible value\");\n    this.source_snapshot_physical = source.source_snapshot_physical;\n    if (typeof source.demand_id !== \"string\") throw new TypeError(\"field demand_id has an incompatible value\");\n    this.demand_id = source.demand_id;\n    if (typeof source.lease_epoch !== \"number\") throw new TypeError(\"field lease_epoch has an incompatible value\");\n    this.lease_epoch = source.lease_epoch;\n    if (typeof source.lease_ttl_ms !== \"number\") throw new TypeError(\"field lease_ttl_ms has an incompatible value\");\n    this.lease_ttl_ms = source.lease_ttl_ms;\n    if (typeof source.max_bytes !== \"number\") throw new TypeError(\"field max_bytes has an incompatible value\");\n    this.max_bytes = source.max_bytes;\n    if (typeof source.max_updates !== \"number\") throw new TypeError(\"field max_updates has an incompatible value\");\n    this.max_updates = source.max_updates;\n    if (source.source_baseline === null || typeof source.source_baseline !== \"object\") throw new TypeError(\"field source_baseline has an incompatible value\");\n    this.source_baseline = source.source_baseline;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    Object.freeze(this);\n  }\n\n  getLake() { return this.lake; }\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getBookId() { return this.book_id; }\n  getSourceSnapshotPhysical() { return this.source_snapshot_physical; }\n  getDemandId() { return this.demand_id; }\n  getLeaseEpoch() { return this.lease_epoch; }\n  getLeaseTtlMs() { return this.lease_ttl_ms; }\n  getMaxBytes() { return this.max_bytes; }\n  getMaxUpdates() { return this.max_updates; }\n  getSourceBaseline() { return this.source_baseline; }\n  getUsername() { return this.username; }\n\n  static validate(value) { if (value instanceof PuffOpenMaintenancePuffbookRequest) return true; try { new PuffOpenMaintenancePuffbookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffOpenMaintenancePuffbookRequest) return value; return new PuffOpenMaintenancePuffbookRequest(value); }\n\n  toObject() { return {lake: this.lake, branch: this.branch, source_path: this.source_path, book_id: this.book_id, source_snapshot_physical: this.source_snapshot_physical, demand_id: this.demand_id, lease_epoch: this.lease_epoch, lease_ttl_ms: this.lease_ttl_ms, max_bytes: this.max_bytes, max_updates: this.max_updates, source_baseline: this.source_baseline, username: this.username}; }\n}\n\nexport const PuffAdvanceMaintenancePuffbookRequestFields = Object.freeze([\"branch\", \"source_path\", \"source_update\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Struct\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"puff_ProjectionBatchResult\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldNullable = Object.freeze([false, false, false])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffAdvanceMaintenancePuffbookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"puff_ProjectionBatchResult\"])\nexport const PuffAdvanceMaintenancePuffbookRequestSchemaIdentity = Object.freeze([0x0a, 0x20, 0xbf, 0xf7, 0xaf, 0x25, 0x92, 0x1c, 0xf4, 0x01, 0x45, 0x14, 0xd2, 0xc4, 0x89, 0xfa, 0x46, 0xb9, 0x5b, 0x20, 0xb1, 0x97, 0x26, 0x09, 0x4a, 0x3c, 0xdc, 0x20, 0xb4, 0x29, 0x26, 0xbd])\nexport const PuffAdvanceMaintenancePuffbookRequestPhysicalType = \"puff_AdvanceMaintenancePuffbookRequest\"\nexport const PuffAdvanceMaintenancePuffbookRequestFieldCount = 3;\nexport const PuffAdvanceMaintenancePuffbookRequestBranchField = 0;\nexport const PuffAdvanceMaintenancePuffbookRequestSourcePathField = 1;\nexport const PuffAdvanceMaintenancePuffbookRequestSourceUpdateField = 2;\n\nexport class PuffAdvanceMaintenancePuffbookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAdvanceMaintenancePuffbookRequest: expected a fixed-layout object\");\n    const names = PuffAdvanceMaintenancePuffbookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAdvanceMaintenancePuffbookRequest: fields must exactly match declaration order\");\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (source.source_update === null || typeof source.source_update !== \"object\") throw new TypeError(\"field source_update has an incompatible value\");\n    this.source_update = source.source_update;\n    Object.freeze(this);\n  }\n\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getSourceUpdate() { return this.source_update; }\n\n  static validate(value) { if (value instanceof PuffAdvanceMaintenancePuffbookRequest) return true; try { new PuffAdvanceMaintenancePuffbookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAdvanceMaintenancePuffbookRequest) return value; return new PuffAdvanceMaintenancePuffbookRequest(value); }\n\n  toObject() { return {branch: this.branch, source_path: this.source_path, source_update: this.source_update}; }\n}\n\nexport const PuffMaintenancePuffbookDemandFields = Object.freeze([\"branch\", \"source_path\", \"demand_id\", \"start_line\", \"end_line\"])\nexport const PuffMaintenancePuffbookDemandFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Int\", \"Int\"])\nexport const PuffMaintenancePuffbookDemandFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffMaintenancePuffbookDemandFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffMaintenancePuffbookDemandFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffMaintenancePuffbookDemandFieldNullable = Object.freeze([false, false, false, false, false])\nexport const PuffMaintenancePuffbookDemandFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffMaintenancePuffbookDemandFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffMaintenancePuffbookDemandSchemaIdentity = Object.freeze([0xc6, 0x46, 0xc1, 0xa9, 0x72, 0xee, 0xb5, 0x22, 0x10, 0xc2, 0x17, 0xc1, 0xf0, 0x17, 0xc0, 0x2f, 0xc0, 0x53, 0x23, 0xf2, 0xa4, 0x7b, 0xa5, 0xdf, 0xcd, 0xda, 0x61, 0xb7, 0xed, 0x64, 0x04, 0xd5])\nexport const PuffMaintenancePuffbookDemandPhysicalType = \"puff_MaintenancePuffbookDemand\"\nexport const PuffMaintenancePuffbookDemandFieldCount = 5;\nexport const PuffMaintenancePuffbookDemandBranchField = 0;\nexport const PuffMaintenancePuffbookDemandSourcePathField = 1;\nexport const PuffMaintenancePuffbookDemandDemandIdField = 2;\nexport const PuffMaintenancePuffbookDemandStartLineField = 3;\nexport const PuffMaintenancePuffbookDemandEndLineField = 4;\n\nexport class PuffMaintenancePuffbookDemand {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenancePuffbookDemand: expected a fixed-layout object\");\n    const names = PuffMaintenancePuffbookDemandFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenancePuffbookDemand: fields must exactly match declaration order\");\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.demand_id !== \"string\") throw new TypeError(\"field demand_id has an incompatible value\");\n    this.demand_id = source.demand_id;\n    if (typeof source.start_line !== \"number\") throw new TypeError(\"field start_line has an incompatible value\");\n    this.start_line = source.start_line;\n    if (typeof source.end_line !== \"number\") throw new TypeError(\"field end_line has an incompatible value\");\n    this.end_line = source.end_line;\n    Object.freeze(this);\n  }\n\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getDemandId() { return this.demand_id; }\n  getStartLine() { return this.start_line; }\n  getEndLine() { return this.end_line; }\n\n  static validate(value) { if (value instanceof PuffMaintenancePuffbookDemand) return true; try { new PuffMaintenancePuffbookDemand(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenancePuffbookDemand) return value; return new PuffMaintenancePuffbookDemand(value); }\n\n  toObject() { return {branch: this.branch, source_path: this.source_path, demand_id: this.demand_id, start_line: this.start_line, end_line: this.end_line}; }\n}\n\nexport const PuffMaintenancePuffbookCreditFields = Object.freeze([\"branch\", \"source_path\", \"demand_id\", \"bytes\", \"updates\", \"obsolete_stream_seq\"])\nexport const PuffMaintenancePuffbookCreditFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Int\"])\nexport const PuffMaintenancePuffbookCreditFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffMaintenancePuffbookCreditFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffMaintenancePuffbookCreditFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffMaintenancePuffbookCreditFieldNullable = Object.freeze([false, false, false, false, false, false])\nexport const PuffMaintenancePuffbookCreditFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffMaintenancePuffbookCreditFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffMaintenancePuffbookCreditSchemaIdentity = Object.freeze([0x52, 0xb9, 0x33, 0x93, 0xc9, 0xea, 0x7c, 0x0b, 0x94, 0xd7, 0xc7, 0x19, 0xe4, 0x54, 0x67, 0x75, 0x85, 0x1c, 0x2e, 0xc2, 0x1d, 0x49, 0xd2, 0x10, 0x1a, 0x09, 0xe5, 0x62, 0x7c, 0x2a, 0x6f, 0xdb])\nexport const PuffMaintenancePuffbookCreditPhysicalType = \"puff_MaintenancePuffbookCredit\"\nexport const PuffMaintenancePuffbookCreditFieldCount = 6;\nexport const PuffMaintenancePuffbookCreditBranchField = 0;\nexport const PuffMaintenancePuffbookCreditSourcePathField = 1;\nexport const PuffMaintenancePuffbookCreditDemandIdField = 2;\nexport const PuffMaintenancePuffbookCreditBytesField = 3;\nexport const PuffMaintenancePuffbookCreditUpdatesField = 4;\nexport const PuffMaintenancePuffbookCreditObsoleteStreamSeqField = 5;\n\nexport class PuffMaintenancePuffbookCredit {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaintenancePuffbookCredit: expected a fixed-layout object\");\n    const names = PuffMaintenancePuffbookCreditFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaintenancePuffbookCredit: fields must exactly match declaration order\");\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.demand_id !== \"string\") throw new TypeError(\"field demand_id has an incompatible value\");\n    this.demand_id = source.demand_id;\n    if (typeof source.bytes !== \"number\") throw new TypeError(\"field bytes has an incompatible value\");\n    this.bytes = source.bytes;\n    if (typeof source.updates !== \"number\") throw new TypeError(\"field updates has an incompatible value\");\n    this.updates = source.updates;\n    if (typeof source.obsolete_stream_seq !== \"number\") throw new TypeError(\"field obsolete_stream_seq has an incompatible value\");\n    this.obsolete_stream_seq = source.obsolete_stream_seq;\n    Object.freeze(this);\n  }\n\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getDemandId() { return this.demand_id; }\n  getBytes() { return this.bytes; }\n  getUpdates() { return this.updates; }\n  getObsoleteStreamSeq() { return this.obsolete_stream_seq; }\n\n  static validate(value) { if (value instanceof PuffMaintenancePuffbookCredit) return true; try { new PuffMaintenancePuffbookCredit(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaintenancePuffbookCredit) return value; return new PuffMaintenancePuffbookCredit(value); }\n\n  toObject() { return {branch: this.branch, source_path: this.source_path, demand_id: this.demand_id, bytes: this.bytes, updates: this.updates, obsolete_stream_seq: this.obsolete_stream_seq}; }\n}\n\nexport const PuffSubscribeBranchProjectionRequestFields = Object.freeze([\"lake\", \"branch\", \"username\", \"subscription_id\", \"owner_id\", \"follow\", \"max_bytes\", \"max_updates\", \"selector_paths\", \"selector_projections\", \"selector_recursive\"])\nexport const PuffSubscribeBranchProjectionRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Int\", \"List\", \"List\", \"List\"])\nexport const PuffSubscribeBranchProjectionRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"BytesArrow32\", \"IntegralArrow64\"])\nexport const PuffSubscribeBranchProjectionRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"Str\", \"Int\"])\nexport const PuffSubscribeBranchProjectionRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, null, null])\nexport const PuffSubscribeBranchProjectionRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false, false])\nexport const PuffSubscribeBranchProjectionRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffSubscribeBranchProjectionRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesArrow32\", \"BytesArrow32\", \"IntegralArrow64\"])\nexport const PuffSubscribeBranchProjectionRequestSchemaIdentity = Object.freeze([0xea, 0x0b, 0xd4, 0xe5, 0xdf, 0xca, 0xfa, 0xdb, 0x44, 0xa5, 0xc8, 0x8e, 0x8d, 0x27, 0xb6, 0xd8, 0x0d, 0xda, 0x41, 0x56, 0xa8, 0xfe, 0x05, 0x43, 0x11, 0x76, 0xb9, 0x61, 0x91, 0x9e, 0x40, 0x90])\nexport const PuffSubscribeBranchProjectionRequestPhysicalType = \"puff_SubscribeBranchProjectionRequest\"\nexport const PuffSubscribeBranchProjectionRequestFieldCount = 11;\nexport const PuffSubscribeBranchProjectionRequestLakeField = 0;\nexport const PuffSubscribeBranchProjectionRequestBranchField = 1;\nexport const PuffSubscribeBranchProjectionRequestUsernameField = 2;\nexport const PuffSubscribeBranchProjectionRequestSubscriptionIdField = 3;\nexport const PuffSubscribeBranchProjectionRequestOwnerIdField = 4;\nexport const PuffSubscribeBranchProjectionRequestFollowField = 5;\nexport const PuffSubscribeBranchProjectionRequestMaxBytesField = 6;\nexport const PuffSubscribeBranchProjectionRequestMaxUpdatesField = 7;\nexport const PuffSubscribeBranchProjectionRequestSelectorPathsField = 8;\nexport const PuffSubscribeBranchProjectionRequestSelectorProjectionsField = 9;\nexport const PuffSubscribeBranchProjectionRequestSelectorRecursiveField = 10;\n\nexport class PuffSubscribeBranchProjectionRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffSubscribeBranchProjectionRequest: expected a fixed-layout object\");\n    const names = PuffSubscribeBranchProjectionRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffSubscribeBranchProjectionRequest: fields must exactly match declaration order\");\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.subscription_id !== \"string\") throw new TypeError(\"field subscription_id has an incompatible value\");\n    this.subscription_id = source.subscription_id;\n    if (typeof source.owner_id !== \"string\") throw new TypeError(\"field owner_id has an incompatible value\");\n    this.owner_id = source.owner_id;\n    if (typeof source.follow !== \"number\") throw new TypeError(\"field follow has an incompatible value\");\n    this.follow = source.follow;\n    if (typeof source.max_bytes !== \"number\") throw new TypeError(\"field max_bytes has an incompatible value\");\n    this.max_bytes = source.max_bytes;\n    if (typeof source.max_updates !== \"number\") throw new TypeError(\"field max_updates has an incompatible value\");\n    this.max_updates = source.max_updates;\n    if (!Array.isArray(source.selector_paths)) throw new TypeError(\"field selector_paths has an incompatible value\");\n    this.selector_paths = source.selector_paths;\n    if (!Array.isArray(source.selector_projections)) throw new TypeError(\"field selector_projections has an incompatible value\");\n    this.selector_projections = source.selector_projections;\n    if (!Array.isArray(source.selector_recursive)) throw new TypeError(\"field selector_recursive has an incompatible value\");\n    this.selector_recursive = source.selector_recursive;\n    Object.freeze(this);\n  }\n\n  getLake() { return this.lake; }\n  getBranch() { return this.branch; }\n  getUsername() { return this.username; }\n  getSubscriptionId() { return this.subscription_id; }\n  getOwnerId() { return this.owner_id; }\n  getFollow() { return this.follow; }\n  getMaxBytes() { return this.max_bytes; }\n  getMaxUpdates() { return this.max_updates; }\n  getSelectorPaths() { return this.selector_paths; }\n  getSelectorProjections() { return this.selector_projections; }\n  getSelectorRecursive() { return this.selector_recursive; }\n\n  static validate(value) { if (value instanceof PuffSubscribeBranchProjectionRequest) return true; try { new PuffSubscribeBranchProjectionRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffSubscribeBranchProjectionRequest) return value; return new PuffSubscribeBranchProjectionRequest(value); }\n\n  toObject() { return {lake: this.lake, branch: this.branch, username: this.username, subscription_id: this.subscription_id, owner_id: this.owner_id, follow: this.follow, max_bytes: this.max_bytes, max_updates: this.max_updates, selector_paths: this.selector_paths, selector_projections: this.selector_projections, selector_recursive: this.selector_recursive}; }\n}\n\nexport const PuffStringListColumnsFields = Object.freeze([\"offsets\", \"values\"])\nexport const PuffStringListColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\"])\nexport const PuffStringListColumnsFieldPhysicalTypes = Object.freeze([\"IntegralArrow64\", \"BytesArrow32\"])\nexport const PuffStringListColumnsFieldItemLogicalTypes = Object.freeze([\"Int\", \"Str\"])\nexport const PuffStringListColumnsFieldItemPhysicalTypes = Object.freeze([null, null])\nexport const PuffStringListColumnsFieldNullable = Object.freeze([false, false])\nexport const PuffStringListColumnsFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffStringListColumnsFieldDeclaredMetadata = Object.freeze([\"IntegralArrow64\", \"BytesArrow32\"])\nexport const PuffStringListColumnsSchemaIdentity = Object.freeze([0x24, 0x8a, 0x36, 0x6f, 0x9c, 0xc4, 0x5f, 0xc1, 0x00, 0x7d, 0x0d, 0x69, 0x90, 0xb9, 0xd9, 0x42, 0xe8, 0x5e, 0x1d, 0xee, 0x3a, 0x03, 0x30, 0x70, 0x26, 0x1a, 0x63, 0x6b, 0x52, 0xf8, 0x94, 0xf2])\nexport const PuffStringListColumnsPhysicalType = \"puff_StringListColumns\"\nexport const PuffStringListColumnsFieldCount = 2;\nexport const PuffStringListColumnsOffsetsField = 0;\nexport const PuffStringListColumnsValuesField = 1;\n\nexport class PuffStringListColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffStringListColumns: expected a fixed-layout object\");\n    const names = PuffStringListColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffStringListColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.offsets)) throw new TypeError(\"field offsets has an incompatible value\");\n    this.offsets = source.offsets;\n    if (!Array.isArray(source.values)) throw new TypeError(\"field values has an incompatible value\");\n    this.values = source.values;\n    Object.freeze(this);\n  }\n\n  getOffsets() { return this.offsets; }\n  getValues() { return this.values; }\n\n  static validate(value) { if (value instanceof PuffStringListColumns) return true; try { new PuffStringListColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffStringListColumns) return value; return new PuffStringListColumns(value); }\n\n  toObject() { return {offsets: this.offsets, values: this.values}; }\n}\n\nexport const PuffDirectoryNameColumnsFields = Object.freeze([\"name\"])\nexport const PuffDirectoryNameColumnsFieldLogicalTypes = Object.freeze([\"List\"])\nexport const PuffDirectoryNameColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\"])\nexport const PuffDirectoryNameColumnsFieldItemLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffDirectoryNameColumnsFieldItemPhysicalTypes = Object.freeze([null])\nexport const PuffDirectoryNameColumnsFieldNullable = Object.freeze([false])\nexport const PuffDirectoryNameColumnsFieldRoles = Object.freeze([\"payload\"])\nexport const PuffDirectoryNameColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\"])\nexport const PuffDirectoryNameColumnsSchemaIdentity = Object.freeze([0x2e, 0x99, 0x8a, 0xad, 0xf2, 0x86, 0x57, 0x48, 0x0e, 0xbe, 0x1a, 0x76, 0x50, 0xf2, 0xce, 0xdb, 0x48, 0xa7, 0xa0, 0x4e, 0xf4, 0xd3, 0xb4, 0x96, 0x8b, 0x0d, 0xb9, 0x16, 0x15, 0x2c, 0x7b, 0x27])\nexport const PuffDirectoryNameColumnsPhysicalType = \"puff_DirectoryNameColumns\"\nexport const PuffDirectoryNameColumnsFieldCount = 1;\nexport const PuffDirectoryNameColumnsNameField = 0;\n\nexport class PuffDirectoryNameColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryNameColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryNameColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryNameColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.name)) throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n\n  static validate(value) { if (value instanceof PuffDirectoryNameColumns) return true; try { new PuffDirectoryNameColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryNameColumns) return value; return new PuffDirectoryNameColumns(value); }\n\n  toObject() { return {name: this.name}; }\n}\n\nexport const PuffDirectoryArtifactColumnsFields = Object.freeze([\"name\", \"type\", \"owner\", \"read_groups\", \"write_groups\", \"can_read\", \"can_write\"])\nexport const PuffDirectoryArtifactColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"Struct\", \"Struct\", \"List\", \"List\"])\nexport const PuffDirectoryArtifactColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"puff_StringListColumns\", \"puff_StringListColumns\", \"BoolArrow\", \"BoolArrow\"])\nexport const PuffDirectoryArtifactColumnsFieldItemLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"recursive_frontier\", \"recursive_frontier\", \"Bool\", \"Bool\"])\nexport const PuffDirectoryArtifactColumnsFieldItemPhysicalTypes = Object.freeze([null, null, null, \"MetadataV1\", \"MetadataV1\", null, null])\nexport const PuffDirectoryArtifactColumnsFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryArtifactColumnsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryArtifactColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"puff_StringListColumns\", \"puff_StringListColumns\", \"BoolArrow\", \"BoolArrow\"])\nexport const PuffDirectoryArtifactColumnsSchemaIdentity = Object.freeze([0xc2, 0xdd, 0xf8, 0x7f, 0x4d, 0xbe, 0x79, 0xac, 0x80, 0x5c, 0xa1, 0x45, 0xf5, 0x86, 0x57, 0xb7, 0x93, 0x63, 0xfe, 0xa8, 0xdd, 0xa5, 0x1a, 0x40, 0xd4, 0x39, 0xf8, 0xf6, 0x3f, 0xa8, 0x97, 0x90])\nexport const PuffDirectoryArtifactColumnsPhysicalType = \"puff_DirectoryArtifactColumns\"\nexport const PuffDirectoryArtifactColumnsFieldCount = 7;\nexport const PuffDirectoryArtifactColumnsNameField = 0;\nexport const PuffDirectoryArtifactColumnsTypeField = 1;\nexport const PuffDirectoryArtifactColumnsOwnerField = 2;\nexport const PuffDirectoryArtifactColumnsReadGroupsField = 3;\nexport const PuffDirectoryArtifactColumnsWriteGroupsField = 4;\nexport const PuffDirectoryArtifactColumnsCanReadField = 5;\nexport const PuffDirectoryArtifactColumnsCanWriteField = 6;\n\nexport class PuffDirectoryArtifactColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryArtifactColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryArtifactColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryArtifactColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.name)) throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    if (!Array.isArray(source.type)) throw new TypeError(\"field type has an incompatible value\");\n    this.type = source.type;\n    if (!Array.isArray(source.owner)) throw new TypeError(\"field owner has an incompatible value\");\n    this.owner = source.owner;\n    if (source.read_groups === null || typeof source.read_groups !== \"object\") throw new TypeError(\"field read_groups has an incompatible value\");\n    this.read_groups = source.read_groups;\n    if (source.write_groups === null || typeof source.write_groups !== \"object\") throw new TypeError(\"field write_groups has an incompatible value\");\n    this.write_groups = source.write_groups;\n    if (!Array.isArray(source.can_read)) throw new TypeError(\"field can_read has an incompatible value\");\n    this.can_read = source.can_read;\n    if (!Array.isArray(source.can_write)) throw new TypeError(\"field can_write has an incompatible value\");\n    this.can_write = source.can_write;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n  getType() { return this.type; }\n  getOwner() { return this.owner; }\n  getReadGroups() { return this.read_groups; }\n  getWriteGroups() { return this.write_groups; }\n  getCanRead() { return this.can_read; }\n  getCanWrite() { return this.can_write; }\n\n  static validate(value) { if (value instanceof PuffDirectoryArtifactColumns) return true; try { new PuffDirectoryArtifactColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryArtifactColumns) return value; return new PuffDirectoryArtifactColumns(value); }\n\n  toObject() { return {name: this.name, type: this.type, owner: this.owner, read_groups: this.read_groups, write_groups: this.write_groups, can_read: this.can_read, can_write: this.can_write}; }\n}\n\nexport const PuffDirectoryNodeColumnsFields = Object.freeze([\"name\", \"kind\", \"freshness\", \"artifact\", \"owner_path\", \"conflicts\"])\nexport const PuffDirectoryNodeColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"Any\", \"List\", \"Struct\"])\nexport const PuffDirectoryNodeColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null, \"BytesArrow32\", \"puff_StringListColumns\"])\nexport const PuffDirectoryNodeColumnsFieldItemLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"recursive_frontier\", \"Str\", \"recursive_frontier\"])\nexport const PuffDirectoryNodeColumnsFieldItemPhysicalTypes = Object.freeze([null, null, null, \"MetadataV1\", null, \"MetadataV1\"])\nexport const PuffDirectoryNodeColumnsFieldNullable = Object.freeze([false, false, false, false, false, false])\nexport const PuffDirectoryNodeColumnsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryNodeColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null, \"BytesArrow32\", \"puff_StringListColumns\"])\nexport const PuffDirectoryNodeColumnsSchemaIdentity = Object.freeze([0x04, 0x4b, 0xae, 0xa6, 0x5f, 0x4d, 0xe5, 0x9b, 0x48, 0x15, 0xc1, 0xba, 0x4b, 0x4b, 0x1b, 0x03, 0x68, 0xe5, 0x59, 0xf6, 0x4f, 0x9f, 0x0a, 0xff, 0x40, 0x14, 0x7e, 0x8c, 0xa8, 0xd8, 0x4b, 0x0d])\nexport const PuffDirectoryNodeColumnsPhysicalType = \"puff_DirectoryNodeColumns\"\nexport const PuffDirectoryNodeColumnsFieldCount = 6;\nexport const PuffDirectoryNodeColumnsNameField = 0;\nexport const PuffDirectoryNodeColumnsKindField = 1;\nexport const PuffDirectoryNodeColumnsFreshnessField = 2;\nexport const PuffDirectoryNodeColumnsArtifactField = 3;\nexport const PuffDirectoryNodeColumnsOwnerPathField = 4;\nexport const PuffDirectoryNodeColumnsConflictsField = 5;\n\nexport class PuffDirectoryNodeColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryNodeColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryNodeColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryNodeColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.name)) throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    if (!Array.isArray(source.kind)) throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (!Array.isArray(source.freshness)) throw new TypeError(\"field freshness has an incompatible value\");\n    this.freshness = source.freshness;\n    if (false) throw new TypeError(\"field artifact has an incompatible value\");\n    this.artifact = source.artifact;\n    if (!Array.isArray(source.owner_path)) throw new TypeError(\"field owner_path has an incompatible value\");\n    this.owner_path = source.owner_path;\n    if (source.conflicts === null || typeof source.conflicts !== \"object\") throw new TypeError(\"field conflicts has an incompatible value\");\n    this.conflicts = source.conflicts;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n  getKind() { return this.kind; }\n  getFreshness() { return this.freshness; }\n  getArtifact() { return this.artifact; }\n  getOwnerPath() { return this.owner_path; }\n  getConflicts() { return this.conflicts; }\n\n  static validate(value) { if (value instanceof PuffDirectoryNodeColumns) return true; try { new PuffDirectoryNodeColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryNodeColumns) return value; return new PuffDirectoryNodeColumns(value); }\n\n  toObject() { return {name: this.name, kind: this.kind, freshness: this.freshness, artifact: this.artifact, owner_path: this.owner_path, conflicts: this.conflicts}; }\n}\n\nexport const PuffDirectoryGroupColumnsFields = Object.freeze([\"key\", \"source_name\", \"source_path\", \"freshness\", \"source_artifact\", \"names\"])\nexport const PuffDirectoryGroupColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"List\", \"Any\", \"Any\"])\nexport const PuffDirectoryGroupColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null, null])\nexport const PuffDirectoryGroupColumnsFieldItemLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryGroupColumnsFieldItemPhysicalTypes = Object.freeze([null, null, null, null, \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryGroupColumnsFieldNullable = Object.freeze([false, false, false, false, false, false])\nexport const PuffDirectoryGroupColumnsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryGroupColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", \"BytesArrow32\", null, null])\nexport const PuffDirectoryGroupColumnsSchemaIdentity = Object.freeze([0x5c, 0xf1, 0x2c, 0x24, 0x10, 0xd5, 0x38, 0x53, 0x4f, 0xce, 0xc4, 0x97, 0xe1, 0x58, 0xc9, 0x97, 0xcf, 0x4f, 0x9f, 0xd6, 0xc3, 0xf8, 0x4e, 0x26, 0x81, 0x63, 0xf4, 0xf4, 0x72, 0x61, 0xe4, 0x30])\nexport const PuffDirectoryGroupColumnsPhysicalType = \"puff_DirectoryGroupColumns\"\nexport const PuffDirectoryGroupColumnsFieldCount = 6;\nexport const PuffDirectoryGroupColumnsKeyField = 0;\nexport const PuffDirectoryGroupColumnsSourceNameField = 1;\nexport const PuffDirectoryGroupColumnsSourcePathField = 2;\nexport const PuffDirectoryGroupColumnsFreshnessField = 3;\nexport const PuffDirectoryGroupColumnsSourceArtifactField = 4;\nexport const PuffDirectoryGroupColumnsNamesField = 5;\n\nexport class PuffDirectoryGroupColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryGroupColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryGroupColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryGroupColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.key)) throw new TypeError(\"field key has an incompatible value\");\n    this.key = source.key;\n    if (!Array.isArray(source.source_name)) throw new TypeError(\"field source_name has an incompatible value\");\n    this.source_name = source.source_name;\n    if (!Array.isArray(source.source_path)) throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (!Array.isArray(source.freshness)) throw new TypeError(\"field freshness has an incompatible value\");\n    this.freshness = source.freshness;\n    if (false) throw new TypeError(\"field source_artifact has an incompatible value\");\n    this.source_artifact = source.source_artifact;\n    if (false) throw new TypeError(\"field names has an incompatible value\");\n    this.names = source.names;\n    Object.freeze(this);\n  }\n\n  getKey() { return this.key; }\n  getSourceName() { return this.source_name; }\n  getSourcePath() { return this.source_path; }\n  getFreshness() { return this.freshness; }\n  getSourceArtifact() { return this.source_artifact; }\n  getNames() { return this.names; }\n\n  static validate(value) { if (value instanceof PuffDirectoryGroupColumns) return true; try { new PuffDirectoryGroupColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryGroupColumns) return value; return new PuffDirectoryGroupColumns(value); }\n\n  toObject() { return {key: this.key, source_name: this.source_name, source_path: this.source_path, freshness: this.freshness, source_artifact: this.source_artifact, names: this.names}; }\n}\n\nexport const PuffDirectoryNodeEditColumnsFields = Object.freeze([\"kind\", \"index\", \"count\", \"rows\"])\nexport const PuffDirectoryNodeEditColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"Any\"])\nexport const PuffDirectoryNodeEditColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"IntegralArrow64\", \"IntegralArrow64\", null])\nexport const PuffDirectoryNodeEditColumnsFieldItemLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"recursive_frontier\"])\nexport const PuffDirectoryNodeEditColumnsFieldItemPhysicalTypes = Object.freeze([null, null, null, \"MetadataV1\"])\nexport const PuffDirectoryNodeEditColumnsFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffDirectoryNodeEditColumnsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryNodeEditColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"IntegralArrow64\", \"IntegralArrow64\", null])\nexport const PuffDirectoryNodeEditColumnsSchemaIdentity = Object.freeze([0x1c, 0x6b, 0xc4, 0x38, 0xee, 0x3a, 0xdd, 0x5a, 0x9e, 0xb2, 0x2b, 0x00, 0xa2, 0xcc, 0x3d, 0x27, 0xf4, 0xec, 0x55, 0xc4, 0xc0, 0xe8, 0x0e, 0x15, 0xf4, 0xa0, 0xcd, 0xb5, 0x85, 0x8c, 0x19, 0x04])\nexport const PuffDirectoryNodeEditColumnsPhysicalType = \"puff_DirectoryNodeEditColumns\"\nexport const PuffDirectoryNodeEditColumnsFieldCount = 4;\nexport const PuffDirectoryNodeEditColumnsKindField = 0;\nexport const PuffDirectoryNodeEditColumnsIndexField = 1;\nexport const PuffDirectoryNodeEditColumnsCountField = 2;\nexport const PuffDirectoryNodeEditColumnsRowsField = 3;\n\nexport class PuffDirectoryNodeEditColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryNodeEditColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryNodeEditColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryNodeEditColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.kind)) throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (!Array.isArray(source.index)) throw new TypeError(\"field index has an incompatible value\");\n    this.index = source.index;\n    if (!Array.isArray(source.count)) throw new TypeError(\"field count has an incompatible value\");\n    this.count = source.count;\n    if (false) throw new TypeError(\"field rows has an incompatible value\");\n    this.rows = source.rows;\n    Object.freeze(this);\n  }\n\n  getKind() { return this.kind; }\n  getIndex() { return this.index; }\n  getCount() { return this.count; }\n  getRows() { return this.rows; }\n\n  static validate(value) { if (value instanceof PuffDirectoryNodeEditColumns) return true; try { new PuffDirectoryNodeEditColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryNodeEditColumns) return value; return new PuffDirectoryNodeEditColumns(value); }\n\n  toObject() { return {kind: this.kind, index: this.index, count: this.count, rows: this.rows}; }\n}\n\nexport const PuffDirectoryGroupEditColumnsFields = Object.freeze([\"kind\", \"index\", \"count\", \"rows\"])\nexport const PuffDirectoryGroupEditColumnsFieldLogicalTypes = Object.freeze([\"List\", \"List\", \"List\", \"Any\"])\nexport const PuffDirectoryGroupEditColumnsFieldPhysicalTypes = Object.freeze([\"BytesArrow32\", \"IntegralArrow64\", \"IntegralArrow64\", null])\nexport const PuffDirectoryGroupEditColumnsFieldItemLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"recursive_frontier\"])\nexport const PuffDirectoryGroupEditColumnsFieldItemPhysicalTypes = Object.freeze([null, null, null, \"MetadataV1\"])\nexport const PuffDirectoryGroupEditColumnsFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffDirectoryGroupEditColumnsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryGroupEditColumnsFieldDeclaredMetadata = Object.freeze([\"BytesArrow32\", \"IntegralArrow64\", \"IntegralArrow64\", null])\nexport const PuffDirectoryGroupEditColumnsSchemaIdentity = Object.freeze([0x0f, 0x86, 0xca, 0x42, 0x68, 0x68, 0x55, 0x13, 0x96, 0x50, 0x37, 0xd0, 0x88, 0xa4, 0x57, 0x6b, 0x1d, 0xcd, 0xa5, 0x44, 0xbc, 0xc7, 0x47, 0xdc, 0x2f, 0xd0, 0x24, 0x8c, 0xdb, 0xf2, 0xc0, 0xf4])\nexport const PuffDirectoryGroupEditColumnsPhysicalType = \"puff_DirectoryGroupEditColumns\"\nexport const PuffDirectoryGroupEditColumnsFieldCount = 4;\nexport const PuffDirectoryGroupEditColumnsKindField = 0;\nexport const PuffDirectoryGroupEditColumnsIndexField = 1;\nexport const PuffDirectoryGroupEditColumnsCountField = 2;\nexport const PuffDirectoryGroupEditColumnsRowsField = 3;\n\nexport class PuffDirectoryGroupEditColumns {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryGroupEditColumns: expected a fixed-layout object\");\n    const names = PuffDirectoryGroupEditColumnsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryGroupEditColumns: fields must exactly match declaration order\");\n    if (!Array.isArray(source.kind)) throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (!Array.isArray(source.index)) throw new TypeError(\"field index has an incompatible value\");\n    this.index = source.index;\n    if (!Array.isArray(source.count)) throw new TypeError(\"field count has an incompatible value\");\n    this.count = source.count;\n    if (false) throw new TypeError(\"field rows has an incompatible value\");\n    this.rows = source.rows;\n    Object.freeze(this);\n  }\n\n  getKind() { return this.kind; }\n  getIndex() { return this.index; }\n  getCount() { return this.count; }\n  getRows() { return this.rows; }\n\n  static validate(value) { if (value instanceof PuffDirectoryGroupEditColumns) return true; try { new PuffDirectoryGroupEditColumns(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryGroupEditColumns) return value; return new PuffDirectoryGroupEditColumns(value); }\n\n  toObject() { return {kind: this.kind, index: this.index, count: this.count, rows: this.rows}; }\n}\n\nexport const PuffDirectoryProjectionSnapshotPayloadFields = Object.freeze([\"projection\", \"children\", \"publication_state\", \"publication_symbols\", \"publication_conflicts\", \"alphabetical\", \"by_source\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\", \"Int\", \"Int\", \"Struct\", \"Struct\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_DirectoryNodeColumns\", \"puff_DirectoryGroupColumns\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryProjectionSnapshotPayloadFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_DirectoryNodeColumns\", \"puff_DirectoryGroupColumns\"])\nexport const PuffDirectoryProjectionSnapshotPayloadSchemaIdentity = Object.freeze([0x2e, 0x86, 0xb1, 0x2b, 0x28, 0x31, 0x76, 0xb4, 0xe2, 0x30, 0x0a, 0xf3, 0x8d, 0x53, 0x90, 0x88, 0x6f, 0xe7, 0x27, 0xc5, 0x55, 0xb6, 0x82, 0x1f, 0x48, 0x73, 0xb2, 0x70, 0xb1, 0x8c, 0xf9, 0x2a])\nexport const PuffDirectoryProjectionSnapshotPayloadPhysicalType = \"puff_DirectoryProjectionSnapshotPayload\"\nexport const PuffDirectoryProjectionSnapshotPayloadFieldCount = 7;\nexport const PuffDirectoryProjectionSnapshotPayloadProjectionField = 0;\nexport const PuffDirectoryProjectionSnapshotPayloadChildrenField = 1;\nexport const PuffDirectoryProjectionSnapshotPayloadPublicationStateField = 2;\nexport const PuffDirectoryProjectionSnapshotPayloadPublicationSymbolsField = 3;\nexport const PuffDirectoryProjectionSnapshotPayloadPublicationConflictsField = 4;\nexport const PuffDirectoryProjectionSnapshotPayloadAlphabeticalField = 5;\nexport const PuffDirectoryProjectionSnapshotPayloadBySourceField = 6;\n\nexport class PuffDirectoryProjectionSnapshotPayload {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryProjectionSnapshotPayload: expected a fixed-layout object\");\n    const names = PuffDirectoryProjectionSnapshotPayloadFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryProjectionSnapshotPayload: fields must exactly match declaration order\");\n    if (typeof source.projection !== \"string\") throw new TypeError(\"field projection has an incompatible value\");\n    this.projection = source.projection;\n    if (typeof source.children !== \"number\") throw new TypeError(\"field children has an incompatible value\");\n    this.children = source.children;\n    if (typeof source.publication_state !== \"string\") throw new TypeError(\"field publication_state has an incompatible value\");\n    this.publication_state = source.publication_state;\n    if (typeof source.publication_symbols !== \"number\") throw new TypeError(\"field publication_symbols has an incompatible value\");\n    this.publication_symbols = source.publication_symbols;\n    if (typeof source.publication_conflicts !== \"number\") throw new TypeError(\"field publication_conflicts has an incompatible value\");\n    this.publication_conflicts = source.publication_conflicts;\n    if (source.alphabetical === null || typeof source.alphabetical !== \"object\") throw new TypeError(\"field alphabetical has an incompatible value\");\n    this.alphabetical = source.alphabetical;\n    if (source.by_source === null || typeof source.by_source !== \"object\") throw new TypeError(\"field by_source has an incompatible value\");\n    this.by_source = source.by_source;\n    Object.freeze(this);\n  }\n\n  getProjection() { return this.projection; }\n  getChildren() { return this.children; }\n  getPublicationState() { return this.publication_state; }\n  getPublicationSymbols() { return this.publication_symbols; }\n  getPublicationConflicts() { return this.publication_conflicts; }\n  getAlphabetical() { return this.alphabetical; }\n  getBySource() { return this.by_source; }\n\n  static validate(value) { if (value instanceof PuffDirectoryProjectionSnapshotPayload) return true; try { new PuffDirectoryProjectionSnapshotPayload(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryProjectionSnapshotPayload) return value; return new PuffDirectoryProjectionSnapshotPayload(value); }\n\n  toObject() { return {projection: this.projection, children: this.children, publication_state: this.publication_state, publication_symbols: this.publication_symbols, publication_conflicts: this.publication_conflicts, alphabetical: this.alphabetical, by_source: this.by_source}; }\n}\n\nexport const PuffDirectoryProjectionDeltaPayloadFields = Object.freeze([\"projection\", \"children\", \"publication_state\", \"publication_symbols\", \"publication_conflicts\", \"alphabetical\", \"by_source\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Str\", \"Int\", \"Int\", \"Struct\", \"Struct\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_DirectoryNodeEditColumns\", \"puff_DirectoryGroupEditColumns\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryProjectionDeltaPayloadFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryProjectionDeltaPayloadFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"puff_DirectoryNodeEditColumns\", \"puff_DirectoryGroupEditColumns\"])\nexport const PuffDirectoryProjectionDeltaPayloadSchemaIdentity = Object.freeze([0x4f, 0x51, 0xc2, 0xed, 0x69, 0x47, 0xbf, 0x18, 0x49, 0xff, 0x87, 0xeb, 0x6f, 0x81, 0xb8, 0x31, 0xf5, 0x7e, 0x92, 0x54, 0x3e, 0x97, 0xba, 0xbc, 0x36, 0x18, 0xe2, 0xa3, 0x4e, 0x66, 0x8f, 0x66])\nexport const PuffDirectoryProjectionDeltaPayloadPhysicalType = \"puff_DirectoryProjectionDeltaPayload\"\nexport const PuffDirectoryProjectionDeltaPayloadFieldCount = 7;\nexport const PuffDirectoryProjectionDeltaPayloadProjectionField = 0;\nexport const PuffDirectoryProjectionDeltaPayloadChildrenField = 1;\nexport const PuffDirectoryProjectionDeltaPayloadPublicationStateField = 2;\nexport const PuffDirectoryProjectionDeltaPayloadPublicationSymbolsField = 3;\nexport const PuffDirectoryProjectionDeltaPayloadPublicationConflictsField = 4;\nexport const PuffDirectoryProjectionDeltaPayloadAlphabeticalField = 5;\nexport const PuffDirectoryProjectionDeltaPayloadBySourceField = 6;\n\nexport class PuffDirectoryProjectionDeltaPayload {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryProjectionDeltaPayload: expected a fixed-layout object\");\n    const names = PuffDirectoryProjectionDeltaPayloadFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryProjectionDeltaPayload: fields must exactly match declaration order\");\n    if (typeof source.projection !== \"string\") throw new TypeError(\"field projection has an incompatible value\");\n    this.projection = source.projection;\n    if (typeof source.children !== \"number\") throw new TypeError(\"field children has an incompatible value\");\n    this.children = source.children;\n    if (typeof source.publication_state !== \"string\") throw new TypeError(\"field publication_state has an incompatible value\");\n    this.publication_state = source.publication_state;\n    if (typeof source.publication_symbols !== \"number\") throw new TypeError(\"field publication_symbols has an incompatible value\");\n    this.publication_symbols = source.publication_symbols;\n    if (typeof source.publication_conflicts !== \"number\") throw new TypeError(\"field publication_conflicts has an incompatible value\");\n    this.publication_conflicts = source.publication_conflicts;\n    if (source.alphabetical === null || typeof source.alphabetical !== \"object\") throw new TypeError(\"field alphabetical has an incompatible value\");\n    this.alphabetical = source.alphabetical;\n    if (source.by_source === null || typeof source.by_source !== \"object\") throw new TypeError(\"field by_source has an incompatible value\");\n    this.by_source = source.by_source;\n    Object.freeze(this);\n  }\n\n  getProjection() { return this.projection; }\n  getChildren() { return this.children; }\n  getPublicationState() { return this.publication_state; }\n  getPublicationSymbols() { return this.publication_symbols; }\n  getPublicationConflicts() { return this.publication_conflicts; }\n  getAlphabetical() { return this.alphabetical; }\n  getBySource() { return this.by_source; }\n\n  static validate(value) { if (value instanceof PuffDirectoryProjectionDeltaPayload) return true; try { new PuffDirectoryProjectionDeltaPayload(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryProjectionDeltaPayload) return value; return new PuffDirectoryProjectionDeltaPayload(value); }\n\n  toObject() { return {projection: this.projection, children: this.children, publication_state: this.publication_state, publication_symbols: this.publication_symbols, publication_conflicts: this.publication_conflicts, alphabetical: this.alphabetical, by_source: this.by_source}; }\n}\n\nexport const PuffDirectoryWireKeyFields = Object.freeze([\"branch\", \"path\"])\nexport const PuffDirectoryWireKeyFieldLogicalTypes = Object.freeze([\"Str\", \"Str\"])\nexport const PuffDirectoryWireKeyFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\"])\nexport const PuffDirectoryWireKeyFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireKeyFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireKeyFieldNullable = Object.freeze([false, false])\nexport const PuffDirectoryWireKeyFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffDirectoryWireKeyFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\"])\nexport const PuffDirectoryWireKeySchemaIdentity = Object.freeze([0x71, 0x25, 0x22, 0xbe, 0x18, 0x93, 0x09, 0x34, 0x5a, 0x9a, 0x3b, 0xda, 0x41, 0xdf, 0x5c, 0x14, 0x4f, 0x2b, 0x20, 0x77, 0xf6, 0xaa, 0x60, 0xac, 0x2d, 0x13, 0x95, 0xc5, 0x68, 0x6d, 0x36, 0x89])\nexport const PuffDirectoryWireKeyPhysicalType = \"puff_DirectoryWireKey\"\nexport const PuffDirectoryWireKeyFieldCount = 2;\nexport const PuffDirectoryWireKeyBranchField = 0;\nexport const PuffDirectoryWireKeyPathField = 1;\n\nexport class PuffDirectoryWireKey {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireKey: expected a fixed-layout object\");\n    const names = PuffDirectoryWireKeyFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireKey: fields must exactly match declaration order\");\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.path !== \"string\") throw new TypeError(\"field path has an incompatible value\");\n    this.path = source.path;\n    Object.freeze(this);\n  }\n\n  getBranch() { return this.branch; }\n  getPath() { return this.path; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireKey) return true; try { new PuffDirectoryWireKey(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireKey) return value; return new PuffDirectoryWireKey(value); }\n\n  toObject() { return {branch: this.branch, path: this.path}; }\n}\n\nexport const PuffDirectoryWireCountsFields = Object.freeze([\"children\"])\nexport const PuffDirectoryWireCountsFieldLogicalTypes = Object.freeze([\"Int\"])\nexport const PuffDirectoryWireCountsFieldPhysicalTypes = Object.freeze([\"IntegralScalar\"])\nexport const PuffDirectoryWireCountsFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffDirectoryWireCountsFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffDirectoryWireCountsFieldNullable = Object.freeze([false])\nexport const PuffDirectoryWireCountsFieldRoles = Object.freeze([\"payload\"])\nexport const PuffDirectoryWireCountsFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\"])\nexport const PuffDirectoryWireCountsSchemaIdentity = Object.freeze([0x9d, 0x31, 0x86, 0x79, 0x8c, 0x5b, 0xc0, 0x80, 0x8a, 0x4b, 0xef, 0x99, 0x54, 0xc1, 0x88, 0xb2, 0xd4, 0xce, 0xcb, 0x25, 0xfa, 0x4f, 0x09, 0x24, 0xfe, 0xf4, 0x3a, 0x0a, 0x0f, 0x86, 0x1f, 0x12])\nexport const PuffDirectoryWireCountsPhysicalType = \"puff_DirectoryWireCounts\"\nexport const PuffDirectoryWireCountsFieldCount = 1;\nexport const PuffDirectoryWireCountsChildrenField = 0;\n\nexport class PuffDirectoryWireCounts {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireCounts: expected a fixed-layout object\");\n    const names = PuffDirectoryWireCountsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireCounts: fields must exactly match declaration order\");\n    if (typeof source.children !== \"number\") throw new TypeError(\"field children has an incompatible value\");\n    this.children = source.children;\n    Object.freeze(this);\n  }\n\n  getChildren() { return this.children; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireCounts) return true; try { new PuffDirectoryWireCounts(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireCounts) return value; return new PuffDirectoryWireCounts(value); }\n\n  toObject() { return {children: this.children}; }\n}\n\nexport const PuffDirectoryWirePublicationCountsFields = Object.freeze([\"freshness\", \"symbols\", \"conflicts\"])\nexport const PuffDirectoryWirePublicationCountsFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\"])\nexport const PuffDirectoryWirePublicationCountsFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffDirectoryWirePublicationCountsFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWirePublicationCountsFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWirePublicationCountsFieldNullable = Object.freeze([false, false, false])\nexport const PuffDirectoryWirePublicationCountsFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWirePublicationCountsFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffDirectoryWirePublicationCountsSchemaIdentity = Object.freeze([0xeb, 0x74, 0xe4, 0x4c, 0x97, 0x22, 0x05, 0x4f, 0x8b, 0x96, 0x03, 0x5e, 0x83, 0xca, 0x99, 0x2a, 0x7f, 0x25, 0x37, 0x60, 0x22, 0x6b, 0x69, 0x9f, 0xf8, 0x6c, 0x01, 0x19, 0x0a, 0xc1, 0x7c, 0x04])\nexport const PuffDirectoryWirePublicationCountsPhysicalType = \"puff_DirectoryWirePublicationCounts\"\nexport const PuffDirectoryWirePublicationCountsFieldCount = 3;\nexport const PuffDirectoryWirePublicationCountsFreshnessField = 0;\nexport const PuffDirectoryWirePublicationCountsSymbolsField = 1;\nexport const PuffDirectoryWirePublicationCountsConflictsField = 2;\n\nexport class PuffDirectoryWirePublicationCounts {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWirePublicationCounts: expected a fixed-layout object\");\n    const names = PuffDirectoryWirePublicationCountsFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWirePublicationCounts: fields must exactly match declaration order\");\n    if (typeof source.freshness !== \"string\") throw new TypeError(\"field freshness has an incompatible value\");\n    this.freshness = source.freshness;\n    if (typeof source.symbols !== \"number\") throw new TypeError(\"field symbols has an incompatible value\");\n    this.symbols = source.symbols;\n    if (typeof source.conflicts !== \"number\") throw new TypeError(\"field conflicts has an incompatible value\");\n    this.conflicts = source.conflicts;\n    Object.freeze(this);\n  }\n\n  getFreshness() { return this.freshness; }\n  getSymbols() { return this.symbols; }\n  getConflicts() { return this.conflicts; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWirePublicationCounts) return true; try { new PuffDirectoryWirePublicationCounts(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWirePublicationCounts) return value; return new PuffDirectoryWirePublicationCounts(value); }\n\n  toObject() { return {freshness: this.freshness, symbols: this.symbols, conflicts: this.conflicts}; }\n}\n\nexport const PuffDirectoryWireArtifactFields = Object.freeze([\"name\", \"type\", \"owner\", \"read_groups\", \"write_groups\", \"can_read\", \"can_write\"])\nexport const PuffDirectoryWireArtifactFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"List\", \"List\", \"Bool\", \"Bool\"])\nexport const PuffDirectoryWireArtifactFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"BoolScalar\", \"BoolScalar\"])\nexport const PuffDirectoryWireArtifactFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\", \"Str\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireArtifactFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null, null, \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireArtifactFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryWireArtifactFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireArtifactFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesArrow32\", \"BytesArrow32\", \"BoolScalar\", \"BoolScalar\"])\nexport const PuffDirectoryWireArtifactSchemaIdentity = Object.freeze([0xb3, 0x24, 0xd7, 0xaf, 0x92, 0xdd, 0x77, 0xf9, 0x25, 0x04, 0x30, 0x12, 0x9f, 0xbb, 0x10, 0x77, 0x15, 0x4a, 0xa4, 0x85, 0x96, 0x06, 0xa2, 0x13, 0x09, 0x0e, 0x3e, 0xf0, 0xcd, 0x6d, 0xca, 0x6c])\nexport const PuffDirectoryWireArtifactPhysicalType = \"puff_DirectoryWireArtifact\"\nexport const PuffDirectoryWireArtifactFieldCount = 7;\nexport const PuffDirectoryWireArtifactNameField = 0;\nexport const PuffDirectoryWireArtifactTypeField = 1;\nexport const PuffDirectoryWireArtifactOwnerField = 2;\nexport const PuffDirectoryWireArtifactReadGroupsField = 3;\nexport const PuffDirectoryWireArtifactWriteGroupsField = 4;\nexport const PuffDirectoryWireArtifactCanReadField = 5;\nexport const PuffDirectoryWireArtifactCanWriteField = 6;\n\nexport class PuffDirectoryWireArtifact {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireArtifact: expected a fixed-layout object\");\n    const names = PuffDirectoryWireArtifactFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireArtifact: fields must exactly match declaration order\");\n    if (typeof source.name !== \"string\") throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    if (typeof source.type !== \"string\") throw new TypeError(\"field type has an incompatible value\");\n    this.type = source.type;\n    if (typeof source.owner !== \"string\") throw new TypeError(\"field owner has an incompatible value\");\n    this.owner = source.owner;\n    if (!Array.isArray(source.read_groups)) throw new TypeError(\"field read_groups has an incompatible value\");\n    this.read_groups = source.read_groups;\n    if (!Array.isArray(source.write_groups)) throw new TypeError(\"field write_groups has an incompatible value\");\n    this.write_groups = source.write_groups;\n    if (typeof source.can_read !== \"boolean\") throw new TypeError(\"field can_read has an incompatible value\");\n    this.can_read = source.can_read;\n    if (typeof source.can_write !== \"boolean\") throw new TypeError(\"field can_write has an incompatible value\");\n    this.can_write = source.can_write;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n  getType() { return this.type; }\n  getOwner() { return this.owner; }\n  getReadGroups() { return this.read_groups; }\n  getWriteGroups() { return this.write_groups; }\n  getCanRead() { return this.can_read; }\n  getCanWrite() { return this.can_write; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireArtifact) return true; try { new PuffDirectoryWireArtifact(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireArtifact) return value; return new PuffDirectoryWireArtifact(value); }\n\n  toObject() { return {name: this.name, type: this.type, owner: this.owner, read_groups: this.read_groups, write_groups: this.write_groups, can_read: this.can_read, can_write: this.can_write}; }\n}\n\nexport const PuffDirectoryWireNodeFields = Object.freeze([\"name\", \"kind\", \"freshness\", \"has_artifact\", \"artifact\", \"owner_path\", \"conflicts\"])\nexport const PuffDirectoryWireNodeFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Bool\", \"Any\", \"Str\", \"List\"])\nexport const PuffDirectoryWireNodeFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", null, \"BytesScalar\", \"BytesArrow32\"])\nexport const PuffDirectoryWireNodeFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"Str\"])\nexport const PuffDirectoryWireNodeFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", null])\nexport const PuffDirectoryWireNodeFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryWireNodeFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireNodeFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", null, \"BytesScalar\", \"BytesArrow32\"])\nexport const PuffDirectoryWireNodeSchemaIdentity = Object.freeze([0x2d, 0xe4, 0x3d, 0xac, 0x59, 0xe0, 0x4c, 0xdb, 0x1a, 0x0b, 0xd1, 0x98, 0xa8, 0xd1, 0xe8, 0x83, 0x9a, 0xf1, 0x3f, 0x9a, 0x5f, 0x42, 0xf6, 0xf0, 0x63, 0x00, 0x79, 0x8b, 0x86, 0x42, 0x2a, 0x7b])\nexport const PuffDirectoryWireNodePhysicalType = \"puff_DirectoryWireNode\"\nexport const PuffDirectoryWireNodeFieldCount = 7;\nexport const PuffDirectoryWireNodeNameField = 0;\nexport const PuffDirectoryWireNodeKindField = 1;\nexport const PuffDirectoryWireNodeFreshnessField = 2;\nexport const PuffDirectoryWireNodeHasArtifactField = 3;\nexport const PuffDirectoryWireNodeArtifactField = 4;\nexport const PuffDirectoryWireNodeOwnerPathField = 5;\nexport const PuffDirectoryWireNodeConflictsField = 6;\n\nexport class PuffDirectoryWireNode {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireNode: expected a fixed-layout object\");\n    const names = PuffDirectoryWireNodeFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireNode: fields must exactly match declaration order\");\n    if (typeof source.name !== \"string\") throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    if (typeof source.kind !== \"string\") throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (typeof source.freshness !== \"string\") throw new TypeError(\"field freshness has an incompatible value\");\n    this.freshness = source.freshness;\n    if (typeof source.has_artifact !== \"boolean\") throw new TypeError(\"field has_artifact has an incompatible value\");\n    this.has_artifact = source.has_artifact;\n    if (false) throw new TypeError(\"field artifact has an incompatible value\");\n    this.artifact = source.artifact;\n    if (typeof source.owner_path !== \"string\") throw new TypeError(\"field owner_path has an incompatible value\");\n    this.owner_path = source.owner_path;\n    if (!Array.isArray(source.conflicts)) throw new TypeError(\"field conflicts has an incompatible value\");\n    this.conflicts = source.conflicts;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n  getKind() { return this.kind; }\n  getFreshness() { return this.freshness; }\n  getHasArtifact() { return this.has_artifact; }\n  getArtifact() { return this.artifact; }\n  getOwnerPath() { return this.owner_path; }\n  getConflicts() { return this.conflicts; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireNode) return true; try { new PuffDirectoryWireNode(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireNode) return value; return new PuffDirectoryWireNode(value); }\n\n  toObject() { return {name: this.name, kind: this.kind, freshness: this.freshness, has_artifact: this.has_artifact, artifact: this.artifact, owner_path: this.owner_path, conflicts: this.conflicts}; }\n}\n\nexport const PuffDirectoryWireNameFields = Object.freeze([\"name\"])\nexport const PuffDirectoryWireNameFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffDirectoryWireNameFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffDirectoryWireNameFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffDirectoryWireNameFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffDirectoryWireNameFieldNullable = Object.freeze([false])\nexport const PuffDirectoryWireNameFieldRoles = Object.freeze([\"payload\"])\nexport const PuffDirectoryWireNameFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffDirectoryWireNameSchemaIdentity = Object.freeze([0x87, 0x0f, 0x61, 0xea, 0xa4, 0xad, 0x01, 0x56, 0x31, 0xe8, 0xd4, 0x5b, 0xab, 0x8e, 0x59, 0xd9, 0x52, 0xc5, 0x1c, 0x75, 0x02, 0xda, 0xe1, 0x61, 0x7b, 0x39, 0x8d, 0x20, 0x5b, 0xa2, 0x7e, 0x46])\nexport const PuffDirectoryWireNamePhysicalType = \"puff_DirectoryWireName\"\nexport const PuffDirectoryWireNameFieldCount = 1;\nexport const PuffDirectoryWireNameNameField = 0;\n\nexport class PuffDirectoryWireName {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireName: expected a fixed-layout object\");\n    const names = PuffDirectoryWireNameFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireName: fields must exactly match declaration order\");\n    if (typeof source.name !== \"string\") throw new TypeError(\"field name has an incompatible value\");\n    this.name = source.name;\n    Object.freeze(this);\n  }\n\n  getName() { return this.name; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireName) return true; try { new PuffDirectoryWireName(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireName) return value; return new PuffDirectoryWireName(value); }\n\n  toObject() { return {name: this.name}; }\n}\n\nexport const PuffDirectoryWireGroupFields = Object.freeze([\"key\", \"source_name\", \"source_path\", \"freshness\", \"has_source_artifact\", \"source_artifact\", \"names\"])\nexport const PuffDirectoryWireGroupFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Bool\", \"Any\", \"Any\"])\nexport const PuffDirectoryWireGroupFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", null, null])\nexport const PuffDirectoryWireGroupFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireGroupFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireGroupFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffDirectoryWireGroupFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireGroupFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BoolScalar\", null, null])\nexport const PuffDirectoryWireGroupSchemaIdentity = Object.freeze([0xfb, 0x85, 0x9b, 0xba, 0x41, 0xca, 0x0c, 0x2e, 0x6a, 0x9a, 0x07, 0xbc, 0x80, 0x6c, 0x90, 0x5a, 0x7a, 0x0b, 0x03, 0xab, 0xd5, 0x98, 0x29, 0xba, 0x5b, 0x42, 0x95, 0x83, 0x59, 0x08, 0xa6, 0x6d])\nexport const PuffDirectoryWireGroupPhysicalType = \"puff_DirectoryWireGroup\"\nexport const PuffDirectoryWireGroupFieldCount = 7;\nexport const PuffDirectoryWireGroupKeyField = 0;\nexport const PuffDirectoryWireGroupSourceNameField = 1;\nexport const PuffDirectoryWireGroupSourcePathField = 2;\nexport const PuffDirectoryWireGroupFreshnessField = 3;\nexport const PuffDirectoryWireGroupHasSourceArtifactField = 4;\nexport const PuffDirectoryWireGroupSourceArtifactField = 5;\nexport const PuffDirectoryWireGroupNamesField = 6;\n\nexport class PuffDirectoryWireGroup {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireGroup: expected a fixed-layout object\");\n    const names = PuffDirectoryWireGroupFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireGroup: fields must exactly match declaration order\");\n    if (typeof source.key !== \"string\") throw new TypeError(\"field key has an incompatible value\");\n    this.key = source.key;\n    if (typeof source.source_name !== \"string\") throw new TypeError(\"field source_name has an incompatible value\");\n    this.source_name = source.source_name;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.freshness !== \"string\") throw new TypeError(\"field freshness has an incompatible value\");\n    this.freshness = source.freshness;\n    if (typeof source.has_source_artifact !== \"boolean\") throw new TypeError(\"field has_source_artifact has an incompatible value\");\n    this.has_source_artifact = source.has_source_artifact;\n    if (false) throw new TypeError(\"field source_artifact has an incompatible value\");\n    this.source_artifact = source.source_artifact;\n    if (false) throw new TypeError(\"field names has an incompatible value\");\n    this.names = source.names;\n    Object.freeze(this);\n  }\n\n  getKey() { return this.key; }\n  getSourceName() { return this.source_name; }\n  getSourcePath() { return this.source_path; }\n  getFreshness() { return this.freshness; }\n  getHasSourceArtifact() { return this.has_source_artifact; }\n  getSourceArtifact() { return this.source_artifact; }\n  getNames() { return this.names; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireGroup) return true; try { new PuffDirectoryWireGroup(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireGroup) return value; return new PuffDirectoryWireGroup(value); }\n\n  toObject() { return {key: this.key, source_name: this.source_name, source_path: this.source_path, freshness: this.freshness, has_source_artifact: this.has_source_artifact, source_artifact: this.source_artifact, names: this.names}; }\n}\n\nexport const PuffDirectoryWireNodeEditFields = Object.freeze([\"kind\", \"index\", \"count\", \"rows\"])\nexport const PuffDirectoryWireNodeEditFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"Any\"])\nexport const PuffDirectoryWireNodeEditFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", null])\nexport const PuffDirectoryWireNodeEditFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireNodeEditFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireNodeEditFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffDirectoryWireNodeEditFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireNodeEditFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", null])\nexport const PuffDirectoryWireNodeEditSchemaIdentity = Object.freeze([0x9d, 0x4c, 0x51, 0x58, 0x85, 0x93, 0xa7, 0xf6, 0x0d, 0x89, 0xfd, 0x3c, 0x3d, 0xea, 0xa2, 0x7e, 0xbe, 0x59, 0x3c, 0xa6, 0x9e, 0x63, 0xdd, 0xc9, 0x12, 0x4c, 0xcb, 0x68, 0xb4, 0x1a, 0xdc, 0x3f])\nexport const PuffDirectoryWireNodeEditPhysicalType = \"puff_DirectoryWireNodeEdit\"\nexport const PuffDirectoryWireNodeEditFieldCount = 4;\nexport const PuffDirectoryWireNodeEditKindField = 0;\nexport const PuffDirectoryWireNodeEditIndexField = 1;\nexport const PuffDirectoryWireNodeEditCountField = 2;\nexport const PuffDirectoryWireNodeEditRowsField = 3;\n\nexport class PuffDirectoryWireNodeEdit {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireNodeEdit: expected a fixed-layout object\");\n    const names = PuffDirectoryWireNodeEditFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireNodeEdit: fields must exactly match declaration order\");\n    if (typeof source.kind !== \"string\") throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (typeof source.index !== \"number\") throw new TypeError(\"field index has an incompatible value\");\n    this.index = source.index;\n    if (typeof source.count !== \"number\") throw new TypeError(\"field count has an incompatible value\");\n    this.count = source.count;\n    if (false) throw new TypeError(\"field rows has an incompatible value\");\n    this.rows = source.rows;\n    Object.freeze(this);\n  }\n\n  getKind() { return this.kind; }\n  getIndex() { return this.index; }\n  getCount() { return this.count; }\n  getRows() { return this.rows; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireNodeEdit) return true; try { new PuffDirectoryWireNodeEdit(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireNodeEdit) return value; return new PuffDirectoryWireNodeEdit(value); }\n\n  toObject() { return {kind: this.kind, index: this.index, count: this.count, rows: this.rows}; }\n}\n\nexport const PuffDirectoryWireGroupEditFields = Object.freeze([\"kind\", \"index\", \"count\", \"rows\"])\nexport const PuffDirectoryWireGroupEditFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"Any\"])\nexport const PuffDirectoryWireGroupEditFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", null])\nexport const PuffDirectoryWireGroupEditFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireGroupEditFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireGroupEditFieldNullable = Object.freeze([false, false, false, false])\nexport const PuffDirectoryWireGroupEditFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireGroupEditFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", null])\nexport const PuffDirectoryWireGroupEditSchemaIdentity = Object.freeze([0xf8, 0xaa, 0x35, 0xb6, 0x95, 0xd0, 0xe3, 0x4b, 0x71, 0x48, 0x60, 0x71, 0x30, 0x9a, 0x7f, 0xef, 0xcf, 0x17, 0xa6, 0x7d, 0x13, 0x0f, 0x0f, 0x57, 0xa6, 0xd6, 0xf2, 0x82, 0xa2, 0x00, 0x9f, 0xd1])\nexport const PuffDirectoryWireGroupEditPhysicalType = \"puff_DirectoryWireGroupEdit\"\nexport const PuffDirectoryWireGroupEditFieldCount = 4;\nexport const PuffDirectoryWireGroupEditKindField = 0;\nexport const PuffDirectoryWireGroupEditIndexField = 1;\nexport const PuffDirectoryWireGroupEditCountField = 2;\nexport const PuffDirectoryWireGroupEditRowsField = 3;\n\nexport class PuffDirectoryWireGroupEdit {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireGroupEdit: expected a fixed-layout object\");\n    const names = PuffDirectoryWireGroupEditFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireGroupEdit: fields must exactly match declaration order\");\n    if (typeof source.kind !== \"string\") throw new TypeError(\"field kind has an incompatible value\");\n    this.kind = source.kind;\n    if (typeof source.index !== \"number\") throw new TypeError(\"field index has an incompatible value\");\n    this.index = source.index;\n    if (typeof source.count !== \"number\") throw new TypeError(\"field count has an incompatible value\");\n    this.count = source.count;\n    if (false) throw new TypeError(\"field rows has an incompatible value\");\n    this.rows = source.rows;\n    Object.freeze(this);\n  }\n\n  getKind() { return this.kind; }\n  getIndex() { return this.index; }\n  getCount() { return this.count; }\n  getRows() { return this.rows; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireGroupEdit) return true; try { new PuffDirectoryWireGroupEdit(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireGroupEdit) return value; return new PuffDirectoryWireGroupEdit(value); }\n\n  toObject() { return {kind: this.kind, index: this.index, count: this.count, rows: this.rows}; }\n}\n\nexport const PuffDirectoryWireSnapshotFields = Object.freeze([\"key\", \"major\", \"seq\", \"projection\", \"counts\", \"publication_state\", \"publication_counts\", \"alphabetical\", \"by_source\"])\nexport const PuffDirectoryWireSnapshotFieldLogicalTypes = Object.freeze([\"Struct\", \"Int\", \"Int\", \"Str\", \"Struct\", \"Str\", \"Struct\", \"Any\", \"Any\"])\nexport const PuffDirectoryWireSnapshotFieldPhysicalTypes = Object.freeze([\"puff_DirectoryWireKey\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"puff_DirectoryWireCounts\", \"BytesScalar\", \"puff_DirectoryWirePublicationCounts\", null, null])\nexport const PuffDirectoryWireSnapshotFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireSnapshotFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireSnapshotFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false])\nexport const PuffDirectoryWireSnapshotFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireSnapshotFieldDeclaredMetadata = Object.freeze([\"puff_DirectoryWireKey\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"puff_DirectoryWireCounts\", \"BytesScalar\", \"puff_DirectoryWirePublicationCounts\", null, null])\nexport const PuffDirectoryWireSnapshotSchemaIdentity = Object.freeze([0x11, 0x49, 0xc0, 0x0a, 0x8b, 0xc7, 0x7e, 0x05, 0x0e, 0x35, 0x84, 0x10, 0x34, 0x89, 0x99, 0x5e, 0x8e, 0x67, 0xd1, 0x73, 0x6b, 0x5c, 0x45, 0x4e, 0xe6, 0x85, 0x59, 0x3f, 0xe7, 0x31, 0xe2, 0xa1])\nexport const PuffDirectoryWireSnapshotPhysicalType = \"puff_DirectoryWireSnapshot\"\nexport const PuffDirectoryWireSnapshotFieldCount = 9;\nexport const PuffDirectoryWireSnapshotKeyField = 0;\nexport const PuffDirectoryWireSnapshotMajorField = 1;\nexport const PuffDirectoryWireSnapshotSeqField = 2;\nexport const PuffDirectoryWireSnapshotProjectionField = 3;\nexport const PuffDirectoryWireSnapshotCountsField = 4;\nexport const PuffDirectoryWireSnapshotPublicationStateField = 5;\nexport const PuffDirectoryWireSnapshotPublicationCountsField = 6;\nexport const PuffDirectoryWireSnapshotAlphabeticalField = 7;\nexport const PuffDirectoryWireSnapshotBySourceField = 8;\n\nexport class PuffDirectoryWireSnapshot {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireSnapshot: expected a fixed-layout object\");\n    const names = PuffDirectoryWireSnapshotFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireSnapshot: fields must exactly match declaration order\");\n    if (source.key === null || typeof source.key !== \"object\") throw new TypeError(\"field key has an incompatible value\");\n    this.key = source.key;\n    if (typeof source.major !== \"number\") throw new TypeError(\"field major has an incompatible value\");\n    this.major = source.major;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (typeof source.projection !== \"string\") throw new TypeError(\"field projection has an incompatible value\");\n    this.projection = source.projection;\n    if (source.counts === null || typeof source.counts !== \"object\") throw new TypeError(\"field counts has an incompatible value\");\n    this.counts = source.counts;\n    if (typeof source.publication_state !== \"string\") throw new TypeError(\"field publication_state has an incompatible value\");\n    this.publication_state = source.publication_state;\n    if (source.publication_counts === null || typeof source.publication_counts !== \"object\") throw new TypeError(\"field publication_counts has an incompatible value\");\n    this.publication_counts = source.publication_counts;\n    if (false) throw new TypeError(\"field alphabetical has an incompatible value\");\n    this.alphabetical = source.alphabetical;\n    if (false) throw new TypeError(\"field by_source has an incompatible value\");\n    this.by_source = source.by_source;\n    Object.freeze(this);\n  }\n\n  getKey() { return this.key; }\n  getMajor() { return this.major; }\n  getSeq() { return this.seq; }\n  getProjection() { return this.projection; }\n  getCounts() { return this.counts; }\n  getPublicationState() { return this.publication_state; }\n  getPublicationCounts() { return this.publication_counts; }\n  getAlphabetical() { return this.alphabetical; }\n  getBySource() { return this.by_source; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireSnapshot) return true; try { new PuffDirectoryWireSnapshot(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireSnapshot) return value; return new PuffDirectoryWireSnapshot(value); }\n\n  toObject() { return {key: this.key, major: this.major, seq: this.seq, projection: this.projection, counts: this.counts, publication_state: this.publication_state, publication_counts: this.publication_counts, alphabetical: this.alphabetical, by_source: this.by_source}; }\n}\n\nexport const PuffDirectoryWireDeltaFields = Object.freeze([\"key\", \"major\", \"seq\", \"projection\", \"counts\", \"publication_state\", \"publication_counts\", \"alphabetical\", \"by_source\"])\nexport const PuffDirectoryWireDeltaFieldLogicalTypes = Object.freeze([\"Struct\", \"Int\", \"Int\", \"Str\", \"Struct\", \"Str\", \"Struct\", \"Any\", \"Any\"])\nexport const PuffDirectoryWireDeltaFieldPhysicalTypes = Object.freeze([\"puff_DirectoryWireKey\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"puff_DirectoryWireCounts\", \"BytesScalar\", \"puff_DirectoryWirePublicationCounts\", null, null])\nexport const PuffDirectoryWireDeltaFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireDeltaFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireDeltaFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false])\nexport const PuffDirectoryWireDeltaFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDirectoryWireDeltaFieldDeclaredMetadata = Object.freeze([\"puff_DirectoryWireKey\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"puff_DirectoryWireCounts\", \"BytesScalar\", \"puff_DirectoryWirePublicationCounts\", null, null])\nexport const PuffDirectoryWireDeltaSchemaIdentity = Object.freeze([0xbb, 0x8e, 0x18, 0x6d, 0x07, 0x37, 0xcb, 0x17, 0xe0, 0x65, 0xd2, 0x0c, 0x3d, 0x9b, 0x36, 0xd5, 0x74, 0xb1, 0xe6, 0x1a, 0xb6, 0x68, 0x9e, 0x6b, 0xcb, 0xd4, 0xb9, 0xac, 0xd6, 0x00, 0xa1, 0x1c])\nexport const PuffDirectoryWireDeltaPhysicalType = \"puff_DirectoryWireDelta\"\nexport const PuffDirectoryWireDeltaFieldCount = 9;\nexport const PuffDirectoryWireDeltaKeyField = 0;\nexport const PuffDirectoryWireDeltaMajorField = 1;\nexport const PuffDirectoryWireDeltaSeqField = 2;\nexport const PuffDirectoryWireDeltaProjectionField = 3;\nexport const PuffDirectoryWireDeltaCountsField = 4;\nexport const PuffDirectoryWireDeltaPublicationStateField = 5;\nexport const PuffDirectoryWireDeltaPublicationCountsField = 6;\nexport const PuffDirectoryWireDeltaAlphabeticalField = 7;\nexport const PuffDirectoryWireDeltaBySourceField = 8;\n\nexport class PuffDirectoryWireDelta {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireDelta: expected a fixed-layout object\");\n    const names = PuffDirectoryWireDeltaFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireDelta: fields must exactly match declaration order\");\n    if (source.key === null || typeof source.key !== \"object\") throw new TypeError(\"field key has an incompatible value\");\n    this.key = source.key;\n    if (typeof source.major !== \"number\") throw new TypeError(\"field major has an incompatible value\");\n    this.major = source.major;\n    if (typeof source.seq !== \"number\") throw new TypeError(\"field seq has an incompatible value\");\n    this.seq = source.seq;\n    if (typeof source.projection !== \"string\") throw new TypeError(\"field projection has an incompatible value\");\n    this.projection = source.projection;\n    if (source.counts === null || typeof source.counts !== \"object\") throw new TypeError(\"field counts has an incompatible value\");\n    this.counts = source.counts;\n    if (typeof source.publication_state !== \"string\") throw new TypeError(\"field publication_state has an incompatible value\");\n    this.publication_state = source.publication_state;\n    if (source.publication_counts === null || typeof source.publication_counts !== \"object\") throw new TypeError(\"field publication_counts has an incompatible value\");\n    this.publication_counts = source.publication_counts;\n    if (false) throw new TypeError(\"field alphabetical has an incompatible value\");\n    this.alphabetical = source.alphabetical;\n    if (false) throw new TypeError(\"field by_source has an incompatible value\");\n    this.by_source = source.by_source;\n    Object.freeze(this);\n  }\n\n  getKey() { return this.key; }\n  getMajor() { return this.major; }\n  getSeq() { return this.seq; }\n  getProjection() { return this.projection; }\n  getCounts() { return this.counts; }\n  getPublicationState() { return this.publication_state; }\n  getPublicationCounts() { return this.publication_counts; }\n  getAlphabetical() { return this.alphabetical; }\n  getBySource() { return this.by_source; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireDelta) return true; try { new PuffDirectoryWireDelta(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireDelta) return value; return new PuffDirectoryWireDelta(value); }\n\n  toObject() { return {key: this.key, major: this.major, seq: this.seq, projection: this.projection, counts: this.counts, publication_state: this.publication_state, publication_counts: this.publication_counts, alphabetical: this.alphabetical, by_source: this.by_source}; }\n}\n\nexport const PuffDirectoryWireSubscribeResponseFields = Object.freeze([\"subscription_uuid\", \"snapshot\"])\nexport const PuffDirectoryWireSubscribeResponseFieldLogicalTypes = Object.freeze([\"Str\", \"Struct\"])\nexport const PuffDirectoryWireSubscribeResponseFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"puff_DirectoryWireSnapshot\"])\nexport const PuffDirectoryWireSubscribeResponseFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireSubscribeResponseFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireSubscribeResponseFieldNullable = Object.freeze([false, false])\nexport const PuffDirectoryWireSubscribeResponseFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffDirectoryWireSubscribeResponseFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"puff_DirectoryWireSnapshot\"])\nexport const PuffDirectoryWireSubscribeResponseSchemaIdentity = Object.freeze([0x27, 0x27, 0x88, 0xef, 0xcd, 0x9b, 0x4e, 0xa3, 0xe9, 0xb7, 0x3e, 0x94, 0xd3, 0x59, 0x36, 0xf8, 0x3b, 0xf0, 0x6c, 0xde, 0xe1, 0x89, 0xdd, 0xcb, 0x3c, 0xc9, 0x45, 0x34, 0x49, 0xee, 0x90, 0x95])\nexport const PuffDirectoryWireSubscribeResponsePhysicalType = \"puff_DirectoryWireSubscribeResponse\"\nexport const PuffDirectoryWireSubscribeResponseFieldCount = 2;\nexport const PuffDirectoryWireSubscribeResponseSubscriptionUuidField = 0;\nexport const PuffDirectoryWireSubscribeResponseSnapshotField = 1;\n\nexport class PuffDirectoryWireSubscribeResponse {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireSubscribeResponse: expected a fixed-layout object\");\n    const names = PuffDirectoryWireSubscribeResponseFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireSubscribeResponse: fields must exactly match declaration order\");\n    if (typeof source.subscription_uuid !== \"string\") throw new TypeError(\"field subscription_uuid has an incompatible value\");\n    this.subscription_uuid = source.subscription_uuid;\n    if (source.snapshot === null || typeof source.snapshot !== \"object\") throw new TypeError(\"field snapshot has an incompatible value\");\n    this.snapshot = source.snapshot;\n    Object.freeze(this);\n  }\n\n  getSubscriptionUuid() { return this.subscription_uuid; }\n  getSnapshot() { return this.snapshot; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireSubscribeResponse) return true; try { new PuffDirectoryWireSubscribeResponse(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireSubscribeResponse) return value; return new PuffDirectoryWireSubscribeResponse(value); }\n\n  toObject() { return {subscription_uuid: this.subscription_uuid, snapshot: this.snapshot}; }\n}\n\nexport const PuffDirectoryWireDeltaEventFields = Object.freeze([\"event_type\", \"delta\"])\nexport const PuffDirectoryWireDeltaEventFieldLogicalTypes = Object.freeze([\"Str\", \"Struct\"])\nexport const PuffDirectoryWireDeltaEventFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"puff_DirectoryWireDelta\"])\nexport const PuffDirectoryWireDeltaEventFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDirectoryWireDeltaEventFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffDirectoryWireDeltaEventFieldNullable = Object.freeze([false, false])\nexport const PuffDirectoryWireDeltaEventFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffDirectoryWireDeltaEventFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"puff_DirectoryWireDelta\"])\nexport const PuffDirectoryWireDeltaEventSchemaIdentity = Object.freeze([0x9f, 0x12, 0xa3, 0x12, 0xbe, 0x1e, 0xea, 0xf3, 0xac, 0x63, 0x3a, 0xfb, 0xcc, 0x3e, 0x1d, 0x33, 0x28, 0x3f, 0xf9, 0x82, 0x64, 0xdb, 0x79, 0x18, 0x49, 0xfd, 0xca, 0xdf, 0x3e, 0xe6, 0xcd, 0xfa])\nexport const PuffDirectoryWireDeltaEventPhysicalType = \"puff_DirectoryWireDeltaEvent\"\nexport const PuffDirectoryWireDeltaEventFieldCount = 2;\nexport const PuffDirectoryWireDeltaEventEventTypeField = 0;\nexport const PuffDirectoryWireDeltaEventDeltaField = 1;\n\nexport class PuffDirectoryWireDeltaEvent {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireDeltaEvent: expected a fixed-layout object\");\n    const names = PuffDirectoryWireDeltaEventFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireDeltaEvent: fields must exactly match declaration order\");\n    if (typeof source.event_type !== \"string\") throw new TypeError(\"field event_type has an incompatible value\");\n    this.event_type = source.event_type;\n    if (source.delta === null || typeof source.delta !== \"object\") throw new TypeError(\"field delta has an incompatible value\");\n    this.delta = source.delta;\n    Object.freeze(this);\n  }\n\n  getEventType() { return this.event_type; }\n  getDelta() { return this.delta; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireDeltaEvent) return true; try { new PuffDirectoryWireDeltaEvent(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireDeltaEvent) return value; return new PuffDirectoryWireDeltaEvent(value); }\n\n  toObject() { return {event_type: this.event_type, delta: this.delta}; }\n}\n\nexport const PuffDirectoryWireUnsubscribeResponseFields = Object.freeze([\"status\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldNullable = Object.freeze([false])\nexport const PuffDirectoryWireUnsubscribeResponseFieldRoles = Object.freeze([\"payload\"])\nexport const PuffDirectoryWireUnsubscribeResponseFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffDirectoryWireUnsubscribeResponseSchemaIdentity = Object.freeze([0x45, 0x28, 0xd8, 0x35, 0x77, 0xbf, 0x64, 0xa1, 0xb8, 0xe1, 0x54, 0x72, 0xb4, 0xbd, 0xcd, 0xe1, 0xf2, 0x8d, 0xfb, 0x63, 0x12, 0xb3, 0x89, 0x6e, 0x2c, 0xaf, 0x63, 0x09, 0xcd, 0x1c, 0xc0, 0x4b])\nexport const PuffDirectoryWireUnsubscribeResponsePhysicalType = \"puff_DirectoryWireUnsubscribeResponse\"\nexport const PuffDirectoryWireUnsubscribeResponseFieldCount = 1;\nexport const PuffDirectoryWireUnsubscribeResponseStatusField = 0;\n\nexport class PuffDirectoryWireUnsubscribeResponse {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDirectoryWireUnsubscribeResponse: expected a fixed-layout object\");\n    const names = PuffDirectoryWireUnsubscribeResponseFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDirectoryWireUnsubscribeResponse: fields must exactly match declaration order\");\n    if (typeof source.status !== \"string\") throw new TypeError(\"field status has an incompatible value\");\n    this.status = source.status;\n    Object.freeze(this);\n  }\n\n  getStatus() { return this.status; }\n\n  static validate(value) { if (value instanceof PuffDirectoryWireUnsubscribeResponse) return true; try { new PuffDirectoryWireUnsubscribeResponse(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDirectoryWireUnsubscribeResponse) return value; return new PuffDirectoryWireUnsubscribeResponse(value); }\n\n  toObject() { return {status: this.status}; }\n}\n\nexport const PuffComputeBookRequestFields = Object.freeze([\"book_id\", \"version\", \"line_num\", \"wave_token\", \"username\", \"lake\", \"branch\", \"source_path\", \"ambient_at_unix_ms\", \"load_snapshot_physical\"])\nexport const PuffComputeBookRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Int\", \"Int\", \"Int\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Str\"])\nexport const PuffComputeBookRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffComputeBookRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffComputeBookRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffComputeBookRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false])\nexport const PuffComputeBookRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffComputeBookRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\"])\nexport const PuffComputeBookRequestSchemaIdentity = Object.freeze([0x74, 0x50, 0xb7, 0x82, 0x5b, 0x0a, 0xab, 0x49, 0x7c, 0xbd, 0xb6, 0x05, 0xba, 0xda, 0x72, 0x08, 0xc8, 0xbb, 0x7f, 0x14, 0xce, 0x6a, 0xa2, 0x81, 0x46, 0x1d, 0xcc, 0x7a, 0x3a, 0x0a, 0xca, 0xb2])\nexport const PuffComputeBookRequestPhysicalType = \"puff_ComputeBookRequest\"\nexport const PuffComputeBookRequestFieldCount = 10;\nexport const PuffComputeBookRequestBookIdField = 0;\nexport const PuffComputeBookRequestVersionField = 1;\nexport const PuffComputeBookRequestLineNumField = 2;\nexport const PuffComputeBookRequestWaveTokenField = 3;\nexport const PuffComputeBookRequestUsernameField = 4;\nexport const PuffComputeBookRequestLakeField = 5;\nexport const PuffComputeBookRequestBranchField = 6;\nexport const PuffComputeBookRequestSourcePathField = 7;\nexport const PuffComputeBookRequestAmbientAtUnixMsField = 8;\nexport const PuffComputeBookRequestLoadSnapshotPhysicalField = 9;\n\nexport class PuffComputeBookRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffComputeBookRequest: expected a fixed-layout object\");\n    const names = PuffComputeBookRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffComputeBookRequest: fields must exactly match declaration order\");\n    if (typeof source.book_id !== \"string\") throw new TypeError(\"field book_id has an incompatible value\");\n    this.book_id = source.book_id;\n    if (typeof source.version !== \"number\") throw new TypeError(\"field version has an incompatible value\");\n    this.version = source.version;\n    if (typeof source.line_num !== \"number\") throw new TypeError(\"field line_num has an incompatible value\");\n    this.line_num = source.line_num;\n    if (typeof source.wave_token !== \"number\") throw new TypeError(\"field wave_token has an incompatible value\");\n    this.wave_token = source.wave_token;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.source_path !== \"string\") throw new TypeError(\"field source_path has an incompatible value\");\n    this.source_path = source.source_path;\n    if (typeof source.ambient_at_unix_ms !== \"number\") throw new TypeError(\"field ambient_at_unix_ms has an incompatible value\");\n    this.ambient_at_unix_ms = source.ambient_at_unix_ms;\n    if (typeof source.load_snapshot_physical !== \"string\") throw new TypeError(\"field load_snapshot_physical has an incompatible value\");\n    this.load_snapshot_physical = source.load_snapshot_physical;\n    Object.freeze(this);\n  }\n\n  getBookId() { return this.book_id; }\n  getVersion() { return this.version; }\n  getLineNum() { return this.line_num; }\n  getWaveToken() { return this.wave_token; }\n  getUsername() { return this.username; }\n  getLake() { return this.lake; }\n  getBranch() { return this.branch; }\n  getSourcePath() { return this.source_path; }\n  getAmbientAtUnixMs() { return this.ambient_at_unix_ms; }\n  getLoadSnapshotPhysical() { return this.load_snapshot_physical; }\n\n  static validate(value) { if (value instanceof PuffComputeBookRequest) return true; try { new PuffComputeBookRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffComputeBookRequest) return value; return new PuffComputeBookRequest(value); }\n\n  toObject() { return {book_id: this.book_id, version: this.version, line_num: this.line_num, wave_token: this.wave_token, username: this.username, lake: this.lake, branch: this.branch, source_path: this.source_path, ambient_at_unix_ms: this.ambient_at_unix_ms, load_snapshot_physical: this.load_snapshot_physical}; }\n}\n\nexport const PuffMaterialiseSubobjectRequestFields = Object.freeze([\"handle\"])\nexport const PuffMaterialiseSubobjectRequestFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffMaterialiseSubobjectRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffMaterialiseSubobjectRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffMaterialiseSubobjectRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffMaterialiseSubobjectRequestFieldNullable = Object.freeze([false])\nexport const PuffMaterialiseSubobjectRequestFieldRoles = Object.freeze([\"payload\"])\nexport const PuffMaterialiseSubobjectRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffMaterialiseSubobjectRequestSchemaIdentity = Object.freeze([0xe7, 0x59, 0x6b, 0xd1, 0x8e, 0x86, 0xcf, 0x59, 0xc5, 0xf4, 0x64, 0xf6, 0xd7, 0xc2, 0xc2, 0x73, 0xa9, 0x2f, 0x18, 0x66, 0x70, 0xb1, 0xe1, 0x6a, 0xd7, 0x86, 0x90, 0x08, 0x0e, 0x7b, 0x5d, 0x6f])\nexport const PuffMaterialiseSubobjectRequestPhysicalType = \"puff_MaterialiseSubobjectRequest\"\nexport const PuffMaterialiseSubobjectRequestFieldCount = 1;\nexport const PuffMaterialiseSubobjectRequestHandleField = 0;\n\nexport class PuffMaterialiseSubobjectRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffMaterialiseSubobjectRequest: expected a fixed-layout object\");\n    const names = PuffMaterialiseSubobjectRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffMaterialiseSubobjectRequest: fields must exactly match declaration order\");\n    if (typeof source.handle !== \"string\") throw new TypeError(\"field handle has an incompatible value\");\n    this.handle = source.handle;\n    Object.freeze(this);\n  }\n\n  getHandle() { return this.handle; }\n\n  static validate(value) { if (value instanceof PuffMaterialiseSubobjectRequest) return true; try { new PuffMaterialiseSubobjectRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffMaterialiseSubobjectRequest) return value; return new PuffMaterialiseSubobjectRequest(value); }\n\n  toObject() { return {handle: this.handle}; }\n}\n\nexport const PuffDataLakeFetchRequestFields = Object.freeze([\"branch\", \"filename\", \"lake\", \"username\", \"snapshot_physical\", \"limit\", \"offset\", \"max_preview_bytes_hint\", \"opts\"])\nexport const PuffDataLakeFetchRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Int\", \"Int\", \"Int\"])\nexport const PuffDataLakeFetchRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffDataLakeFetchRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffDataLakeFetchRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffDataLakeFetchRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false])\nexport const PuffDataLakeFetchRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffDataLakeFetchRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffDataLakeFetchRequestSchemaIdentity = Object.freeze([0xe6, 0xc2, 0x02, 0xb5, 0x03, 0x8d, 0x76, 0xcf, 0x35, 0x0c, 0x20, 0x5f, 0xce, 0x65, 0x82, 0x4d, 0x8b, 0x2c, 0x18, 0xbb, 0x23, 0x6e, 0x3e, 0x97, 0x5f, 0x7d, 0xd1, 0x36, 0x1a, 0xc4, 0x98, 0x37])\nexport const PuffDataLakeFetchRequestPhysicalType = \"puff_DataLakeFetchRequest\"\nexport const PuffDataLakeFetchRequestFieldCount = 9;\nexport const PuffDataLakeFetchRequestBranchField = 0;\nexport const PuffDataLakeFetchRequestFilenameField = 1;\nexport const PuffDataLakeFetchRequestLakeField = 2;\nexport const PuffDataLakeFetchRequestUsernameField = 3;\nexport const PuffDataLakeFetchRequestSnapshotPhysicalField = 4;\nexport const PuffDataLakeFetchRequestLimitField = 5;\nexport const PuffDataLakeFetchRequestOffsetField = 6;\nexport const PuffDataLakeFetchRequestMaxPreviewBytesHintField = 7;\nexport const PuffDataLakeFetchRequestOptsField = 8;\n\nexport class PuffDataLakeFetchRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffDataLakeFetchRequest: expected a fixed-layout object\");\n    const names = PuffDataLakeFetchRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffDataLakeFetchRequest: fields must exactly match declaration order\");\n    if (typeof source.branch !== \"string\") throw new TypeError(\"field branch has an incompatible value\");\n    this.branch = source.branch;\n    if (typeof source.filename !== \"string\") throw new TypeError(\"field filename has an incompatible value\");\n    this.filename = source.filename;\n    if (typeof source.lake !== \"string\") throw new TypeError(\"field lake has an incompatible value\");\n    this.lake = source.lake;\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.snapshot_physical !== \"string\") throw new TypeError(\"field snapshot_physical has an incompatible value\");\n    this.snapshot_physical = source.snapshot_physical;\n    if (typeof source.limit !== \"number\") throw new TypeError(\"field limit has an incompatible value\");\n    this.limit = source.limit;\n    if (typeof source.offset !== \"number\") throw new TypeError(\"field offset has an incompatible value\");\n    this.offset = source.offset;\n    if (typeof source.max_preview_bytes_hint !== \"number\") throw new TypeError(\"field max_preview_bytes_hint has an incompatible value\");\n    this.max_preview_bytes_hint = source.max_preview_bytes_hint;\n    if (typeof source.opts !== \"number\") throw new TypeError(\"field opts has an incompatible value\");\n    this.opts = source.opts;\n    Object.freeze(this);\n  }\n\n  getBranch() { return this.branch; }\n  getFilename() { return this.filename; }\n  getLake() { return this.lake; }\n  getUsername() { return this.username; }\n  getSnapshotPhysical() { return this.snapshot_physical; }\n  getLimit() { return this.limit; }\n  getOffset() { return this.offset; }\n  getMaxPreviewBytesHint() { return this.max_preview_bytes_hint; }\n  getOpts() { return this.opts; }\n\n  static validate(value) { if (value instanceof PuffDataLakeFetchRequest) return true; try { new PuffDataLakeFetchRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffDataLakeFetchRequest) return value; return new PuffDataLakeFetchRequest(value); }\n\n  toObject() { return {branch: this.branch, filename: this.filename, lake: this.lake, username: this.username, snapshot_physical: this.snapshot_physical, limit: this.limit, offset: this.offset, max_preview_bytes_hint: this.max_preview_bytes_hint, opts: this.opts}; }\n}\n\nexport const PuffCacheReadRequestFields = Object.freeze([\"hash\"])\nexport const PuffCacheReadRequestFieldLogicalTypes = Object.freeze([\"Bin\"])\nexport const PuffCacheReadRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffCacheReadRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffCacheReadRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffCacheReadRequestFieldNullable = Object.freeze([false])\nexport const PuffCacheReadRequestFieldRoles = Object.freeze([\"payload\"])\nexport const PuffCacheReadRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffCacheReadRequestSchemaIdentity = Object.freeze([0x4e, 0xf0, 0x9b, 0xa7, 0xc2, 0xf4, 0x64, 0xff, 0xa0, 0x54, 0x8a, 0xb0, 0x12, 0x03, 0x95, 0x6f, 0x05, 0x6d, 0x45, 0xc2, 0x2d, 0x7f, 0xf8, 0x25, 0x79, 0x80, 0x56, 0x79, 0x6b, 0x3a, 0x76, 0xc3])\nexport const PuffCacheReadRequestPhysicalType = \"puff_CacheReadRequest\"\nexport const PuffCacheReadRequestFieldCount = 1;\nexport const PuffCacheReadRequestHashField = 0;\n\nexport class PuffCacheReadRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffCacheReadRequest: expected a fixed-layout object\");\n    const names = PuffCacheReadRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffCacheReadRequest: fields must exactly match declaration order\");\n    if (!(source.hash instanceof Uint8Array)) throw new TypeError(\"field hash has an incompatible value\");\n    this.hash = source.hash;\n    Object.freeze(this);\n  }\n\n  getHash() { return this.hash; }\n\n  static validate(value) { if (value instanceof PuffCacheReadRequest) return true; try { new PuffCacheReadRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffCacheReadRequest) return value; return new PuffCacheReadRequest(value); }\n\n  toObject() { return {hash: this.hash}; }\n}\n\nexport const PuffCacheWriteRequestFields = Object.freeze([\"object\"])\nexport const PuffCacheWriteRequestFieldLogicalTypes = Object.freeze([\"Bin\"])\nexport const PuffCacheWriteRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffCacheWriteRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffCacheWriteRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffCacheWriteRequestFieldNullable = Object.freeze([false])\nexport const PuffCacheWriteRequestFieldRoles = Object.freeze([\"payload\"])\nexport const PuffCacheWriteRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffCacheWriteRequestSchemaIdentity = Object.freeze([0xf2, 0xa2, 0x69, 0x4b, 0x77, 0x2c, 0xe2, 0xbf, 0x6c, 0x5d, 0xde, 0x6f, 0xbc, 0xc7, 0x91, 0x34, 0xc2, 0x06, 0xfc, 0x09, 0x11, 0x5a, 0xca, 0x5e, 0xdf, 0xd6, 0xa2, 0xcb, 0x43, 0x46, 0x55, 0xf1])\nexport const PuffCacheWriteRequestPhysicalType = \"puff_CacheWriteRequest\"\nexport const PuffCacheWriteRequestFieldCount = 1;\nexport const PuffCacheWriteRequestObjectField = 0;\n\nexport class PuffCacheWriteRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffCacheWriteRequest: expected a fixed-layout object\");\n    const names = PuffCacheWriteRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffCacheWriteRequest: fields must exactly match declaration order\");\n    if (!(source.object instanceof Uint8Array)) throw new TypeError(\"field object has an incompatible value\");\n    this.object = source.object;\n    Object.freeze(this);\n  }\n\n  getObject() { return this.object; }\n\n  static validate(value) { if (value instanceof PuffCacheWriteRequest) return true; try { new PuffCacheWriteRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffCacheWriteRequest) return value; return new PuffCacheWriteRequest(value); }\n\n  toObject() { return {object: this.object}; }\n}\n\nexport const PuffHTTPRequestFields = Object.freeze([\"method\", \"url\", \"params\", \"headers\", \"auth\", \"body\", \"timeout_ms\", \"revalidate_every_ms\", \"dispatch_key_v1\", \"family_key_v1\"])\nexport const PuffHTTPRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Bin\", \"Int\", \"Int\", \"Bin\", \"Bin\"])\nexport const PuffHTTPRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffHTTPRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffHTTPRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffHTTPRequestFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false])\nexport const PuffHTTPRequestFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffHTTPRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\"])\nexport const PuffHTTPRequestSchemaIdentity = Object.freeze([0x74, 0x3b, 0x85, 0xcf, 0x5a, 0xa4, 0x96, 0x85, 0x5e, 0x5e, 0x3c, 0xa6, 0x5f, 0x08, 0x5a, 0x06, 0xfe, 0xed, 0xf2, 0xa8, 0x06, 0xe1, 0xfd, 0x43, 0xed, 0x7e, 0x61, 0xe9, 0x9f, 0x39, 0xab, 0x2e])\nexport const PuffHTTPRequestPhysicalType = \"puff_HTTPRequest\"\nexport const PuffHTTPRequestFieldCount = 10;\nexport const PuffHTTPRequestMethodField = 0;\nexport const PuffHTTPRequestUrlField = 1;\nexport const PuffHTTPRequestParamsField = 2;\nexport const PuffHTTPRequestHeadersField = 3;\nexport const PuffHTTPRequestAuthField = 4;\nexport const PuffHTTPRequestBodyField = 5;\nexport const PuffHTTPRequestTimeoutMsField = 6;\nexport const PuffHTTPRequestRevalidateEveryMsField = 7;\nexport const PuffHTTPRequestDispatchKeyV1Field = 8;\nexport const PuffHTTPRequestFamilyKeyV1Field = 9;\n\nexport class PuffHTTPRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffHTTPRequest: expected a fixed-layout object\");\n    const names = PuffHTTPRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffHTTPRequest: fields must exactly match declaration order\");\n    if (typeof source.method !== \"string\") throw new TypeError(\"field method has an incompatible value\");\n    this.method = source.method;\n    if (typeof source.url !== \"string\") throw new TypeError(\"field url has an incompatible value\");\n    this.url = source.url;\n    if (typeof source.params !== \"string\") throw new TypeError(\"field params has an incompatible value\");\n    this.params = source.params;\n    if (typeof source.headers !== \"string\") throw new TypeError(\"field headers has an incompatible value\");\n    this.headers = source.headers;\n    if (typeof source.auth !== \"string\") throw new TypeError(\"field auth has an incompatible value\");\n    this.auth = source.auth;\n    if (!(source.body instanceof Uint8Array)) throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    if (typeof source.timeout_ms !== \"number\") throw new TypeError(\"field timeout_ms has an incompatible value\");\n    this.timeout_ms = source.timeout_ms;\n    if (typeof source.revalidate_every_ms !== \"number\") throw new TypeError(\"field revalidate_every_ms has an incompatible value\");\n    this.revalidate_every_ms = source.revalidate_every_ms;\n    if (!(source.dispatch_key_v1 instanceof Uint8Array)) throw new TypeError(\"field dispatch_key_v1 has an incompatible value\");\n    this.dispatch_key_v1 = source.dispatch_key_v1;\n    if (!(source.family_key_v1 instanceof Uint8Array)) throw new TypeError(\"field family_key_v1 has an incompatible value\");\n    this.family_key_v1 = source.family_key_v1;\n    Object.freeze(this);\n  }\n\n  getMethod() { return this.method; }\n  getUrl() { return this.url; }\n  getParams() { return this.params; }\n  getHeaders() { return this.headers; }\n  getAuth() { return this.auth; }\n  getBody() { return this.body; }\n  getTimeoutMs() { return this.timeout_ms; }\n  getRevalidateEveryMs() { return this.revalidate_every_ms; }\n  getDispatchKeyV1() { return this.dispatch_key_v1; }\n  getFamilyKeyV1() { return this.family_key_v1; }\n\n  static validate(value) { if (value instanceof PuffHTTPRequest) return true; try { new PuffHTTPRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffHTTPRequest) return value; return new PuffHTTPRequest(value); }\n\n  toObject() { return {method: this.method, url: this.url, params: this.params, headers: this.headers, auth: this.auth, body: this.body, timeout_ms: this.timeout_ms, revalidate_every_ms: this.revalidate_every_ms, dispatch_key_v1: this.dispatch_key_v1, family_key_v1: this.family_key_v1}; }\n}\n\nexport const PuffLLMCompletionRequestFields = Object.freeze([\"username\", \"query\"])\nexport const PuffLLMCompletionRequestFieldLogicalTypes = Object.freeze([\"Str\", \"Str\"])\nexport const PuffLLMCompletionRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\"])\nexport const PuffLLMCompletionRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffLLMCompletionRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffLLMCompletionRequestFieldNullable = Object.freeze([false, false])\nexport const PuffLLMCompletionRequestFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffLLMCompletionRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\"])\nexport const PuffLLMCompletionRequestSchemaIdentity = Object.freeze([0xe3, 0x56, 0x1e, 0x58, 0x2f, 0xeb, 0xe0, 0x7d, 0xb8, 0x07, 0x5c, 0xfb, 0xaa, 0x67, 0xb9, 0xe2, 0x9f, 0x06, 0xe1, 0x6d, 0xa3, 0xbd, 0xe7, 0x3d, 0x17, 0x28, 0x58, 0xd2, 0x53, 0xe5, 0x60, 0x19])\nexport const PuffLLMCompletionRequestPhysicalType = \"puff_LLMCompletionRequest\"\nexport const PuffLLMCompletionRequestFieldCount = 2;\nexport const PuffLLMCompletionRequestUsernameField = 0;\nexport const PuffLLMCompletionRequestQueryField = 1;\n\nexport class PuffLLMCompletionRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffLLMCompletionRequest: expected a fixed-layout object\");\n    const names = PuffLLMCompletionRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffLLMCompletionRequest: fields must exactly match declaration order\");\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    if (typeof source.query !== \"string\") throw new TypeError(\"field query has an incompatible value\");\n    this.query = source.query;\n    Object.freeze(this);\n  }\n\n  getUsername() { return this.username; }\n  getQuery() { return this.query; }\n\n  static validate(value) { if (value instanceof PuffLLMCompletionRequest) return true; try { new PuffLLMCompletionRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffLLMCompletionRequest) return value; return new PuffLLMCompletionRequest(value); }\n\n  toObject() { return {username: this.username, query: this.query}; }\n}\n\nexport const PuffAuthorizeCrashBuiltinRequestFields = Object.freeze([\"username\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldLogicalTypes = Object.freeze([\"Str\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldPhysicalTypes = Object.freeze([\"BytesScalar\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldNullable = Object.freeze([false])\nexport const PuffAuthorizeCrashBuiltinRequestFieldRoles = Object.freeze([\"payload\"])\nexport const PuffAuthorizeCrashBuiltinRequestFieldDeclaredMetadata = Object.freeze([\"BytesScalar\"])\nexport const PuffAuthorizeCrashBuiltinRequestSchemaIdentity = Object.freeze([0x08, 0x85, 0xaf, 0xa7, 0x95, 0x77, 0x20, 0x68, 0x27, 0x40, 0xad, 0xba, 0x93, 0xdc, 0x32, 0xb1, 0xb6, 0xe7, 0x28, 0xfe, 0x39, 0x11, 0x58, 0x7b, 0x6b, 0x40, 0x57, 0xd9, 0xf4, 0x88, 0xfe, 0xc2])\nexport const PuffAuthorizeCrashBuiltinRequestPhysicalType = \"puff_AuthorizeCrashBuiltinRequest\"\nexport const PuffAuthorizeCrashBuiltinRequestFieldCount = 1;\nexport const PuffAuthorizeCrashBuiltinRequestUsernameField = 0;\n\nexport class PuffAuthorizeCrashBuiltinRequest {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffAuthorizeCrashBuiltinRequest: expected a fixed-layout object\");\n    const names = PuffAuthorizeCrashBuiltinRequestFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffAuthorizeCrashBuiltinRequest: fields must exactly match declaration order\");\n    if (typeof source.username !== \"string\") throw new TypeError(\"field username has an incompatible value\");\n    this.username = source.username;\n    Object.freeze(this);\n  }\n\n  getUsername() { return this.username; }\n\n  static validate(value) { if (value instanceof PuffAuthorizeCrashBuiltinRequest) return true; try { new PuffAuthorizeCrashBuiltinRequest(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffAuthorizeCrashBuiltinRequest) return value; return new PuffAuthorizeCrashBuiltinRequest(value); }\n\n  toObject() { return {username: this.username}; }\n}\n\nexport const PuffHTTPResultFields = Object.freeze([\"status_code\", \"headers_json\", \"etag\", \"body\", \"retries\", \"exception\", \"exceptions_json\", \"elapsed_ms\", \"timestamp_unix_ms\", \"cache_status\", \"last_http_status\"])\nexport const PuffHTTPResultFieldLogicalTypes = Object.freeze([\"Int\", \"Str\", \"Str\", \"Bin\", \"Int\", \"Str\", \"Str\", \"Int\", \"Int\", \"Str\", \"Int\"])\nexport const PuffHTTPResultFieldPhysicalTypes = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\"])\nexport const PuffHTTPResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffHTTPResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffHTTPResultFieldNullable = Object.freeze([false, false, false, false, false, false, false, false, false, false, false])\nexport const PuffHTTPResultFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffHTTPResultFieldDeclaredMetadata = Object.freeze([\"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\", \"BytesScalar\", \"IntegralScalar\"])\nexport const PuffHTTPResultSchemaIdentity = Object.freeze([0xc7, 0xcc, 0x58, 0xe1, 0x26, 0x4d, 0x7a, 0xbc, 0x9e, 0x22, 0x3d, 0x50, 0x60, 0xca, 0xec, 0xb1, 0x6a, 0x80, 0x49, 0xd5, 0xec, 0x9c, 0x9b, 0x60, 0x7d, 0x76, 0x4f, 0x07, 0x42, 0x95, 0x4e, 0xa4])\nexport const PuffHTTPResultPhysicalType = \"puff_HTTPResult\"\nexport const PuffHTTPResultFieldCount = 11;\nexport const PuffHTTPResultStatusCodeField = 0;\nexport const PuffHTTPResultHeadersJsonField = 1;\nexport const PuffHTTPResultEtagField = 2;\nexport const PuffHTTPResultBodyField = 3;\nexport const PuffHTTPResultRetriesField = 4;\nexport const PuffHTTPResultExceptionField = 5;\nexport const PuffHTTPResultExceptionsJsonField = 6;\nexport const PuffHTTPResultElapsedMsField = 7;\nexport const PuffHTTPResultTimestampUnixMsField = 8;\nexport const PuffHTTPResultCacheStatusField = 9;\nexport const PuffHTTPResultLastHttpStatusField = 10;\n\nexport class PuffHTTPResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffHTTPResult: expected a fixed-layout object\");\n    const names = PuffHTTPResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffHTTPResult: fields must exactly match declaration order\");\n    if (typeof source.status_code !== \"number\") throw new TypeError(\"field status_code has an incompatible value\");\n    this.status_code = source.status_code;\n    if (typeof source.headers_json !== \"string\") throw new TypeError(\"field headers_json has an incompatible value\");\n    this.headers_json = source.headers_json;\n    if (typeof source.etag !== \"string\") throw new TypeError(\"field etag has an incompatible value\");\n    this.etag = source.etag;\n    if (!(source.body instanceof Uint8Array)) throw new TypeError(\"field body has an incompatible value\");\n    this.body = source.body;\n    if (typeof source.retries !== \"number\") throw new TypeError(\"field retries has an incompatible value\");\n    this.retries = source.retries;\n    if (typeof source.exception !== \"string\") throw new TypeError(\"field exception has an incompatible value\");\n    this.exception = source.exception;\n    if (typeof source.exceptions_json !== \"string\") throw new TypeError(\"field exceptions_json has an incompatible value\");\n    this.exceptions_json = source.exceptions_json;\n    if (typeof source.elapsed_ms !== \"number\") throw new TypeError(\"field elapsed_ms has an incompatible value\");\n    this.elapsed_ms = source.elapsed_ms;\n    if (typeof source.timestamp_unix_ms !== \"number\") throw new TypeError(\"field timestamp_unix_ms has an incompatible value\");\n    this.timestamp_unix_ms = source.timestamp_unix_ms;\n    if (typeof source.cache_status !== \"string\") throw new TypeError(\"field cache_status has an incompatible value\");\n    this.cache_status = source.cache_status;\n    if (typeof source.last_http_status !== \"number\") throw new TypeError(\"field last_http_status has an incompatible value\");\n    this.last_http_status = source.last_http_status;\n    Object.freeze(this);\n  }\n\n  getStatusCode() { return this.status_code; }\n  getHeadersJson() { return this.headers_json; }\n  getEtag() { return this.etag; }\n  getBody() { return this.body; }\n  getRetries() { return this.retries; }\n  getException() { return this.exception; }\n  getExceptionsJson() { return this.exceptions_json; }\n  getElapsedMs() { return this.elapsed_ms; }\n  getTimestampUnixMs() { return this.timestamp_unix_ms; }\n  getCacheStatus() { return this.cache_status; }\n  getLastHttpStatus() { return this.last_http_status; }\n\n  static validate(value) { if (value instanceof PuffHTTPResult) return true; try { new PuffHTTPResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffHTTPResult) return value; return new PuffHTTPResult(value); }\n\n  toObject() { return {status_code: this.status_code, headers_json: this.headers_json, etag: this.etag, body: this.body, retries: this.retries, exception: this.exception, exceptions_json: this.exceptions_json, elapsed_ms: this.elapsed_ms, timestamp_unix_ms: this.timestamp_unix_ms, cache_status: this.cache_status, last_http_status: this.last_http_status}; }\n}\n\nexport const PuffLLMCompletionResultFields = Object.freeze([\"response\", \"cache_hit_level\", \"provider_id\", \"actual_model\", \"finish_reason\", \"prompt_tokens\", \"completion_tokens\"])\nexport const PuffLLMCompletionResultFieldLogicalTypes = Object.freeze([\"Str\", \"Str\", \"Str\", \"Str\", \"Str\", \"Int\", \"Int\"])\nexport const PuffLLMCompletionResultFieldPhysicalTypes = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffLLMCompletionResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffLLMCompletionResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\", \"MetadataV1\"])\nexport const PuffLLMCompletionResultFieldNullable = Object.freeze([false, false, false, false, false, false, false])\nexport const PuffLLMCompletionResultFieldRoles = Object.freeze([\"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\", \"payload\"])\nexport const PuffLLMCompletionResultFieldDeclaredMetadata = Object.freeze([\"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"BytesScalar\", \"IntegralScalar\", \"IntegralScalar\"])\nexport const PuffLLMCompletionResultSchemaIdentity = Object.freeze([0x5f, 0x7f, 0x23, 0x4c, 0x94, 0x8d, 0xf6, 0x49, 0x93, 0x8e, 0x6b, 0x36, 0x39, 0xbc, 0xbc, 0x76, 0x95, 0x9e, 0x6c, 0x0f, 0x31, 0xae, 0x5f, 0xb1, 0xe3, 0x70, 0x81, 0x70, 0xba, 0x43, 0x71, 0xbc])\nexport const PuffLLMCompletionResultPhysicalType = \"puff_LLMCompletionResult\"\nexport const PuffLLMCompletionResultFieldCount = 7;\nexport const PuffLLMCompletionResultResponseField = 0;\nexport const PuffLLMCompletionResultCacheHitLevelField = 1;\nexport const PuffLLMCompletionResultProviderIdField = 2;\nexport const PuffLLMCompletionResultActualModelField = 3;\nexport const PuffLLMCompletionResultFinishReasonField = 4;\nexport const PuffLLMCompletionResultPromptTokensField = 5;\nexport const PuffLLMCompletionResultCompletionTokensField = 6;\n\nexport class PuffLLMCompletionResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffLLMCompletionResult: expected a fixed-layout object\");\n    const names = PuffLLMCompletionResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffLLMCompletionResult: fields must exactly match declaration order\");\n    if (typeof source.response !== \"string\") throw new TypeError(\"field response has an incompatible value\");\n    this.response = source.response;\n    if (typeof source.cache_hit_level !== \"string\") throw new TypeError(\"field cache_hit_level has an incompatible value\");\n    this.cache_hit_level = source.cache_hit_level;\n    if (typeof source.provider_id !== \"string\") throw new TypeError(\"field provider_id has an incompatible value\");\n    this.provider_id = source.provider_id;\n    if (typeof source.actual_model !== \"string\") throw new TypeError(\"field actual_model has an incompatible value\");\n    this.actual_model = source.actual_model;\n    if (typeof source.finish_reason !== \"string\") throw new TypeError(\"field finish_reason has an incompatible value\");\n    this.finish_reason = source.finish_reason;\n    if (typeof source.prompt_tokens !== \"number\") throw new TypeError(\"field prompt_tokens has an incompatible value\");\n    this.prompt_tokens = source.prompt_tokens;\n    if (typeof source.completion_tokens !== \"number\") throw new TypeError(\"field completion_tokens has an incompatible value\");\n    this.completion_tokens = source.completion_tokens;\n    Object.freeze(this);\n  }\n\n  getResponse() { return this.response; }\n  getCacheHitLevel() { return this.cache_hit_level; }\n  getProviderId() { return this.provider_id; }\n  getActualModel() { return this.actual_model; }\n  getFinishReason() { return this.finish_reason; }\n  getPromptTokens() { return this.prompt_tokens; }\n  getCompletionTokens() { return this.completion_tokens; }\n\n  static validate(value) { if (value instanceof PuffLLMCompletionResult) return true; try { new PuffLLMCompletionResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffLLMCompletionResult) return value; return new PuffLLMCompletionResult(value); }\n\n  toObject() { return {response: this.response, cache_hit_level: this.cache_hit_level, provider_id: this.provider_id, actual_model: this.actual_model, finish_reason: this.finish_reason, prompt_tokens: this.prompt_tokens, completion_tokens: this.completion_tokens}; }\n}\n\nexport const PuffCacheReadResultFields = Object.freeze([\"found\", \"object\"])\nexport const PuffCacheReadResultFieldLogicalTypes = Object.freeze([\"Bool\", \"Bin\"])\nexport const PuffCacheReadResultFieldPhysicalTypes = Object.freeze([\"BoolScalar\", \"BytesScalar\"])\nexport const PuffCacheReadResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\", \"recursive_frontier\"])\nexport const PuffCacheReadResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\", \"MetadataV1\"])\nexport const PuffCacheReadResultFieldNullable = Object.freeze([false, false])\nexport const PuffCacheReadResultFieldRoles = Object.freeze([\"payload\", \"payload\"])\nexport const PuffCacheReadResultFieldDeclaredMetadata = Object.freeze([\"BoolScalar\", \"BytesScalar\"])\nexport const PuffCacheReadResultSchemaIdentity = Object.freeze([0x14, 0x4c, 0xe7, 0xcf, 0x9b, 0x46, 0xfa, 0xaf, 0x56, 0x84, 0xe9, 0xd8, 0x5e, 0x74, 0x6d, 0x68, 0x82, 0x6b, 0xd1, 0x0f, 0x8b, 0xd4, 0xc7, 0x2a, 0x43, 0xf7, 0xca, 0xb9, 0xbd, 0x68, 0x1c, 0x44])\nexport const PuffCacheReadResultPhysicalType = \"puff_CacheReadResult\"\nexport const PuffCacheReadResultFieldCount = 2;\nexport const PuffCacheReadResultFoundField = 0;\nexport const PuffCacheReadResultObjectField = 1;\n\nexport class PuffCacheReadResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffCacheReadResult: expected a fixed-layout object\");\n    const names = PuffCacheReadResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffCacheReadResult: fields must exactly match declaration order\");\n    if (typeof source.found !== \"boolean\") throw new TypeError(\"field found has an incompatible value\");\n    this.found = source.found;\n    if (!(source.object instanceof Uint8Array)) throw new TypeError(\"field object has an incompatible value\");\n    this.object = source.object;\n    Object.freeze(this);\n  }\n\n  getFound() { return this.found; }\n  getObject() { return this.object; }\n\n  static validate(value) { if (value instanceof PuffCacheReadResult) return true; try { new PuffCacheReadResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffCacheReadResult) return value; return new PuffCacheReadResult(value); }\n\n  toObject() { return {found: this.found, object: this.object}; }\n}\n\nexport const PuffCacheWriteResultFields = Object.freeze([\"stored\"])\nexport const PuffCacheWriteResultFieldLogicalTypes = Object.freeze([\"Bool\"])\nexport const PuffCacheWriteResultFieldPhysicalTypes = Object.freeze([\"BoolScalar\"])\nexport const PuffCacheWriteResultFieldItemLogicalTypes = Object.freeze([\"recursive_frontier\"])\nexport const PuffCacheWriteResultFieldItemPhysicalTypes = Object.freeze([\"MetadataV1\"])\nexport const PuffCacheWriteResultFieldNullable = Object.freeze([false])\nexport const PuffCacheWriteResultFieldRoles = Object.freeze([\"payload\"])\nexport const PuffCacheWriteResultFieldDeclaredMetadata = Object.freeze([\"BoolScalar\"])\nexport const PuffCacheWriteResultSchemaIdentity = Object.freeze([0x40, 0x03, 0xa5, 0x29, 0x1a, 0xa6, 0xa2, 0xfa, 0xea, 0x9a, 0x74, 0x47, 0x0f, 0xa7, 0xb3, 0x0e, 0xf7, 0xe4, 0x63, 0x56, 0xc3, 0x8a, 0x17, 0x52, 0xc1, 0x89, 0x88, 0x25, 0x3e, 0xa6, 0x70, 0x46])\nexport const PuffCacheWriteResultPhysicalType = \"puff_CacheWriteResult\"\nexport const PuffCacheWriteResultFieldCount = 1;\nexport const PuffCacheWriteResultStoredField = 0;\n\nexport class PuffCacheWriteResult {\n  constructor(fields) {\n    const source = fields ?? {};\n    if (!source || typeof source !== \"object\" || Array.isArray(source)) throw new TypeError(\"PuffCacheWriteResult: expected a fixed-layout object\");\n    const names = PuffCacheWriteResultFields;\n    const keys = Object.keys(source);\n    if (keys.length !== names.length || keys.some((key, i) => key !== names[i])) throw new TypeError(\"PuffCacheWriteResult: fields must exactly match declaration order\");\n    if (typeof source.stored !== \"boolean\") throw new TypeError(\"field stored has an incompatible value\");\n    this.stored = source.stored;\n    Object.freeze(this);\n  }\n\n  getStored() { return this.stored; }\n\n  static validate(value) { if (value instanceof PuffCacheWriteResult) return true; try { new PuffCacheWriteResult(value); return true; } catch { return false; } }\n\n  static from(value) { if (value instanceof PuffCacheWriteResult) return value; return new PuffCacheWriteResult(value); }\n\n  toObject() { return {stored: this.stored}; }\n}\n\nexport const AllStructDescriptors = Object.freeze([\n  Object.freeze({ name: \"puff_Edit\", fields: PuffEditFields, fieldCount: PuffEditFieldCount, logicalTypes: PuffEditFieldLogicalTypes, physicalTypes: PuffEditFieldPhysicalTypes, physicalType: PuffEditPhysicalType, nullable: PuffEditFieldNullable, Type: PuffEdit, roles: PuffEditFieldRoles, declaredMetadata: PuffEditFieldDeclaredMetadata, accessors: PuffEditFields, schemaIdentity: PuffEditSchemaIdentity }),\n  Object.freeze({ name: \"puff_SessionOpen\", fields: PuffSessionOpenFields, fieldCount: PuffSessionOpenFieldCount, logicalTypes: PuffSessionOpenFieldLogicalTypes, physicalTypes: PuffSessionOpenFieldPhysicalTypes, physicalType: PuffSessionOpenPhysicalType, nullable: PuffSessionOpenFieldNullable, Type: PuffSessionOpen, roles: PuffSessionOpenFieldRoles, declaredMetadata: PuffSessionOpenFieldDeclaredMetadata, accessors: PuffSessionOpenFields, schemaIdentity: PuffSessionOpenSchemaIdentity }),\n  Object.freeze({ name: \"puff_Envelope\", fields: PuffEnvelopeFields, fieldCount: PuffEnvelopeFieldCount, logicalTypes: PuffEnvelopeFieldLogicalTypes, physicalTypes: PuffEnvelopeFieldPhysicalTypes, physicalType: PuffEnvelopePhysicalType, nullable: PuffEnvelopeFieldNullable, Type: PuffEnvelope, roles: PuffEnvelopeFieldRoles, declaredMetadata: PuffEnvelopeFieldDeclaredMetadata, accessors: PuffEnvelopeFields, schemaIdentity: PuffEnvelopeSchemaIdentity }),\n  Object.freeze({ name: \"puff_AdvanceBookRequest\", fields: PuffAdvanceBookRequestFields, fieldCount: PuffAdvanceBookRequestFieldCount, logicalTypes: PuffAdvanceBookRequestFieldLogicalTypes, physicalTypes: PuffAdvanceBookRequestFieldPhysicalTypes, physicalType: PuffAdvanceBookRequestPhysicalType, nullable: PuffAdvanceBookRequestFieldNullable, Type: PuffAdvanceBookRequest, roles: PuffAdvanceBookRequestFieldRoles, declaredMetadata: PuffAdvanceBookRequestFieldDeclaredMetadata, accessors: PuffAdvanceBookRequestFields, schemaIdentity: PuffAdvanceBookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_ProjectionLineChange\", fields: PuffProjectionLineChangeFields, fieldCount: PuffProjectionLineChangeFieldCount, logicalTypes: PuffProjectionLineChangeFieldLogicalTypes, physicalTypes: PuffProjectionLineChangeFieldPhysicalTypes, physicalType: PuffProjectionLineChangePhysicalType, nullable: PuffProjectionLineChangeFieldNullable, Type: PuffProjectionLineChange, roles: PuffProjectionLineChangeFieldRoles, declaredMetadata: PuffProjectionLineChangeFieldDeclaredMetadata, accessors: PuffProjectionLineChangeFields, schemaIdentity: PuffProjectionLineChangeSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenanceSourceCut\", fields: PuffMaintenanceSourceCutFields, fieldCount: PuffMaintenanceSourceCutFieldCount, logicalTypes: PuffMaintenanceSourceCutFieldLogicalTypes, physicalTypes: PuffMaintenanceSourceCutFieldPhysicalTypes, physicalType: PuffMaintenanceSourceCutPhysicalType, nullable: PuffMaintenanceSourceCutFieldNullable, Type: PuffMaintenanceSourceCut, roles: PuffMaintenanceSourceCutFieldRoles, declaredMetadata: PuffMaintenanceSourceCutFieldDeclaredMetadata, accessors: PuffMaintenanceSourceCutFields, schemaIdentity: PuffMaintenanceSourceCutSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenanceLineChanges\", fields: PuffMaintenanceLineChangesFields, fieldCount: PuffMaintenanceLineChangesFieldCount, logicalTypes: PuffMaintenanceLineChangesFieldLogicalTypes, physicalTypes: PuffMaintenanceLineChangesFieldPhysicalTypes, physicalType: PuffMaintenanceLineChangesPhysicalType, nullable: PuffMaintenanceLineChangesFieldNullable, Type: PuffMaintenanceLineChanges, roles: PuffMaintenanceLineChangesFieldRoles, declaredMetadata: PuffMaintenanceLineChangesFieldDeclaredMetadata, accessors: PuffMaintenanceLineChangesFields, schemaIdentity: PuffMaintenanceLineChangesSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenanceSnapshotInstall\", fields: PuffMaintenanceSnapshotInstallFields, fieldCount: PuffMaintenanceSnapshotInstallFieldCount, logicalTypes: PuffMaintenanceSnapshotInstallFieldLogicalTypes, physicalTypes: PuffMaintenanceSnapshotInstallFieldPhysicalTypes, physicalType: PuffMaintenanceSnapshotInstallPhysicalType, nullable: PuffMaintenanceSnapshotInstallFieldNullable, Type: PuffMaintenanceSnapshotInstall, roles: PuffMaintenanceSnapshotInstallFieldRoles, declaredMetadata: PuffMaintenanceSnapshotInstallFieldDeclaredMetadata, accessors: PuffMaintenanceSnapshotInstallFields, schemaIdentity: PuffMaintenanceSnapshotInstallSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenanceStreamFrame\", fields: PuffMaintenanceStreamFrameFields, fieldCount: PuffMaintenanceStreamFrameFieldCount, logicalTypes: PuffMaintenanceStreamFrameFieldLogicalTypes, physicalTypes: PuffMaintenanceStreamFrameFieldPhysicalTypes, physicalType: PuffMaintenanceStreamFramePhysicalType, nullable: PuffMaintenanceStreamFrameFieldNullable, Type: PuffMaintenanceStreamFrame, roles: PuffMaintenanceStreamFrameFieldRoles, declaredMetadata: PuffMaintenanceStreamFrameFieldDeclaredMetadata, accessors: PuffMaintenanceStreamFrameFields, schemaIdentity: PuffMaintenanceStreamFrameSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookOutputRecord\", fields: PuffPuffbookOutputRecordFields, fieldCount: PuffPuffbookOutputRecordFieldCount, logicalTypes: PuffPuffbookOutputRecordFieldLogicalTypes, physicalTypes: PuffPuffbookOutputRecordFieldPhysicalTypes, physicalType: PuffPuffbookOutputRecordPhysicalType, nullable: PuffPuffbookOutputRecordFieldNullable, Type: PuffPuffbookOutputRecord, roles: PuffPuffbookOutputRecordFieldRoles, declaredMetadata: PuffPuffbookOutputRecordFieldDeclaredMetadata, accessors: PuffPuffbookOutputRecordFields, schemaIdentity: PuffPuffbookOutputRecordSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookInlineOutputRecord\", fields: PuffPuffbookInlineOutputRecordFields, fieldCount: PuffPuffbookInlineOutputRecordFieldCount, logicalTypes: PuffPuffbookInlineOutputRecordFieldLogicalTypes, physicalTypes: PuffPuffbookInlineOutputRecordFieldPhysicalTypes, physicalType: PuffPuffbookInlineOutputRecordPhysicalType, nullable: PuffPuffbookInlineOutputRecordFieldNullable, Type: PuffPuffbookInlineOutputRecord, roles: PuffPuffbookInlineOutputRecordFieldRoles, declaredMetadata: PuffPuffbookInlineOutputRecordFieldDeclaredMetadata, accessors: PuffPuffbookInlineOutputRecordFields, schemaIdentity: PuffPuffbookInlineOutputRecordSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookProjectionSnapshot\", fields: PuffPuffbookProjectionSnapshotFields, fieldCount: PuffPuffbookProjectionSnapshotFieldCount, logicalTypes: PuffPuffbookProjectionSnapshotFieldLogicalTypes, physicalTypes: PuffPuffbookProjectionSnapshotFieldPhysicalTypes, physicalType: PuffPuffbookProjectionSnapshotPhysicalType, nullable: PuffPuffbookProjectionSnapshotFieldNullable, Type: PuffPuffbookProjectionSnapshot, roles: PuffPuffbookProjectionSnapshotFieldRoles, declaredMetadata: PuffPuffbookProjectionSnapshotFieldDeclaredMetadata, accessors: PuffPuffbookProjectionSnapshotFields, schemaIdentity: PuffPuffbookProjectionSnapshotSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookViewportWindow\", fields: PuffPuffbookViewportWindowFields, fieldCount: PuffPuffbookViewportWindowFieldCount, logicalTypes: PuffPuffbookViewportWindowFieldLogicalTypes, physicalTypes: PuffPuffbookViewportWindowFieldPhysicalTypes, physicalType: PuffPuffbookViewportWindowPhysicalType, nullable: PuffPuffbookViewportWindowFieldNullable, Type: PuffPuffbookViewportWindow, roles: PuffPuffbookViewportWindowFieldRoles, declaredMetadata: PuffPuffbookViewportWindowFieldDeclaredMetadata, accessors: PuffPuffbookViewportWindowFields, schemaIdentity: PuffPuffbookViewportWindowSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookSourceEditApplied\", fields: PuffPuffbookSourceEditAppliedFields, fieldCount: PuffPuffbookSourceEditAppliedFieldCount, logicalTypes: PuffPuffbookSourceEditAppliedFieldLogicalTypes, physicalTypes: PuffPuffbookSourceEditAppliedFieldPhysicalTypes, physicalType: PuffPuffbookSourceEditAppliedPhysicalType, nullable: PuffPuffbookSourceEditAppliedFieldNullable, Type: PuffPuffbookSourceEditApplied, roles: PuffPuffbookSourceEditAppliedFieldRoles, declaredMetadata: PuffPuffbookSourceEditAppliedFieldDeclaredMetadata, accessors: PuffPuffbookSourceEditAppliedFields, schemaIdentity: PuffPuffbookSourceEditAppliedSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookApplyLineChanges\", fields: PuffPuffbookApplyLineChangesFields, fieldCount: PuffPuffbookApplyLineChangesFieldCount, logicalTypes: PuffPuffbookApplyLineChangesFieldLogicalTypes, physicalTypes: PuffPuffbookApplyLineChangesFieldPhysicalTypes, physicalType: PuffPuffbookApplyLineChangesPhysicalType, nullable: PuffPuffbookApplyLineChangesFieldNullable, Type: PuffPuffbookApplyLineChanges, roles: PuffPuffbookApplyLineChangesFieldRoles, declaredMetadata: PuffPuffbookApplyLineChangesFieldDeclaredMetadata, accessors: PuffPuffbookApplyLineChangesFields, schemaIdentity: PuffPuffbookApplyLineChangesSchemaIdentity }),\n  Object.freeze({ name: \"puff_PuffbookPayloadValue\", fields: PuffPuffbookPayloadValueFields, fieldCount: PuffPuffbookPayloadValueFieldCount, logicalTypes: PuffPuffbookPayloadValueFieldLogicalTypes, physicalTypes: PuffPuffbookPayloadValueFieldPhysicalTypes, physicalType: PuffPuffbookPayloadValuePhysicalType, nullable: PuffPuffbookPayloadValueFieldNullable, Type: PuffPuffbookPayloadValue, roles: PuffPuffbookPayloadValueFieldRoles, declaredMetadata: PuffPuffbookPayloadValueFieldDeclaredMetadata, accessors: PuffPuffbookPayloadValueFields, schemaIdentity: PuffPuffbookPayloadValueSchemaIdentity }),\n  Object.freeze({ name: \"puff_CompileRequest\", fields: PuffCompileRequestFields, fieldCount: PuffCompileRequestFieldCount, logicalTypes: PuffCompileRequestFieldLogicalTypes, physicalTypes: PuffCompileRequestFieldPhysicalTypes, physicalType: PuffCompileRequestPhysicalType, nullable: PuffCompileRequestFieldNullable, Type: PuffCompileRequest, roles: PuffCompileRequestFieldRoles, declaredMetadata: PuffCompileRequestFieldDeclaredMetadata, accessors: PuffCompileRequestFields, schemaIdentity: PuffCompileRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_AmendRequest\", fields: PuffAmendRequestFields, fieldCount: PuffAmendRequestFieldCount, logicalTypes: PuffAmendRequestFieldLogicalTypes, physicalTypes: PuffAmendRequestFieldPhysicalTypes, physicalType: PuffAmendRequestPhysicalType, nullable: PuffAmendRequestFieldNullable, Type: PuffAmendRequest, roles: PuffAmendRequestFieldRoles, declaredMetadata: PuffAmendRequestFieldDeclaredMetadata, accessors: PuffAmendRequestFields, schemaIdentity: PuffAmendRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_ComputeRequest\", fields: PuffComputeRequestFields, fieldCount: PuffComputeRequestFieldCount, logicalTypes: PuffComputeRequestFieldLogicalTypes, physicalTypes: PuffComputeRequestFieldPhysicalTypes, physicalType: PuffComputeRequestPhysicalType, nullable: PuffComputeRequestFieldNullable, Type: PuffComputeRequest, roles: PuffComputeRequestFieldRoles, declaredMetadata: PuffComputeRequestFieldDeclaredMetadata, accessors: PuffComputeRequestFields, schemaIdentity: PuffComputeRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_SeedBookRequest\", fields: PuffSeedBookRequestFields, fieldCount: PuffSeedBookRequestFieldCount, logicalTypes: PuffSeedBookRequestFieldLogicalTypes, physicalTypes: PuffSeedBookRequestFieldPhysicalTypes, physicalType: PuffSeedBookRequestPhysicalType, nullable: PuffSeedBookRequestFieldNullable, Type: PuffSeedBookRequest, roles: PuffSeedBookRequestFieldRoles, declaredMetadata: PuffSeedBookRequestFieldDeclaredMetadata, accessors: PuffSeedBookRequestFields, schemaIdentity: PuffSeedBookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_AdvanceEarliestRequest\", fields: PuffAdvanceEarliestRequestFields, fieldCount: PuffAdvanceEarliestRequestFieldCount, logicalTypes: PuffAdvanceEarliestRequestFieldLogicalTypes, physicalTypes: PuffAdvanceEarliestRequestFieldPhysicalTypes, physicalType: PuffAdvanceEarliestRequestPhysicalType, nullable: PuffAdvanceEarliestRequestFieldNullable, Type: PuffAdvanceEarliestRequest, roles: PuffAdvanceEarliestRequestFieldRoles, declaredMetadata: PuffAdvanceEarliestRequestFieldDeclaredMetadata, accessors: PuffAdvanceEarliestRequestFields, schemaIdentity: PuffAdvanceEarliestRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_OutputBookLinesRequest\", fields: PuffOutputBookLinesRequestFields, fieldCount: PuffOutputBookLinesRequestFieldCount, logicalTypes: PuffOutputBookLinesRequestFieldLogicalTypes, physicalTypes: PuffOutputBookLinesRequestFieldPhysicalTypes, physicalType: PuffOutputBookLinesRequestPhysicalType, nullable: PuffOutputBookLinesRequestFieldNullable, Type: PuffOutputBookLinesRequest, roles: PuffOutputBookLinesRequestFieldRoles, declaredMetadata: PuffOutputBookLinesRequestFieldDeclaredMetadata, accessors: PuffOutputBookLinesRequestFields, schemaIdentity: PuffOutputBookLinesRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_ExportBookRequest\", fields: PuffExportBookRequestFields, fieldCount: PuffExportBookRequestFieldCount, logicalTypes: PuffExportBookRequestFieldLogicalTypes, physicalTypes: PuffExportBookRequestFieldPhysicalTypes, physicalType: PuffExportBookRequestPhysicalType, nullable: PuffExportBookRequestFieldNullable, Type: PuffExportBookRequest, roles: PuffExportBookRequestFieldRoles, declaredMetadata: PuffExportBookRequestFieldDeclaredMetadata, accessors: PuffExportBookRequestFields, schemaIdentity: PuffExportBookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_ExportSourceRequest\", fields: PuffExportSourceRequestFields, fieldCount: PuffExportSourceRequestFieldCount, logicalTypes: PuffExportSourceRequestFieldLogicalTypes, physicalTypes: PuffExportSourceRequestFieldPhysicalTypes, physicalType: PuffExportSourceRequestPhysicalType, nullable: PuffExportSourceRequestFieldNullable, Type: PuffExportSourceRequest, roles: PuffExportSourceRequestFieldRoles, declaredMetadata: PuffExportSourceRequestFieldDeclaredMetadata, accessors: PuffExportSourceRequestFields, schemaIdentity: PuffExportSourceRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_SeedBookResult\", fields: PuffSeedBookResultFields, fieldCount: PuffSeedBookResultFieldCount, logicalTypes: PuffSeedBookResultFieldLogicalTypes, physicalTypes: PuffSeedBookResultFieldPhysicalTypes, physicalType: PuffSeedBookResultPhysicalType, nullable: PuffSeedBookResultFieldNullable, Type: PuffSeedBookResult, roles: PuffSeedBookResultFieldRoles, declaredMetadata: PuffSeedBookResultFieldDeclaredMetadata, accessors: PuffSeedBookResultFields, schemaIdentity: PuffSeedBookResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_AdvanceBookResult\", fields: PuffAdvanceBookResultFields, fieldCount: PuffAdvanceBookResultFieldCount, logicalTypes: PuffAdvanceBookResultFieldLogicalTypes, physicalTypes: PuffAdvanceBookResultFieldPhysicalTypes, physicalType: PuffAdvanceBookResultPhysicalType, nullable: PuffAdvanceBookResultFieldNullable, Type: PuffAdvanceBookResult, roles: PuffAdvanceBookResultFieldRoles, declaredMetadata: PuffAdvanceBookResultFieldDeclaredMetadata, accessors: PuffAdvanceBookResultFields, schemaIdentity: PuffAdvanceBookResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_PartialResult\", fields: PuffPartialResultFields, fieldCount: PuffPartialResultFieldCount, logicalTypes: PuffPartialResultFieldLogicalTypes, physicalTypes: PuffPartialResultFieldPhysicalTypes, physicalType: PuffPartialResultPhysicalType, nullable: PuffPartialResultFieldNullable, Type: PuffPartialResult, roles: PuffPartialResultFieldRoles, declaredMetadata: PuffPartialResultFieldDeclaredMetadata, accessors: PuffPartialResultFields, schemaIdentity: PuffPartialResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_ComputeBookResult\", fields: PuffComputeBookResultFields, fieldCount: PuffComputeBookResultFieldCount, logicalTypes: PuffComputeBookResultFieldLogicalTypes, physicalTypes: PuffComputeBookResultFieldPhysicalTypes, physicalType: PuffComputeBookResultPhysicalType, nullable: PuffComputeBookResultFieldNullable, Type: PuffComputeBookResult, roles: PuffComputeBookResultFieldRoles, declaredMetadata: PuffComputeBookResultFieldDeclaredMetadata, accessors: PuffComputeBookResultFields, schemaIdentity: PuffComputeBookResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_ProjectionBatchResult\", fields: PuffProjectionBatchResultFields, fieldCount: PuffProjectionBatchResultFieldCount, logicalTypes: PuffProjectionBatchResultFieldLogicalTypes, physicalTypes: PuffProjectionBatchResultFieldPhysicalTypes, physicalType: PuffProjectionBatchResultPhysicalType, nullable: PuffProjectionBatchResultFieldNullable, Type: PuffProjectionBatchResult, roles: PuffProjectionBatchResultFieldRoles, declaredMetadata: PuffProjectionBatchResultFieldDeclaredMetadata, accessors: PuffProjectionBatchResultFields, schemaIdentity: PuffProjectionBatchResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_OpenMaintenancePuffbookRequest\", fields: PuffOpenMaintenancePuffbookRequestFields, fieldCount: PuffOpenMaintenancePuffbookRequestFieldCount, logicalTypes: PuffOpenMaintenancePuffbookRequestFieldLogicalTypes, physicalTypes: PuffOpenMaintenancePuffbookRequestFieldPhysicalTypes, physicalType: PuffOpenMaintenancePuffbookRequestPhysicalType, nullable: PuffOpenMaintenancePuffbookRequestFieldNullable, Type: PuffOpenMaintenancePuffbookRequest, roles: PuffOpenMaintenancePuffbookRequestFieldRoles, declaredMetadata: PuffOpenMaintenancePuffbookRequestFieldDeclaredMetadata, accessors: PuffOpenMaintenancePuffbookRequestFields, schemaIdentity: PuffOpenMaintenancePuffbookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_AdvanceMaintenancePuffbookRequest\", fields: PuffAdvanceMaintenancePuffbookRequestFields, fieldCount: PuffAdvanceMaintenancePuffbookRequestFieldCount, logicalTypes: PuffAdvanceMaintenancePuffbookRequestFieldLogicalTypes, physicalTypes: PuffAdvanceMaintenancePuffbookRequestFieldPhysicalTypes, physicalType: PuffAdvanceMaintenancePuffbookRequestPhysicalType, nullable: PuffAdvanceMaintenancePuffbookRequestFieldNullable, Type: PuffAdvanceMaintenancePuffbookRequest, roles: PuffAdvanceMaintenancePuffbookRequestFieldRoles, declaredMetadata: PuffAdvanceMaintenancePuffbookRequestFieldDeclaredMetadata, accessors: PuffAdvanceMaintenancePuffbookRequestFields, schemaIdentity: PuffAdvanceMaintenancePuffbookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenancePuffbookDemand\", fields: PuffMaintenancePuffbookDemandFields, fieldCount: PuffMaintenancePuffbookDemandFieldCount, logicalTypes: PuffMaintenancePuffbookDemandFieldLogicalTypes, physicalTypes: PuffMaintenancePuffbookDemandFieldPhysicalTypes, physicalType: PuffMaintenancePuffbookDemandPhysicalType, nullable: PuffMaintenancePuffbookDemandFieldNullable, Type: PuffMaintenancePuffbookDemand, roles: PuffMaintenancePuffbookDemandFieldRoles, declaredMetadata: PuffMaintenancePuffbookDemandFieldDeclaredMetadata, accessors: PuffMaintenancePuffbookDemandFields, schemaIdentity: PuffMaintenancePuffbookDemandSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaintenancePuffbookCredit\", fields: PuffMaintenancePuffbookCreditFields, fieldCount: PuffMaintenancePuffbookCreditFieldCount, logicalTypes: PuffMaintenancePuffbookCreditFieldLogicalTypes, physicalTypes: PuffMaintenancePuffbookCreditFieldPhysicalTypes, physicalType: PuffMaintenancePuffbookCreditPhysicalType, nullable: PuffMaintenancePuffbookCreditFieldNullable, Type: PuffMaintenancePuffbookCredit, roles: PuffMaintenancePuffbookCreditFieldRoles, declaredMetadata: PuffMaintenancePuffbookCreditFieldDeclaredMetadata, accessors: PuffMaintenancePuffbookCreditFields, schemaIdentity: PuffMaintenancePuffbookCreditSchemaIdentity }),\n  Object.freeze({ name: \"puff_SubscribeBranchProjectionRequest\", fields: PuffSubscribeBranchProjectionRequestFields, fieldCount: PuffSubscribeBranchProjectionRequestFieldCount, logicalTypes: PuffSubscribeBranchProjectionRequestFieldLogicalTypes, physicalTypes: PuffSubscribeBranchProjectionRequestFieldPhysicalTypes, physicalType: PuffSubscribeBranchProjectionRequestPhysicalType, nullable: PuffSubscribeBranchProjectionRequestFieldNullable, Type: PuffSubscribeBranchProjectionRequest, roles: PuffSubscribeBranchProjectionRequestFieldRoles, declaredMetadata: PuffSubscribeBranchProjectionRequestFieldDeclaredMetadata, accessors: PuffSubscribeBranchProjectionRequestFields, schemaIdentity: PuffSubscribeBranchProjectionRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_StringListColumns\", fields: PuffStringListColumnsFields, fieldCount: PuffStringListColumnsFieldCount, logicalTypes: PuffStringListColumnsFieldLogicalTypes, physicalTypes: PuffStringListColumnsFieldPhysicalTypes, physicalType: PuffStringListColumnsPhysicalType, nullable: PuffStringListColumnsFieldNullable, Type: PuffStringListColumns, roles: PuffStringListColumnsFieldRoles, declaredMetadata: PuffStringListColumnsFieldDeclaredMetadata, accessors: PuffStringListColumnsFields, schemaIdentity: PuffStringListColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryNameColumns\", fields: PuffDirectoryNameColumnsFields, fieldCount: PuffDirectoryNameColumnsFieldCount, logicalTypes: PuffDirectoryNameColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryNameColumnsFieldPhysicalTypes, physicalType: PuffDirectoryNameColumnsPhysicalType, nullable: PuffDirectoryNameColumnsFieldNullable, Type: PuffDirectoryNameColumns, roles: PuffDirectoryNameColumnsFieldRoles, declaredMetadata: PuffDirectoryNameColumnsFieldDeclaredMetadata, accessors: PuffDirectoryNameColumnsFields, schemaIdentity: PuffDirectoryNameColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryArtifactColumns\", fields: PuffDirectoryArtifactColumnsFields, fieldCount: PuffDirectoryArtifactColumnsFieldCount, logicalTypes: PuffDirectoryArtifactColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryArtifactColumnsFieldPhysicalTypes, physicalType: PuffDirectoryArtifactColumnsPhysicalType, nullable: PuffDirectoryArtifactColumnsFieldNullable, Type: PuffDirectoryArtifactColumns, roles: PuffDirectoryArtifactColumnsFieldRoles, declaredMetadata: PuffDirectoryArtifactColumnsFieldDeclaredMetadata, accessors: PuffDirectoryArtifactColumnsFields, schemaIdentity: PuffDirectoryArtifactColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryNodeColumns\", fields: PuffDirectoryNodeColumnsFields, fieldCount: PuffDirectoryNodeColumnsFieldCount, logicalTypes: PuffDirectoryNodeColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryNodeColumnsFieldPhysicalTypes, physicalType: PuffDirectoryNodeColumnsPhysicalType, nullable: PuffDirectoryNodeColumnsFieldNullable, Type: PuffDirectoryNodeColumns, roles: PuffDirectoryNodeColumnsFieldRoles, declaredMetadata: PuffDirectoryNodeColumnsFieldDeclaredMetadata, accessors: PuffDirectoryNodeColumnsFields, schemaIdentity: PuffDirectoryNodeColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryGroupColumns\", fields: PuffDirectoryGroupColumnsFields, fieldCount: PuffDirectoryGroupColumnsFieldCount, logicalTypes: PuffDirectoryGroupColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryGroupColumnsFieldPhysicalTypes, physicalType: PuffDirectoryGroupColumnsPhysicalType, nullable: PuffDirectoryGroupColumnsFieldNullable, Type: PuffDirectoryGroupColumns, roles: PuffDirectoryGroupColumnsFieldRoles, declaredMetadata: PuffDirectoryGroupColumnsFieldDeclaredMetadata, accessors: PuffDirectoryGroupColumnsFields, schemaIdentity: PuffDirectoryGroupColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryNodeEditColumns\", fields: PuffDirectoryNodeEditColumnsFields, fieldCount: PuffDirectoryNodeEditColumnsFieldCount, logicalTypes: PuffDirectoryNodeEditColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryNodeEditColumnsFieldPhysicalTypes, physicalType: PuffDirectoryNodeEditColumnsPhysicalType, nullable: PuffDirectoryNodeEditColumnsFieldNullable, Type: PuffDirectoryNodeEditColumns, roles: PuffDirectoryNodeEditColumnsFieldRoles, declaredMetadata: PuffDirectoryNodeEditColumnsFieldDeclaredMetadata, accessors: PuffDirectoryNodeEditColumnsFields, schemaIdentity: PuffDirectoryNodeEditColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryGroupEditColumns\", fields: PuffDirectoryGroupEditColumnsFields, fieldCount: PuffDirectoryGroupEditColumnsFieldCount, logicalTypes: PuffDirectoryGroupEditColumnsFieldLogicalTypes, physicalTypes: PuffDirectoryGroupEditColumnsFieldPhysicalTypes, physicalType: PuffDirectoryGroupEditColumnsPhysicalType, nullable: PuffDirectoryGroupEditColumnsFieldNullable, Type: PuffDirectoryGroupEditColumns, roles: PuffDirectoryGroupEditColumnsFieldRoles, declaredMetadata: PuffDirectoryGroupEditColumnsFieldDeclaredMetadata, accessors: PuffDirectoryGroupEditColumnsFields, schemaIdentity: PuffDirectoryGroupEditColumnsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryProjectionSnapshotPayload\", fields: PuffDirectoryProjectionSnapshotPayloadFields, fieldCount: PuffDirectoryProjectionSnapshotPayloadFieldCount, logicalTypes: PuffDirectoryProjectionSnapshotPayloadFieldLogicalTypes, physicalTypes: PuffDirectoryProjectionSnapshotPayloadFieldPhysicalTypes, physicalType: PuffDirectoryProjectionSnapshotPayloadPhysicalType, nullable: PuffDirectoryProjectionSnapshotPayloadFieldNullable, Type: PuffDirectoryProjectionSnapshotPayload, roles: PuffDirectoryProjectionSnapshotPayloadFieldRoles, declaredMetadata: PuffDirectoryProjectionSnapshotPayloadFieldDeclaredMetadata, accessors: PuffDirectoryProjectionSnapshotPayloadFields, schemaIdentity: PuffDirectoryProjectionSnapshotPayloadSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryProjectionDeltaPayload\", fields: PuffDirectoryProjectionDeltaPayloadFields, fieldCount: PuffDirectoryProjectionDeltaPayloadFieldCount, logicalTypes: PuffDirectoryProjectionDeltaPayloadFieldLogicalTypes, physicalTypes: PuffDirectoryProjectionDeltaPayloadFieldPhysicalTypes, physicalType: PuffDirectoryProjectionDeltaPayloadPhysicalType, nullable: PuffDirectoryProjectionDeltaPayloadFieldNullable, Type: PuffDirectoryProjectionDeltaPayload, roles: PuffDirectoryProjectionDeltaPayloadFieldRoles, declaredMetadata: PuffDirectoryProjectionDeltaPayloadFieldDeclaredMetadata, accessors: PuffDirectoryProjectionDeltaPayloadFields, schemaIdentity: PuffDirectoryProjectionDeltaPayloadSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireKey\", fields: PuffDirectoryWireKeyFields, fieldCount: PuffDirectoryWireKeyFieldCount, logicalTypes: PuffDirectoryWireKeyFieldLogicalTypes, physicalTypes: PuffDirectoryWireKeyFieldPhysicalTypes, physicalType: PuffDirectoryWireKeyPhysicalType, nullable: PuffDirectoryWireKeyFieldNullable, Type: PuffDirectoryWireKey, roles: PuffDirectoryWireKeyFieldRoles, declaredMetadata: PuffDirectoryWireKeyFieldDeclaredMetadata, accessors: PuffDirectoryWireKeyFields, schemaIdentity: PuffDirectoryWireKeySchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireCounts\", fields: PuffDirectoryWireCountsFields, fieldCount: PuffDirectoryWireCountsFieldCount, logicalTypes: PuffDirectoryWireCountsFieldLogicalTypes, physicalTypes: PuffDirectoryWireCountsFieldPhysicalTypes, physicalType: PuffDirectoryWireCountsPhysicalType, nullable: PuffDirectoryWireCountsFieldNullable, Type: PuffDirectoryWireCounts, roles: PuffDirectoryWireCountsFieldRoles, declaredMetadata: PuffDirectoryWireCountsFieldDeclaredMetadata, accessors: PuffDirectoryWireCountsFields, schemaIdentity: PuffDirectoryWireCountsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWirePublicationCounts\", fields: PuffDirectoryWirePublicationCountsFields, fieldCount: PuffDirectoryWirePublicationCountsFieldCount, logicalTypes: PuffDirectoryWirePublicationCountsFieldLogicalTypes, physicalTypes: PuffDirectoryWirePublicationCountsFieldPhysicalTypes, physicalType: PuffDirectoryWirePublicationCountsPhysicalType, nullable: PuffDirectoryWirePublicationCountsFieldNullable, Type: PuffDirectoryWirePublicationCounts, roles: PuffDirectoryWirePublicationCountsFieldRoles, declaredMetadata: PuffDirectoryWirePublicationCountsFieldDeclaredMetadata, accessors: PuffDirectoryWirePublicationCountsFields, schemaIdentity: PuffDirectoryWirePublicationCountsSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireArtifact\", fields: PuffDirectoryWireArtifactFields, fieldCount: PuffDirectoryWireArtifactFieldCount, logicalTypes: PuffDirectoryWireArtifactFieldLogicalTypes, physicalTypes: PuffDirectoryWireArtifactFieldPhysicalTypes, physicalType: PuffDirectoryWireArtifactPhysicalType, nullable: PuffDirectoryWireArtifactFieldNullable, Type: PuffDirectoryWireArtifact, roles: PuffDirectoryWireArtifactFieldRoles, declaredMetadata: PuffDirectoryWireArtifactFieldDeclaredMetadata, accessors: PuffDirectoryWireArtifactFields, schemaIdentity: PuffDirectoryWireArtifactSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireNode\", fields: PuffDirectoryWireNodeFields, fieldCount: PuffDirectoryWireNodeFieldCount, logicalTypes: PuffDirectoryWireNodeFieldLogicalTypes, physicalTypes: PuffDirectoryWireNodeFieldPhysicalTypes, physicalType: PuffDirectoryWireNodePhysicalType, nullable: PuffDirectoryWireNodeFieldNullable, Type: PuffDirectoryWireNode, roles: PuffDirectoryWireNodeFieldRoles, declaredMetadata: PuffDirectoryWireNodeFieldDeclaredMetadata, accessors: PuffDirectoryWireNodeFields, schemaIdentity: PuffDirectoryWireNodeSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireName\", fields: PuffDirectoryWireNameFields, fieldCount: PuffDirectoryWireNameFieldCount, logicalTypes: PuffDirectoryWireNameFieldLogicalTypes, physicalTypes: PuffDirectoryWireNameFieldPhysicalTypes, physicalType: PuffDirectoryWireNamePhysicalType, nullable: PuffDirectoryWireNameFieldNullable, Type: PuffDirectoryWireName, roles: PuffDirectoryWireNameFieldRoles, declaredMetadata: PuffDirectoryWireNameFieldDeclaredMetadata, accessors: PuffDirectoryWireNameFields, schemaIdentity: PuffDirectoryWireNameSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireGroup\", fields: PuffDirectoryWireGroupFields, fieldCount: PuffDirectoryWireGroupFieldCount, logicalTypes: PuffDirectoryWireGroupFieldLogicalTypes, physicalTypes: PuffDirectoryWireGroupFieldPhysicalTypes, physicalType: PuffDirectoryWireGroupPhysicalType, nullable: PuffDirectoryWireGroupFieldNullable, Type: PuffDirectoryWireGroup, roles: PuffDirectoryWireGroupFieldRoles, declaredMetadata: PuffDirectoryWireGroupFieldDeclaredMetadata, accessors: PuffDirectoryWireGroupFields, schemaIdentity: PuffDirectoryWireGroupSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireNodeEdit\", fields: PuffDirectoryWireNodeEditFields, fieldCount: PuffDirectoryWireNodeEditFieldCount, logicalTypes: PuffDirectoryWireNodeEditFieldLogicalTypes, physicalTypes: PuffDirectoryWireNodeEditFieldPhysicalTypes, physicalType: PuffDirectoryWireNodeEditPhysicalType, nullable: PuffDirectoryWireNodeEditFieldNullable, Type: PuffDirectoryWireNodeEdit, roles: PuffDirectoryWireNodeEditFieldRoles, declaredMetadata: PuffDirectoryWireNodeEditFieldDeclaredMetadata, accessors: PuffDirectoryWireNodeEditFields, schemaIdentity: PuffDirectoryWireNodeEditSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireGroupEdit\", fields: PuffDirectoryWireGroupEditFields, fieldCount: PuffDirectoryWireGroupEditFieldCount, logicalTypes: PuffDirectoryWireGroupEditFieldLogicalTypes, physicalTypes: PuffDirectoryWireGroupEditFieldPhysicalTypes, physicalType: PuffDirectoryWireGroupEditPhysicalType, nullable: PuffDirectoryWireGroupEditFieldNullable, Type: PuffDirectoryWireGroupEdit, roles: PuffDirectoryWireGroupEditFieldRoles, declaredMetadata: PuffDirectoryWireGroupEditFieldDeclaredMetadata, accessors: PuffDirectoryWireGroupEditFields, schemaIdentity: PuffDirectoryWireGroupEditSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireSnapshot\", fields: PuffDirectoryWireSnapshotFields, fieldCount: PuffDirectoryWireSnapshotFieldCount, logicalTypes: PuffDirectoryWireSnapshotFieldLogicalTypes, physicalTypes: PuffDirectoryWireSnapshotFieldPhysicalTypes, physicalType: PuffDirectoryWireSnapshotPhysicalType, nullable: PuffDirectoryWireSnapshotFieldNullable, Type: PuffDirectoryWireSnapshot, roles: PuffDirectoryWireSnapshotFieldRoles, declaredMetadata: PuffDirectoryWireSnapshotFieldDeclaredMetadata, accessors: PuffDirectoryWireSnapshotFields, schemaIdentity: PuffDirectoryWireSnapshotSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireDelta\", fields: PuffDirectoryWireDeltaFields, fieldCount: PuffDirectoryWireDeltaFieldCount, logicalTypes: PuffDirectoryWireDeltaFieldLogicalTypes, physicalTypes: PuffDirectoryWireDeltaFieldPhysicalTypes, physicalType: PuffDirectoryWireDeltaPhysicalType, nullable: PuffDirectoryWireDeltaFieldNullable, Type: PuffDirectoryWireDelta, roles: PuffDirectoryWireDeltaFieldRoles, declaredMetadata: PuffDirectoryWireDeltaFieldDeclaredMetadata, accessors: PuffDirectoryWireDeltaFields, schemaIdentity: PuffDirectoryWireDeltaSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireSubscribeResponse\", fields: PuffDirectoryWireSubscribeResponseFields, fieldCount: PuffDirectoryWireSubscribeResponseFieldCount, logicalTypes: PuffDirectoryWireSubscribeResponseFieldLogicalTypes, physicalTypes: PuffDirectoryWireSubscribeResponseFieldPhysicalTypes, physicalType: PuffDirectoryWireSubscribeResponsePhysicalType, nullable: PuffDirectoryWireSubscribeResponseFieldNullable, Type: PuffDirectoryWireSubscribeResponse, roles: PuffDirectoryWireSubscribeResponseFieldRoles, declaredMetadata: PuffDirectoryWireSubscribeResponseFieldDeclaredMetadata, accessors: PuffDirectoryWireSubscribeResponseFields, schemaIdentity: PuffDirectoryWireSubscribeResponseSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireDeltaEvent\", fields: PuffDirectoryWireDeltaEventFields, fieldCount: PuffDirectoryWireDeltaEventFieldCount, logicalTypes: PuffDirectoryWireDeltaEventFieldLogicalTypes, physicalTypes: PuffDirectoryWireDeltaEventFieldPhysicalTypes, physicalType: PuffDirectoryWireDeltaEventPhysicalType, nullable: PuffDirectoryWireDeltaEventFieldNullable, Type: PuffDirectoryWireDeltaEvent, roles: PuffDirectoryWireDeltaEventFieldRoles, declaredMetadata: PuffDirectoryWireDeltaEventFieldDeclaredMetadata, accessors: PuffDirectoryWireDeltaEventFields, schemaIdentity: PuffDirectoryWireDeltaEventSchemaIdentity }),\n  Object.freeze({ name: \"puff_DirectoryWireUnsubscribeResponse\", fields: PuffDirectoryWireUnsubscribeResponseFields, fieldCount: PuffDirectoryWireUnsubscribeResponseFieldCount, logicalTypes: PuffDirectoryWireUnsubscribeResponseFieldLogicalTypes, physicalTypes: PuffDirectoryWireUnsubscribeResponseFieldPhysicalTypes, physicalType: PuffDirectoryWireUnsubscribeResponsePhysicalType, nullable: PuffDirectoryWireUnsubscribeResponseFieldNullable, Type: PuffDirectoryWireUnsubscribeResponse, roles: PuffDirectoryWireUnsubscribeResponseFieldRoles, declaredMetadata: PuffDirectoryWireUnsubscribeResponseFieldDeclaredMetadata, accessors: PuffDirectoryWireUnsubscribeResponseFields, schemaIdentity: PuffDirectoryWireUnsubscribeResponseSchemaIdentity }),\n  Object.freeze({ name: \"puff_ComputeBookRequest\", fields: PuffComputeBookRequestFields, fieldCount: PuffComputeBookRequestFieldCount, logicalTypes: PuffComputeBookRequestFieldLogicalTypes, physicalTypes: PuffComputeBookRequestFieldPhysicalTypes, physicalType: PuffComputeBookRequestPhysicalType, nullable: PuffComputeBookRequestFieldNullable, Type: PuffComputeBookRequest, roles: PuffComputeBookRequestFieldRoles, declaredMetadata: PuffComputeBookRequestFieldDeclaredMetadata, accessors: PuffComputeBookRequestFields, schemaIdentity: PuffComputeBookRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_MaterialiseSubobjectRequest\", fields: PuffMaterialiseSubobjectRequestFields, fieldCount: PuffMaterialiseSubobjectRequestFieldCount, logicalTypes: PuffMaterialiseSubobjectRequestFieldLogicalTypes, physicalTypes: PuffMaterialiseSubobjectRequestFieldPhysicalTypes, physicalType: PuffMaterialiseSubobjectRequestPhysicalType, nullable: PuffMaterialiseSubobjectRequestFieldNullable, Type: PuffMaterialiseSubobjectRequest, roles: PuffMaterialiseSubobjectRequestFieldRoles, declaredMetadata: PuffMaterialiseSubobjectRequestFieldDeclaredMetadata, accessors: PuffMaterialiseSubobjectRequestFields, schemaIdentity: PuffMaterialiseSubobjectRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_DataLakeFetchRequest\", fields: PuffDataLakeFetchRequestFields, fieldCount: PuffDataLakeFetchRequestFieldCount, logicalTypes: PuffDataLakeFetchRequestFieldLogicalTypes, physicalTypes: PuffDataLakeFetchRequestFieldPhysicalTypes, physicalType: PuffDataLakeFetchRequestPhysicalType, nullable: PuffDataLakeFetchRequestFieldNullable, Type: PuffDataLakeFetchRequest, roles: PuffDataLakeFetchRequestFieldRoles, declaredMetadata: PuffDataLakeFetchRequestFieldDeclaredMetadata, accessors: PuffDataLakeFetchRequestFields, schemaIdentity: PuffDataLakeFetchRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_CacheReadRequest\", fields: PuffCacheReadRequestFields, fieldCount: PuffCacheReadRequestFieldCount, logicalTypes: PuffCacheReadRequestFieldLogicalTypes, physicalTypes: PuffCacheReadRequestFieldPhysicalTypes, physicalType: PuffCacheReadRequestPhysicalType, nullable: PuffCacheReadRequestFieldNullable, Type: PuffCacheReadRequest, roles: PuffCacheReadRequestFieldRoles, declaredMetadata: PuffCacheReadRequestFieldDeclaredMetadata, accessors: PuffCacheReadRequestFields, schemaIdentity: PuffCacheReadRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_CacheWriteRequest\", fields: PuffCacheWriteRequestFields, fieldCount: PuffCacheWriteRequestFieldCount, logicalTypes: PuffCacheWriteRequestFieldLogicalTypes, physicalTypes: PuffCacheWriteRequestFieldPhysicalTypes, physicalType: PuffCacheWriteRequestPhysicalType, nullable: PuffCacheWriteRequestFieldNullable, Type: PuffCacheWriteRequest, roles: PuffCacheWriteRequestFieldRoles, declaredMetadata: PuffCacheWriteRequestFieldDeclaredMetadata, accessors: PuffCacheWriteRequestFields, schemaIdentity: PuffCacheWriteRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_HTTPRequest\", fields: PuffHTTPRequestFields, fieldCount: PuffHTTPRequestFieldCount, logicalTypes: PuffHTTPRequestFieldLogicalTypes, physicalTypes: PuffHTTPRequestFieldPhysicalTypes, physicalType: PuffHTTPRequestPhysicalType, nullable: PuffHTTPRequestFieldNullable, Type: PuffHTTPRequest, roles: PuffHTTPRequestFieldRoles, declaredMetadata: PuffHTTPRequestFieldDeclaredMetadata, accessors: PuffHTTPRequestFields, schemaIdentity: PuffHTTPRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_LLMCompletionRequest\", fields: PuffLLMCompletionRequestFields, fieldCount: PuffLLMCompletionRequestFieldCount, logicalTypes: PuffLLMCompletionRequestFieldLogicalTypes, physicalTypes: PuffLLMCompletionRequestFieldPhysicalTypes, physicalType: PuffLLMCompletionRequestPhysicalType, nullable: PuffLLMCompletionRequestFieldNullable, Type: PuffLLMCompletionRequest, roles: PuffLLMCompletionRequestFieldRoles, declaredMetadata: PuffLLMCompletionRequestFieldDeclaredMetadata, accessors: PuffLLMCompletionRequestFields, schemaIdentity: PuffLLMCompletionRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_AuthorizeCrashBuiltinRequest\", fields: PuffAuthorizeCrashBuiltinRequestFields, fieldCount: PuffAuthorizeCrashBuiltinRequestFieldCount, logicalTypes: PuffAuthorizeCrashBuiltinRequestFieldLogicalTypes, physicalTypes: PuffAuthorizeCrashBuiltinRequestFieldPhysicalTypes, physicalType: PuffAuthorizeCrashBuiltinRequestPhysicalType, nullable: PuffAuthorizeCrashBuiltinRequestFieldNullable, Type: PuffAuthorizeCrashBuiltinRequest, roles: PuffAuthorizeCrashBuiltinRequestFieldRoles, declaredMetadata: PuffAuthorizeCrashBuiltinRequestFieldDeclaredMetadata, accessors: PuffAuthorizeCrashBuiltinRequestFields, schemaIdentity: PuffAuthorizeCrashBuiltinRequestSchemaIdentity }),\n  Object.freeze({ name: \"puff_HTTPResult\", fields: PuffHTTPResultFields, fieldCount: PuffHTTPResultFieldCount, logicalTypes: PuffHTTPResultFieldLogicalTypes, physicalTypes: PuffHTTPResultFieldPhysicalTypes, physicalType: PuffHTTPResultPhysicalType, nullable: PuffHTTPResultFieldNullable, Type: PuffHTTPResult, roles: PuffHTTPResultFieldRoles, declaredMetadata: PuffHTTPResultFieldDeclaredMetadata, accessors: PuffHTTPResultFields, schemaIdentity: PuffHTTPResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_LLMCompletionResult\", fields: PuffLLMCompletionResultFields, fieldCount: PuffLLMCompletionResultFieldCount, logicalTypes: PuffLLMCompletionResultFieldLogicalTypes, physicalTypes: PuffLLMCompletionResultFieldPhysicalTypes, physicalType: PuffLLMCompletionResultPhysicalType, nullable: PuffLLMCompletionResultFieldNullable, Type: PuffLLMCompletionResult, roles: PuffLLMCompletionResultFieldRoles, declaredMetadata: PuffLLMCompletionResultFieldDeclaredMetadata, accessors: PuffLLMCompletionResultFields, schemaIdentity: PuffLLMCompletionResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_CacheReadResult\", fields: PuffCacheReadResultFields, fieldCount: PuffCacheReadResultFieldCount, logicalTypes: PuffCacheReadResultFieldLogicalTypes, physicalTypes: PuffCacheReadResultFieldPhysicalTypes, physicalType: PuffCacheReadResultPhysicalType, nullable: PuffCacheReadResultFieldNullable, Type: PuffCacheReadResult, roles: PuffCacheReadResultFieldRoles, declaredMetadata: PuffCacheReadResultFieldDeclaredMetadata, accessors: PuffCacheReadResultFields, schemaIdentity: PuffCacheReadResultSchemaIdentity }),\n  Object.freeze({ name: \"puff_CacheWriteResult\", fields: PuffCacheWriteResultFields, fieldCount: PuffCacheWriteResultFieldCount, logicalTypes: PuffCacheWriteResultFieldLogicalTypes, physicalTypes: PuffCacheWriteResultFieldPhysicalTypes, physicalType: PuffCacheWriteResultPhysicalType, nullable: PuffCacheWriteResultFieldNullable, Type: PuffCacheWriteResult, roles: PuffCacheWriteResultFieldRoles, declaredMetadata: PuffCacheWriteResultFieldDeclaredMetadata, accessors: PuffCacheWriteResultFields, schemaIdentity: PuffCacheWriteResultSchemaIdentity }),\n]);\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport {\n  newBin,\n  newBool,\n  newFloat32,\n  newFloat32Array,\n  newFloat64,\n  newFloat64Array,\n  newInt,\n  newInt8,\n  newInt8Array,\n  newInt16,\n  newInt16Array,\n  newInt32,\n  newInt32Array,\n  newInt64Array,\n  newNominalStruct,\n  newNullableBin,\n  newNullableBool,\n  newNullableInt,\n  newNullableStr,\n  newUntypedNull,\n  newStr,\n  newStrArray,\n  newStrArray64,\n} from '../ptrless/export.mjs';\nimport { AllStructDescriptors } from './puffrpc.gen.mjs';\n\n\nconst ARRAY_CONSTRUCTORS = Object.freeze({\n  IntegralArrow8: newInt8Array,\n  IntegralArrow16: newInt16Array,\n  IntegralArrow32: newInt32Array,\n  IntegralArrow64: newInt64Array,\n  BytesArrow32: newStrArray,\n  BytesArrow64: newStrArray64,\n  FloatArrow32: newFloat32Array,\n  FloatArrow64: newFloat64Array,\n});\n\nconst SCALAR_CONSTRUCTORS = Object.freeze({\n  BoolScalar: newBool,\n  BytesScalar: newStr,\n  FloatScalar32: newFloat32,\n  FloatScalar64: newFloat64,\n  IntegralScalar: newInt,\n  IntegralScalar8: newInt8,\n  IntegralScalar16: newInt16,\n  IntegralScalar32: newInt32,\n});\n\nconst NOMINAL_PHYSICAL_TYPES = new Set(AllStructDescriptors.map(descriptor => descriptor.physicalType));\n\n\nfunction fieldObject(value, name) {\n  if (!value || typeof value !== 'object') {\n    throw new TypeError(`puffrpc.ptrless: field '${name}' must be an object or array`);\n  }\n  if (value.kind || typeof value.field === 'function') return value;\n  throw new TypeError(`puffrpc.ptrless: field '${name}' is not a ptrless object`);\n}\n\n\nfunction declaredPhysicalType(meta) {\n  const value = meta?.field?.('physical');\n  return typeof value?.toText === 'function' ? value.toText() : null;\n}\n\nfunction fieldPhysicalType(field, expected) {\n  if (NOMINAL_PHYSICAL_TYPES.has(expected)) {\n    return declaredPhysicalType(field?.meta?.());\n  }\n  return typeof field?.physicalType === 'function' ? field.physicalType() : null;\n}\n\n\nfunction constructField(name, physicalType, logicalType, nullable, itemLogicalType, axisName, value) {\n  if (value === null) {\n    if (logicalType === 'Any') return newUntypedNull();\n    if (!nullable) throw new TypeError(`puffrpc.ptrless: field '${name}' is not nullable`);\n    if (logicalType === 'Str') return newNullableStr(null);\n    if (logicalType === 'Bin') return newNullableBin(null);\n    if (logicalType === 'Bool') return newNullableBool(null);\n    if (logicalType?.startsWith('Int')) {\n      const bits = Number(logicalType.slice(3)) || 64;\n      return newNullableInt(null, bits);\n    }\n  }\n  const arrayConstructor = ARRAY_CONSTRUCTORS[physicalType];\n  if (arrayConstructor) {\n    if (physicalType.startsWith('BytesArrow') && itemLogicalType === 'Bin') {\n      throw new TypeError(`puffrpc.ptrless: binary byte arrays are not supported by the JS exporter for '${name}'`);\n    }\n    return arrayConstructor(value, axisName ?? null);\n  }\n  if (logicalType === 'Bin') return newBin(value);\n  if (logicalType === 'Str') return newStr(value);\n  if (logicalType === 'Int' || logicalType === 'Int64') return newInt(value);\n  if (logicalType === 'Int8') return newInt8(value);\n  if (logicalType === 'Int16') return newInt16(value);\n  if (logicalType === 'Int32') return newInt32(value);\n  if (logicalType === 'Bool') return newBool(value);\n  if (logicalType === 'Float32') return newFloat32(value);\n  if (logicalType === 'Float64') return newFloat64(value);\n  if (physicalType?.startsWith('puff_')) {\n    const nested = AllStructDescriptors.find(item => item.physicalType === physicalType);\n    if (!nested) throw new TypeError(`puffrpc.ptrless: no descriptor for nested field '${name}'`);\n    return toPtrless(nested, value);\n  }\n  if (logicalType === 'Any') return fieldObject(value, name);\n  throw new TypeError(`puffrpc.ptrless: unsupported physical field '${name}': ${physicalType ?? '<none>'}`);\n}\n\n\nexport function toPtrless(descriptor, value) {\n  if (!descriptor || typeof descriptor !== 'object') {\n    throw new TypeError('puffrpc.ptrless.toPtrless: descriptor is required');\n  }\n  const nominal = descriptor.Type.from(value);\n  const source = nominal.toObject();\n  const fields = {};\n  for (let i = 0; i < descriptor.fields.length; i++) {\n    const name = descriptor.fields[i];\n    fields[name] = constructField(\n      name,\n      descriptor.physicalTypes[i],\n      descriptor.logicalTypes[i],\n      descriptor.nullable?.[i] ?? false,\n      descriptor.itemLogicalTypes?.[i],\n      descriptor.axisNames?.[i],\n      source[name],\n    );\n  }\n  return newNominalStruct(fields, descriptor.physicalType);\n}\n\n\nexport function castPtrless(descriptor, object) {\n  if (!descriptor || typeof descriptor !== 'object') {\n    throw new TypeError('puffrpc.ptrless.castPtrless: descriptor is required');\n  }\n  if (!object || typeof object.field !== 'function' || typeof object.fieldNames !== 'function') {\n    throw new TypeError('puffrpc.ptrless.castPtrless: object must expose field(name) and fieldNames()');\n  }\n  const physicalType = declaredPhysicalType(object.meta?.());\n  if (physicalType !== descriptor.physicalType) {\n    throw new TypeError(`puffrpc.ptrless.castPtrless: got physical type '${physicalType}', want '${descriptor.physicalType}'`);\n  }\n  const names = object.fieldNames();\n  if (names.length !== descriptor.fields.length || names.some((name, i) => name !== descriptor.fields[i])) {\n    throw new TypeError(`puffrpc.ptrless.castPtrless: '${descriptor.name}' fields do not match declaration order`);\n  }\n  for (let i = 0; i < descriptor.fields.length; i++) {\n    const name = descriptor.fields[i];\n    const field = object.field(name);\n    if (descriptor.logicalTypes[i] === 'Any') continue;\n    const actualPhysicalType = fieldPhysicalType(field, descriptor.physicalTypes[i]);\n    if (actualPhysicalType !== descriptor.physicalTypes[i]) {\n      throw new TypeError(`puffrpc.ptrless.castPtrless: field '${name}' has physical type '${actualPhysicalType}', want '${descriptor.physicalTypes[i]}'`);\n    }\n  }\n  return object;\n}\n\nexport function castPtrlessNamed(name, object) {\n  const descriptor = AllStructDescriptors.find(item => item.name === name);\n  if (!descriptor) {\n    throw new TypeError(`puffrpc.ptrless.castPtrlessNamed: unknown nominal type '${name}'`);\n  }\n  return castPtrless(descriptor, object);\n}\n\n\nexport function fromPtrless(descriptor, object) {\n  if (!descriptor || typeof descriptor !== 'object') {\n    throw new TypeError('puffrpc.ptrless.fromPtrless: descriptor is required');\n  }\n  if (!object || typeof object.field !== 'function') {\n    throw new TypeError('puffrpc.ptrless.fromPtrless: object must expose field(name)');\n  }\n  castPtrless(descriptor, object);\n  const fields = {};\n  for (let i = 0; i < descriptor.fields.length; i++) {\n    const name = descriptor.fields[i];\n    const field = object.field(name);\n    const logicalType = descriptor.logicalTypes[i];\n    if (!field) throw new TypeError(`puffrpc.ptrless.fromPtrless: field '${name}' is missing`);\n    if (descriptor.nullable?.[i] && typeof field.valid === 'function' && !field.valid()) {\n      fields[name] = null;\n    } else if (descriptor.itemLogicalTypes?.[i] !== null && typeof field.toArray === 'function') {\n      fields[name] = field.toArray();\n    } else if (logicalType === 'Any') {\n      fields[name] = field;\n    } else if (logicalType === 'Str') {\n      fields[name] = field.toText();\n    } else if (logicalType === 'Bin') {\n      fields[name] = field.toUint8Array();\n    } else if (logicalType?.startsWith('Int') || logicalType?.startsWith('Float')) {\n      fields[name] = field.value();\n    } else if (logicalType === 'Bool') {\n      fields[name] = field.value();\n    } else if (descriptor.physicalTypes[i]?.startsWith('puff_')) {\n      const nested = AllStructDescriptors.find(item => item.physicalType === descriptor.physicalTypes[i]);\n      if (!nested) throw new TypeError(`puffrpc.ptrless.fromPtrless: no descriptor for '${name}'`);\n      fields[name] = fromPtrless(nested, field);\n    } else {\n      throw new TypeError(`puffrpc.ptrless.fromPtrless: unsupported field '${name}'`);\n    }\n  }\n  return descriptor.Type.from(fields);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.gen.mjs';\nimport { bytesToHex, hashIdentityHexSync } from './hash.mjs';\nimport { importFile } from './import.mjs';\nimport { HASH_SIZE } from './ptrless.gen.mjs';\nimport { BytesScalar } from './concrete/BytesScalar.mjs';\nimport { IntegralScalar } from './concrete/IntegralScalar.mjs';\nimport { Struct } from './concrete/Struct.mjs';\nimport { exportFile, hashIdentity as hashIdentityConstructed, newBin, newInt32, newStr, newStruct, payloadHash } from './export.mjs';\nimport { toPtrless } from '../puffrpc/puffrpc.ptrless.mjs';\nimport { AllStructDescriptors } from '../puffrpc/puffrpc.gen.mjs';\nimport {\n    GraphState,\n    axisFieldGraphState,\n    isLazyPhysicalType,\n    metadataFieldGraphState,\n} from './serialization-state.mjs';\n\n\nexport const UUID_BYTES = Number(HASH_SIZE);\n\nexport const Request = 'request';\nexport const Response = 'response';\n// Stream is the server-to-client carrier for application-level batches.\nexport const Stream = 'stream';\nexport const Partial = 'partial';\nexport const Close = 'close';\nexport const Cancel = 'cancel';\nexport const Reprioritize = 'reprioritize';\nexport const MethodSessionOpen = 'session_open';\n\nconst FIELD_NAMES = Object.freeze(['uuid', 'type', 'method', 'priority', 'body']);\nconst PREVIEW_HINTS_FIELD = 'preview_hints';\nconst SERVER_DURATION_FIELD = 'server_duration_ns';\n\n\nfunction pushTestingPortalTrace(event, fields = {}) {\n    try {\n        globalThis.__testingPortalWSTracePush?.(event, fields);\n    } catch (_err) {\n    }\n}\n\nfunction roundMS(ms) {\n    return Math.round(ms * 1000) / 1000;\n}\n\nfunction objectInfo(obj) {\n    return {\n        object_type: obj?.constructor?.name ?? typeof obj,\n        logical_type: typeof obj?.logicalType === 'function' ? obj.logicalType() : null,\n        physical_type: typeof obj?.physicalType === 'function' ? obj.physicalType() : null,\n    };\n}\n\nfunction hashKeyHex(bytes) {\n    return bytesToHex(bytes);\n}\n\nfunction payloadLengthOf(obj) {\n    if (obj && typeof obj.length === 'bigint') {\n        return obj.length;\n    }\n    if (obj && typeof obj.length === 'number') {\n        return BigInt(obj.length);\n    }\n    return 0n;\n}\n\nfunction payloadNumNullsOf(obj) {\n    if (obj && typeof obj.numNulls === 'bigint') {\n        return obj.numNulls;\n    }\n    if (obj && typeof obj.numNulls === 'number') {\n        return BigInt(obj.numNulls);\n    }\n    return 0n;\n}\n\nfunction newCodecStats() {\n    return {\n        frames_in: 0,\n        frames_out: 0,\n        bytes_in: 0,\n        bytes_out: 0,\n        reusable_concrete_sent: 0,\n        reusable_deferred_sent: 0,\n        reusable_cached_incoming: 0,\n        reusable_deferred_resolved: 0,\n        reusable_cache_miss: 0,\n        incoming_cache_size: 0,\n        peer_seen_size: 0,\n    };\n}\n\nasync function newWireLazyHash(obj, graphState) {\n    if (!obj.meta && graphState !== GraphState.Metadata) {\n        throw new Error(`ptrless.rpc.SessionCodec: reusable ${obj.kind ?? typeof obj} has no metadata`);\n    }\n    const dataHash = await payloadHash(obj);\n    const identityHash = await hashIdentityConstructed(obj);\n    return {\n        kind: 'LazyHash',\n        flags: (obj.flags & ~(ptlf.outer_MASK | ptlf.form_MASK | ptlf.REUSABLE)) | ptlf.outer_LAZY_HASHED | ptlf.HASH_POPULATED | ptlf.BEACON_BIT,\n        meta: null,\n        identityHash,\n        hash: dataHash,\n        length: payloadLengthOf(obj),\n        numNulls: payloadNumNullsOf(obj),\n    };\n}\n\nasync function rewriteOutgoingPayload(obj, frameConcrete, peerSeen, memo, stats,\n    graphState = GraphState.Payload) {\n    if (!obj || typeof obj !== 'object') {\n        return obj;\n    }\n    const hit = memo.get(obj);\n    if (hit) {\n        return hit;\n    }\n    // Publish the in-progress identity before following metadata and explicit\n    // recursion-marker edges.\n    // Role stays on this recursive instruction; it does not split identity.\n    memo.set(obj, obj);\n\n    const meta = obj.meta\n        ? await rewriteOutgoingPayloadEdge(obj.meta, `${obj.kind ?? 'object'}.meta`, frameConcrete, peerSeen, memo, stats, GraphState.Metadata)\n        : null;\n\n    let out = obj;\n    let diagnostic = typeof obj.diagnostic === 'function' ? obj.diagnostic() : null;\n    let iaxis = typeof obj.iaxis === 'function' ? obj.iaxis() : null;\n    let daxis = typeof obj.daxis === 'function' ? obj.daxis() : null;\n    let diagnosticOut = diagnostic;\n    let iaxisOut = iaxis;\n    let daxisOut = daxis;\n    if (diagnostic) {\n        diagnosticOut = await rewriteOutgoingPayloadEdge(diagnostic, `${obj.kind ?? 'object'}.diagnostic`, frameConcrete, peerSeen, memo, stats, GraphState.Payload);\n    }\n    if (iaxis) {\n        iaxisOut = await rewriteOutgoingPayloadEdge(iaxis, `${obj.kind ?? 'object'}.iaxis`, frameConcrete, peerSeen, memo, stats, GraphState.Metadata);\n    }\n    if (daxis) {\n        daxisOut = await rewriteOutgoingPayloadEdge(daxis, `${obj.kind ?? 'object'}.daxis`, frameConcrete, peerSeen, memo, stats, GraphState.Metadata);\n    }\n    const sideChanged = diagnosticOut !== diagnostic || iaxisOut !== iaxis || daxisOut !== daxis;\n    switch (obj.kind) {\n    case 'Hetero':\n    case 'Metadata': {\n        let changed = meta !== obj.meta || sideChanged;\n        const fields = new Array(obj.fields.length);\n        for (let i = 0; i < obj.fields.length; i++) {\n            const childState = obj.kind === 'Metadata'\n                ? metadataFieldGraphState(i, graphState)\n                : obj.kind === 'Axis'\n                    ? axisFieldGraphState(i, graphState)\n                    : graphState;\n            const next = await rewriteOutgoingPayloadEdge(\n                obj.fields[i], `${obj.kind ?? 'object'}.fields[${i}]`, frameConcrete, peerSeen, memo, stats, childState\n            );\n            fields[i] = next;\n            changed = changed || next !== obj.fields[i];\n        }\n        if (changed) {\n            out = { ...obj, meta, fields,\n                _diagnostic: diagnosticOut, _iaxis: iaxisOut, _daxis: daxisOut };\n        }\n        break;\n    }\n    default:\n        if (meta !== obj.meta || sideChanged) {\n            out = { ...obj, meta,\n                _diagnostic: diagnosticOut, _iaxis: iaxisOut, _daxis: daxisOut };\n        }\n        break;\n    }\n\n    memo.set(obj, out);\n    return out;\n}\n\nasync function rewriteOutgoingPayloadEdge(child, path, frameConcrete, peerSeen, memo, stats, graphState) {\n    if (!child) {\n        return child;\n    }\n    const edge = await rewriteOutgoingReusableEdge(child, path, frameConcrete, peerSeen, memo, stats, graphState);\n    if (edge !== child) {\n        return edge;\n    }\n    return await rewriteOutgoingPayload(edge, frameConcrete, peerSeen, memo, stats, graphState);\n}\n\nasync function rewriteOutgoingReusableEdge(child, path, frameConcrete, peerSeen, memo, stats, graphState) {\n    if (!child || typeof child.flags !== 'bigint' || (child.flags & ptlf.REUSABLE) === 0n) {\n        return child;\n    }\n    const key = hashKeyHex(await hashIdentityConstructed(child));\n    // A definition selected in this frame is concrete at every occurrence.\n    // Only an identity established by a successfully written earlier frame\n    // may become a deferred reusable edge.\n    if (frameConcrete.has(child)) {\n        return child;\n    }\n    if (peerSeen.has(key)) {\n        stats.reusable_deferred_sent++;\n        return await newWireLazyHash(child, graphState);\n    }\n    stats.reusable_concrete_sent++;\n    frameConcrete.set(child, key);\n    return child;\n}\n\nexport class SessionCodec {\n    constructor() {\n        this._incoming = new Map();\n        this._peerSeen = new Set();\n        this._stats = newCodecStats();\n    }\n\n    // Read one websocket frame using one session-local reusable-object cache.\n    readFrame(buffer, offset = undefined, base = 0) {\n        const bytes = ArrayBuffer.isView(buffer) ? buffer.byteLength : buffer?.byteLength ?? 0;\n        this._stats.frames_in++;\n        this._stats.bytes_in += bytes;\n        const root = importFrameRoot(buffer, offset, base, {\n            resolveImportedObject: (obj, position, graphState) => {\n                if ((obj.flags() & ptlf.outer_MASK) !== ptlf.outer_LAZY_HASHED) {\n                    return obj;\n                }\n                const key = hashIdentityHexSync(obj);\n                const cached = this._incoming.get(key);\n                if (!cached) {\n                    this._stats.reusable_cache_miss++;\n                    throw new Error(\n                        `ptrless.rpc.SessionCodec.readFrame: deferred reusable arrived before cache population: `\n                        + `key=${key} physical=${obj.physicalType?.() ?? typeof obj} `\n                        + `data_hash=${obj.dataHashHex?.() ?? null} `\n                        + `identity_hash=${obj.identityHashHex?.() ?? null} `\n                        + `cached=${this._incoming.size} position=${position} role=${graphState}`\n                    );\n                }\n                this._stats.reusable_deferred_resolved++;\n                return cached;\n            },\n            observeImportedObject: (obj) => {\n                if ((obj.flags() & ptlf.REUSABLE) === 0n\n                    || (obj.flags() & ptlf.outer_MASK) === ptlf.outer_LAZY_HASHED) {\n                    return;\n                }\n                const key = hashIdentityHexSync(obj);\n                if (!this._incoming.has(key)) {\n                    this._stats.reusable_cached_incoming++;\n                    this._incoming.set(key, obj);\n                }\n            },\n        });\n        this.#refreshSizes();\n        return fromObject(root);\n    }\n\n    // Write one websocket frame, eliding reusable objects after their first concrete send.\n    async writeFrame(env) {\n        const root = envelopeToObject(env);\n        const frameConcrete = new Map();\n        const rewritten = await rewriteOutgoingPayload(root, frameConcrete, this._peerSeen, new WeakMap(), this._stats);\n        const frameEmitted = new Set();\n        const frame = await exportFile(rewritten, {\n            onObjectWritten: async (obj) => {\n                if (!obj || typeof obj.flags !== 'bigint' || (obj.flags & ptlf.REUSABLE) === 0n) {\n                    return;\n                }\n                const key = hashKeyHex(await hashIdentityConstructed(obj));\n                if (frameConcrete.get(obj) === key) {\n                    frameEmitted.add(key);\n                }\n            },\n        });\n        for (const key of frameEmitted) {\n            this._peerSeen.add(key);\n        }\n        this._stats.frames_out++;\n        this._stats.bytes_out += frame.byteLength ?? 0;\n        this.#refreshSizes();\n        return frame;\n    }\n\n    // stats returns one point-in-time transport counter snapshot for diagnostics.\n    stats() {\n        this.#refreshSizes();\n        return { ...this._stats };\n    }\n\n    #refreshSizes() {\n        this._stats.incoming_cache_size = this._incoming.size;\n        this._stats.peer_seen_size = this._peerSeen.size;\n    }\n}\n\n\nexport class Envelope {\n    constructor({ uuid, type, method = '', priority = 0, body, previewHints = null, serverDurationNS = null }) {\n        this.uuid = normaliseUUID(uuid);\n        this.type = requireType(type);\n        this.method = normaliseMethod(method);\n        this.priority = normalisePriority(priority);\n        if (body === undefined || body === null) {\n            throw new Error(`ptrless.rpc.Envelope: body must not be null`);\n        }\n        if (this.type === Request && this.method === '') {\n            throw new Error(`ptrless.rpc.Envelope: request method must not be empty`);\n        }\n        this.body = body;\n        this.previewHints = previewHints;\n        if (serverDurationNS !== null\n            && (!Number.isSafeInteger(serverDurationNS) || serverDurationNS < 0 || this.type !== Response)) {\n            throw new Error('ptrless.rpc.Envelope: serverDurationNS must be a non-negative response-only safe integer');\n        }\n        this.serverDurationNS = serverDurationNS;\n    }\n}\n\nexport function newRequest(uuid, method, body) {\n    if (body === undefined || body === null) {\n        throw new Error(`ptrless.rpc.newRequest: body must not be null`);\n    }\n    if (!isNullObject(body) && !isStructLike(body)) {\n        throw new Error(`ptrless.rpc.newRequest: body must be Struct or typed null`);\n    }\n    return new Envelope({ uuid, type: Request, method, body });\n}\n\nexport function newSessionOpenBody(sessionUUID) {\n    const descriptor = AllStructDescriptors.find(item => item.name === 'puff_SessionOpen');\n    if (!descriptor) throw new Error('ptrless.rpc.newSessionOpenBody: puff_SessionOpen descriptor is missing');\n    return toPtrless(descriptor, {\n        session_uuid: normaliseUUID(sessionUUID),\n    });\n}\n\nexport function newSessionOpenRequest(uuid, sessionUUID) {\n    return newRequest(uuid, MethodSessionOpen, newSessionOpenBody(sessionUUID));\n}\n\nexport function newResponse(req, body) {\n    return newReply(Response, req, body);\n}\n\nexport function newPartial(req, body) {\n    return newReply(Partial, req, body);\n}\n\nexport function newClose(req, body) {\n    return newReply(Close, req, body);\n}\n\nexport function fromObject(obj) {\n    const started = performance.now();\n    pushTestingPortalTrace('rpc_from_object_start', {\n        ...objectInfo(obj),\n    });\n    if (!(obj instanceof Struct)) {\n        const got = obj?.constructor?.name || String(obj);\n        throw new Error(`ptrless.rpc.fromObject: want Struct, got ${got}`);\n    }\n\n    const namesStarted = performance.now();\n    requireFieldNames(obj);\n    const namesMS = roundMS(performance.now() - namesStarted);\n\n    const uuidStarted = performance.now();\n    const uuidObj = requireBytesField(obj.field('uuid'), 'uuid');\n    if (!uuidObj.valid()) {\n        throw new Error(`ptrless.rpc.fromObject: uuid must be valid`);\n    }\n    if (uuidObj.bytes() !== UUID_BYTES) {\n        throw new Error(`ptrless.rpc.fromObject: uuid length = ${uuidObj.bytes()}, want ${UUID_BYTES}`);\n    }\n    const uuidMS = roundMS(performance.now() - uuidStarted);\n\n    const typeStarted = performance.now();\n    const typeObj = requireBytesField(obj.field('type'), 'type');\n    if (!typeObj.valid()) {\n        throw new Error(`ptrless.rpc.fromObject: type must be valid`);\n    }\n    const type = requireType(typeObj.toText());\n    const typeMS = roundMS(performance.now() - typeStarted);\n\n    const methodStarted = performance.now();\n    const methodObj = requireBytesField(obj.field('method'), 'method');\n    const method = methodObj.valid() ? methodObj.toText() : '';\n    const methodMS = roundMS(performance.now() - methodStarted);\n\n    const priorityStarted = performance.now();\n    const priorityObj = requireIntField(obj.field('priority'), 'priority');\n    if (!priorityObj.valid()) {\n        throw new Error(`ptrless.rpc.fromObject: priority must be valid`);\n    }\n    const priorityMS = roundMS(performance.now() - priorityStarted);\n\n    const bodyStarted = performance.now();\n    const body = obj.field('body');\n    if (body === undefined || body === null) {\n        throw new Error(`ptrless.rpc.fromObject: body field is null`);\n    }\n    const bodyMS = roundMS(performance.now() - bodyStarted);\n    const previewHints = obj.fieldNames().includes(PREVIEW_HINTS_FIELD)\n        ? obj.field(PREVIEW_HINTS_FIELD)\n        : null;\n    let serverDurationNS = null;\n    if (obj.fieldNames().includes(SERVER_DURATION_FIELD)) {\n        if (type !== Response) {\n            throw new Error('ptrless.rpc.fromObject: server_duration_ns is response-only');\n        }\n        const durationObj = requireIntField(obj.field(SERVER_DURATION_FIELD), SERVER_DURATION_FIELD, ptlf.bitwidth_64, 'Int64');\n        if (!durationObj.valid()) {\n            throw new Error('ptrless.rpc.fromObject: server_duration_ns must be valid');\n        }\n        serverDurationNS = durationObj.value();\n        if (!Number.isSafeInteger(serverDurationNS) || serverDurationNS < 0) {\n            throw new Error(`ptrless.rpc.fromObject: invalid server_duration_ns ${serverDurationNS}`);\n        }\n    }\n    pushTestingPortalTrace('rpc_from_object_fields_done', {\n        type,\n        method,\n        field_names_duration_ms: namesMS,\n        uuid_duration_ms: uuidMS,\n        type_duration_ms: typeMS,\n        method_duration_ms: methodMS,\n        priority_duration_ms: priorityMS,\n        body_duration_ms: bodyMS,\n        body_is_lazy: isLazyPhysicalType(body),\n        ...objectInfo(body),\n    });\n\n    const env = new Envelope({\n        uuid: uuidObj.toUint8Array(),\n        type,\n        method,\n        priority: priorityObj.value(),\n        body,\n        previewHints,\n        serverDurationNS,\n    });\n    pushTestingPortalTrace('rpc_from_object_done', {\n        type: env.type,\n        method: env.method,\n        duration_ms: roundMS(performance.now() - started),\n        body_is_lazy: isLazyPhysicalType(env.body),\n        ...objectInfo(env.body),\n    });\n    return env;\n}\n\nfunction importFrameRoot(buffer, offset = undefined, base = 0, options = {}) {\n    if (ArrayBuffer.isView(buffer)) {\n        buffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n    }\n    return offset === undefined\n        ? importFile(buffer, undefined, base, options)\n        : importFile(buffer, offset, base, options);\n}\n\nfunction readFrameWithRoot(buffer, offset = undefined, base = 0) {\n    const started = performance.now();\n    pushTestingPortalTrace('rpc_read_frame_start', {\n        offset: offset === undefined ? null : offset,\n        base,\n        bytes: buffer?.byteLength ?? null,\n    });\n    const bytes = buffer?.byteLength ?? null;\n    const importStarted = performance.now();\n    const root = importFrameRoot(buffer, offset, base);\n    const importMS = roundMS(performance.now() - importStarted);\n    pushTestingPortalTrace('rpc_read_frame_import_done', {\n        bytes,\n        duration_ms: importMS,\n        ...objectInfo(root),\n    });\n    const envelopeStarted = performance.now();\n    const env = fromObject(root);\n    const envelopeMS = roundMS(performance.now() - envelopeStarted);\n    pushTestingPortalTrace('rpc_read_frame_done', {\n        type: env.type,\n        method: env.method,\n        bytes,\n        duration_ms: roundMS(performance.now() - started),\n        import_duration_ms: importMS,\n        envelope_duration_ms: envelopeMS,\n        body_is_lazy: isLazyPhysicalType(env.body),\n        ...objectInfo(env.body),\n    });\n    return env;\n}\n\nfunction envelopeToObject(env) {\n    if (env.serverDurationNS !== undefined && env.serverDurationNS !== null) {\n        throw new Error('ptrless.rpc.envelopeToObject: serverDurationNS is a receive-only Puff response sidecar');\n    }\n    const fields = {\n        uuid: newBin(normaliseUUID(env.uuid)),\n        type: newStr(requireType(env.type)),\n        method: newStr(normaliseMethod(env.method)),\n        priority: newInt32(normalisePriority(env.priority)),\n        body: env.body,\n    };\n    if (env.previewHints !== undefined && env.previewHints !== null) {\n        fields.preview_hints = env.previewHints;\n    }\n    return newStruct(fields);\n}\n\nexport function readFrame(buffer, offset = undefined, base = 0) {\n    return readFrameWithRoot(buffer, offset, base);\n}\n\nexport async function writeFrame(env) {\n    const root = envelopeToObject(env);\n    return await exportFile(root);\n}\n\nexport function uuidToHex(uuid) {\n    return Array.from(normaliseUUID(uuid), (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport function uuidFromHex(text) {\n    if (typeof text !== 'string') {\n        throw new Error(`ptrless.rpc.uuidFromHex: text must be a string`);\n    }\n    if (text.length !== UUID_BYTES * 2) {\n        throw new Error(`ptrless.rpc.uuidFromHex: hex length = ${text.length}, want ${UUID_BYTES * 2}`);\n    }\n    if (!/^[0-9a-fA-F]+$/.test(text)) {\n        throw new Error(`ptrless.rpc.uuidFromHex: text must be hexadecimal`);\n    }\n\n    const uuid = new Uint8Array(UUID_BYTES);\n    for (let i = 0; i < UUID_BYTES; i++) {\n        uuid[i] = Number.parseInt(text.slice(i * 2, i * 2 + 2), 16);\n    }\n    return uuid;\n}\n\nfunction newReply(type, req, body) {\n    if (!(req instanceof Envelope)) {\n        const got = req?.constructor?.name || String(req);\n        throw new Error(`ptrless.rpc.newReply: request must be Envelope, got ${got}`);\n    }\n    if (req.type !== Request) {\n        throw new Error(`ptrless.rpc.newReply: request type = '${req.type}', want '${Request}'`);\n    }\n    if (req.method === '') {\n        throw new Error(`ptrless.rpc.newReply: request method must not be empty`);\n    }\n    if (body === undefined || body === null) {\n        throw new Error(`ptrless.rpc.newReply: body must not be null`);\n    }\n    return new Envelope({\n        uuid: req.uuid,\n        type,\n        method: req.method,\n        body,\n    });\n}\n\nfunction requireFieldNames(obj) {\n    const names = obj.fieldNames();\n    if (names.length < FIELD_NAMES.length || names.length > FIELD_NAMES.length + 2) {\n        throw new Error(`ptrless.rpc.fromObject: num_fields = ${names.length}, want ${FIELD_NAMES.length}`);\n    }\n\n    for (let i = 0; i < FIELD_NAMES.length; i++) {\n        const name = FIELD_NAMES[i];\n        const got = names[i];\n        if (got !== name) {\n            throw new Error(`ptrless.rpc.fromObject: field_names[${i}] = '${got}', want '${name}'`);\n        }\n    }\n    if (names.length === FIELD_NAMES.length + 1 && names[FIELD_NAMES.length] !== PREVIEW_HINTS_FIELD) {\n        throw new Error(`ptrless.rpc.fromObject: field_names[${FIELD_NAMES.length}] = '${names[FIELD_NAMES.length]}', want '${PREVIEW_HINTS_FIELD}'`);\n    }\n    if (names.length === FIELD_NAMES.length + 2\n        && (names[FIELD_NAMES.length] !== PREVIEW_HINTS_FIELD\n            || names[FIELD_NAMES.length + 1] !== SERVER_DURATION_FIELD)) {\n        throw new Error('ptrless.rpc.fromObject: response sidecar fields must be preview_hints, server_duration_ns');\n    }\n}\n\nfunction requireBytesField(obj, name) {\n    if (!(obj instanceof BytesScalar)) {\n        const got = obj?.constructor?.name || String(obj);\n        throw new Error(`ptrless.rpc.fromObject: ${name} field type = ${got}, want BytesScalar`);\n    }\n    return obj;\n}\n\nfunction requireIntField(obj, name, bitwidth = ptlf.bitwidth_32, logical = 'Int32') {\n    if (!(obj instanceof IntegralScalar)) {\n        const got = obj?.constructor?.name || String(obj);\n        throw new Error(`ptrless.rpc.fromObject: ${name} field type = ${got}, want IntegralScalar`);\n    }\n    const flags = obj.flags();\n    switch (true) {\n    case (flags & ptlf.outer_MASK) !== ptlf.outer_SCALAR:\n    case (flags & ptlf.inner_MASK) !== ptlf.inner_INT:\n    case (flags & ptlf.bitwidth_MASK) !== bitwidth:\n        throw new Error(`ptrless.rpc.fromObject: ${name} flags = 0x${flags.toString(16)}, want scalar ${logical}`);\n    }\n    return obj;\n}\n\nfunction requireType(type) {\n    switch (type) {\n    case Request:\n    case Response:\n    case Stream:\n    case Partial:\n    case Close:\n    case Cancel:\n    case Reprioritize:\n        return type;\n    default:\n        throw new Error(`ptrless.rpc: unsupported type '${type}'`);\n    }\n}\n\nfunction normaliseMethod(method) {\n    if (method === null || method === undefined) {\n        return '';\n    }\n    if (typeof method !== 'string') {\n        throw new Error(`ptrless.rpc: method must be a string`);\n    }\n    return method;\n}\n\nfunction normalisePriority(priority) {\n    if (!Number.isInteger(priority)) {\n        throw new Error(`ptrless.rpc: priority must be an integer`);\n    }\n    switch (true) {\n    case priority < -2147483648:\n    case priority > 2147483647:\n        throw new Error(`ptrless.rpc: priority ${priority} is out of int32 range`);\n    }\n    return priority;\n}\n\nfunction normaliseUUID(uuid) {\n    let bytes = null;\n    if (uuid instanceof Uint8Array) {\n        bytes = uuid;\n    } else if (uuid instanceof ArrayBuffer) {\n        bytes = new Uint8Array(uuid);\n    } else if (ArrayBuffer.isView(uuid)) {\n        bytes = new Uint8Array(uuid.buffer, uuid.byteOffset, uuid.byteLength);\n    }\n\n    if (!bytes) {\n        throw new Error(`ptrless.rpc: uuid must be a Uint8Array-like value`);\n    }\n    if (bytes.byteLength !== UUID_BYTES) {\n        throw new Error(`ptrless.rpc: uuid length = ${bytes.byteLength}, want ${UUID_BYTES}`);\n    }\n    if (bytes.every((b) => b === 0)) {\n        throw new Error(`ptrless.rpc: uuid must not be zero`);\n    }\n    return new Uint8Array(bytes);\n}\n\nfunction isNullObject(obj) {\n    return obj && typeof obj.valid === 'function' && obj.valid() === false;\n}\n\nfunction isStructLike(obj) {\n    return obj\n        && (\n            (typeof obj.field === 'function'\n                && typeof obj.fieldNames === 'function'\n                && typeof obj.numFields === 'function')\n            || (obj.kind === 'Hetero' && Array.isArray(obj.fields) && obj.meta)\n        );\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptlf from './flags.mjs';\nimport { Hetero } from './abstract/Hetero.mjs';\nimport { BoolArrow } from './concrete/BoolArrow.mjs';\nimport { BoolScalar } from './concrete/BoolScalar.mjs';\nimport { BytesScalar } from './concrete/BytesScalar.mjs';\nimport { BytesArrow32, BytesArrow64 } from './concrete/BytesArrow.mjs';\nimport { IntegralArrow32, IntegralArrow64 } from './concrete/IntegralArrow.mjs';\nimport { IntegralScalar } from './concrete/IntegralScalar.mjs';\nimport { VecArrow } from './concrete/VecArrow.mjs';\nimport { HomoArrow32 } from './concrete/HomoArrow.mjs';\nimport { METADATA_V1_FIELD_NAMES_INDEX } from './concrete/MetadataFields.mjs';\n\n\nconst WORD = 2;\nconst DWORD = 4;\nconst QWORD = 8; // bytes\n\nexport function dump(buffer, base) {\n    let d = new Dumper(buffer, base);\n\n    d.dump(base, 'root');\n}\n\nfunction sumFlags(flags) {\n    return `outer=${ptlf.decodeOuter(flags)} inner=${ptlf.decodeInner(flags)} bits=${ptlf.decodeBitwidth(flags)}`;\n}\n\nclass Dumper {\n    constructor(buffer, base) {\n        this.buffer = buffer;\n        this.base = base;\n        this._depth = 0;\n        this._cache = new Map();\n    }\n\n    dump(offset, name) {\n        this._depth++;\n        const lead = ' '.repeat(4 * this._depth);\n        const gapp = ' '.repeat(4 * this._depth - 2);\n\n        let spine = new DataView(this.buffer, offset - this.base, 128);\n        const flags = spine.getBigUint64(0, true);\n        const metaOffset = offset + Number(spine.getBigInt64(1 * QWORD, true));\n\n        let msg = `[${offset}] ${name} outer=${ptlf.decodeOuter(flags)} inner=${ptlf.decodeInner(flags)} bits=${ptlf.decodeBitwidth(flags)}`;\n        const numFields = Number(spine.getBigInt64(5 * QWORD, true));\n        let startField = offset + Number(spine.getBigInt64(6 * QWORD, true));\n        if ((flags & ptlf.outer_MASK) == ptlf.outer_STRUCT) {\n            msg += ` numFields=${numFields}`;\n            msg += ` startFieldDelta=${startField - offset}`;\n        }\n        console.log(lead + msg);\n\n        console.log(lead + `meta offset=${metaOffset} delta=${metaOffset - offset}`);\n        if (this._depth < 3) {\n            if (metaOffset == offset) {\n                console.log(lead + '   SELF-REFERENTIAL');\n            } else {\n                this.dump(metaOffset, 'meta');\n            }\n        }\n\n        if ((flags & ptlf.BEACON_BIT) == 0) {\n            console.log(lead + 'BAD BEACON!');\n        }\n\n        switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_LAZY:\n            msg += ` length=${Number(spine.getBigInt64(12 * QWORD, true))}`;\n            msg += ` numNulls=${Number(spine.getBigInt64(13 * QWORD, true))}`;\n            break;\n        case ptlf.outer_STRUCT:\n            const names = this.fieldNamesFromMeta(metaOffset);\n            console.log(names);\n            const fields = new BigInt64Array(this.buffer, startField, numFields);\n            for (let i = 0; i < numFields; i++) {\n                const name = `field${i}`;\n                const adif = fields[i];\n                console.log(lead + `${name} adif=${adif}`);\n            }\n            break;\n        }\n    }\n\n    fieldNamesFromMeta(offset) {\n\n        // This is the metadata object\n        let spine = new DataView(this.buffer, offset - this.base, 128);\n        const flags = spine.getBigUint64(0, true);\n        console.log('fieldNamesFromMeta(' + sumFlags(flags) + ')');\n        const numFields = Number(spine.getBigUint64(5 * QWORD, true));\n        const startField = offset + Number(spine.getBigInt64(6 * QWORD, true));\n        const metaFields = new BigInt64Array(this.buffer, startField, numFields);\n        \n        const namesOffset = offset + Number(metaFields[METADATA_V1_FIELD_NAMES_INDEX]);\n        return this.fieldNamesFromBytesArrow32(namesOffset);\n    }\n\n    fieldNamesFromBytesArrow32(offset) {\n        // This is the BytesArrow32 object containing the field names\n        let spine = new DataView(this.buffer, offset - this.base, 128);\n        const flags = spine.getBigUint64(0, true);\n        const length = Number(spine.getBigUint64(12 * QWORD, true));\n        console.log('fieldNamesFromBytesArrow32(' + sumFlags(flags) + ')');\n\n        const offsetsAddr = offset + Number(spine.getBigInt64(5 * QWORD, true));\n        const offsets = new Int32Array(this.buffer, offsetsAddr, length + 1);\n\n        const valuesAddr = offset + Number(spine.getBigInt64(6 * QWORD, true));\n        const values = this.buffer.slice(valuesAddr, valuesAddr + offsets[length])\n        console.log(`values = valAdr=${valuesAddr} buffer=${this.buffer.byteLength} total=${offsets[length]}`);\n\n        const enc = new TextDecoder('utf-8');\n        let names = new Array(length);\n        for (let i = 0; i < length; i++) {\n            names[i] = enc.decode(values.slice(offsets[i], offsets[i + 1]));\n        }\n\n        return names;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport * from './import.mjs';\nexport * from './export.mjs';\nexport * from './rpc.mjs';\nexport * from './ptrless.gen.mjs'; // FIXME: mostly should be moved to ptlf.*\nexport { Chunked } from './concrete/Chunked.mjs';\nexport { DiagnosticV1, DiagnosticV2, SourceLocation } from './concrete/Diagnostic.mjs';\nexport { Lazy, LazyDerived, LazyHandle, LazyHash } from './concrete/Lazy.mjs';\nexport { dump } from './dumper.mjs';\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './base.mjs';\n\n/* Represent one visualisation plugin that occupies a rectangular viewport in either output-cell or fullscreen presentation. */\nexport class VisualizationPlugin extends ui.Node {\n    /* Clamp one preview request against the plugin's current height when no more specific sizing rule applies yet. */\n    preferredPreviewHeight(maxHeight = 512) {\n        if (!Number.isFinite(maxHeight) || maxHeight <= 0) {\n            throw new Error(`VisualizationPlugin.preferredPreviewHeight(${maxHeight}): maxHeight must be positive.`);\n        }\n        return Math.min(maxHeight, this.state.height);\n    }\n\n    /* Pull width and height from the owning viewport so one plugin class can be reused between cell and fullscreen hosts. */\n    syncViewportLayout() {\n        const viewport = this.parentNode;\n        if (!viewport) {\n            return;\n        }\n        const width = Number.isFinite(viewport.state?.width) ? viewport.state.width : this.state.width;\n        const height = Number.isFinite(viewport.state?.height) ? viewport.state.height : this.state.height;\n        this.mutate({ width, height });\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst TILE_MATERIAL = Symbol('evilui.tileMaterial');\nconst DEFAULT_TINT_COLOR = Object.freeze([0.824, 0.396, 0.255]);\nconst DEFAULT_GRADIENT_POINTS = Object.freeze([\n    Object.freeze({ offset: 0, color: Object.freeze([0.824, 0.396, 0.255, 1]) }),\n    Object.freeze({ offset: 1, color: Object.freeze([0.35, 0.18, 0.55, 1]) }),\n]);\nconst DEFAULT_GRADIENT_START = Object.freeze([0, 0.5]);\nconst DEFAULT_GRADIENT_END = Object.freeze([1, 0.5]);\nconst DEFAULT_FRESNEL_F0 = Object.freeze([0.04, 0.04, 0.04]);\nconst DEFAULT_NORMAL_GRID_X_ANGLES = Object.freeze([\n    -0.3, 0, 0.3,\n    -0.3, 0, 0.3,\n    -0.3, 0, 0.3,\n]);\nconst DEFAULT_NORMAL_GRID_Y_ANGLES = Object.freeze([\n    -0.3, -0.3, -0.3,\n    0, 0, 0,\n    0.3, 0.3, 0.3,\n]);\nexport const MAX_FROSTED_GLASS_BLUR_LOD = 254;\nexport const MAX_LINEAR_GRADIENT_POINTS = 8;\nexport const BEVELED_NORMAL_GRID_SIZE = 3;\n\nfunction assertUnitAmount(name, value) {\n    if (!Number.isFinite(value) || value < 0 || value > 1) {\n        throw new Error(`FrostedGlassMaterial ${name} must be a finite number in [0, 1]; got '${value}'.`);\n    }\n}\n\nfunction normaliseTintColor(value) {\n    if ((!Array.isArray(value) && !(value instanceof Float32Array))\n            || value.length !== 3\n            || Array.from(value).some(channel => !Number.isFinite(channel) || channel < 0 || channel > 1)) {\n        throw new Error(`FrostedGlassMaterial tintColor must contain three finite channels in [0, 1]; got '${value}'.`);\n    }\n    return Object.freeze(Array.from(value));\n}\n\nfunction normaliseGradientColor(name, value) {\n    if ((!Array.isArray(value) && !(value instanceof Float32Array))\n            || value.length !== 4\n            || Array.from(value).some(channel => !Number.isFinite(channel) || channel < 0 || channel > 1)) {\n        throw new Error(`LinearGradientMaterial ${name} must contain four finite RGBA channels in [0, 1]; got '${value}'.`);\n    }\n    return Object.freeze(Array.from(value));\n}\n\nfunction normaliseGradientPoints(value) {\n    if (!Array.isArray(value) || value.length < 1 || value.length > MAX_LINEAR_GRADIENT_POINTS) {\n        throw new Error(`LinearGradientMaterial points must contain between 1 and ${MAX_LINEAR_GRADIENT_POINTS} entries.`);\n    }\n    const points = value.map((point, index) => {\n        const offset = point?.offset;\n        if (!Number.isFinite(offset) || offset < 0 || offset > 1) {\n            throw new Error(`LinearGradientMaterial points[${index}].offset must be a finite number in [0, 1]; got '${offset}'.`);\n        }\n        return Object.freeze({\n            offset: Object.is(offset, -0) ? 0 : offset,\n            color: normaliseGradientColor(`points[${index}].color`, point?.color),\n        });\n    }).sort((a, b) => a.offset - b.offset);\n    for (let i = 1; i < points.length; i += 1) {\n        if (points[i - 1].offset === points[i].offset) {\n            throw new Error(`LinearGradientMaterial points must have unique offsets; duplicate '${points[i].offset}'.`);\n        }\n    }\n    return Object.freeze(points);\n}\n\nfunction packGradientStops(points) {\n    const colors = [];\n    const offsets = [];\n    const finalPoint = points[points.length - 1];\n    for (let i = 0; i < MAX_LINEAR_GRADIENT_POINTS; i += 1) {\n        const point = points[i] ?? finalPoint;\n        colors.push(...point.color);\n        offsets.push(point.offset);\n    }\n    return {\n        colors: Object.freeze(colors),\n        offsets: Object.freeze(offsets),\n    };\n}\n\nfunction normaliseGradientPoint(name, value) {\n    if ((!Array.isArray(value) && !(value instanceof Float32Array))\n            || value.length !== 2\n            || Array.from(value).some(channel => !Number.isFinite(channel))) {\n        throw new Error(`LinearGradientMaterial ${name} must contain two finite coordinates; got '${value}'.`);\n    }\n    return Object.freeze(Array.from(value, channel => Object.is(channel, -0) ? 0 : channel));\n}\n\nfunction gradientBatchValue(values) {\n    return values.map(value => Object.is(value, -0) ? 0 : value).join(',');\n}\n\nfunction assertBlurLod(value) {\n    if (value !== null\n            && (!Number.isFinite(value) || value < 0 || value > MAX_FROSTED_GLASS_BLUR_LOD)) {\n        throw new Error(\n            `FrostedGlassMaterial blurLod must be null or a finite number in [0, ${MAX_FROSTED_GLASS_BLUR_LOD}]; got '${value}'.`,\n        );\n    }\n}\n\nfunction assertNonNegativeFinite(materialName, name, value) {\n    if (!Number.isFinite(value) || value < 0) {\n        throw new Error(`${materialName} ${name} must be a finite non-negative number; got '${value}'.`);\n    }\n}\n\nfunction normaliseFresnelF0(materialName, value) {\n    if ((!Array.isArray(value) && !(value instanceof Float32Array))\n            || value.length !== 3\n            || Array.from(value).some(channel => !Number.isFinite(channel) || channel < 0 || channel > 1)) {\n        throw new Error(`${materialName} fresnelF0 must contain three finite channels in [0, 1]; got '${value}'.`);\n    }\n    return Object.freeze(Array.from(value, channel => Object.is(channel, -0) ? 0 : channel));\n}\n\nfunction normaliseLitResponse(materialName, state) {\n    const diffuseStrength = state.diffuseStrength ?? 1;\n    const specularStrength = state.specularStrength ?? 1;\n    const shininess = state.shininess ?? 32;\n    const fresnelF0 = normaliseFresnelF0(materialName, state.fresnelF0 ?? DEFAULT_FRESNEL_F0);\n    assertNonNegativeFinite(materialName, 'diffuseStrength', diffuseStrength);\n    assertNonNegativeFinite(materialName, 'specularStrength', specularStrength);\n    if (!Number.isFinite(shininess) || shininess <= 0) {\n        throw new Error(`${materialName} shininess must be a finite number greater than zero; got '${shininess}'.`);\n    }\n    return {\n        diffuseStrength: Object.is(diffuseStrength, -0) ? 0 : diffuseStrength,\n        specularStrength: Object.is(specularStrength, -0) ? 0 : specularStrength,\n        shininess,\n        fresnelF0,\n    };\n}\n\nfunction litResponseBatchKey(response) {\n    return `diffuse=${response.diffuseStrength}:specular=${response.specularStrength}:shininess=${response.shininess}:f0=${response.fresnelF0.join(',')}`;\n}\n\nfunction normaliseNormalGrid(value) {\n    const source = value ?? {\n        size: BEVELED_NORMAL_GRID_SIZE,\n        xAngles: DEFAULT_NORMAL_GRID_X_ANGLES,\n        yAngles: DEFAULT_NORMAL_GRID_Y_ANGLES,\n    };\n    if (!source || typeof source !== 'object' || source.size !== BEVELED_NORMAL_GRID_SIZE) {\n        throw new Error(`BeveledMaterial normalGrid.size must be ${BEVELED_NORMAL_GRID_SIZE}.`);\n    }\n    if (source.angles !== undefined) {\n        throw new Error('BeveledMaterial normalGrid.angles is retired; provide xAngles and yAngles.');\n    }\n    const normaliseAxis = (name, angles) => {\n        if ((!Array.isArray(angles) && !(angles instanceof Float32Array))\n                || angles.length !== BEVELED_NORMAL_GRID_SIZE * BEVELED_NORMAL_GRID_SIZE\n                || Array.from(angles).some(angle => !Number.isFinite(angle) || angle < -1 || angle > 1)) {\n            throw new Error(`BeveledMaterial normalGrid.${name} must contain nine finite normalized angles in [-1, 1].`);\n        }\n        const canonical = Array.from(angles, angle => Object.is(angle, -0) ? 0 : angle);\n        if (canonical[4] !== 0) {\n            throw new Error(`BeveledMaterial normalGrid.${name} centre angle must be 0 for the flat -Z normal.`);\n        }\n        return Object.freeze(canonical);\n    };\n    const xAngles = normaliseAxis('xAngles', source.xAngles);\n    const yAngles = normaliseAxis('yAngles', source.yAngles);\n    return Object.freeze({\n        size: BEVELED_NORMAL_GRID_SIZE,\n        xAngles,\n        yAngles,\n    });\n}\n\nconst SOLID_TILE_MATERIAL = Object.freeze({\n    [TILE_MATERIAL]: true,\n    kind: 'solid',\n    pass: 'opaque',\n    batchKey: 'solid',\n    requiresBackdrop: false,\n});\nconst TRANSLUCENT_SOLID_TILE_MATERIAL = Object.freeze({\n    [TILE_MATERIAL]: true,\n    kind: 'solid',\n    pass: 'transparent',\n    batchKey: 'solid:transparent',\n    requiresBackdrop: false,\n});\n\nexport function solidTileMaterial() {\n    return SOLID_TILE_MATERIAL;\n}\n\n/* Use the solid shader in the premultiplied-alpha pass for flat translucent surfaces. */\nexport function translucentSolidTileMaterial() {\n    return TRANSLUCENT_SOLID_TILE_MATERIAL;\n}\n\n/* Keep per-instance tint/LOD out of the batch key; tint/noise amounts remain shared uniforms. */\nexport function frostedGlassMaterial(state = {}) {\n    const tintColor = normaliseTintColor(state.tintColor ?? DEFAULT_TINT_COLOR);\n    const tintAmount = state.tintAmount ?? 0.32;\n    const noiseAmount = state.noiseAmount ?? 0.02;\n    const blurLod = state.blurLod ?? null;\n    assertUnitAmount('tintAmount', tintAmount);\n    assertUnitAmount('noiseAmount', noiseAmount);\n    assertBlurLod(blurLod);\n    return Object.freeze({\n        [TILE_MATERIAL]: true,\n        kind: 'frostedGlass',\n        pass: 'transparent',\n        batchKey: `frosted:tint=${Object.is(tintAmount, -0) ? 0 : tintAmount}:noise=${Object.is(noiseAmount, -0) ? 0 : noiseAmount}`,\n        requiresBackdrop: true,\n        tintColor,\n        tintAmount,\n        noiseAmount,\n        blurLod,\n    });\n}\n\n/* Canonicalise one to eight arbitrarily ordered stops into batch-uniform arrays. */\nexport function linearGradientMaterial(state = {}) {\n    const points = normaliseGradientPoints(state.points ?? DEFAULT_GRADIENT_POINTS);\n    const start = normaliseGradientPoint('start', state.start ?? DEFAULT_GRADIENT_START);\n    const end = normaliseGradientPoint('end', state.end ?? DEFAULT_GRADIENT_END);\n    if (points.length > 1 && start[0] === end[0] && start[1] === end[1]) {\n        throw new Error('LinearGradientMaterial start and end must describe a non-zero gradient vector.');\n    }\n    const { colors, offsets } = packGradientStops(points);\n    const pass = points.every(point => point.color[3] === 1) ? 'opaque' : 'transparent';\n    return Object.freeze({\n        [TILE_MATERIAL]: true,\n        kind: 'linearGradient',\n        pass,\n        batchKey: `linear-gradient:colors=${gradientBatchValue(colors)}:offsets=${gradientBatchValue(offsets)}:count=${points.length}:start=${gradientBatchValue(start)}:end=${gradientBatchValue(end)}`,\n        requiresBackdrop: false,\n        stopCount: points.length,\n        points,\n        colors,\n        offsets,\n        start,\n        end,\n    });\n}\n\nexport function litTileMaterial(state = {}) {\n    const response = normaliseLitResponse('LitMaterial', state);\n    return Object.freeze({\n        [TILE_MATERIAL]: true,\n        kind: 'lit',\n        pass: 'opaque',\n        batchKey: `lit:${litResponseBatchKey(response)}`,\n        requiresBackdrop: false,\n        ...response,\n    });\n}\n\nexport function beveledTileMaterial(state = {}) {\n    const response = normaliseLitResponse('BeveledMaterial', state);\n    const bevelWidth = state.bevelWidth ?? 6;\n    const bevelMargin = state.bevelMargin ?? 0;\n    const maxTilt = state.maxTilt ?? Math.PI / 3;\n    const bevelType = state.bevelType ?? 'outer';\n    const normalGrid = normaliseNormalGrid(state.normalGrid);\n    if (!Number.isFinite(bevelWidth) || bevelWidth <= 0) {\n        throw new Error(`BeveledMaterial bevelWidth must be finite and greater than zero; got '${bevelWidth}'.`);\n    }\n    if (!Number.isFinite(bevelMargin) || bevelMargin < 0) {\n        throw new Error(`BeveledMaterial bevelMargin must be finite and non-negative; got '${bevelMargin}'.`);\n    }\n    if (!Number.isFinite(maxTilt) || maxTilt < 0 || maxTilt > Math.PI / 2) {\n        throw new Error(`BeveledMaterial maxTilt must be finite and in [0, pi/2]; got '${maxTilt}'.`);\n    }\n    if (bevelType !== 'outer' && bevelType !== 'inner') {\n        throw new Error(`BeveledMaterial bevelType must be 'outer' or 'inner'; got '${bevelType}'.`);\n    }\n    const canonicalWidth = Object.is(bevelWidth, -0) ? 0 : bevelWidth;\n    const canonicalMargin = Object.is(bevelMargin, -0) ? 0 : bevelMargin;\n    const canonicalTilt = Object.is(maxTilt, -0) ? 0 : maxTilt;\n    return Object.freeze({\n        [TILE_MATERIAL]: true,\n        kind: 'beveled',\n        pass: 'opaque',\n        batchKey: `beveled:${litResponseBatchKey(response)}:type=${bevelType}:margin=${canonicalMargin}:width=${canonicalWidth}:tilt=${canonicalTilt}:grid-x=${normalGrid.xAngles.join(',')}:grid-y=${normalGrid.yAngles.join(',')}`,\n        requiresBackdrop: false,\n        ...response,\n        bevelWidth: canonicalWidth,\n        bevelMargin: canonicalMargin,\n        maxTilt: canonicalTilt,\n        bevelType,\n        normalGrid,\n    });\n}\n\nexport function isTileMaterial(value) {\n    return value?.[TILE_MATERIAL] === true;\n}\n\nexport function normaliseTileMaterial(value = null) {\n    if (value == null) {\n        return SOLID_TILE_MATERIAL;\n    }\n    if (!isTileMaterial(value)) {\n        throw new Error('Tile material must be created through ui.materials.');\n    }\n    return value;\n}\n\nexport const materials = Object.freeze({\n    solid: solidTileMaterial,\n    translucentSolid: translucentSolidTileMaterial,\n    frostedGlass: frostedGlassMaterial,\n    linearGradient: linearGradientMaterial,\n    lit: litTileMaterial,\n    beveled: beveledTileMaterial,\n});\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst CORNER_FIELDS = Object.freeze([\n    'roundTopLeft',\n    'roundTopRight',\n    'roundBottomLeft',\n    'roundBottomRight',\n]);\n\nfunction assertCornerRadius(owner, value) {\n    if (!Number.isFinite(value) || value < 0) {\n        throw new Error(`${owner} cornerRadius must be a finite non-negative number; got '${value}'.`);\n    }\n}\n\nfunction assertCornerFlag(owner, name, value) {\n    if (typeof value !== 'boolean') {\n        throw new Error(`${owner} ${name} must be boolean; got '${value}'.`);\n    }\n}\n\n/* Normalise the rounded-corner state shared by independently rendered Tile types. */\nexport function roundedTileState(state = {}, owner = 'RoundedTile') {\n    const cornerRadius = state.cornerRadius ?? 4;\n    assertCornerRadius(owner, cornerRadius);\n    const corners = {};\n    for (const field of CORNER_FIELDS) {\n        const value = state[field] ?? true;\n        assertCornerFlag(owner, field, value);\n        corners[field] = value;\n    }\n    return {\n        cornerRadius,\n        ...corners,\n    };\n}\n\nexport function validateRoundedTileMutation(state = {}, owner = 'RoundedTile') {\n    if (Object.hasOwn(state, 'cornerRadius')) {\n        assertCornerRadius(owner, state.cornerRadius);\n    }\n    for (const field of CORNER_FIELDS) {\n        if (Object.hasOwn(state, field)) {\n            assertCornerFlag(owner, field, state[field]);\n        }\n    }\n}\n\n/* Pack radius and four corner booleans into Tile's otherwise-unused texoffset channel. */\nexport function roundedTileInstanceData(node) {\n    const state = node.state;\n    const cornerMask = (state.roundTopLeft ? 1 : 0)\n        + (state.roundTopRight ? 2 : 0)\n        + (state.roundBottomLeft ? 4 : 0)\n        + (state.roundBottomRight ? 8 : 0);\n    return [state.cornerRadius, cornerMask];\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { roundedTileState } from './rounded-tile-state.mjs';\n\nconst TILE_SHAPE = Symbol('evilui.tileShape');\nconst RECTANGLE_TILE_SHAPE = Object.freeze({\n    [TILE_SHAPE]: true,\n    kind: 'rectangle',\n    batchKey: 'rectangle',\n});\n\nexport function rectangleTileShape() {\n    return RECTANGLE_TILE_SHAPE;\n}\n\nexport function roundedTileShape(state = {}) {\n    return Object.freeze({\n        [TILE_SHAPE]: true,\n        kind: 'rounded',\n        batchKey: 'rounded',\n        ...roundedTileState(state, 'RoundedTileShape'),\n    });\n}\n\nexport function isTileShape(value) {\n    return value?.[TILE_SHAPE] === true;\n}\n\nexport function normaliseTileShape(value = null) {\n    if (value == null) {\n        return RECTANGLE_TILE_SHAPE;\n    }\n    if (!isTileShape(value)) {\n        throw new Error('Tile shape must be created through ui.shapes.');\n    }\n    return value;\n}\n\nexport function tileShapeState(shape) {\n    if (shape.kind !== 'rounded') {\n        return {};\n    }\n    return {\n        cornerRadius: shape.cornerRadius,\n        roundTopLeft: shape.roundTopLeft,\n        roundTopRight: shape.roundTopRight,\n        roundBottomLeft: shape.roundBottomLeft,\n        roundBottomRight: shape.roundBottomRight,\n    };\n}\n\nexport const shapes = Object.freeze({\n    rectangle: rectangleTileShape,\n    rounded: roundedTileShape,\n});\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const MAX_SCENE_LIGHTS = 4;\nconst SCREEN_CAMERA_LIGHTING_Z = -100000;\n/* HUD node Z is compositing order, so screen-space lights use a canonical surface at Z=0. */\nconst SCREEN_POINTER_LIGHT_Z = -50;\nconst SCREEN_VIEWPORT_LIGHT_Z = -10;\nconst SCREEN_PROJECTED_POINT_LIGHT_Z = -50;\n\nconst DEFAULT_AMBIENT_LIGHT = Object.freeze([0, 0, 0]);\nconst DEFAULT_LIGHTS = Object.freeze([\n    Object.freeze({\n        kind: 'directional',\n        source: 'camera',\n        /* Surface-to-light direction; normalization preserves this 0.7:0.7:1 ratio. */\n        direction: Object.freeze([-0.7, -0.7, -1]),\n        color: Object.freeze([1, 1, 1]),\n        intensity: 1.33,\n    }),\n    Object.freeze({\n        kind: 'point',\n        source: 'pointer',\n        color: Object.freeze([1, 0.97, 0.90]),\n        intensity: 0.22,\n        range: 500,\n        attenuation: 0.255,\n        z: SCREEN_POINTER_LIGHT_Z,\n    }),\n]);\n\nfunction normaliseVector(name, value, length, { nonNegative = false } = {}) {\n    if ((!Array.isArray(value) && !(value instanceof Float32Array))\n            || value.length !== length\n            || Array.from(value).some(channel => !Number.isFinite(channel)\n                || (nonNegative && channel < 0))) {\n        throw new Error(\n            `Scene lighting ${name} must contain ${length} finite${nonNegative ? ' non-negative' : ''} values; got '${value}'.`,\n        );\n    }\n    return Array.from(value, channel => Object.is(channel, -0) ? 0 : channel);\n}\n\nfunction normaliseDirection(name, value) {\n    const direction = normaliseVector(name, value, 3);\n    const length = Math.hypot(...direction);\n    if (length === 0) {\n        throw new Error(`Scene lighting ${name} must be non-zero.`);\n    }\n    return Object.freeze(direction.map(channel => channel / length));\n}\n\nfunction normaliseLight(light, index) {\n    if (!light || typeof light !== 'object') {\n        throw new Error(`Scene lighting lights[${index}] must be a light object.`);\n    }\n    if (light.kind !== 'directional' && light.kind !== 'point') {\n        throw new Error(\n            `Scene lighting lights[${index}].kind must be 'directional' or 'point'; got '${light.kind}'.`,\n        );\n    }\n    const color = Object.freeze(normaliseVector(`lights[${index}].color`, light.color ?? [1, 1, 1], 3, {\n        nonNegative: true,\n    }));\n    const intensity = light.intensity ?? 1;\n    if (!Number.isFinite(intensity) || intensity < 0) {\n        throw new Error(`Scene lighting lights[${index}].intensity must be finite and non-negative; got '${intensity}'.`);\n    }\n    if (light.kind === 'directional') {\n        const source = light.source ?? 'fixed';\n        if (source !== 'fixed' && source !== 'camera') {\n            throw new Error(`Scene lighting lights[${index}].source must be 'fixed' or 'camera' for a directional light; got '${source}'.`);\n        }\n        return Object.freeze({\n            kind: 'directional',\n            source,\n            direction: normaliseDirection(`lights[${index}].direction`, light.direction),\n            color,\n            intensity,\n        });\n    }\n    const range = light.range;\n    if (!Number.isFinite(range) || range <= 0) {\n        throw new Error(`Scene lighting lights[${index}].range must be finite and greater than zero; got '${range}'.`);\n    }\n    const source = light.source ?? 'fixed';\n    if (source !== 'fixed' && source !== 'pointer' && source !== 'viewport') {\n        throw new Error(`Scene lighting lights[${index}].source must be 'fixed', 'pointer', or 'viewport'; got '${source}'.`);\n    }\n    const position = source === 'fixed'\n        ? Object.freeze(normaliseVector(`lights[${index}].position`, light.position, 3))\n        : null;\n    const viewportPosition = source === 'viewport'\n        ? Object.freeze(normaliseVector(`lights[${index}].viewportPosition`, light.viewportPosition, 2))\n        : null;\n    const attenuation = light.attenuation;\n    if (attenuation != null && (!Number.isFinite(attenuation) || attenuation <= 0)) {\n        throw new Error(`Scene lighting lights[${index}].attenuation must be finite and greater than zero; got '${attenuation}'.`);\n    }\n    const z = light.z;\n    if (z != null && !Number.isFinite(z)) {\n        throw new Error(`Scene lighting lights[${index}].z must be finite; got '${z}'.`);\n    }\n    if (viewportPosition?.some(channel => channel < 0 || channel > 1)) {\n        throw new Error(`Scene lighting lights[${index}].viewportPosition values must be in [0, 1].`);\n    }\n    return Object.freeze({\n        kind: 'point',\n        source,\n        ...(position ? { position } : {}),\n        ...(viewportPosition ? { viewportPosition } : {}),\n        ...(attenuation != null ? { attenuation } : {}),\n        ...(z != null ? { z: Object.is(z, -0) ? 0 : z } : {}),\n        color,\n        intensity,\n        range,\n    });\n}\n\nexport function normaliseSceneLighting(value = null) {\n    const source = value ?? {\n        ambient: DEFAULT_AMBIENT_LIGHT,\n        lights: DEFAULT_LIGHTS,\n    };\n    if (!source || typeof source !== 'object') {\n        throw new Error('Scene lighting must be an object.');\n    }\n    const ambient = Object.freeze(normaliseVector('ambient', source.ambient ?? DEFAULT_AMBIENT_LIGHT, 3, {\n        nonNegative: true,\n    }));\n    const sourceLights = source.lights ?? [];\n    if (!Array.isArray(sourceLights) || sourceLights.length > MAX_SCENE_LIGHTS) {\n        throw new Error(`Scene lighting lights must contain at most ${MAX_SCENE_LIGHTS} entries.`);\n    }\n    return Object.freeze({\n        ambient,\n        lights: Object.freeze(sourceLights.map(normaliseLight)),\n    });\n}\n\nexport const DEFAULT_SCENE_LIGHTING = normaliseSceneLighting();\n\nfunction lightingSourceScene(scene) {\n    return scene?.stage?.sceneLightingSource?.(scene) ?? scene;\n}\n\nfunction usesFlatLightingDepth(scene) {\n    const camera = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    return camera?.viewMode?.() === 'screen';\n}\n\n/* Give the orthographic HUD a camera position on its declared negative-Z viewing side. */\nfunction lightingCameraWorld(scene) {\n    const camera = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    if (camera?.viewMode?.() === 'screen') {\n        const viewport = camera.getViewportSize?.() ?? [1, 1];\n        return [viewport[0] * 0.5, viewport[1] * 0.5, SCREEN_CAMERA_LIGHTING_Z];\n    }\n    return camera?.worldPosition?.() ?? [0, 0, 0];\n}\n\nfunction pointerLightPosition(light, scene) {\n    const camera = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const pointer = camera?.getMouseWorldPosition?.() ?? camera?.getWorldCameraCenter?.() ?? [0, 0, 0];\n    const cameraWorld = camera?.worldPosition?.() ?? [0, 0, 0];\n    const z = camera?.viewMode?.() === 'screen'\n        ? (light.z ?? SCREEN_POINTER_LIGHT_Z)\n        : (cameraWorld[2] ?? 0);\n    return [pointer[0] ?? 0, pointer[1] ?? 0, z];\n}\n\n/* Resolve a normalized screen anchor into the presentation camera's current world plane. */\nfunction viewportLightPosition(light, scene) {\n    const camera = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const [x, y] = light.viewportPosition;\n    const cameraWorld = camera?.worldPosition?.() ?? [0, 0, 0];\n    const viewport = camera?.getViewportSize?.() ?? [1, 1];\n    if (camera?.viewMode?.() === 'screen') {\n        return [x * viewport[0], y * viewport[1], light.z ?? SCREEN_VIEWPORT_LIGHT_Z];\n    }\n    const bounds = camera?.vpBounds;\n    if (bounds && Number.isFinite(bounds.minX) && Number.isFinite(bounds.minY)\n            && Number.isFinite(bounds.width) && Number.isFinite(bounds.height)) {\n        return [\n            bounds.minX + x * bounds.width,\n            bounds.minY + y * bounds.height,\n            cameraWorld[2] ?? 0,\n        ];\n    }\n    return [\n        (cameraWorld[0] ?? 0) + (x - 0.5) * viewport[0],\n        (cameraWorld[1] ?? 0) + (y - 0.5) * viewport[1],\n        cameraWorld[2] ?? 0,\n    ];\n}\n\nfunction pointLightPosition(light, sourceScene, targetScene) {\n    if (light.source === 'pointer') {\n        return pointerLightPosition(light, targetScene);\n    }\n    if (light.source === 'viewport') {\n        return viewportLightPosition(light, targetScene);\n    }\n    if (sourceScene !== targetScene && targetScene?.stage?.hudScene === targetScene) {\n        const projected = targetScene.stage.projectSceneWorldPointToHud?.(sourceScene, light.position);\n        if (projected) {\n            return usesFlatLightingDepth(targetScene)\n                ? [projected[0], projected[1], light.z ?? SCREEN_PROJECTED_POINT_LIGHT_Z]\n                : projected;\n        }\n    }\n    return light.position;\n}\n\n/* Viewport-light ranges are CSS-pixel values and scale with the world camera. */\nfunction pointLightRange(light, targetScene) {\n    if (light.source !== 'viewport') {\n        return light.range;\n    }\n    const camera = targetScene?.presentationCamera?.() ?? targetScene?.camera ?? null;\n    if (camera?.viewMode?.() === 'screen') {\n        return light.range;\n    }\n    const bounds = camera?.vpBounds;\n    const viewport = camera?.getViewportSize?.() ?? [1, 1];\n    if (bounds && Number.isFinite(bounds.width) && Number.isFinite(bounds.height)) {\n        const scaleX = bounds.width / Math.max(1, viewport[0]);\n        const scaleY = bounds.height / Math.max(1, viewport[1]);\n        return light.range * Math.max(scaleX, scaleY);\n    }\n    return light.range;\n}\n\nfunction directionalLightDirection(light, sourceScene, targetScene) {\n    if (light.source === 'camera') {\n        const camera = targetScene?.presentationCamera?.() ?? targetScene?.camera ?? null;\n        const matrix = camera?.localToWorld?.() ?? null;\n        if (!matrix) {\n            return light.direction;\n        }\n        const [x, y, z] = light.direction;\n        return normaliseDirection('camera-relative direction', [\n            matrix[0] * x + matrix[4] * y + matrix[8] * z,\n            matrix[1] * x + matrix[5] * y + matrix[9] * z,\n            matrix[2] * x + matrix[6] * y + matrix[10] * z,\n        ]);\n    }\n    if (sourceScene !== targetScene && targetScene?.stage?.hudScene === targetScene) {\n        return targetScene.stage.projectSceneWorldDirectionToHud?.(sourceScene, light.direction)\n            ?? light.direction;\n    }\n    return light.direction;\n}\n\n/* Project one strict scene-light record into fixed-capacity WebGL uniform arrays. */\nexport function sceneLightUniformState(scene) {\n    const sourceScene = lightingSourceScene(scene);\n    const lighting = sourceScene?.lighting ?? DEFAULT_SCENE_LIGHTING;\n    const kinds = new Int32Array(MAX_SCENE_LIGHTS);\n    const positions = new Float32Array(MAX_SCENE_LIGHTS * 3);\n    const directions = new Float32Array(MAX_SCENE_LIGHTS * 3);\n    const colors = new Float32Array(MAX_SCENE_LIGHTS * 3);\n    const intensities = new Float32Array(MAX_SCENE_LIGHTS);\n    const ranges = new Float32Array(MAX_SCENE_LIGHTS);\n    const attenuations = new Float32Array(MAX_SCENE_LIGHTS);\n    const flatLightingDepth = usesFlatLightingDepth(scene);\n\n    for (let i = 0; i < lighting.lights.length; i += 1) {\n        const light = lighting.lights[i];\n        kinds[i] = light.kind === 'point' ? 1 : 0;\n        const offset = i * 3;\n        if (light.kind === 'point') {\n            positions.set(pointLightPosition(light, sourceScene, scene), offset);\n            ranges[i] = pointLightRange(light, scene);\n            attenuations[i] = light.attenuation ?? (flatLightingDepth ? 1 : 2);\n        } else {\n            directions.set(directionalLightDirection(light, sourceScene, scene), offset);\n        }\n        colors.set(light.color, offset);\n        intensities[i] = light.intensity;\n    }\n\n    return {\n        u_cameraWorld: lightingCameraWorld(scene),\n        u_flattenLightingDepth: flatLightingDepth ? 1 : 0,\n        u_ambientLight: lighting.ambient,\n        u_lightCount: lighting.lights.length,\n        u_lightKind: kinds,\n        u_lightPosition: positions,\n        u_lightDirection: directions,\n        u_lightColor: colors,\n        u_lightIntensity: intensities,\n        u_lightRange: ranges,\n        u_lightAttenuation: attenuations,\n    };\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from './base.mjs';\nimport { TEXTURES_URL } from '../config.mjs';\nimport { gpuDiagNoteTileSync, gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo, drawArraysInstancedChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty, resourceDirtyKinds } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { normaliseTileMaterial } from './tile-material.mjs';\nimport { normaliseTileShape, tileShapeState } from './tile-shape.mjs';\nimport { roundedTileInstanceData, validateRoundedTileMutation } from './rounded-tile-state.mjs';\nimport { sceneLightUniformState } from './scene-lighting.mjs';\n\n\nconst tl = [-1, -1, 0];\nconst tr = [+1, -1, 0];\nconst bl = [-1, +1, 0];\nconst br = [+1, +1, 0];\n\nconst mesh = new Float32Array([].concat(\n    tl, tr, bl,\n    tr, br, bl\n));\n\nconst STATIC_BASE_UVS = new Float32Array([\n    0, 0,  // TL\n    1, 0,  // TR\n    0, 1,  // BL\n    1, 0,  // TR\n    1, 1,  // BR\n    0, 1   // BL\n]);\n\nconst TILE_FULL_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n]);\n\nconst TILE_INSTANCE_BUFFER_KINDS = Object.freeze([\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\nconst TILE_PACKED_INSTANCE_LAYOUT = Object.freeze({\n    resolution: 0,\n    color: 2,\n    texoffset: 6,\n    spin: 8,\n    floats: 10,\n});\nconst TILE_PACKED_INSTANCE_STRIDE_BYTES = TILE_PACKED_INSTANCE_LAYOUT.floats * Float32Array.BYTES_PER_ELEMENT;\n\nexport const TILE_OUTLINE_WIDTH = 1;\nconst TILE_OUTLINE_Z = -0.01;\nconst TILE_OUTLINE_ALIGNMENTS = new Set(['inner', 'center', 'outer']);\n\nconst FROSTED_INSTANCE_DATA_STRIDE = 256;\nconst ROUNDED_OUTLINE_DATA_STRIDE = 1024;\n\nfunction tileRenderProfile(shared) {\n    return {\n        material: normaliseTileMaterial(shared?.batchDescriptor?.material ?? null),\n        outlineMaterial: normaliseTileMaterial(shared?.batchDescriptor?.outlineMaterial ?? null),\n        shape: normaliseTileShape(shared?.batchDescriptor?.shape ?? null),\n    };\n}\n\nfunction assertOutlineMaterialSupported(material, outlineMaterial, shape) {\n    if (outlineMaterial.kind === 'frostedGlass') {\n        throw new Error('Tile outlineMaterial does not support frosted glass.');\n    }\n    if (outlineMaterial.kind === 'linearGradient' && material.kind === 'frostedGlass') {\n        throw new Error('Tile linear-gradient outlineMaterial cannot currently be combined with frosted glass.');\n    }\n    if (outlineMaterial.kind === 'lit' || outlineMaterial.kind === 'beveled') {\n        throw new Error('Tile outlineMaterial does not support lit or beveled materials.');\n    }\n    if (material.kind === 'beveled' && shape.kind !== 'rectangle') {\n        throw new Error('BeveledMaterial currently supports rectangular Tile shapes only.');\n    }\n}\n\nfunction tileMaterialPass(material, outlineMaterial) {\n    return material.pass === 'transparent' || outlineMaterial.pass === 'transparent'\n        ? 'transparent'\n        : 'opaque';\n}\n\nfunction tileProgramSpec(shared) {\n    const { material, outlineMaterial, shape } = tileRenderProfile(shared);\n    if (material.kind === 'beveled') {\n        return {\n            cacheKey: 'gl_program.beveled_tile',\n            fragmentShader: 'lib/evilui/beveled-tile',\n            label: 'BeveledMaterial',\n        };\n    }\n    if (material.kind === 'lit') {\n        return {\n            cacheKey: 'gl_program.lit_tile',\n            fragmentShader: 'lib/evilui/lit-tile',\n            label: 'LitMaterial',\n        };\n    }\n    if (material.kind === 'frostedGlass') {\n        return {\n            cacheKey: 'gl_program.frosted_glass_tile',\n            fragmentShader: 'lib/evilui/frosted-glass-tile',\n            label: 'FrostedGlassMaterial',\n        };\n    }\n    if (material.kind === 'linearGradient' || outlineMaterial.kind === 'linearGradient') {\n        return {\n            cacheKey: 'gl_program.linear_gradient_tile',\n            fragmentShader: 'lib/evilui/linear-gradient-tile',\n            label: 'LinearGradientMaterial',\n        };\n    }\n    if (shape.kind === 'rounded') {\n        return {\n            cacheKey: 'gl_program.shader_rounded_tile',\n            fragmentShader: 'lib/evilui/shader-rounded-tile',\n            label: 'RoundedTile',\n        };\n    }\n    return {\n        cacheKey: 'gl_program.tile',\n        fragmentShader: 'lib/evilui/solid',\n        label: 'Tile',\n    };\n}\n\nexport function tileSurfaceInstanceData(node) {\n    const material = node.material ?? normaliseTileMaterial(node.state?.material ?? null);\n    const shape = node.shape ?? normaliseTileShape(node.state?.shape ?? null);\n    const [cornerRadius, cornerMask] = shape.kind === 'rounded'\n        ? roundedTileInstanceData(node)\n        : [0, 0];\n    if (material.kind !== 'frostedGlass') {\n        return [cornerRadius, cornerMask];\n    }\n    const encodedBlurLod = material.blurLod === null ? 0 : material.blurLod + 1;\n    return [cornerRadius, cornerMask * FROSTED_INSTANCE_DATA_STRIDE + encodedBlurLod];\n}\n\n/* Replace outline strips with one analytic ring instance. */\nfunction analyticTileOutlineRects(node, cornerRadius, cornerMask, dataStride) {\n    if (node?.state?.outlineEnabled !== true) {\n        return [];\n    }\n    const width = Math.max(0, node.state.width);\n    const height = Math.max(0, node.state.height);\n    const outsideFraction = node.state.outlineAlignment === 'inner'\n        ? 0\n        : node.state.outlineAlignment === 'center' ? 0.5 : 1;\n    const outlineWidth = tileOutlineWidth(node);\n    const expansion = outlineWidth * outsideFraction;\n    const outerRadius = cornerRadius > 0 ? cornerRadius + expansion : 0;\n    const origin = expansion === 0 ? 0 : -expansion;\n    return [{\n        x: origin,\n        y: origin,\n        width: width + expansion * 2,\n        height: height + expansion * 2,\n        texoffset: [-(outerRadius + 1), cornerMask * dataStride + outlineWidth],\n    }];\n}\n\nexport function roundedTileOutlineRects(node, dataStride = ROUNDED_OUTLINE_DATA_STRIDE) {\n    const [cornerRadius, cornerMask] = roundedTileInstanceData(node);\n    return analyticTileOutlineRects(node, cornerRadius, cornerMask, dataStride);\n}\n\nexport function rectangularTileOutlineRingRects(node, dataStride = ROUNDED_OUTLINE_DATA_STRIDE) {\n    return analyticTileOutlineRects(node, 0, 0, dataStride);\n}\n\nfunction frostedOutlineRects(node) {\n    const shape = node.shape ?? normaliseTileShape(node.state?.shape ?? null);\n    if (shape.kind === 'rounded') {\n        return roundedTileOutlineRects(node, FROSTED_INSTANCE_DATA_STRIDE);\n    }\n    return tileOutlineRects(node).map(rect => ({\n        ...rect,\n        texoffset: [-1, -1],\n    }));\n}\n\nfunction gradientOutlineRects(node) {\n    const shape = node.shape ?? normaliseTileShape(node.state?.shape ?? null);\n    return shape.kind === 'rounded'\n        ? roundedTileOutlineRects(node)\n        : rectangularTileOutlineRingRects(node);\n}\n\nfunction tileBufferOptions(shared) {\n    const { material, shape } = tileRenderProfile(shared);\n    return {\n        texoffsetOfNode: tileSurfaceInstanceData,\n        outlineRectsOfNode: material.kind === 'frostedGlass'\n            ? frostedOutlineRects\n            : material.kind === 'linearGradient' || material.kind === 'lit' || material.kind === 'beveled'\n                ? gradientOutlineRects\n            : shape.kind === 'rounded' ? roundedTileOutlineRects : tileOutlineRects,\n    };\n}\nfunction gradientMaterialUniformState(material, outlineMaterial) {\n    const uniforms = {\n        u_surfaceUsesGradient: material.kind === 'linearGradient' ? 1 : 0,\n        u_outlineUsesGradient: outlineMaterial.kind === 'linearGradient' ? 1 : 0,\n    };\n    if (material.kind === 'linearGradient') {\n        Object.assign(uniforms, {\n            u_surfaceStopCount: material.stopCount,\n            u_surfaceStopColors: material.colors,\n            u_surfaceStopOffsets: material.offsets,\n            u_surfaceGradientStart: material.start,\n            u_surfaceGradientEnd: material.end,\n        });\n    }\n    if (outlineMaterial.kind === 'linearGradient') {\n        Object.assign(uniforms, {\n            u_outlineStopCount: outlineMaterial.stopCount,\n            u_outlineStopColors: outlineMaterial.colors,\n            u_outlineStopOffsets: outlineMaterial.offsets,\n            u_outlineGradientStart: outlineMaterial.start,\n            u_outlineGradientEnd: outlineMaterial.end,\n        });\n    }\n    return uniforms;\n}\n\nfunction litMaterialUniformState(material) {\n    if (material.kind !== 'lit' && material.kind !== 'beveled') {\n        return {};\n    }\n    const uniforms = {\n        u_diffuseStrength: material.diffuseStrength,\n        u_specularStrength: material.specularStrength,\n        u_shininess: material.shininess,\n        u_fresnelF0: material.fresnelF0,\n    };\n    if (material.kind === 'beveled') {\n        Object.assign(uniforms, {\n            u_bevelWidth: material.bevelWidth,\n            u_bevelMargin: material.bevelMargin,\n            u_bevelMaxTilt: material.maxTilt,\n            u_bevelInner: material.bevelType === 'inner' ? 1 : 0,\n            u_normalGridXAngles: material.normalGrid.xAngles,\n            u_normalGridYAngles: material.normalGrid.yAngles,\n        });\n    }\n    return uniforms;\n}\n\nfunction assertTileOutlineAlignment(value) {\n    if (!TILE_OUTLINE_ALIGNMENTS.has(value)) {\n        throw new Error(\n            `Tile outlineAlignment must be 'inner', 'center', or 'outer'; got '${value}'.`,\n        );\n    }\n}\n\nfunction assertTileOutlineWidth(value) {\n    if (!Number.isFinite(value) || value < 0 || value > 255) {\n        throw new Error(\n            `Tile outlineWidth must be a finite number from 0 through 255; got '${value}'.`,\n        );\n    }\n}\n\nfunction tileOutlineWidth(node) {\n    const value = node?.state?.outlineWidth ?? TILE_OUTLINE_WIDTH;\n    assertTileOutlineWidth(value);\n    return value;\n}\n\nfunction hashFloat32Array(data) {\n    if (!(data instanceof Float32Array)) {\n        return 'none';\n    }\n    const bits = new Uint32Array(data.buffer, data.byteOffset, data.length);\n    let h = 2166136261 >>> 0;\n    for (let i = 0; i < bits.length; i++) {\n        h ^= bits[i];\n        h = Math.imul(h, 16777619) >>> 0;\n    }\n    return `${data.length}:${h}`;\n}\n\n/* Resolve the shared anchor pose for one tile batch so scope motion can stay uniform-driven. */\nexport function tileScopeMatrix(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    const matrix = node?.anchorNode?.anchorToRoot ?? null;\n    return matrix ? new Float32Array(matrix) : new Float32Array(twgl.m4.identity());\n}\n\n/* Resolve the shared anchor scope owner so draw-time presentation motion can hang off one uniform payload. */\nfunction tileScopeNode(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    return node?.anchorNode ?? null;\n}\n\n/* Resolve one tile's local pose within the active anchor scope, falling back to the legacy world pose during migration. */\nfunction tileLocalMatrix(node, scene) {\n    const pose = node._batchPose?.(scene) ?? null;\n    return pose?.localToAnchor ?? node.localToAnchor ?? node._worldMatrixForBatch?.(scene) ?? null;\n}\n\n/* Derive one shared clip uniform payload for a tile batch from the authoritative clip-chain model. */\nfunction tileClipUniformState(shared, nodes = shared.nodes) {\n    return ui.batchClipUniformState(nodes, shared.scene, `Tile(${shared.resourceKey})`);\n}\n\n/* Keep every tile-derived renderer on the same anchor, presentation, and clip uniforms as tile-anchor.vs.glsl. */\nexport function tileDrawUniformState(shared, label = `Tile(${shared.resourceKey})`, nodes = shared.nodes) {\n    return {\n        u_anchorMatrix: tileScopeMatrix(shared, nodes),\n        ...ui.presentationOffsetUniformState(tileScopeNode(shared, nodes), shared.scene, label),\n        ...tileClipUniformState(shared, nodes),\n    };\n}\n\nfunction setBufferData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n}\n\n/* Update an existing instance buffer in place when batch shape is unchanged. */\nfunction setBufferSubData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n}\n\nfunction perfBuildEnabled() {\n    return typeof __PORTAL_PERF_BUILD__ !== 'undefined' && __PORTAL_PERF_BUILD__;\n}\n\nfunction tileInstancePropagation(diag = null) {\n    return diag?.instance_propagation ?? null;\n}\n\nfunction isTransformStateKey(key) {\n    return key === 'x' || key === 'y' || key === 'z' || key === 'localToParent';\n}\n\n/* Accept the cheap path only when movement changes transforms or clip state, not style or geometry. */\nfunction isTransformOnlyTileDirty(kinds, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (list.length === 0) {\n        return false;\n    }\n    for (const kind of list) {\n        if (kind === DIRTY.transform) {\n            continue;\n        }\n        if (kind !== DIRTY.instance) {\n            return false;\n        }\n    }\n    if (!list.includes(DIRTY.instance)) {\n        return true;\n    }\n    const reasons = tileInstancePropagation(diag)?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.every(reason => reason === 'ancestor' || reason === 'transform' || reason === 'clip_rect');\n}\n\nfunction markTileSharedDirty(shared, kinds, source = null, diag = null) {\n    markResourceDirty(shared, kinds, source);\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    const transformOnly = isTransformOnlyTileDirty(list, diag);\n    shared.pendingTransformOnly = shared.pendingTransformOnly == null\n        ? transformOnly\n        : shared.pendingTransformOnly && transformOnly;\n}\n\nfunction effectiveTileColor(node) {\n    if (!node) {\n        return null;\n    }\n    const color = node.color ?? node.state?.color ?? null;\n    if (!color) {\n        return null;\n    }\n    const alpha = (color[3] ?? 1.0) * (node.computedOpacity ?? 1.0);\n    return [color[0], color[1], color[2], alpha];\n}\n\nfunction effectiveTileOutlineColor(node) {\n    const color = node?.state?.outlineColor ?? null;\n    if (!color || color.length < 4) {\n        return null;\n    }\n    return [color[0], color[1], color[2], color[3] * (node.computedOpacity ?? 1.0)];\n}\n\n/* Describe four configurable-width strips without adding retained scene nodes. */\nfunction tileOutlineRects(node) {\n    if (node?.state?.outlineEnabled !== true) {\n        return [];\n    }\n    const width = Math.max(0, node.state.width);\n    const height = Math.max(0, node.state.height);\n    const alignment = node.state.outlineAlignment;\n    const outlineWidth = tileOutlineWidth(node);\n    const outsideFraction = alignment === 'inner' ? 0 : alignment === 'center' ? 0.5 : 1;\n    const horizontalThickness = alignment === 'inner'\n        ? Math.min(outlineWidth, height)\n        : outlineWidth;\n    const verticalThickness = alignment === 'inner'\n        ? Math.min(outlineWidth, width)\n        : outlineWidth;\n    const horizontalOutside = horizontalThickness * outsideFraction;\n    const verticalOutside = verticalThickness * outsideFraction;\n    const horizontalInside = horizontalThickness - horizontalOutside;\n    const verticalInside = verticalThickness - verticalOutside;\n    const sideHeight = Math.max(0, height - 2 * horizontalInside);\n    const rects = [\n        {\n            x: -verticalOutside,\n            y: -horizontalOutside,\n            width: width + 2 * verticalOutside,\n            height: horizontalThickness,\n        },\n        {\n            x: -verticalOutside,\n            y: height - horizontalInside,\n            width: width + 2 * verticalOutside,\n            height: horizontalThickness,\n        },\n    ];\n    if (sideHeight > 0) {\n        rects.push(\n            { x: -verticalOutside, y: horizontalInside, width: verticalThickness, height: sideHeight },\n            { x: width - verticalInside, y: horizontalInside, width: verticalThickness, height: sideHeight },\n        );\n    }\n    return rects.filter(rect => rect.width > 0 && rect.height > 0);\n}\n\nfunction tileOutlineMatrix(tileMatrix, rect) {\n    return twgl.m4.multiply(tileMatrix, twgl.m4.translation([rect.x, rect.y, TILE_OUTLINE_Z]));\n}\n\nfunction classifyTileDirtyKinds(prevState, newState) {\n    const kinds = new Set();\n    for (const key of Object.keys(newState)) {\n        if (prevState[key] === newState[key]) {\n            continue;\n        }\n        if (isTransformStateKey(key)) {\n            kinds.add(DIRTY.transform);\n            continue;\n        }\n        if (key === 'width' || key === 'height') {\n            kinds.add(DIRTY.layout);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        if (key === 'color' || key === 'outlineEnabled' || key === 'outlineColor' || key === 'outlineAlignment' || key === 'outlineWidth') {\n            kinds.add(DIRTY.style);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        if (key === 'visible') {\n            kinds.add(DIRTY.visibility);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        kinds.add(DIRTY.content);\n        kinds.add(DIRTY.instance);\n    }\n    return Array.from(kinds);\n}\n\n/* Pack non-matrix per-instance tile attributes into one shared float stream. */\nfunction setPackedTileInstanceData(instanceData, instanceCount, node, color, texoffset) {\n    const base = instanceCount * TILE_PACKED_INSTANCE_LAYOUT.floats;\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.resolution] = node.state.width;\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.resolution + 1] = node.state.height;\n    instanceData.set(color, base + TILE_PACKED_INSTANCE_LAYOUT.color);\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.texoffset] = texoffset[0] ?? 0;\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.texoffset + 1] = texoffset[1] ?? 0;\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.spin] = node.state.gpu_spin_start_s ?? 0;\n    instanceData[base + TILE_PACKED_INSTANCE_LAYOUT.spin + 1] = node.state.gpu_spin_period_s ?? 0;\n}\n\nfunction buildTileArrays(shared, {\n    nodes = shared.nodes,\n    positionData = mesh,\n    baseuvsData = STATIC_BASE_UVS,\n    texoffsetOfNode = null,\n    outlineRectsOfNode = tileOutlineRects,\n} = {}) {\n    const capacity = nodes.reduce(\n        (total, node) => total + 1 + (node?.state?.outlineEnabled === true ? 4 : 0),\n        0,\n    );\n\n    const instanceMatrices = new Float32Array(capacity * 16);\n    const packedInstanceData = new Float32Array(capacity * TILE_PACKED_INSTANCE_LAYOUT.floats);\n    let instanceCount = 0;\n    for (let i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n        \n        if (!node || !node.computedVisible ) {\n            continue;\n        }\n        const color = effectiveTileColor(node);\n        if (!color || color.length < 4) {\n            console.warn('buildTileArrays: skipping tile node with invalid color.', {\n                resourceKey: shared.resourceKey,\n                node,\n                color,\n            });\n            continue;\n        }\n        const localMatrix = tileLocalMatrix(node, shared.scene);\n        \n        if (!localMatrix) {\n            continue;\n        }\n\n        const texoffset = texoffsetOfNode ? texoffsetOfNode(node) : [0, 0];\n        if (color[3] !== 0) {\n            instanceMatrices.set(localMatrix, instanceCount * 16);\n            setPackedTileInstanceData(packedInstanceData, instanceCount, node, color, texoffset);\n            instanceCount++;\n        }\n\n        const outlineColor = node.state.outlineEnabled === true\n            ? effectiveTileOutlineColor(node)\n            : null;\n        if (!outlineColor || outlineColor[3] === 0) {\n            continue;\n        }\n        for (const rect of outlineRectsOfNode(node)) {\n            instanceMatrices.set(tileOutlineMatrix(localMatrix, rect), instanceCount * 16);\n            setPackedTileInstanceData(packedInstanceData, instanceCount, {\n                state: { width: rect.width, height: rect.height },\n            }, outlineColor, rect.texoffset ?? texoffset);\n            instanceCount++;\n        }\n    }\n\n    return {\n        position: {\n            numComponents: 3,\n            data: positionData,\n        },\n        matrix: {\n            numComponents: 16,\n            data: instanceMatrices.subarray(0, instanceCount * 16),\n            divisor: 1,\n        },\n        packedInstance: {\n            data: packedInstanceData.subarray(0, instanceCount * TILE_PACKED_INSTANCE_LAYOUT.floats),\n        },\n        baseuvs: {\n            numComponents: 2,\n            data: baseuvsData,\n        },\n        instanceCount,\n    };\n}\n\n/* Build only the per-instance transform data for pure movement churn. */\nfunction buildTileTransformArrays(shared, {\n    nodes = shared.nodes,\n    outlineRectsOfNode = tileOutlineRects,\n} = {}) {\n    const capacity = nodes.reduce(\n        (total, node) => total + 1 + (node?.state?.outlineEnabled === true ? 4 : 0),\n        0,\n    );\n    const instanceMatrices = new Float32Array(capacity * 16);\n\n    let instanceCount = 0;\n    for (let i = 0; i < nodes.length; i++) {\n        const node = nodes[i];\n        if (!node || !node.computedVisible) {\n            continue;\n        }\n        const color = effectiveTileColor(node);\n        if (!color || color.length < 4) {\n            continue;\n        }\n        const localMatrix = tileLocalMatrix(node, shared.scene);\n        if (!localMatrix) {\n            continue;\n        }\n        if (color[3] !== 0) {\n            instanceMatrices.set(localMatrix, instanceCount * 16);\n            instanceCount++;\n        }\n        const outlineColor = node.state.outlineEnabled === true\n            ? effectiveTileOutlineColor(node)\n            : null;\n        if (!outlineColor || outlineColor[3] === 0) {\n            continue;\n        }\n        for (const rect of outlineRectsOfNode(node)) {\n            instanceMatrices.set(tileOutlineMatrix(localMatrix, rect), instanceCount * 16);\n            instanceCount++;\n        }\n    }\n\n    return {\n        matrix: {\n            numComponents: 16,\n            data: instanceMatrices.subarray(0, instanceCount * 16),\n            divisor: 1,\n        },\n        instanceCount,\n    };\n}\n\nfunction presentedTileNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes;\n    }\n    return shared.nodes.filter(node => scene._isPresentedNode(node));\n}\n\n/* Describe the shared packed instance buffer for TWGL while keeping one GL upload stream. */\nfunction packedTileInstanceAttribs(gl, ownGlPackedInstanceBuffer) {\n    return {\n        resolution: {\n            buffer: ownGlPackedInstanceBuffer,\n            type: gl.FLOAT,\n            numComponents: 2,\n            stride: TILE_PACKED_INSTANCE_STRIDE_BYTES,\n            offset: TILE_PACKED_INSTANCE_LAYOUT.resolution * Float32Array.BYTES_PER_ELEMENT,\n            divisor: 1,\n        },\n        color: {\n            buffer: ownGlPackedInstanceBuffer,\n            type: gl.FLOAT,\n            numComponents: 4,\n            stride: TILE_PACKED_INSTANCE_STRIDE_BYTES,\n            offset: TILE_PACKED_INSTANCE_LAYOUT.color * Float32Array.BYTES_PER_ELEMENT,\n            divisor: 1,\n        },\n        texoffset: {\n            buffer: ownGlPackedInstanceBuffer,\n            type: gl.FLOAT,\n            numComponents: 2,\n            stride: TILE_PACKED_INSTANCE_STRIDE_BYTES,\n            offset: TILE_PACKED_INSTANCE_LAYOUT.texoffset * Float32Array.BYTES_PER_ELEMENT,\n            divisor: 1,\n        },\n        spin: {\n            buffer: ownGlPackedInstanceBuffer,\n            type: gl.FLOAT,\n            numComponents: 2,\n            stride: TILE_PACKED_INSTANCE_STRIDE_BYTES,\n            offset: TILE_PACKED_INSTANCE_LAYOUT.spin * Float32Array.BYTES_PER_ELEMENT,\n            divisor: 1,\n        },\n    };\n}\n\n/* Create one owned packed instance buffer so non-matrix tile attributes update in a single upload. */\nfunction makeGlPackedTileInstanceBuffer(gl, data, origin) {\n    return gpuDiagWithResourceOrigin(origin, () => {\n        const ownGlBuffer = gl.createBuffer();\n        if (!ownGlBuffer) {\n            throw new Error(`${origin}: gl.createBuffer() returned null.`);\n        }\n        gl.bindBuffer(gl.ARRAY_BUFFER, ownGlBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n        return ownGlBuffer;\n    });\n}\n\nfunction updateTileInstanceBuffers(gl, ownGlBufferInfo, arrays) {\n    setBufferData(gl, ownGlBufferInfo.attribs.matrix, arrays.matrix.data);\n    setBufferData(gl, ownGlBufferInfo.attribs.resolution, arrays.packedInstance.data);\n    ownGlBufferInfo.instanceCount = arrays.instanceCount;\n    return ownGlBufferInfo;\n}\n\n/* Keep transform-only tile sync on the cheap path so scope-only motion avoids non-transform uploads. */\nfunction updateTileTransformBuffers(gl, ownGlBufferInfo, arrays) {\n    setBufferSubData(gl, ownGlBufferInfo.attribs.matrix, arrays.matrix.data);\n    ownGlBufferInfo.instanceCount = arrays.instanceCount;\n    return ownGlBufferInfo;\n}\n\nfunction totalTileArrayBytes(arrays, names) {\n    let total = 0;\n    for (const name of names) {\n        total += arrays[name]?.data?.byteLength ?? 0;\n    }\n    return total;\n}\n\n/* Decide whether draw still needs to touch GL for this tile batch or can trust the settled empty/non-empty cache. */\nexport function needsTileBufferSync(shared) {\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    if (shared.lastPresentationRevision !== presentationRev) {\n        return true;\n    }\n    if (shared.lastDrawScopeRoot !== drawScopeRoot) {\n        return true;\n    }\n    if (hasAnyResourceDirty(shared, TILE_FULL_BUFFER_KINDS) || hasAnyResourceDirty(shared, TILE_INSTANCE_BUFFER_KINDS)) {\n        return true;\n    }\n    return !shared.ownGlBufferInfo && shared.emptyPresentedBatch !== true;\n}\n\n/* Record which tile sync mode ran so crash reports can distinguish fast-path use from rebuild churn. */\nfunction noteTileSync(shared, {\n    arrays,\n    needsFullRebuild,\n    needsInstanceUpdate,\n    transformOnly,\n    presentationChanged,\n    drawScopeChanged,\n    emptyBatch = false,\n    uploadBytes = 0,\n} = {}) {\n    gpuDiagNoteTileSync(shared?.resourceKey ?? '<unknown>', {\n        full_rebuild: !!needsFullRebuild,\n        needs_full_rebuild: !!needsFullRebuild,\n        needs_instance_update: !!needsInstanceUpdate,\n        transform_only: !needsFullRebuild && !!transformOnly,\n        empty_batch: !!emptyBatch,\n        presentation_changed: !!presentationChanged,\n        draw_scope_changed: !!drawScopeChanged,\n        pending_transform_only: shared?.pendingTransformOnly === true,\n        node_count: shared?.nodes?.length ?? 0,\n        instance_count: arrays?.instanceCount ?? 0,\n        upload_bytes: uploadBytes,\n        dirty_kinds: resourceDirtyKinds(shared),\n        propagation_reasons: tileInstancePropagation()?.reasons ?? [],\n    });\n}\n\nexport function syncTileBufferInfo(gl, shared, opts = {}) {\n    if (!needsTileBufferSync(shared)) {\n        return shared.ownGlBufferInfo;\n    }\n    const nodes = opts.nodes ?? presentedTileNodes(shared);\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    const presentationChanged = shared.lastPresentationRevision !== presentationRev;\n    const drawScopeChanged = shared.lastDrawScopeRoot !== drawScopeRoot;\n    const needsFullRebuild = drawScopeChanged || presentationChanged || !shared.ownGlBufferInfo || hasAnyResourceDirty(shared, TILE_FULL_BUFFER_KINDS);\n    const needsInstanceUpdate = needsFullRebuild || hasAnyResourceDirty(shared, TILE_INSTANCE_BUFFER_KINDS);\n    const transformOnly = !needsFullRebuild && shared.pendingTransformOnly === true;\n    if (!needsInstanceUpdate) {\n        return shared.ownGlBufferInfo;\n    }\n\n    let perfToken = null;\n    let perfStepToken = null;\n    let perfKey = null;\n    if (perfBuildEnabled()) {\n        perfKey = shared.resourceKey;\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_sync.${perfKey}`);\n        if (needsFullRebuild) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(`tile_sync_full_rebuild_count.${perfKey}`);\n        } else {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(`tile_sync_instance_update_count.${perfKey}`);\n        }\n    }\n\n    if (perfBuildEnabled()) {\n        perfStepToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_build_arrays.${perfKey}`);\n    }\n    const arrays = transformOnly\n        ? buildTileTransformArrays(shared, {\n            ...opts,\n            nodes,\n        })\n        : buildTileArrays(shared, { ...opts, nodes });\n    const scopeMatrixHash = hashFloat32Array(tileScopeMatrix(shared, nodes));\n    const scopeMatrixChanged = shared.lastScopeMatrixHash != null && shared.lastScopeMatrixHash !== scopeMatrixHash;\n    const localMatrixHash = hashFloat32Array(arrays.matrix.data);\n    const localMatrixChanged = shared.lastLocalMatrixHash != null && shared.lastLocalMatrixHash !== localMatrixHash;\n    if (perfBuildEnabled()) {\n        globalThis.__eviluiPerformanceTracker?.endTimer(`tile_build_arrays.${perfKey}`, perfStepToken);\n        globalThis.__eviluiPerformanceTracker?.incrementCounter(`tile_nodes.${perfKey}`, nodes.length);\n        globalThis.__eviluiPerformanceTracker?.incrementCounter(`tile_instances.${perfKey}`, arrays.instanceCount);\n    }\n    if (needsFullRebuild) {\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        if (arrays.instanceCount === 0) {\n            shared.ownGlBufferInfo = null;\n            shared.emptyPresentedBatch = true;\n            shared.lastPresentationRevision = presentationRev;\n            shared.lastDrawScopeRoot = drawScopeRoot;\n            shared.lastScopeMatrixHash = scopeMatrixHash;\n            shared.lastLocalMatrixHash = localMatrixHash;\n            shared.pendingTransformOnly = null;\n            noteTileSync(shared, {\n                arrays,\n                needsFullRebuild,\n                needsInstanceUpdate,\n                transformOnly,\n                presentationChanged,\n                drawScopeChanged,\n                scopeMatrixChanged,\n                emptyBatch: true,\n            });\n            if (perfBuildEnabled()) {\n                globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n            }\n            return null;\n        }\n        if (perfBuildEnabled()) {\n            perfStepToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_full_rebuild.${perfKey}`);\n        }\n        if (!arrays.position.data || !arrays.baseuvs.data) {\n            console.warn('syncTileBufferInfo: skipping tile buffer rebuild with missing static arrays.', {\n                resourceKey: shared.resourceKey,\n                positionData: arrays.position.data,\n                baseuvsData: arrays.baseuvs.data,\n            });\n            shared.ownGlBufferInfo = null;\n            shared.lastPresentationRevision = presentationRev;\n            shared.lastDrawScopeRoot = drawScopeRoot;\n            shared.lastScopeMatrixHash = scopeMatrixHash;\n            shared.lastLocalMatrixHash = localMatrixHash;\n            shared.pendingTransformOnly = null;\n            if (perfBuildEnabled()) {\n                globalThis.__eviluiPerformanceTracker?.endTimer(`tile_full_rebuild.${perfKey}`, perfStepToken);\n                globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n            }\n            return null;\n        }\n        const origin = `tile.sync_buffer_info.${shared.resourceKey}`;\n        const ownGlPackedInstanceBuffer = makeGlPackedTileInstanceBuffer(gl, arrays.packedInstance.data, origin);\n        const ownGlBufferInfo = gpuDiagWithResourceOrigin(origin, () => twgl.createBufferInfoFromArrays(gl, {\n            position: arrays.position,\n            matrix: arrays.matrix,\n            ...packedTileInstanceAttribs(gl, ownGlPackedInstanceBuffer),\n            baseuvs: arrays.baseuvs,\n        }));\n        ownGlBufferInfo.instanceCount = arrays.instanceCount;\n        shared.ownGlBufferInfo = ownGlBufferInfo;\n        shared.emptyPresentedBatch = false;\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        shared.pendingTransformOnly = null;\n        const uploadBytes = totalTileArrayBytes(arrays, ['position', 'matrix', 'packedInstance', 'baseuvs']);\n        noteTileSync(shared, {\n            arrays,\n            needsFullRebuild,\n            needsInstanceUpdate,\n            transformOnly,\n            presentationChanged,\n            drawScopeChanged,\n            scopeMatrixChanged,\n            uploadBytes,\n        });\n        if (perfBuildEnabled()) {\n            globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_recreate_events.tile');\n            globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_upload_events.tile');\n            globalThis.__eviluiPerformanceTracker?.incrementCounter(\n                'buffer_upload_bytes.tile',\n                uploadBytes,\n            );\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_full_rebuild.${perfKey}`, perfStepToken);\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n        }\n        return ownGlBufferInfo;\n    }\n\n    if (!shared.ownGlBufferInfo) {\n        if (perfBuildEnabled()) {\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n        }\n        return null;\n    }\n    if (perfBuildEnabled()) {\n        perfStepToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_instance_update.${perfKey}`);\n    }\n    if (transformOnly && shared.ownGlBufferInfo.instanceCount !== arrays.instanceCount) {\n        throw new Error(\n            `syncTileBufferInfo(${shared.resourceKey}): transform-only sync changed batch shape `\n            + `(instances ${shared.ownGlBufferInfo.instanceCount} -> ${arrays.instanceCount}).`\n        );\n    }\n    if (transformOnly && shared.lastLocalMatrixHash != null && !localMatrixChanged) {\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        noteTileSync(shared, {\n            arrays,\n            needsFullRebuild,\n            needsInstanceUpdate,\n            transformOnly,\n            presentationChanged,\n            drawScopeChanged,\n            scopeMatrixChanged,\n            uploadBytes: 0,\n        });\n        if (perfBuildEnabled()) {\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_instance_update.${perfKey}`, perfStepToken);\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n        }\n        shared.pendingTransformOnly = null;\n        return shared.ownGlBufferInfo;\n    }\n    const res = transformOnly\n        ? updateTileTransformBuffers(gl, shared.ownGlBufferInfo, arrays)\n        : updateTileInstanceBuffers(gl, shared.ownGlBufferInfo, arrays);\n    shared.emptyPresentedBatch = false;\n    shared.lastPresentationRevision = presentationRev;\n    shared.lastDrawScopeRoot = drawScopeRoot;\n    shared.lastScopeMatrixHash = scopeMatrixHash;\n    shared.lastLocalMatrixHash = localMatrixHash;\n    const uploadBytes = transformOnly\n        ? totalTileArrayBytes(arrays, ['matrix'])\n        : totalTileArrayBytes(arrays, ['matrix', 'packedInstance']);\n    noteTileSync(shared, {\n        arrays,\n        needsFullRebuild,\n        needsInstanceUpdate,\n        transformOnly,\n        presentationChanged,\n        drawScopeChanged,\n        scopeMatrixChanged,\n        uploadBytes,\n    });\n    if (perfBuildEnabled()) {\n        globalThis.__eviluiPerformanceTracker?.incrementCounter('buffer_upload_events.tile');\n        globalThis.__eviluiPerformanceTracker?.incrementCounter(\n            'buffer_upload_bytes.tile',\n            uploadBytes,\n        );\n        globalThis.__eviluiPerformanceTracker?.endTimer(`tile_instance_update.${perfKey}`, perfStepToken);\n        globalThis.__eviluiPerformanceTracker?.endTimer(`tile_sync.${perfKey}`, perfToken);\n    }\n    shared.pendingTransformOnly = null;\n    return res;\n}\n\n/**\n    Generic axis-aligned rectangular prism, suitable for use as UI\n    backgrounds for panels, frames, text boxes, etc. Suitable for displaying a\n    shader effect that doesn't need any data, and which has a (roughly) rectangular\n    outline.\n\n    Almost a \"generic quad\", except specialised to form part of the 2.5D UI, which\n    mostly falls in the xy-plane around z=0\n\n    Shaders only support the following inputs.\n\n    .. code:: glsl\n\n        uniform mat4 _worldMatrix;\n        uniform float u_time;    // Time variable, in seconds. Do not depend on the\n                                 // absolute time values, use time differences or\n                                 // time modulo a period.\n        in vec3 position;        // 3D vertex position measured in mesh units i.e. [-1, 1]\n*/\nexport class Tile extends ui.Node {\n    constructor(state = {}) {\n        const outlineAlignment = state.outlineAlignment ?? 'center';\n        const material = normaliseTileMaterial(state.material ?? null);\n        const outlineMaterial = normaliseTileMaterial(state.outlineMaterial ?? null);\n        const shape = normaliseTileShape(state.shape ?? null);\n        assertOutlineMaterialSupported(material, outlineMaterial, shape);\n        assertTileOutlineAlignment(outlineAlignment);\n        super({\n            width: state.width || 100, // wpx\n            height: state.height || 100, // wpx\n            outlineEnabled: false,\n            outlineColor: [0, 0, 0, 1],\n            outlineWidth: TILE_OUTLINE_WIDTH,\n            ...state,\n            ...tileShapeState(shape),\n            material,\n            outlineMaterial,\n            shape,\n            color: material.kind === 'frostedGlass'\n                ? [...material.tintColor, 1]\n                : material.kind === 'linearGradient' ? [1, 1, 1, 1]\n                : (state.color ?? [0.5, 0.5, 0.6, 1]),\n            outlineAlignment,\n        });\n        this.material = material;\n        this.outlineMaterial = outlineMaterial;\n        this.shape = shape;\n        this.color = this.state.color;\n        assertTileOutlineWidth(this.state.outlineWidth);\n        this.visible = true;\n        this.tileBatch = state.tileBatch || 'surface';\n    }\n\n    _resourceKey() {\n        return `${super._resourceKey()}:${this.tileBatch}:shape=${this.shape.batchKey}:material=${this.material.batchKey}:outline-material=${this.outlineMaterial.batchKey}`;\n    }\n\n    _batchDescriptor() {\n        return {\n            material: this.material,\n            outlineMaterial: this.outlineMaterial,\n            shape: this.shape,\n        };\n    }\n\n    mutate(newState) {\n        if (Object.hasOwn(newState, 'outlineAlignment')) {\n            assertTileOutlineAlignment(newState.outlineAlignment);\n        }\n        if (Object.hasOwn(newState, 'outlineWidth')) {\n            assertTileOutlineWidth(newState.outlineWidth);\n        }\n        const nextMaterial = Object.hasOwn(newState, 'material')\n            ? normaliseTileMaterial(newState.material)\n            : this.material;\n        const nextOutlineMaterial = Object.hasOwn(newState, 'outlineMaterial')\n            ? normaliseTileMaterial(newState.outlineMaterial)\n            : this.outlineMaterial;\n        const nextShape = Object.hasOwn(newState, 'shape')\n            ? normaliseTileShape(newState.shape)\n            : this.shape;\n        assertOutlineMaterialSupported(nextMaterial, nextOutlineMaterial, nextShape);\n        if (this._resources\n                && (nextMaterial.pass !== this.material.pass\n                    || nextMaterial.batchKey !== this.material.batchKey\n                    || nextOutlineMaterial.pass !== this.outlineMaterial.pass\n                    || nextOutlineMaterial.batchKey !== this.outlineMaterial.batchKey\n                    || nextShape.batchKey !== this.shape.batchKey)) {\n            throw new Error('Tile material/shape batch cannot change while attached; remount a replacement Tile.');\n        }\n        if (nextShape.kind === 'rounded') {\n            validateRoundedTileMutation(newState, 'Tile');\n        }\n\n        const patch = {\n            ...newState,\n            ...(Object.hasOwn(newState, 'shape') ? tileShapeState(nextShape) : {}),\n            material: nextMaterial,\n            outlineMaterial: nextOutlineMaterial,\n            shape: nextShape,\n        };\n        if (nextMaterial.kind === 'frostedGlass') {\n            patch.color = [...nextMaterial.tintColor, 1];\n        } else if (nextMaterial.kind === 'linearGradient') {\n            patch.color = [1, 1, 1, 1];\n        }\n\n        const prevState = this.state;\n        this.state = {\n            ...this.state,\n            ...patch,\n        };\n        this.material = nextMaterial;\n        this.outlineMaterial = nextOutlineMaterial;\n        this.shape = nextShape;\n        this.color = this.state.color;\n\n        const kinds = classifyTileDirtyKinds(prevState, this.state);\n        if (kinds.includes(DIRTY.transform)) {\n            this._markTransformDirty();\n        }\n        if (this._resources && kinds.length > 0) {\n            this._markLocalResourcesDirty({ kinds });\n        }\n    }\n\n    static _batchPassForNode(node) {\n        const material = normaliseTileMaterial(node?.material ?? node?.state?.material ?? null);\n        const outlineMaterial = normaliseTileMaterial(node?.outlineMaterial ?? node?.state?.outlineMaterial ?? null);\n        return tileMaterialPass(material, outlineMaterial);\n    }\n\n    static _batchPassForShared(shared) {\n        const { material, outlineMaterial } = tileRenderProfile(shared);\n        return tileMaterialPass(material, outlineMaterial);\n    }\n\n    static _onAttachClass(shared) {\n        shared.nodes = [];\n    }\n\n    _onAttachNode(shared) {\n        markTileSharedDirty(shared, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer], this);\n        shared.nodes.push(this);\n    }\n\n    _onDetachNode(shared) {\n        markTileSharedDirty(shared, [DIRTY.detach, DIRTY.structure, DIRTY.instance, DIRTY.buffer], this);\n        shared.nodes = shared.nodes.filter(n => n !== this);\n    }\n\n    getMesh() {\n        return mesh;\n    }\n\n    getUvs() {\n        return STATIC_BASE_UVS;\n    }\n\n    setVisibility(state){\n        if (this.visible === state) {\n            return;\n        }\n        this.visible = state;\n        this._dirtyResources({ kinds: [DIRTY.visibility, DIRTY.instance] });\n    }\n\n    isTileVisible() {\n        return this.computedVisible !== false;\n    }\n\n    static _onAcquireContext(gl, shared) {\n        const spec = tileProgramSpec(shared);\n        shared.ownGlProgram = peekContextGlProgram(gl, spec.cacheKey);\n        shared.ownGlBufferInfo = null;\n        shared.emptyPresentedBatch = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markTileSharedDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vertexShader = 'lib/evilui/tile-anchor';\n            const ownGlProgram = await getContextGlProgram(gl, spec.cacheKey, async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(`${vertexShader}.vs.glsl`, `${spec.fragmentShader}.fs.glsl`);\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                const name = shared.nodes?.[0]?.state?.name ?? shared.resourceKey ?? spec.label;\n                console.warn(`${spec.label} shader program was not acquired for ${name}.`);\n            }\n        })();  // fire-and-forget\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        shared.ownGlProgram = null;\n        shared.ownGlBufferInfo = null;\n        shared.emptyPresentedBatch = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markTileSharedDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = ui.RENDER_STATUS.LOADING\n        const spec = tileProgramSpec(shared);\n        if (!shared.ownGlProgram) {\n            return;\n        }\n        const { material, outlineMaterial } = tileRenderProfile(shared);\n\n        let perfKey = null;\n        let perfToken = null;\n        if (perfBuildEnabled()) {\n            perfKey = shared.resourceKey;\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_draw_opaque.${perfKey}`);\n        }\n\n        if (needsTileBufferSync(shared)) {\n            shared.ownGlBufferInfo = syncTileBufferInfo(gl, shared, tileBufferOptions(shared));\n            clearNonPickerResourceDirty(shared);\n            shared.pendingTransformOnly = null;\n        }\n\n        // Empty batchers are already settled. Leaving them as LOADING keeps\n        // sceneFullyRendered false forever after transient UI is removed.\n        if (!shared.ownGlBufferInfo) {\n            status.response = ui.RENDER_STATUS.READY;\n            if (perfBuildEnabled()) {\n                globalThis.__eviluiPerformanceTracker?.endTimer(`tile_draw_opaque.${perfKey}`, perfToken);\n            }\n            return;\n        }\n\n        /*\n            To bake the mesh with the node offsets, we need the GL, we can't use the \n            have a baked bufferInfo to be recycled on gl loss, this means gl loss is not\n            something we need to worry about for this case.\n            The only 2 objects that we can save in bettwen gl loss is:\n            - Shader\n            - mesh\n\n            Program can be kept in bettwen calls but not bufferinfo\n        */\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            ...gradientMaterialUniformState(material, outlineMaterial),\n            ...litMaterialUniformState(material),\n            ...(material.kind === 'lit' || material.kind === 'beveled'\n                ? sceneLightUniformState(shared.scene)\n                : {}),\n            ...tileDrawUniformState(shared),\n        });\n        let drawToken = null;\n        if (perfBuildEnabled()) {\n            drawToken = globalThis.__eviluiPerformanceTracker?.beginTimer(`tile_draw_instanced.${perfKey}`);\n        }\n        drawArraysInstancedChecked(gl, `${spec.label}(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n        if (perfBuildEnabled()) {\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_draw_instanced.${perfKey}`, drawToken);\n            globalThis.__eviluiPerformanceTracker?.endTimer(`tile_draw_opaque.${perfKey}`, perfToken);\n        }\n        status.response = ui.RENDER_STATUS.READY;\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) status.response = ui.RENDER_STATUS.LOADING;\n        const { material, outlineMaterial } = tileRenderProfile(shared);\n        if (tileMaterialPass(material, outlineMaterial) !== 'transparent') {\n            throw new Error(`Tile(${shared.resourceKey}) reached the transparent pass without a transparent material.`);\n        }\n        if (!shared.ownGlProgram) {\n            return;\n        }\n        if (needsTileBufferSync(shared)) {\n            shared.ownGlBufferInfo = syncTileBufferInfo(gl, shared, tileBufferOptions(shared));\n            clearNonPickerResourceDirty(shared);\n            shared.pendingTransformOnly = null;\n        }\n        if (!shared.ownGlBufferInfo) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n\n        const spec = tileProgramSpec(shared);\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        const materialUniforms = gradientMaterialUniformState(material, outlineMaterial);\n        if (material.kind === 'frostedGlass') {\n            const frostState = shared.scene?.stage?.frostedBackdropState();\n            if (!frostState) {\n                throw new Error('FrostedGlassMaterial requires a Stage-owned backdrop captured in the current frame.');\n            }\n            Object.assign(materialUniforms, {\n                u_backdropTexture: frostState.borGlTexture,\n                u_backdropSize: [frostState.width, frostState.height],\n                u_backdropLod: frostState.lod,\n                u_tintAmount: material.tintAmount,\n                u_noiseAmount: material.noiseAmount,\n            });\n        }\n\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            ...materialUniforms,\n            ...tileDrawUniformState(shared, `${spec.label}(${shared.resourceKey})`),\n        });\n        drawArraysInstancedChecked(\n            gl,\n            `${spec.label}(${shared.resourceKey})`,\n            shared.ownGlBufferInfo,\n            shared.ownGlBufferInfo.instanceCount,\n        );\n        if (status) status.response = ui.RENDER_STATUS.READY;\n    }\n\n\n    _markLocalResourcesDirty({ kinds = null, diag = null } = {}) {\n        if (!this._resources) {\n            return;\n        }\n        const dirtyKinds = kinds ?? [DIRTY.content, DIRTY.style, DIRTY.layout, DIRTY.transform, DIRTY.instance];\n        markTileSharedDirty(this._resources, dirtyKinds, this, diag);\n    }\n}\n\n/*\n    Iterates the shared resource and fetches all data to be baked\n    onto the shader bufferInfo, then combines static mesh of the Node Tile\n    to create the bufferInfo. Requires GL and must be baked when the\n    node becomes \"dirty\".\n*/\nexport function batchBufferInfo(gl, shared) {\n    const arrays = buildTileArrays(shared);\n    if (arrays.instanceCount === 0) {\n        return null;\n    }\n    const origin = `tile.batch_buffer_info.${shared.resourceKey ?? 'unknown'}`;\n    const ownGlPackedInstanceBuffer = makeGlPackedTileInstanceBuffer(gl, arrays.packedInstance.data, origin);\n    const ownGlBufferInfo = gpuDiagWithResourceOrigin(`tile.batch_buffer_info.${shared.resourceKey ?? 'unknown'}`, () => twgl.createBufferInfoFromArrays(gl, {\n        position: arrays.position,\n        matrix: arrays.matrix,\n        ...packedTileInstanceAttribs(gl, ownGlPackedInstanceBuffer),\n        baseuvs: arrays.baseuvs,\n    }));\n    ownGlBufferInfo.instanceCount = arrays.instanceCount;\n\n    return ownGlBufferInfo;\n}\n", "import { glyphForSymbol } from '../evilfont/font-asset.mjs';\n// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n/* Format one cell into visible text and report whether any trailing content was clipped away. */\nexport function formatCellValueLayout(value, width, style, lineLimit = null) {\n    if (value == null) return { text: \"\", clipped: false };\n\n    const font = style.font.fontData;\n    const fontSize = style.fontSize;\n    const lines = [];\n\n    const spaceWidth = glyphForSymbol(font, ' ').advance * fontSize;\n    const glyphWidth = (char) => glyphForSymbol(font, char).advance * fontSize;\n    const measureWord = (word) => {\n        let wordWidth = 0;\n        for (const char of word) {\n            wordWidth += glyphWidth(char);\n        }\n        return wordWidth;\n    };\n\n    const lineHeight = Number.isFinite(font.lineHeight) && font.lineHeight > 0\n        ? font.lineHeight * fontSize\n        : fontSize * 1.325;\n    const maxHeight = style.maxCellHeight ?? 300;\n    const maxLines = lineLimit ?? Math.floor(maxHeight / lineHeight);\n\n    /* Clip one single-line cell by character while still collapsing internal whitespace. */\n    const clipSingleLine = (logicalLine) => {\n        const text = String(logicalLine ?? '').trim();\n        let out = '';\n        let outWidth = 0;\n        let pendingSpace = false;\n        let clipped = false;\n        for (const char of text) {\n            if (/\\s/.test(char)) {\n                pendingSpace = out.length > 0;\n                continue;\n            }\n            const charWidth = glyphWidth(char);\n            const nextSpaceWidth = pendingSpace ? spaceWidth : 0;\n            if (outWidth + nextSpaceWidth + charWidth > width) {\n                clipped = true;\n                break;\n            }\n            if (pendingSpace) {\n                out += ' ';\n                outWidth += spaceWidth;\n                pendingSpace = false;\n            }\n            out += char;\n            outWidth += charWidth;\n        }\n        return { text: out, clipped };\n    };\n\n    if (maxLines === 1) {\n        const firstLogicalLine = String(value).replace(/\\r\\n/g, '\\n').split('\\n')[0] ?? '';\n        return clipSingleLine(firstLogicalLine);\n    }\n\n    const wrapLogicalLine = (logicalLine) => {\n        const words = logicalLine.trim().length === 0 ? [''] : logicalLine.trim().split(/\\s+/);\n        let currentLine = \"\";\n        let currentWidth = 0;\n\n        for (const word of words) {\n            const wordWidth = measureWord(word);\n            if (wordWidth > width) {\n                if (currentLine) {\n                    lines.push(currentLine);\n                    currentLine = \"\";\n                    currentWidth = 0;\n                }\n\n                let tempLine = \"\";\n                let tempWidth = 0;\n                for (let char of word) {\n                    const charWidth = glyphWidth(char);\n                    if (tempWidth + charWidth > width && tempLine) {\n                        lines.push(tempLine);\n                        tempLine = char;\n                        tempWidth = charWidth;\n                    } else {\n                        tempLine += char;\n                        tempWidth += charWidth;\n                    }\n                }\n                currentLine = tempLine;\n                currentWidth = tempWidth;\n                continue;\n            }\n\n            const sepWidth = currentLine ? spaceWidth : 0;\n            if (currentWidth + sepWidth + wordWidth > width) {\n                if (currentLine) lines.push(currentLine);\n                currentLine = word;\n                currentWidth = wordWidth;\n            } else {\n                currentLine = currentLine ? currentLine + \" \" + word : word;\n                currentWidth += sepWidth + wordWidth;\n            }\n        }\n\n        if (currentLine) {\n            lines.push(currentLine);\n        } else if (words.length === 1 && words[0] === '') {\n            lines.push('');\n        }\n    };\n\n    const logicalLines = String(value).replace(/\\r\\n/g, '\\n').split('\\n');\n    for (const logicalLine of logicalLines) {\n        wrapLogicalLine(logicalLine);\n    }\n\n    const clipped = lines.length > maxLines;\n    return {\n        text: lines.slice(0, maxLines).join('\\n'),\n        clipped,\n    };\n}\n\n/* Keep the public formatter surface string-only for existing callers outside TableView. */\nexport function formatCellValue(value, width, style, lineLimit = null) {\n    const layout = formatCellValueLayout(value, width, style, lineLimit);\n    return layout?.text ?? \"\";\n}\n\nexport function formatCellType(value, dataFormat) {\n\n    const parseDMY = (value) => {\n        const [day, month, year] = value.split(\"-\");\n        return new Date(`${year}-${month}-${day}`);\n    };\n\n    if (value == null) return \"\";\n    switch (dataFormat) {\n        case \"int\":\n            return parseInt(value).toString();\n        case \"float\":\n            return parseFloat(value).toFixed(2);\n        case \"currency\":\n            return `\u00A3${parseFloat(value).toFixed(2)}`;\n        case \"date\":\n            {\n                const date = new Date(parseDMY(value));\n                return date.toLocaleDateString();\n            }\n        case \"bool\":\n            return value ? \"Yes\" : \"No\";\n        case \"email\":\n            return String(value).toLowerCase();\n        case \"string\":\n            return String(value);\n        case \"cm\":\n            return `${value} cm`;\n        default:\n            return String(value);\n    }\n}\n\nexport function getAligment(width, column) {\n    //width = full text width\n    //column.alignment = \"left\" | \"center\" | \"right\"\n    //column.width = total cell width space\n    //column.x = cell starting x position\n    let xPos = column.x;\n    switch (column.alignment) {\n        case 0:\n            xPos = column.x; break;\n        case 1:\n            xPos = column.x + (column.width - width) / 2; break;\n        case 2:\n            xPos = column.x + (column.width - width); break;\n        default:\n            xPos = column.x; break;\n        \n    }\n    return xPos;\n}\n\nfunction charClass(ch) {\n    if (typeof ch !== 'string' || ch.length === 0) {\n        return 'boundary';\n    }\n    if (/\\s/.test(ch)) {\n        return 'space';\n    }\n    if (/[A-Za-z0-9_]/.test(ch)) {\n        return 'word';\n    }\n    return 'punct';\n}\n\n/* Cursor positions remain UTF-16 offsets, but motion must skip whole scalars. */\nexport function previousCodepointIndex(text, index) {\n    if (index <= 0) return 0;\n    const last = text.charCodeAt(index - 1);\n    const first = text.charCodeAt(index - 2);\n    return index - (last >= 0xdc00 && last <= 0xdfff && first >= 0xd800 && first <= 0xdbff ? 2 : 1);\n}\n\nexport function nextCodepointIndex(text, index) {\n    if (index >= text.length) return text.length;\n    return index + (text.codePointAt(index) > 0xffff ? 2 : 1);\n}\n\nexport function moveCursorByWord(text, index, dir) {\n    const value = String(text ?? '');\n    let i = Math.max(0, Math.min(index ?? 0, value.length));\n    const before = () => value.slice(previousCodepointIndex(value, i), i);\n    const after = () => value.slice(i, nextCodepointIndex(value, i));\n    if (dir === 'left') {\n        while (i > 0 && charClass(before()) === 'space') i = previousCodepointIndex(value, i);\n        const kind = charClass(before());\n        while (i > 0 && charClass(before()) === kind) i = previousCodepointIndex(value, i);\n        return i;\n    }\n    if (dir === 'right') {\n        while (i < value.length && charClass(after()) === 'space') i = nextCodepointIndex(value, i);\n        const kind = charClass(after());\n        while (i < value.length && charClass(after()) === kind) i = nextCodepointIndex(value, i);\n        return i;\n    }\n    throw new Error(`moveCursorByWord: unsupported dir '${dir}'.`);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './base.mjs';\nimport { Tile } from './tile.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as textutils from './text-utils.mjs'\n\nexport const TOOLTIP_BOUNDS = Object.freeze({\n    maxWidth: 640,\n    maxHeight: 480,\n    padding: 12,\n    edgeMargin: 12,\n});\n\nconst POPUP_MESSAGE_BOUNDS = Object.freeze({\n    // Preserve PopupMessage's historical 420x600 content box plus padding.\n    maxWidth: 432,\n    maxHeight: 612,\n    padding: 12,\n});\n\nfunction boundedDimension(value, fallback, hardLimit = fallback) {\n    if (!Number.isFinite(value) || value <= 0) {\n        return fallback;\n    }\n    return Math.min(value, hardLimit);\n}\n\nfunction measureText(font, fontSize, text) {\n    return evilfont.MSDFText.measureFromState({ font, fontSize, text });\n}\n\nfunction ellipsizeLine(font, fontSize, line, maxWidth) {\n    const ellipsis = '...';\n    if (measureText(font, fontSize, ellipsis).width > maxWidth) {\n        return '';\n    }\n    const chars = Array.from(String(line ?? ''));\n    let lo = 0;\n    let hi = chars.length;\n    while (lo < hi) {\n        const mid = Math.floor((lo + hi + 1) * 0.5);\n        const candidate = chars.slice(0, mid).join('') + ellipsis;\n        if (measureText(font, fontSize, candidate).width <= maxWidth) {\n            lo = mid;\n        } else {\n            hi = mid - 1;\n        }\n    }\n    return chars.slice(0, lo).join('').trimEnd() + ellipsis;\n}\n\n/* Fit popup text once so measurement and rendering share the same bounded contract. */\nfunction popupMessageLayout(state, {\n    wrapText = true,\n    maxWidth: optionMaxWidth = null,\n    maxHeight: optionMaxHeight = null,\n    hardBounds = POPUP_MESSAGE_BOUNDS,\n} = {}) {\n    const fontSize = state.fontSize || 20;\n    const padding = hardBounds.padding;\n    const maxWidth = boundedDimension(optionMaxWidth ?? state.maxWidth, hardBounds.maxWidth, hardBounds.maxWidth);\n    const maxHeight = boundedDimension(optionMaxHeight ?? state.maxHeight, hardBounds.maxHeight, hardBounds.maxHeight);\n    const contentWidth = Math.max(1, maxWidth - padding);\n    const contentHeight = Math.max(1, maxHeight - padding);\n    const lineHeight = Number.isFinite(state.font?.fontData?.lineHeight) && state.font.fontData.lineHeight > 0\n        ? state.font.fontData.lineHeight * fontSize\n        : fontSize * 1.325;\n    const maxLines = Math.max(1, Math.floor(contentHeight / Math.max(1, lineHeight)));\n    const inputText = String(state.text ?? '').replace(/\\r\\n/g, '\\n');\n    let text = '';\n    let clipped = false;\n\n    if (wrapText === false) {\n        const logicalLines = inputText.split('\\n');\n        const visibleLines = logicalLines.slice(0, maxLines).map((line) => {\n            if (measureText(state.font, fontSize, line).width <= contentWidth) {\n                return line;\n            }\n            clipped = true;\n            return ellipsizeLine(state.font, fontSize, line, contentWidth);\n        });\n        clipped = clipped || logicalLines.length > maxLines;\n        if (clipped && logicalLines.length > maxLines && visibleLines.length > 0) {\n            visibleLines[visibleLines.length - 1] = ellipsizeLine(\n                state.font,\n                fontSize,\n                visibleLines[visibleLines.length - 1].replace(/\\.\\.\\.$/, ''),\n                contentWidth,\n            );\n        }\n        text = visibleLines.join('\\n');\n    } else {\n        const formatted = textutils.formatCellValueLayout(\n            inputText,\n            contentWidth,\n            { font: state.font, fontSize, maxCellHeight: contentHeight },\n            maxLines,\n        );\n        text = formatted?.text ?? '';\n        clipped = formatted?.clipped === true;\n        if (clipped) {\n            const visibleLines = text.split('\\n');\n            if (visibleLines.length > 0) {\n                visibleLines[visibleLines.length - 1] = ellipsizeLine(\n                    state.font,\n                    fontSize,\n                    visibleLines[visibleLines.length - 1],\n                    contentWidth,\n                );\n                text = visibleLines.join('\\n');\n            }\n        }\n    }\n    const layout = evilfont.MSDFText.measureFromState({\n        font: state.font,\n        fontSize,\n        text,\n    });\n    return {\n        text,\n        clipped,\n        width: Math.min(maxWidth, layout.width + padding),\n        height: Math.min(maxHeight, layout.height + padding),\n    };\n}\n\nexport class PopupMessage extends Tile {\n\n    constructor(state) {\n        super({\n            color: state.color || [0.5961,0.6118,0.60781, 1.0],\n            fontColor: state.fontColor || [0.3412,0.3412,0.3412, 1.0],\n            ...state})\n        this.text = state.text;\n    }\n    PADDING = 12\n    label = null;\n    popUpMount = null;\n\n    static measureLayout(state, opts = {}) {\n        return popupMessageLayout(state, opts);\n    }\n\n    _measureLayout() {\n        return this.constructor.measureLayout(this.state, {\n            wrapText: this.state.wrapText !== false,\n        });\n    }\n\n    _onAttachNode(shared) {\n        // Format the text to fit the max popup bounds unless wrapping is\n        // explicitly disabled. Tooltips often provide their own line breaks.\n        const layout = this._measureLayout();\n        this.text = layout.text;\n        this.state.width = layout.width;\n        this.state.height = layout.height;\n\n        super._onAttachNode(shared);\n        this.rebuild();\n    }\n\n    rebuild() {\n        this.popUpMount = new ui.Placeholder({});\n        this.label = new evilfont.MSDFText({\n            font: this.state.font,\n            fontSize: this.state.fontSize || 20,\n            text: this.text,\n            x: this.PADDING * 0.5,\n            y: this.PADDING * 0.5,\n            fontColor: this.state.fontColor,\n            z: -.1\n        });\n        this.popUpMount.appendChild(this.label);\n        this.appendChild(this.popUpMount)\n        \n    }\n}\n\n/* Bounds, anchor and size are expressed in the tooltip parent's local coordinates. */\nexport function placeTooltip({ anchor, tooltipSize, bounds, offset = [0, 0], margin = TOOLTIP_BOUNDS.edgeMargin }) {\n    const values = [...anchor.slice(0, 2), tooltipSize.width, tooltipSize.height,\n        bounds.left, bounds.top, bounds.right, bounds.bottom, ...offset, margin];\n    if (!values.every(Number.isFinite)) {\n        throw new Error('placeTooltip(...): anchor, size, bounds, offset and margin must be finite.');\n    }\n    // Reduce the margin on very small viewports so the panel can still fit.\n    const marginX = Math.min(margin, Math.max(0, (bounds.right - bounds.left - tooltipSize.width) / 2));\n    const marginY = Math.min(margin, Math.max(0, (bounds.bottom - bounds.top - tooltipSize.height) / 2));\n    const minX = bounds.left + marginX;\n    const maxX = Math.max(minX, bounds.right - marginX - tooltipSize.width);\n    const minY = bounds.top + marginY;\n    const maxY = Math.max(minY, bounds.bottom - marginY - tooltipSize.height);\n    const belowY = anchor[1] + offset[1];\n    const desiredY = belowY + tooltipSize.height <= bounds.bottom - marginY\n        ? belowY : anchor[1] - offset[1] - tooltipSize.height;\n    return {\n        x: Math.max(minX, Math.min(maxX, anchor[0] + offset[0])),\n        y: Math.max(minY, Math.min(maxY, desiredY)),\n    };\n}\n\nexport class Tooltip extends PopupMessage {\n    constructor(state) {\n        super({ wrapText: true, ...state });\n        if (typeof state.viewportBounds !== 'function') {\n            throw new Error('Tooltip requires a viewportBounds provider in parent-local coordinates.');\n        }\n        this.placementAnchor = [state.x ?? 0, state.y ?? 0];\n    }\n\n    static measureLayout(state, opts = {}) {\n        return popupMessageLayout(state, {\n            wrapText: state.wrapText !== false,\n            ...opts,\n            hardBounds: TOOLTIP_BOUNDS,\n        });\n    }\n\n    /* Callers supply a bounds provider; Tooltip owns text fitting and placement.\n       The provider reads current geometry rather than retaining a screen-size snapshot. */\n    _viewportBounds() {\n        return this.state.viewportBounds();\n    }\n\n    _measureLayout() {\n        const bounds = this._viewportBounds();\n        if (!bounds) {\n            return super._measureLayout();\n        }\n        const available = (span) => {\n            const margin = Math.min(TOOLTIP_BOUNDS.edgeMargin, Math.max(0, (span - TOOLTIP_BOUNDS.padding - 1) / 2));\n            return Math.max(1, span - 2 * margin);\n        };\n        return this.constructor.measureLayout(this.state, {\n            maxWidth: Math.min(this.state.maxWidth ?? TOOLTIP_BOUNDS.maxWidth, available(bounds.right - bounds.left)),\n            maxHeight: Math.min(this.state.maxHeight ?? TOOLTIP_BOUNDS.maxHeight, available(bounds.bottom - bounds.top)),\n        });\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this._placeWithinViewport();\n    }\n\n    _placeWithinViewport() {\n        const bounds = this._viewportBounds();\n        if (!bounds) {\n            const offset = this.state.pointerOffset ?? [0, 0];\n            this.setLocalPosition(this.placementAnchor[0] + offset[0], this.placementAnchor[1] + offset[1], this.localPosition()[2]);\n            return;\n        }\n        const placement = placeTooltip({\n            anchor: this.placementAnchor,\n            tooltipSize: { width: this.state.width, height: this.state.height },\n            bounds,\n            offset: this.state.pointerOffset ?? [0, 0],\n        });\n        this.setLocalPosition(placement.x, placement.y, this.localPosition()[2]);\n    }\n\n    /* Moving plot anchors can request a fresh fit without duplicating placement rules. */\n    refreshPlacement() {\n        const layout = this._measureLayout();\n        if (this.text !== layout.text || this.state.width !== layout.width || this.state.height !== layout.height) {\n            this.text = layout.text;\n            this.state.width = layout.width;\n            this.state.height = layout.height;\n            this.removeChild(this.popUpMount);\n            this.rebuild();\n        }\n        this._placeWithinViewport();\n    }\n}\n\nexport class Toast extends PopupMessage {\n    static HOLD_SECONDS = 2.0;\n    static FADE_SECONDS = 1.5;\n\n    constructor(state) {\n        super(state)\n    }\n\n    /* Hold briefly at full opacity, then fade the whole toast subtree via the native animation path. */\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.opacity = 1.0;\n        const startS = this.scene?.stage?.frameNowS ?? null;\n        const fadeStartS = (startS ?? 0) + Toast.HOLD_SECONDS;\n        this.stopAnimation('opacity');\n        this.animateTo({\n            start_s: fadeStartS,\n            duration_s: Toast.FADE_SECONDS,\n            opacity: 0.0,\n            onFinish: ({ node }) => {\n                if (node.parentNode) {\n                    node.parentNode.removeChild(node);\n                }\n            },\n        });\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        // Toast background should render before its MSDFText children, or the\n        // later transparent tile pass will cover the text completely.\n        return Tile._drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status);\n    }\n\n    /* Toast backgrounds remain plain tile batches even though the transparent hook is stubbed out explicitly. */\n    static _batchPassForNode(_node) {\n        return 'opaque';\n    }\n\n    /* Shared toast resources stay registered with the opaque pass. */\n    static _batchPassForShared(_shared) {\n        return 'opaque';\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        return;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from './base.mjs';\nimport { sceneLightUniformState } from './scene-lighting.mjs';\nimport { deleteBufferInfo, drawBufferInfoInstancedChecked } from './gl-buffer.mjs';\nimport { gpuDiagNoteScatterplot, gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\n\nconst MARKER_STYLE_CUBE = 0;\nconst MARKER_STYLE_ROUNDED_CUBE = 1;\nconst MARKER_STYLE_SPHERE = 2;\nconst MARKER_STYLE_TUBE = 3;\nconst MARKER_STYLE_CONE = 4;\n\nconst GEOMETRYPLOT_FULL_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n]);\n\nconst GEOMETRYPLOT_INSTANCE_BUFFER_KINDS = Object.freeze([\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\nconst GEOMETRYPLOT_PICK_ID_FIRST = 0x800000;\nconst GEOMETRYPLOT_PICK_ID_LAST = 0xFFFFFF;\nconst TOOLTIP_MAX_FIELDS = 8;\nconst TOOLTIP_OFFSET_X = 132;\nconst TOOLTIP_OFFSET_Y = 88;\nconst GEOMETRYPLOT_SEGMENT_THICKNESS_SCALE = 0.46;\nconst GEOMETRYPLOT_SEGMENT_MIN_THICKNESS = 2.0;\nconst GEOMETRYPLOT_HOVER_BLINK_PERIOD_S = 0.65;\nconst GEOMETRYPLOT_HOVER_PULSE_DURATION_S = 60.0;\n\n/* Keep hover blink timing browser-stable by doing the periodic reduction in JS double precision. */\nfunction geometryPlotHoverBlink(nowS) {\n    const phase = 2.0 * Math.PI * (nowS % GEOMETRYPLOT_HOVER_BLINK_PERIOD_S) / GEOMETRYPLOT_HOVER_BLINK_PERIOD_S;\n    return 0.5 + 0.5 * Math.sin(phase);\n}\n\n/* Keep a hovered point visually highlighted after the finite pulse window ends by clamping the settled state to white. */\nfunction hoverPulseNode(node) {\n    return node?._hoverPulseOwner ?? node ?? null;\n}\n\n/* Keep a hovered point visually highlighted after the finite pulse window ends by clamping the settled state to white. */\nfunction geometryPlotHoverBlinkForNode(node, nowS) {\n    if (!node || PrimitiveShapes._hoveredEntry?.node !== node || PrimitiveShapes._hoveredPickId <= 0) {\n        return 0;\n    }\n    if (hoverPulseNode(node)?.animationState('clock_s')) {\n        return geometryPlotHoverBlink(nowS);\n    }\n    return 1;\n}\n\nexport function testingGeometryPlotHoverBlinkForNode(node, nowS) {\n    return geometryPlotHoverBlinkForNode(node, nowS);\n}\n\n/* Sum one attribute payload so GPU diagnostics can report the uploaded batch size. */\nfunction totalArrayBytes(arrays) {\n    let total = 0;\n    for (const value of Object.values(arrays ?? {})) {\n        const data = value?.data ?? value;\n        if (ArrayBuffer.isView(data)) {\n            total += data.byteLength;\n        }\n    }\n    return total;\n}\n\n/* Hash one float stream so geometry sync can separate scope motion from local instance churn. */\nfunction hashFloat32Array(data) {\n    if (!(data instanceof Float32Array)) {\n        return 'none';\n    }\n    const bits = new Uint32Array(data.buffer, data.byteOffset, data.length);\n    let h = 2166136261 >>> 0;\n    for (let i = 0; i < bits.length; i++) {\n        h ^= bits[i];\n        h = Math.imul(h, 16777619) >>> 0;\n    }\n    return `${data.length}:${h}`;\n}\n\n/* Combine scene-owned lighting with plot-specific fog distances. */\nfunction geometryPlotDrawUniforms(shared) {\n    const vpHeight = Number.isFinite(shared.scene?.presentationViewport?.state?.height)\n        ? shared.scene.presentationViewport.state.height\n        : 720;\n    return {\n        ...sceneLightUniformState(shared.scene),\n        u_fogNear: Math.max(180, vpHeight * 0.42),\n        u_fogFar: Math.max(420, vpHeight * 1.05),\n    };\n}\n\n/* Upload one whole instance attribute stream from scratch. */\nfunction setBufferData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n}\n\n/* Update one existing instance attribute stream in place when only transforms changed. */\nfunction setBufferSubData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n}\n\n/* Canonicalise one named primitive style onto the shader's compact enum. */\nfunction markerStyleCode(style) {\n    switch (style) {\n    case 'cube':\n        return MARKER_STYLE_CUBE;\n    case 'rounded-cube':\n        return MARKER_STYLE_ROUNDED_CUBE;\n    case 'sphere':\n        return MARKER_STYLE_SPHERE;\n    case 'tube':\n        return MARKER_STYLE_TUBE;\n    case 'cone':\n        return MARKER_STYLE_CONE;\n    default:\n        throw new Error(`PrimitiveShapes markerStyle '${style}' is unsupported.`);\n    }\n}\n\n/* Let primitive subclasses disable point/segment lanes while still sharing the same batching core. */\nfunction wantsRenderedLane(node, key, fallback = true) {\n    const value = node?.state?.[key];\n    return typeof value === 'boolean' ? value : fallback;\n}\n\n/* Allow one plot-level default style to be overridden per point when the renderer opts into mixed markers. */\nfunction pointMarkerStyleCode(nodeStyle, specStyle) {\n    switch (nodeStyle) {\n    case 'cube':\n    case 'rounded-cube':\n    case 'sphere':\n    case 'tube':\n    case 'cone':\n        return markerStyleCode(nodeStyle);\n    case 'mixed':\n        return markerStyleCode(specStyle ?? 'cube');\n    default:\n        throw new Error(`PrimitiveShapes markerStyle '${nodeStyle}' is unsupported.`);\n    }\n}\n\n/* Restrict the transform-only fast path to pure motion or clip propagation. */\nfunction isTransformStateKey(key) {\n    return key === 'x' || key === 'y' || key === 'z' || key === 'localToParent';\n}\n\n/* Accept the cheap path only for motion or clip propagation, not content, style, or opacity churn. */\nfunction isTransformOnlyGeometryPlotDirty(kinds, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (list.length === 0) {\n        return false;\n    }\n    for (const kind of list) {\n        if (kind === DIRTY.transform) {\n            continue;\n        }\n        if (kind !== DIRTY.instance) {\n            return false;\n        }\n    }\n    if (!list.includes(DIRTY.instance)) {\n        return true;\n    }\n    const reasons = diag?.instance_propagation?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.every(reason => reason === 'ancestor' || reason === 'transform' || reason === 'clip_rect');\n}\n\n/* Track whether pending dirtiness can stay on the transform-only upload path. */\nfunction markGeometryPlotSharedDirty(shared, kinds, source = null, diag = null) {\n    markResourceDirty(shared, kinds, source);\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    const transformOnly = isTransformOnlyGeometryPlotDirty(list, diag);\n    shared.pendingTransformOnly = shared.pendingTransformOnly == null\n        ? transformOnly\n        : shared.pendingTransformOnly && transformOnly;\n}\n\n/* Classify one generic state mutation into the resource dirtiness needed by the shared renderer. */\nfunction classifyGeometryPlotDirtyKinds(prevState, nextState) {\n    const kinds = new Set();\n    for (const key of Object.keys(nextState)) {\n        if (prevState[key] === nextState[key]) {\n            continue;\n        }\n        if (isTransformStateKey(key)) {\n            kinds.add(DIRTY.transform);\n            continue;\n        }\n        if (key === 'width' || key === 'height') {\n            kinds.add(DIRTY.layout);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        kinds.add(DIRTY.content);\n        kinds.add(DIRTY.instance);\n    }\n    return Array.from(kinds);\n}\n\n/* Filter plots to the currently presented subtree so fullscreen switches rebuild deterministically. */\nfunction presentedGeometryPlotNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes;\n    }\n    return shared.nodes.filter(node => scene._isPresentedNode(node));\n}\n\n/* Resolve the shared anchor pose so scope motion can stay uniform-driven. */\nfunction geometryPlotScopeMatrix(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    const matrix = node?.anchorNode?.anchorToRoot ?? null;\n    return matrix ? new Float32Array(matrix) : new Float32Array(twgl.m4.identity());\n}\n\n/* Resolve one plot's local pose within the active anchor scope. */\nfunction geometryPlotLocalMatrix(node, scene) {\n    const pose = node._batchPose?.(scene) ?? null;\n    return pose?.localToAnchor ?? node.localToAnchor ?? node._worldMatrixForBatch?.(scene) ?? null;\n}\n\n/* Derive one shared clip payload from the authoritative clip-chain model. */\nfunction geometryPlotClipUniformState(shared, nodes = shared.nodes) {\n    return ui.batchClipUniformState(nodes, shared.scene, `PrimitiveShapes(${shared.resourceKey})`);\n}\n\n/* Derive one segment orientation and length from two box placements. */\nfunction lineSegmentLocalMatrixAndLength(a, b) {\n    const ax = a.x + 0.5 * a.width;\n    const ay = a.y + 0.5 * a.height;\n    const az = a.z + 0.5 * a.depth;\n    const bx = b.x + 0.5 * b.width;\n    const by = b.y + 0.5 * b.height;\n    const bz = b.z + 0.5 * b.depth;\n    const dx = bx - ax;\n    const dy = by - ay;\n    const dz = bz - az;\n    const len = Math.hypot(dx, dy, dz);\n    const mid = [0.5 * (ax + bx), 0.5 * (ay + by), 0.5 * (az + bz)];\n    let localMatrix = twgl.m4.translation(mid);\n    if (!(len > 0)) {\n        return { localMatrix, length: 0 };\n    }\n    const invLen = 1.0 / len;\n    const ux = dx * invLen;\n    const uy = dy * invLen;\n    const uz = dz * invLen;\n    const dot = Math.max(-1.0, Math.min(1.0, ux));\n    if (dot < 0.999999) {\n        if (dot <= -0.999999) {\n            localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(Math.PI));\n        } else {\n            const axis = twgl.v3.normalize([0, -uz, uy]);\n            const angle = Math.acos(dot);\n            localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.axisRotation(axis, angle));\n        }\n    }\n    return { localMatrix, length: len };\n}\n\n/* Project one point detail list into the shared hover tooltip text contract. */\nfunction tooltipTextForPoint(spec) {\n    const lines = [];\n    for (const detail of spec.details ?? []) {\n        const label = detail.label || detail.key;\n        lines.push(`${label}: ${detail.value}`);\n        if (lines.length >= TOOLTIP_MAX_FIELDS) {\n            break;\n        }\n    }\n    return lines.join('\\n');\n}\n\n/* Build the full instance payload in anchor-local space from the plot hooks. */\nfunction buildGeometryPlotArrays(shared, { nodes = shared.nodes } = {}) {\n    const visibleNodes = nodes.filter(node => node?.computedVisible !== false);\n    const maxInstances = visibleNodes.reduce(\n        (sum, node) => sum\n            + (node._pointSpecs?.length ?? 0)\n            + (node._segmentSpecs?.length ?? 0)\n            + (node.geometryAxisPlacements?.().length ?? 0)\n            + (node.geometryTickPlacements?.().length ?? 0),\n        0,\n    );\n    if (maxInstances === 0 || !shared.cpuCubeVertices) {\n        return null;\n    }\n\n    const instanceMatrices = new Float32Array(maxInstances * 16);\n    const resolutions = new Float32Array(maxInstances * 3);\n    const colors = new Float32Array(maxInstances * 4);\n    const texoffsets = new Float32Array(maxInstances * 2);\n    const markerStyles = new Float32Array(maxInstances);\n    const pickIds = new Float32Array(maxInstances);\n\n    let instanceCount = 0;\n    for (const node of visibleNodes) {\n        const nodeLocalMatrix = geometryPlotLocalMatrix(node, shared.scene);\n        if (!nodeLocalMatrix) {\n            continue;\n        }\n        const opacity = node.computedOpacity ?? 1.0;\n        const nodeMarkerStyle = node.state.markerStyle ?? 'mixed';\n        if (wantsRenderedLane(node, 'renderSegments', true)) for (const seg of node._segmentSpecs ?? []) {\n            const markerStyle = markerStyleCode(seg.markerStyle ?? 'tube');\n            const placement = node.geometrySegmentPlacement(seg);\n            if (!placement) {\n                continue;\n            }\n            const segMatrix = twgl.m4.multiply(nodeLocalMatrix, placement.localMatrix);\n            instanceMatrices.set(segMatrix, instanceCount * 16);\n            resolutions[instanceCount * 3 + 0] = placement.width;\n            resolutions[instanceCount * 3 + 1] = placement.height;\n            resolutions[instanceCount * 3 + 2] = placement.depth;\n            colors.set([\n                seg.color[0],\n                seg.color[1],\n                seg.color[2],\n                (seg.color[3] ?? 1.0) * opacity,\n            ], instanceCount * 4);\n            texoffsets[instanceCount * 2 + 0] = -1;\n            texoffsets[instanceCount * 2 + 1] = -1;\n            markerStyles[instanceCount] = markerStyle;\n            pickIds[instanceCount] = 0;\n            instanceCount += 1;\n        }\n        if (wantsRenderedLane(node, 'renderPoints', true)) for (const spec of node._pointSpecs ?? []) {\n            const markerStyle = pointMarkerStyleCode(nodeMarkerStyle, spec.markerStyle);\n            const placement = node.geometryPointPlacement(spec);\n            let localMatrix = twgl.m4.translation([placement.x, placement.y, placement.z]);\n            if (markerStyle !== MARKER_STYLE_SPHERE) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(spec.rx ?? 0));\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(spec.ry ?? 0));\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(spec.rz ?? 0));\n            }\n            const pointMatrix = twgl.m4.multiply(nodeLocalMatrix, localMatrix);\n            instanceMatrices.set(pointMatrix, instanceCount * 16);\n            resolutions[instanceCount * 3 + 0] = placement.width;\n            resolutions[instanceCount * 3 + 1] = placement.height;\n            resolutions[instanceCount * 3 + 2] = placement.depth;\n            colors.set([\n                spec.color[0],\n                spec.color[1],\n                spec.color[2],\n                (spec.color[3] ?? 1.0) * opacity,\n            ], instanceCount * 4);\n            texoffsets[instanceCount * 2 + 0] = -1;\n            texoffsets[instanceCount * 2 + 1] = -1;\n            markerStyles[instanceCount] = markerStyle;\n            pickIds[instanceCount] = spec.pickId ?? 0;\n            instanceCount += 1;\n        }\n        for (const axis of node.geometryAxisPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([axis.x, axis.y, axis.z]);\n            if (axis.angleY) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(axis.angleY));\n            }\n            if (axis.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(axis.angleZ));\n            }\n            const axisMatrix = twgl.m4.multiply(nodeLocalMatrix, localMatrix);\n            instanceMatrices.set(axisMatrix, instanceCount * 16);\n            resolutions[instanceCount * 3 + 0] = axis.width;\n            resolutions[instanceCount * 3 + 1] = axis.height;\n            resolutions[instanceCount * 3 + 2] = axis.depth;\n            colors.set(axis.color, instanceCount * 4);\n            texoffsets[instanceCount * 2 + 0] = -1;\n            texoffsets[instanceCount * 2 + 1] = -1;\n            markerStyles[instanceCount] = markerStyleCode(axis.markerStyle ?? 'tube');\n            pickIds[instanceCount] = 0;\n            instanceCount += 1;\n        }\n        for (const tick of node.geometryTickPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([tick.x, tick.y, tick.z]);\n            if (tick.angleX) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(tick.angleX));\n            }\n            if (tick.angleY) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(tick.angleY));\n            }\n            if (tick.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(tick.angleZ));\n            }\n            const tickMatrix = twgl.m4.multiply(nodeLocalMatrix, localMatrix);\n            instanceMatrices.set(tickMatrix, instanceCount * 16);\n            resolutions[instanceCount * 3 + 0] = tick.width;\n            resolutions[instanceCount * 3 + 1] = tick.height;\n            resolutions[instanceCount * 3 + 2] = tick.depth;\n            colors.set([\n                tick.color[0],\n                tick.color[1],\n                tick.color[2],\n                (tick.color[3] ?? 1.0) * opacity,\n            ], instanceCount * 4);\n            texoffsets[instanceCount * 2 + 0] = -1;\n            texoffsets[instanceCount * 2 + 1] = -1;\n            markerStyles[instanceCount] = markerStyleCode(tick.markerStyle ?? 'tube');\n            pickIds[instanceCount] = 0;\n            instanceCount += 1;\n        }\n    }\n\n    return {\n        arrays: {\n            position: {\n                numComponents: 3,\n                data: shared.cpuCubeVertices.position,\n            },\n            matrix: {\n                numComponents: 16,\n                data: instanceMatrices.subarray(0, instanceCount * 16),\n                divisor: 1,\n            },\n            resolution: {\n                numComponents: 3,\n                data: resolutions.subarray(0, instanceCount * 3),\n                divisor: 1,\n            },\n            color: {\n                numComponents: 4,\n                data: colors.subarray(0, instanceCount * 4),\n                divisor: 1,\n            },\n            normal: {\n                numComponents: 3,\n                data: shared.cpuCubeVertices.normal,\n            },\n            baseuvs: {\n                numComponents: 2,\n                data: shared.cpuCubeVertices.texcoord,\n            },\n            texoffset: {\n                numComponents: 2,\n                data: texoffsets.subarray(0, instanceCount * 2),\n                divisor: 1,\n            },\n            markerStyle: {\n                numComponents: 1,\n                data: markerStyles.subarray(0, instanceCount),\n                divisor: 1,\n            },\n            pickId: {\n                numComponents: 1,\n                data: pickIds.subarray(0, instanceCount),\n                divisor: 1,\n            },\n        },\n        instanceCount,\n    };\n}\n\nexport function testingBuildGeometryPlotArrays(shared) {\n    return buildGeometryPlotArrays(shared);\n}\n\n/* Build the tick overlay payload in anchor-local space so it stays aligned with the main plot batch. */\nfunction buildGeometryPlotTickArrays(shared, { nodes = shared.nodes } = {}) {\n    const visibleNodes = nodes.filter(node => node?.computedVisible !== false);\n    const maxInstances = visibleNodes.reduce((sum, node) => sum + (node.geometryTickPlacements?.().length ?? 0), 0);\n    if (maxInstances === 0 || !shared.cpuTickQuad) {\n        return null;\n    }\n\n    const instanceMatrices = new Float32Array(maxInstances * 16);\n    const resolutions = new Float32Array(maxInstances * 2);\n    const colors = new Float32Array(maxInstances * 4);\n    let instanceCount = 0;\n    for (const node of visibleNodes) {\n        const nodeLocalMatrix = geometryPlotLocalMatrix(node, shared.scene);\n        if (!nodeLocalMatrix) {\n            continue;\n        }\n        const opacity = node.computedOpacity ?? 1.0;\n        for (const tick of node.geometryTickPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([tick.x, tick.y, tick.z]);\n            if (tick.angleX) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(tick.angleX));\n            }\n            if (tick.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(tick.angleZ));\n            }\n            const tickMatrix = twgl.m4.multiply(nodeLocalMatrix, localMatrix);\n            instanceMatrices.set(tickMatrix, instanceCount * 16);\n            resolutions[instanceCount * 2 + 0] = tick.width;\n            resolutions[instanceCount * 2 + 1] = tick.height;\n            colors.set([\n                tick.color[0],\n                tick.color[1],\n                tick.color[2],\n                (tick.color[3] ?? 1.0) * opacity,\n            ], instanceCount * 4);\n            instanceCount += 1;\n        }\n    }\n\n    return {\n        arrays: {\n            position: {\n                numComponents: 3,\n                data: shared.cpuTickQuad,\n            },\n            matrix: {\n                numComponents: 16,\n                data: instanceMatrices.subarray(0, instanceCount * 16),\n                divisor: 1,\n            },\n            resolution: {\n                numComponents: 2,\n                data: resolutions.subarray(0, instanceCount * 2),\n                divisor: 1,\n            },\n            color: {\n                numComponents: 4,\n                data: colors.subarray(0, instanceCount * 4),\n                divisor: 1,\n            },\n        },\n        instanceCount,\n    };\n}\n\nexport function testingBuildGeometryPlotTickArrays(shared) {\n    return buildGeometryPlotTickArrays(shared);\n}\n\n/* Build only plot-local transforms for pure motion churn on the main marker buffer. */\nfunction buildGeometryPlotTransformArrays(shared, { nodes = shared.nodes } = {}) {\n    const visibleNodes = nodes.filter(node => node?.computedVisible !== false);\n    const maxInstances = visibleNodes.reduce(\n        (sum, node) => sum\n            + (node._pointSpecs?.length ?? 0)\n            + (node._segmentSpecs?.length ?? 0)\n            + (node.geometryAxisPlacements?.().length ?? 0)\n            + (node.geometryTickPlacements?.().length ?? 0),\n        0,\n    );\n    const instanceMatrices = new Float32Array(maxInstances * 16);\n    let instanceCount = 0;\n    for (const node of visibleNodes) {\n        const nodeLocalMatrix = geometryPlotLocalMatrix(node, shared.scene);\n        if (!nodeLocalMatrix) {\n            continue;\n        }\n        if (wantsRenderedLane(node, 'renderSegments', true)) for (const seg of node._segmentSpecs ?? []) {\n            const placement = node.geometrySegmentPlacement(seg);\n            if (!placement) {\n                continue;\n            }\n            instanceMatrices.set(twgl.m4.multiply(nodeLocalMatrix, placement.localMatrix), instanceCount * 16);\n            instanceCount += 1;\n        }\n        if (wantsRenderedLane(node, 'renderPoints', true)) for (const spec of node._pointSpecs ?? []) {\n            const placement = node.geometryPointPlacement(spec);\n            let localMatrix = twgl.m4.translation([placement.x, placement.y, placement.z]);\n            const markerStyle = pointMarkerStyleCode(node.state.markerStyle ?? 'mixed', spec.markerStyle);\n            if (markerStyle !== MARKER_STYLE_SPHERE) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(spec.rx ?? 0));\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(spec.ry ?? 0));\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(spec.rz ?? 0));\n            }\n            instanceMatrices.set(twgl.m4.multiply(nodeLocalMatrix, localMatrix), instanceCount * 16);\n            instanceCount += 1;\n        }\n        for (const axis of node.geometryAxisPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([axis.x, axis.y, axis.z]);\n            if (axis.angleY) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(axis.angleY));\n            }\n            if (axis.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(axis.angleZ));\n            }\n            instanceMatrices.set(twgl.m4.multiply(nodeLocalMatrix, localMatrix), instanceCount * 16);\n            instanceCount += 1;\n        }\n        for (const tick of node.geometryTickPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([tick.x, tick.y, tick.z]);\n            if (tick.angleX) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(tick.angleX));\n            }\n            if (tick.angleY) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationY(tick.angleY));\n            }\n            if (tick.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(tick.angleZ));\n            }\n            instanceMatrices.set(twgl.m4.multiply(nodeLocalMatrix, localMatrix), instanceCount * 16);\n            instanceCount += 1;\n        }\n    }\n\n    return {\n        matrix: {\n            numComponents: 16,\n            data: instanceMatrices.subarray(0, instanceCount * 16),\n            divisor: 1,\n        },\n        instanceCount,\n    };\n}\n\n/* Build only tick transforms during pure motion churn. */\nfunction buildGeometryPlotTickTransformArrays(shared, { nodes = shared.nodes } = {}) {\n    const visibleNodes = nodes.filter(node => node?.computedVisible !== false);\n    const maxInstances = visibleNodes.reduce((sum, node) => sum + (node.geometryTickPlacements?.().length ?? 0), 0);\n    const instanceMatrices = new Float32Array(maxInstances * 16);\n    let instanceCount = 0;\n    for (const node of visibleNodes) {\n        const nodeLocalMatrix = geometryPlotLocalMatrix(node, shared.scene);\n        if (!nodeLocalMatrix) {\n            continue;\n        }\n        for (const tick of node.geometryTickPlacements?.() ?? []) {\n            let localMatrix = twgl.m4.translation([tick.x, tick.y, tick.z]);\n            if (tick.angleX) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationX(tick.angleX));\n            }\n            if (tick.angleZ) {\n                localMatrix = twgl.m4.multiply(localMatrix, twgl.m4.rotationZ(tick.angleZ));\n            }\n            instanceMatrices.set(twgl.m4.multiply(nodeLocalMatrix, localMatrix), instanceCount * 16);\n            instanceCount += 1;\n        }\n    }\n\n    return {\n        matrix: {\n            numComponents: 16,\n            data: instanceMatrices.subarray(0, instanceCount * 16),\n            divisor: 1,\n        },\n        instanceCount,\n    };\n}\n\n/* Keep tick-buffer sync cheap for anchor motion and force rebuilds when presentation membership changes. */\nfunction syncGeometryPlotTickBufferInfo(gl, shared, opts = {}) {\n    const nodes = opts.nodes ?? presentedGeometryPlotNodes(shared);\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    const presentationChanged = shared.lastPresentationRevision !== presentationRev;\n    const drawScopeChanged = shared.lastDrawScopeRoot !== drawScopeRoot;\n    const needsFullRebuild = drawScopeChanged || presentationChanged || !shared.ownGlTickBufferInfo\n        || hasAnyResourceDirty(shared, GEOMETRYPLOT_FULL_BUFFER_KINDS);\n    const needsInstanceUpdate = needsFullRebuild || hasAnyResourceDirty(shared, GEOMETRYPLOT_INSTANCE_BUFFER_KINDS);\n    const transformOnly = !needsFullRebuild && shared.pendingTransformOnly === true;\n    if (!needsInstanceUpdate) {\n        return shared.ownGlTickBufferInfo;\n    }\n\n    const batch = transformOnly\n        ? buildGeometryPlotTickTransformArrays(shared, { ...opts, nodes })\n        : buildGeometryPlotTickArrays(shared, { ...opts, nodes });\n    if (!batch) {\n        if (needsFullRebuild) {\n            deleteBufferInfo(gl, shared.ownGlTickBufferInfo);\n            shared.ownGlTickBufferInfo = null;\n        }\n        return null;\n    }\n    const arrays = transformOnly ? null : batch.arrays;\n    const instanceCount = batch.instanceCount;\n    const localMatrixHash = hashFloat32Array(transformOnly ? batch.matrix.data : batch.arrays.matrix.data);\n\n    if (needsFullRebuild) {\n        deleteBufferInfo(gl, shared.ownGlTickBufferInfo);\n        if (instanceCount === 0) {\n            shared.ownGlTickBufferInfo = null;\n            shared.lastPresentationRevision = presentationRev;\n            shared.lastDrawScopeRoot = drawScopeRoot;\n            shared.lastTickLocalMatrixHash = localMatrixHash;\n            return null;\n        }\n        shared.ownGlTickBufferInfo = gpuDiagWithResourceOrigin('geometry_plot.tick_buffer_info', () => twgl.createBufferInfoFromArrays(gl, arrays));\n        shared.ownGlTickBufferInfo.instanceCount = instanceCount;\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastTickLocalMatrixHash = localMatrixHash;\n        gpuDiagNoteScatterplot('geometry_plot_tick_rebuild', shared.resourceKey, {\n            instance_count: instanceCount,\n            array_bytes: totalArrayBytes(arrays),\n        });\n        return shared.ownGlTickBufferInfo;\n    }\n\n    if (transformOnly && shared.ownGlTickBufferInfo.instanceCount !== instanceCount) {\n        throw new Error(\n            `syncGeometryPlotTickBufferInfo(${shared.resourceKey}): transform-only sync changed batch shape `\n            + `from ${shared.ownGlTickBufferInfo.instanceCount} to ${instanceCount}.`,\n        );\n    }\n    if (transformOnly && shared.lastTickLocalMatrixHash != null && shared.lastTickLocalMatrixHash === localMatrixHash) {\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        return shared.ownGlTickBufferInfo;\n    }\n    if (transformOnly) {\n        setBufferSubData(gl, shared.ownGlTickBufferInfo.attribs.matrix, batch.matrix.data);\n    } else {\n        setBufferData(gl, shared.ownGlTickBufferInfo.attribs.matrix, arrays.matrix.data);\n        setBufferData(gl, shared.ownGlTickBufferInfo.attribs.resolution, arrays.resolution.data);\n        setBufferData(gl, shared.ownGlTickBufferInfo.attribs.color, arrays.color.data);\n    }\n    shared.ownGlTickBufferInfo.instanceCount = instanceCount;\n    shared.lastPresentationRevision = presentationRev;\n    shared.lastDrawScopeRoot = drawScopeRoot;\n    shared.lastTickLocalMatrixHash = localMatrixHash;\n    return shared.ownGlTickBufferInfo;\n}\n\n/* Keep main buffer sync cheap for anchor motion and force rebuilds when presentation membership changes. */\nexport function syncGeometryPlotBufferInfo(gl, shared, opts = {}) {\n    const nodes = opts.nodes ?? presentedGeometryPlotNodes(shared);\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    const presentationChanged = shared.lastPresentationRevision !== presentationRev;\n    const drawScopeChanged = shared.lastDrawScopeRoot !== drawScopeRoot;\n    const needsFullRebuild = drawScopeChanged || presentationChanged || !shared.ownGlBufferInfo\n        || hasAnyResourceDirty(shared, GEOMETRYPLOT_FULL_BUFFER_KINDS);\n    const needsInstanceUpdate = needsFullRebuild || hasAnyResourceDirty(shared, GEOMETRYPLOT_INSTANCE_BUFFER_KINDS);\n    const transformOnly = !needsFullRebuild && shared.pendingTransformOnly === true;\n    if (!needsInstanceUpdate) {\n        return shared.ownGlBufferInfo;\n    }\n\n    const batch = transformOnly\n        ? buildGeometryPlotTransformArrays(shared, { ...opts, nodes })\n        : buildGeometryPlotArrays(shared, { ...opts, nodes });\n    if (!batch) {\n        if (needsFullRebuild) {\n            deleteBufferInfo(gl, shared.ownGlBufferInfo);\n            shared.ownGlBufferInfo = null;\n        }\n        return null;\n    }\n    const arrays = transformOnly ? null : batch.arrays;\n    const instanceCount = batch.instanceCount;\n    const scopeMatrixHash = hashFloat32Array(geometryPlotScopeMatrix(shared, nodes));\n    const localMatrixHash = hashFloat32Array(transformOnly ? batch.matrix.data : batch.arrays.matrix.data);\n    const localMatrixChanged = shared.lastLocalMatrixHash != null && shared.lastLocalMatrixHash !== localMatrixHash;\n\n    if (needsFullRebuild) {\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        if (instanceCount === 0) {\n            shared.ownGlBufferInfo = null;\n            shared.lastPresentationRevision = presentationRev;\n            shared.lastDrawScopeRoot = drawScopeRoot;\n            shared.lastScopeMatrixHash = scopeMatrixHash;\n            shared.lastLocalMatrixHash = localMatrixHash;\n            shared.pendingTransformOnly = null;\n            return null;\n        }\n        shared.ownGlBufferInfo = gpuDiagWithResourceOrigin('geometry_plot.main_buffer_info', () => twgl.createBufferInfoFromArrays(gl, arrays));\n        shared.ownGlBufferInfo.instanceCount = instanceCount;\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        shared.pendingTransformOnly = null;\n        gpuDiagNoteScatterplot('geometry_plot_rebuild', shared.resourceKey, {\n            instance_count: instanceCount,\n            num_elements: shared.ownGlBufferInfo?.numElements ?? null,\n            array_bytes: totalArrayBytes(arrays),\n        });\n        return shared.ownGlBufferInfo;\n    }\n\n    if (transformOnly && shared.ownGlBufferInfo.instanceCount !== instanceCount) {\n        throw new Error(\n            `syncGeometryPlotBufferInfo(${shared.resourceKey}): transform-only sync changed batch shape `\n            + `from ${shared.ownGlBufferInfo.instanceCount} to ${instanceCount}.`,\n        );\n    }\n    if (transformOnly && shared.lastLocalMatrixHash != null && !localMatrixChanged) {\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        shared.pendingTransformOnly = null;\n        return shared.ownGlBufferInfo;\n    }\n    if (transformOnly) {\n        setBufferSubData(gl, shared.ownGlBufferInfo.attribs.matrix, batch.matrix.data);\n    } else {\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.matrix, arrays.matrix.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.resolution, arrays.resolution.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.color, arrays.color.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.markerStyle, arrays.markerStyle.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.pickId, arrays.pickId.data);\n    }\n    shared.ownGlBufferInfo.instanceCount = instanceCount;\n    shared.lastPresentationRevision = presentationRev;\n    shared.lastDrawScopeRoot = drawScopeRoot;\n    shared.lastScopeMatrixHash = scopeMatrixHash;\n    shared.lastLocalMatrixHash = localMatrixHash;\n    shared.pendingTransformOnly = null;\n    return shared.ownGlBufferInfo;\n}\n\n/* Render generic point/segment/tick primitive geometry while leaving layout semantics to subclasses. */\nexport class PrimitiveShapes extends ui.Node {\n    static _pickEntries = new Map();\n    static _pickIdCounter = GEOMETRYPLOT_PICK_ID_FIRST - 1;\n    static _hoveredPickId = 0;\n    static _hoveredEntry = null;\n\n    #layoutProvider;\n\n    _geometryError = null;\n\n    static _nextPickId() {\n        PrimitiveShapes._pickIdCounter += 1;\n        if (PrimitiveShapes._pickIdCounter > GEOMETRYPLOT_PICK_ID_LAST) {\n            throw new Error('PrimitiveShapes pick ID space exhausted.');\n        }\n        return PrimitiveShapes._pickIdCounter;\n    }\n\n    static _clearPointPickIds(node) {\n        for (const spec of node?._pointSpecs ?? []) {\n            if (!spec.pickId) {\n                continue;\n            }\n            const entry = PrimitiveShapes._pickEntries.get(spec.pickId);\n            if (entry?.node === node) {\n                PrimitiveShapes._pickEntries.delete(spec.pickId);\n            }\n            if (PrimitiveShapes._hoveredPickId === spec.pickId) {\n                PrimitiveShapes._hoveredPickId = 0;\n                if (PrimitiveShapes._hoveredEntry?.node === node) {\n                    PrimitiveShapes._hoveredEntry = null;\n                }\n            }\n        }\n    }\n\n    static _registerPointPickIds(node) {\n        for (const spec of node?._pointSpecs ?? []) {\n            if (!Number.isInteger(spec?.pickId) || spec.pickId <= 0) {\n                continue;\n            }\n            const entry = { node, spec };\n            PrimitiveShapes._pickEntries.set(spec.pickId, entry);\n            if (PrimitiveShapes._hoveredPickId === spec.pickId) {\n                PrimitiveShapes._hoveredEntry = entry;\n            }\n        }\n    }\n\n    static setHoveringID(id) {\n        const normalizedId = Number.isInteger(id) && id > 0 ? id : 0;\n        const prevId = PrimitiveShapes._hoveredPickId;\n        const prevEntry = PrimitiveShapes._hoveredEntry ?? null;\n        const prevNode = prevEntry?.node ?? null;\n        const prevPulseNode = hoverPulseNode(prevNode);\n\n        let entry = null;\n        if (normalizedId > 0) {\n            entry = PrimitiveShapes._pickEntries.get(normalizedId) ?? null;\n            if (!entry && prevId === normalizedId && prevEntry?.node) {\n                entry = prevEntry;\n            }\n        }\n        const nextNode = entry?.node ?? null;\n        const nextPulseNode = hoverPulseNode(nextNode);\n        const idChanged = prevId !== normalizedId;\n        const nodeChanged = nextNode !== prevNode;\n\n        PrimitiveShapes._hoveredPickId = normalizedId;\n        PrimitiveShapes._hoveredEntry = entry;\n\n        if (prevNode && prevNode !== nextNode) {\n            prevNode._hoverOwner?._syncPrimitiveHover?.();\n        }\n        nextNode?._hoverOwner?._syncPrimitiveHover?.();\n\n        if (!idChanged && !nodeChanged) {\n            return;\n        }\n\n        if (prevPulseNode && prevPulseNode !== nextPulseNode) {\n            prevPulseNode.cancelAnimation?.('clock_s');\n        }\n        if (nextPulseNode) {\n            nextPulseNode.animateTo?.({\n                clock_s: (nextPulseNode.animationTarget?.('clock_s') ?? 0) + 1,\n                duration_s: GEOMETRYPLOT_HOVER_PULSE_DURATION_S,\n            });\n        } else if (!normalizedId) {\n            prevPulseNode?.cancelAnimation?.('clock_s');\n        }\n    }\n\n    /* Expose the active hovered primitive entry so higher composition layers can own hover chrome. */\n    static hoveredEntry() {\n        return PrimitiveShapes._hoveredEntry;\n    }\n\n    constructor(state = {}) {\n        super({\n            markerStyle: 'sphere',\n            renderPoints: true,\n            renderSegments: true,\n            width: 720,\n            height: 512,\n            ...state,\n        });\n        this._pointSpecs = [];\n        this._segmentSpecs = [];\n        this.#layoutProvider = {\n            pointPlacement: null,\n            segmentPlacement: null,\n            axisPlacements: null,\n            tickPlacements: null,\n            tooltipText: null,\n        };\n    }\n\n    /* Install one explicit geometry/layout provider so higher widgets can compose this renderer instead of subclassing it. */\n    setLayoutProvider(provider = {}) {\n        this.#layoutProvider = {\n            pointPlacement: typeof provider.pointPlacement === 'function' ? provider.pointPlacement : null,\n            segmentPlacement: typeof provider.segmentPlacement === 'function' ? provider.segmentPlacement : null,\n            axisPlacements: typeof provider.axisPlacements === 'function' ? provider.axisPlacements : null,\n            tickPlacements: typeof provider.tickPlacements === 'function' ? provider.tickPlacements : null,\n            tooltipText: typeof provider.tooltipText === 'function' ? provider.tooltipText : null,\n        };\n        this._markLocalResourcesDirty({\n            kinds: [DIRTY.layout, DIRTY.instance, DIRTY.buffer],\n        });\n    }\n\n    /* Derive one point box in local coordinates from the installed provider contract. */\n    geometryPointPlacement(spec) {\n        const fn = this.#layoutProvider.pointPlacement;\n        if (typeof fn !== 'function') {\n            throw new Error('PrimitiveShapes pointPlacement provider is not installed.');\n        }\n        return fn(spec);\n    }\n\n    /* Derive one segment box either from the explicit provider or by joining the endpoint point placements. */\n    geometrySegmentPlacement(seg) {\n        const direct = this.#layoutProvider.segmentPlacement;\n        if (typeof direct === 'function') {\n            return direct(seg);\n        }\n        const aSpec = this._pointSpecs?.[seg.a] ?? null;\n        const bSpec = this._pointSpecs?.[seg.b] ?? null;\n        if (!aSpec || !bSpec) {\n            return null;\n        }\n        const a = this.geometryPointPlacement(aSpec);\n        const b = this.geometryPointPlacement(bSpec);\n        const { localMatrix, length } = lineSegmentLocalMatrixAndLength(a, b);\n        if (!(length > 0)) {\n            return null;\n        }\n        const thickness = Math.max(\n            GEOMETRYPLOT_SEGMENT_MIN_THICKNESS,\n            GEOMETRYPLOT_SEGMENT_THICKNESS_SCALE * 0.5 * (Math.min(a.width, a.height, a.depth) + Math.min(b.width, b.height, b.depth)),\n        );\n        return {\n            localMatrix,\n            width: length,\n            height: thickness,\n            depth: thickness,\n        };\n    }\n\n    /* Return any non-point primitive rods the owner wants batched alongside the main geometry. */\n    geometryAxisPlacements() {\n        return this.#layoutProvider.axisPlacements?.() ?? [];\n    }\n\n    /* Return any tick quads the owner wants batched in the transparent overlay path. */\n    geometryTickPlacements() {\n        return this.#layoutProvider.tickPlacements?.() ?? [];\n    }\n\n    /* Project one hovered point into tooltip text through the installed owner callback when present. */\n    geometryTooltipText(spec) {\n        return this.#layoutProvider.tooltipText?.(spec) ?? tooltipTextForPoint(spec);\n    }\n\n    /* Replace the live point/segment model and refresh pick ids through the shared renderer contract. */\n    setGeometryModel({ points = [], segments = [], error = null } = {}) {\n        PrimitiveShapes._clearPointPickIds(this);\n        if (wantsRenderedLane(this, 'renderPoints', true)) {\n            for (const spec of points) {\n                spec.pickId = PrimitiveShapes._nextPickId();\n                PrimitiveShapes._pickEntries.set(spec.pickId, { node: this, spec });\n            }\n        }\n        this._geometryError = error;\n        this._pointSpecs = points;\n        this._segmentSpecs = segments;\n        if (this._resources) {\n            markResourceDirty(this._resources, [DIRTY.content, DIRTY.instance, DIRTY.buffer]);\n        }\n    }\n\n    testingPointPlacement(index = 0) {\n        const spec = this._pointSpecs[index] ?? null;\n        if (!spec) {\n            return null;\n        }\n        return this.geometryPointPlacement(spec);\n    }\n\n    testingSegmentPlacement(index = 0) {\n        const seg = this._segmentSpecs[index] ?? null;\n        if (!seg) {\n            return null;\n        }\n        return this.geometrySegmentPlacement(seg);\n    }\n\n    mutate(newState) {\n        const prevState = this.state;\n        super.mutate(newState);\n        if (this._resources) {\n            const kinds = classifyGeometryPlotDirtyKinds(prevState, this.state);\n            if (kinds.length > 0) {\n                markResourceDirty(this._resources, kinds, this);\n            }\n        }\n    }\n\n    static _onAttachClass(shared) {\n        shared.nodes = [];\n    }\n\n    _onAttachNode(shared) {\n        shared.pendingTransformOnly = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        shared.nodes.push(this);\n        PrimitiveShapes._registerPointPickIds(this);\n    }\n\n    _onDetachNode(shared) {\n        hoverPulseNode(this)?.cancelAnimation?.('clock_s');\n        PrimitiveShapes._clearPointPickIds(this);\n        shared.pendingTransformOnly = null;\n        markResourceDirty(shared, [DIRTY.detach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        shared.nodes = shared.nodes.filter(node => node !== this);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.geometry_plot.main');\n        shared.ownGlPickerProgram = peekContextGlProgram(gl, 'gl_program.geometry_plot.picker');\n        shared.ownGlTickProgram = peekContextGlProgram(gl, 'gl_program.geometry_plot.tick');\n        shared.cpuCubeVertices = null;\n        shared.cpuTickQuad = null;\n        shared.ownGlBufferInfo = null;\n        shared.ownGlTickBufferInfo = null;\n        shared.lastPresentationRevision = null;\n        shared.lastDrawScopeRoot = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.lastTickLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markGeometryPlotSharedDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            shared.cpuCubeVertices = twgl.primitives.deindexVertices(\n                twgl.primitives.createCubeVertices(1.0),\n            );\n            shared.cpuTickQuad = new Float32Array([\n                -0.5, -0.5, 0.0,\n                 0.5, -0.5, 0.0,\n                 0.5,  0.5, 0.0,\n                -0.5, -0.5, 0.0,\n                 0.5,  0.5, 0.0,\n                -0.5,  0.5, 0.0,\n            ]);\n            const shaderName = 'lib/evilui/geometry-plot';\n            const pickerShaderName = 'lib/evilui/geometry-plot-picker';\n            const tickShaderName = 'lib/evilui/geometry-plot-tick';\n            const [ownGlProgram, ownGlPickerProgram, ownGlTickProgram] = await Promise.all([\n                getContextGlProgram(gl, 'gl_program.geometry_plot.main', async () => {\n                    const [vsSrc, fsSrc] = await ewu.loadSource(shaderName + '.vs.glsl', shaderName + '.fs.glsl');\n                    return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n                }),\n                getContextGlProgram(gl, 'gl_program.geometry_plot.picker', async () => {\n                    const [vsSrc, fsSrc] = await ewu.loadSource(pickerShaderName + '.vs.glsl', pickerShaderName + '.fs.glsl');\n                    return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n                }),\n                getContextGlProgram(gl, 'gl_program.geometry_plot.tick', async () => {\n                    const [vsSrc, fsSrc] = await ewu.loadSource(tickShaderName + '.vs.glsl', tickShaderName + '.fs.glsl');\n                    return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n                }),\n            ]);\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            shared.ownGlPickerProgram = ownGlPickerProgram;\n            shared.ownGlTickProgram = ownGlTickProgram;\n            if (!shared.ownGlProgram) {\n                console.warn(`Shader ${shaderName} not found. PrimitiveShapes will not render.`);\n            }\n            if (!shared.ownGlPickerProgram) {\n                console.warn(`Shader ${pickerShaderName} not found. PrimitiveShapes picker will not render.`);\n            }\n            if (!shared.ownGlTickProgram) {\n                console.warn(`Shader ${tickShaderName} not found. PrimitiveShapes ticks will not render.`);\n            }\n        })();\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        deleteBufferInfo(gl, shared.ownGlTickBufferInfo);\n        shared.ownGlProgram = null;\n        shared.ownGlPickerProgram = null;\n        shared.ownGlTickProgram = null;\n        shared.cpuCubeVertices = null;\n        shared.cpuTickQuad = null;\n        shared.ownGlBufferInfo = null;\n        shared.ownGlTickBufferInfo = null;\n        shared.lastPresentationRevision = null;\n        shared.lastDrawScopeRoot = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.lastTickLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markGeometryPlotSharedDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) {\n            status.response = ui.RENDER_STATUS.LOADING;\n        }\n        if (!shared.ownGlProgram || !shared.cpuCubeVertices) {\n            return;\n        }\n\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, GEOMETRYPLOT_FULL_BUFFER_KINDS) || hasAnyResourceDirty(shared, GEOMETRYPLOT_INSTANCE_BUFFER_KINDS)) {\n            shared.ownGlBufferInfo = syncGeometryPlotBufferInfo(gl, shared);\n            clearNonPickerResourceDirty(shared);\n        }\n        if (!shared.ownGlBufferInfo) {\n            if (status) {\n                status.response = ui.RENDER_STATUS.READY;\n            }\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        const clipState = geometryPlotClipUniformState(shared);\n        const hadCullFace = gl.isEnabled(gl.CULL_FACE);\n        const prevCullFaceMode = gl.getParameter(gl.CULL_FACE_MODE);\n        const prevFrontFace = gl.getParameter(gl.FRONT_FACE);\n        if (!hadCullFace) {\n            gl.enable(gl.CULL_FACE);\n        }\n        gl.frontFace(gl.CW);\n        gl.cullFace(gl.BACK);\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        const hoverBlink = geometryPlotHoverBlinkForNode(PrimitiveShapes._hoveredEntry?.node ?? null, t);\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_hoverBlink: hoverBlink,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            u_anchorMatrix: geometryPlotScopeMatrix(shared),\n            u_hoveredPickId: PrimitiveShapes._hoveredPickId,\n            ...clipState,\n            ...geometryPlotDrawUniforms(shared),\n        });\n        gpuDiagNoteScatterplot('geometry_plot_draw', shared.resourceKey, {\n            instance_count: shared.ownGlBufferInfo.instanceCount,\n            num_elements: shared.ownGlBufferInfo?.numElements ?? null,\n            hovered_pick_id: PrimitiveShapes._hoveredPickId,\n        });\n        drawBufferInfoInstancedChecked(gl, `PrimitiveShapes(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n        gl.frontFace(prevFrontFace);\n        gl.cullFace(prevCullFaceMode);\n        if (!hadCullFace) {\n            gl.disable(gl.CULL_FACE);\n        }\n        if (status) {\n            status.response = ui.RENDER_STATUS.READY;\n        }\n    }\n\n    static _drawGLPickable(gl, shared, _t, viewMatrix, projectionMatrix) {\n        if (!shared.ownGlPickerProgram || !shared.cpuCubeVertices) {\n            return;\n        }\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, GEOMETRYPLOT_FULL_BUFFER_KINDS) || hasAnyResourceDirty(shared, GEOMETRYPLOT_INSTANCE_BUFFER_KINDS)) {\n            shared.ownGlBufferInfo = syncGeometryPlotBufferInfo(gl, shared);\n            clearNonPickerResourceDirty(shared);\n        }\n        if (!shared.ownGlBufferInfo) {\n            return;\n        }\n\n        const borGlProgram = shared.ownGlPickerProgram;\n        gl.useProgram(borGlProgram.program);\n        gl.enable(gl.DEPTH_TEST);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        const clipState = geometryPlotClipUniformState(shared);\n        twgl.setUniforms(borGlProgram, {\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            u_anchorMatrix: geometryPlotScopeMatrix(shared),\n            u_cameraWorld: shared.scene?.camera?.worldPosition?.() ?? [0, 0, 0],\n            ...clipState,\n        });\n        drawBufferInfoInstancedChecked(gl, `PrimitiveShapesPicker(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n    }\n\n    static _drawTransparent(_gl, _shared, _t, _viewMatrix, _projectionMatrix, status = null) {\n        if (status) {\n            status.response = ui.RENDER_STATUS.READY;\n        }\n    }\n\n    /* GeometryPlot content is depth-tested opaque content; the transparent hook remains an explicit no-op. */\n    static _batchPassForNode(_node) {\n        return 'opaque';\n    }\n\n    /* Shared resources stay owned by the opaque pass. */\n    static _batchPassForShared(_shared) {\n        return 'opaque';\n    }\n\n    _markLocalResourcesDirty({ kinds = null, diag = null } = {}) {\n        if (!this._resources) {\n            return;\n        }\n        const dirtyKinds = kinds ?? [DIRTY.content, DIRTY.style, DIRTY.layout, DIRTY.transform, DIRTY.instance];\n        markGeometryPlotSharedDirty(this._resources, dirtyKinds, this, diag);\n    }\n}\n\n/* Render only sphere instances while retaining hover/picking behaviour for point-like primitives. */\nexport class Sphere extends PrimitiveShapes {\n    constructor(state = {}) {\n        super({\n            ...state,\n            markerStyle: 'sphere',\n            renderPoints: true,\n            renderSegments: false,\n        });\n    }\n}\n\n/* Render only rod/tube instances and joined segments while omitting standalone point spheres. */\nexport class Rod extends PrimitiveShapes {\n    constructor(state = {}) {\n        super({\n            ...state,\n            markerStyle: 'tube',\n            renderPoints: false,\n            renderSegments: true,\n        });\n    }\n}\n\n/* Render only cone placements while omitting point spheres and joined segments. */\nexport class Cone extends PrimitiveShapes {\n    constructor(state = {}) {\n        super({\n            ...state,\n            markerStyle: 'cone',\n            renderPoints: false,\n            renderSegments: false,\n        });\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './base.mjs';\nimport { Tooltip } from './popup.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport {\n    PrimitiveShapes,\n    Rod,\n    Sphere,\n    Cone,\n    syncGeometryPlotBufferInfo,\n    testingBuildGeometryPlotArrays,\n    testingBuildGeometryPlotTickArrays,\n    testingGeometryPlotHoverBlinkForNode as testingPrimitiveHoverBlinkForNode,\n} from './primitive-shapes.mjs';\n\nconst TOOLTIP_OFFSET_X = 132;\nconst TOOLTIP_OFFSET_Y = 88;\n\n/* Resolve either a wrapper plot or a raw primitive renderer onto the composed primitive children. */\nfunction primitiveShapeNodes(node) {\n    if (typeof node?._primitiveShapeNodes === 'function') {\n        return node._primitiveShapeNodes();\n    }\n    return node ? [node] : [];\n}\n\n/* Project wrapper-owned render state onto the primitive children so shared batch tests can run without a live scene graph. */\nfunction projectPrimitiveShapeNodes(node) {\n    const primitives = primitiveShapeNodes(node);\n    for (const primitive of primitives) {\n        if (!primitive || primitive === node) {\n            continue;\n        }\n        primitive.scene = node.scene ?? primitive.scene;\n        primitive.computedVisible = node.computedVisible ?? primitive.computedVisible;\n        primitive.computedOpacity = node.computedOpacity ?? primitive.computedOpacity;\n        primitive.computedClipRect = node.computedClipRect ?? primitive.computedClipRect;\n        primitive.anchorNode = node.anchorNode ?? primitive.anchorNode;\n        primitive.localToAnchor = node.localToAnchor ?? primitive.localToAnchor;\n    }\n    return primitives;\n}\n\n/* Normalise one wrapper-owned shared batch onto the underlying primitive children. */\nfunction normaliseGeometryPlotShared(shared) {\n    const scene = shared?.scene;\n    const wrappedScene = scene && typeof scene._isPresentedNode === 'function'\n        ? {\n            ...scene,\n            _isPresentedNode(node) {\n                return scene._isPresentedNode(node?._geometryOwner ?? node);\n            },\n        }\n        : scene;\n    return {\n        ...shared,\n        scene: wrappedScene,\n        nodes: (shared?.nodes ?? []).flatMap(projectPrimitiveShapeNodes),\n    };\n}\n\n/* Keep the caller-owned shared state authoritative while delegating sync to the primitive children. */\nfunction withNormalisedGeometryPlotShared(shared, fn) {\n    const normalized = normaliseGeometryPlotShared(shared);\n    const result = fn(normalized);\n    shared.ownGlBufferInfo = normalized.ownGlBufferInfo;\n    shared.ownGlTickBufferInfo = normalized.ownGlTickBufferInfo;\n    shared.lastPresentationRevision = normalized.lastPresentationRevision;\n    shared.lastDrawScopeRoot = normalized.lastDrawScopeRoot;\n    shared.lastScopeMatrixHash = normalized.lastScopeMatrixHash;\n    shared.lastLocalMatrixHash = normalized.lastLocalMatrixHash;\n    shared.lastTickLocalMatrixHash = normalized.lastTickLocalMatrixHash;\n    shared.pendingTransformOnly = normalized.pendingTransformOnly;\n    return result;\n}\n\nexport function syncComposedGeometryPlotBufferInfo(gl, shared, opts = {}) {\n    return withNormalisedGeometryPlotShared(shared, (normalized) => syncGeometryPlotBufferInfo(gl, normalized, opts));\n}\n\nexport function testingBuildComposedGeometryPlotArrays(shared) {\n    return testingBuildGeometryPlotArrays(normaliseGeometryPlotShared(shared));\n}\n\nexport function testingBuildComposedGeometryPlotTickArrays(shared) {\n    return testingBuildGeometryPlotTickArrays(normaliseGeometryPlotShared(shared));\n}\n\nexport function testingGeometryPlotHoverBlinkForNode(node, nowS) {\n    return testingPrimitiveHoverBlinkForNode(primitiveShapeNodes(node)[0] ?? null, nowS);\n}\n\n/* Compose one sphere/rod/cone trio into one reusable plot node with shared hover tooltip ownership. */\nexport class GeometryPlot extends ui.Node {\n    #hoverTooltipMount;\n    #hoverTooltip;\n    #hoverTooltipPickId;\n    #provider;\n    #ownSphere;\n    #ownRod;\n    #ownCone;\n\n    constructor(state = {}) {\n        super({\n            font: null,\n            width: 720,\n            height: 512,\n            ambientLight: [0.16, 0.17, 0.19],\n            ...state,\n        });\n        if (!this.state.font) {\n            throw new Error('GeometryPlot requires a font.');\n        }\n        this.#hoverTooltipMount = null;\n        this.#hoverTooltip = null;\n        this.#hoverTooltipPickId = 0;\n        this.#provider = {\n            pointPlacement: null,\n            segmentPlacement: null,\n            axisPlacements: null,\n            tickPlacements: null,\n            tooltipText: null,\n        };\n        this.#ownSphere = new Sphere({\n            width: this.state.width,\n            height: this.state.height,\n            ambientLight: this.state.ambientLight,\n        });\n        this.#ownRod = new Rod({\n            width: this.state.width,\n            height: this.state.height,\n            ambientLight: this.state.ambientLight,\n        });\n        this.#ownCone = new Cone({\n            width: this.state.width,\n            height: this.state.height,\n            ambientLight: this.state.ambientLight,\n        });\n        for (const primitive of [this.#ownRod, this.#ownCone, this.#ownSphere]) {\n            primitive._geometryOwner = this;\n            primitive._hoverOwner = this;\n            primitive._hoverPulseOwner = this;\n            this.appendChild(primitive);\n        }\n    }\n\n    /* Project the outer plugin owner onto the primitive children for presentation membership and hover animation ownership. */\n    setPluginOwner(owner = null) {\n        const resolved = owner ?? this;\n        for (const primitive of this._primitiveShapeNodes()) {\n            primitive._geometryOwner = resolved;\n            primitive._hoverPulseOwner = resolved;\n        }\n    }\n\n    /* Forward generic size/state changes to the composed primitive children and refresh hover chrome. */\n    mutate(newState) {\n        super.mutate(newState);\n        for (const primitive of this._primitiveShapeNodes()) {\n            primitive.mutate({\n                width: this.state.width,\n                height: this.state.height,\n                ambientLight: this.state.ambientLight,\n            });\n        }\n        this._syncPrimitiveHover();\n    }\n\n    /* Install the owner-supplied layout contract and project it onto the composed primitives. */\n    setLayoutProvider(provider = {}) {\n        this.#provider = {\n            pointPlacement: typeof provider.pointPlacement === 'function' ? provider.pointPlacement : null,\n            segmentPlacement: typeof provider.segmentPlacement === 'function' ? provider.segmentPlacement : null,\n            axisPlacements: typeof provider.axisPlacements === 'function' ? provider.axisPlacements : null,\n            tickPlacements: typeof provider.tickPlacements === 'function' ? provider.tickPlacements : null,\n            tooltipText: typeof provider.tooltipText === 'function' ? provider.tooltipText : null,\n        };\n        this.#ownSphere.setLayoutProvider({\n            pointPlacement: this.#provider.pointPlacement,\n            tooltipText: this.#provider.tooltipText,\n        });\n        this.#ownRod.setLayoutProvider({\n            pointPlacement: this.#provider.pointPlacement,\n            segmentPlacement: this.#provider.segmentPlacement,\n            axisPlacements: () => (this.#provider.axisPlacements?.() ?? []).filter((spec) => spec.markerStyle === 'tube'),\n            tickPlacements: this.#provider.tickPlacements,\n            tooltipText: this.#provider.tooltipText,\n        });\n        this.#ownCone.setLayoutProvider({\n            axisPlacements: () => (this.#provider.axisPlacements?.() ?? []).filter((spec) => spec.markerStyle === 'cone'),\n        });\n    }\n\n    /* Replace the shared point/segment model and fan it out onto the primitive children without duplicating pick ownership. */\n    setGeometryModel({ points = [], segments = [], error = null } = {}) {\n        this.#ownSphere.setGeometryModel({\n            points,\n            segments: [],\n            error,\n        });\n        this.#ownRod.setGeometryModel({\n            points: points.map((spec) => ({ ...spec })),\n            segments,\n            error,\n        });\n        this.#ownCone.setGeometryModel({\n            points: [],\n            segments: [],\n            error,\n        });\n        this._syncPrimitiveHover();\n    }\n\n    /* Expose the composed primitive children to shared batch helpers and focused tests. */\n    _primitiveShapeNodes() {\n        return [this.#ownSphere, this.#ownRod, this.#ownCone];\n    }\n\n    get _pointSpecs() {\n        return this.#ownSphere._pointSpecs;\n    }\n\n    get _segmentSpecs() {\n        return this.#ownRod._segmentSpecs;\n    }\n\n    testingPointPlacement(index = 0) {\n        return this.#ownSphere.testingPointPlacement(index);\n    }\n\n    testingSegmentPlacement(index = 0) {\n        return this.#ownRod.testingSegmentPlacement(index);\n    }\n\n    /* Forward global hover routing onto the lower-level primitive pick map. */\n    static setHoveringID(id) {\n        PrimitiveShapes.setHoveringID(id);\n    }\n\n    /* Keep the hovered tooltip owned by the composed plot rather than by an individual primitive child. */\n    _syncPrimitiveHover() {\n        const entry = PrimitiveShapes.hoveredEntry();\n        if (!entry || entry.node?._hoverOwner !== this || !entry.spec) {\n            this.#dropHoverTooltip();\n            return;\n        }\n        const spec = entry.spec;\n        const placement = entry.node.geometryPointPlacement(spec);\n        const text = entry.node.geometryTooltipText(spec);\n        if (!text) {\n            this.#dropHoverTooltip();\n            return;\n        }\n        const x = placement.x + 0.5 * placement.width + TOOLTIP_OFFSET_X;\n        const y = placement.y - 0.5 * placement.height - TOOLTIP_OFFSET_Y;\n        const z = placement.z - 12;\n        if (this.#hoverTooltipPickId !== spec.pickId) {\n            this.#dropHoverTooltip();\n            const mountRoot = this.scene?.stage?.hudMountRoot?.('tooltip') ?? this;\n            const hudPoint = this.scene?.stage?.projectNodePointToHud?.(this, [x, y, z], mountRoot) ?? [x, y, z];\n            // HUD tooltips inherit their layer depth; standalone plots retain local placement.\n            this.#hoverTooltipMount = new ui.Placeholder({ x: hudPoint[0], y: hudPoint[1], z: mountRoot === this ? hudPoint[2] : 0 });\n            this.#hoverTooltip = this.#makeHoverTooltip(text);\n            this.#hoverTooltipMount.appendChild(this.#hoverTooltip);\n            mountRoot.appendChild(this.#hoverTooltipMount);\n            this.#hoverTooltipPickId = spec.pickId;\n            return;\n        }\n        const mountRoot = this.scene?.stage?.hudMountRoot?.('tooltip') ?? this;\n        const hudPoint = this.scene?.stage?.projectNodePointToHud?.(this, [x, y, z], mountRoot) ?? [x, y, z];\n        this.#hoverTooltipMount.setLocalPosition(hudPoint[0], hudPoint[1], mountRoot === this ? hudPoint[2] : 0);\n        this.#hoverTooltip.refreshPlacement();\n    }\n\n    /* Create the shared hover tooltip text node using the owner plugin font. */\n    #makeHoverTooltip(text) {\n        return new Tooltip({\n            x: 0,\n            y: 0,\n            z: 0,\n            wrapText: false,\n            color: [0.08, 0.10, 0.13, 0.98],\n            font: this.state.font,\n            fontSize: 16,\n            fontColor: [0.95, 0.97, 1.0, 1.0],\n            text,\n            viewportBounds: () => this.scene?.stage?.hudViewportBounds?.(this.#hoverTooltipMount) ?? null,\n        });\n    }\n\n    /* Remove any retained hover tooltip subtree when hover moves away or the plot detaches. */\n    #dropHoverTooltip() {\n        if (!this.#hoverTooltipMount) {\n            return;\n        }\n        if (this.#hoverTooltipMount.parentNode && this.#hoverTooltipMount._lifecycle !== 'detached') {\n            this.#hoverTooltipMount.parentNode.removeChild(this.#hoverTooltipMount);\n        }\n        this.#hoverTooltipMount = null;\n        this.#hoverTooltip = null;\n        this.#hoverTooltipPickId = 0;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\n\nconst DEFAULT_MAJOR_TICK_COUNT = 10;\nconst X_MINOR_TICKS_PER_INTERVAL = 9;\nconst X_TICK_TILT = 0.5 * Math.PI;\n\n/* Keep one portable fallback axis model so cartesian previews can stay structurally complete while data is absent. */\nexport function defaultAxisModel(name) {\n    return {\n        key: name,\n        name,\n        unit: '',\n        min: 0,\n        max: 9,\n        step: 1,\n        majorCount: DEFAULT_MAJOR_TICK_COUNT,\n        type: '?',\n    };\n}\n\n/* Keep one portable empty plot model so cartesian renderers can fail closed without special null branches. */\nexport function defaultPlotModel() {\n    return {\n        points: [],\n        segments: [],\n        count: 0,\n        axes: {\n            x: defaultAxisModel('x'),\n            y: defaultAxisModel('y'),\n            z: defaultAxisModel('z'),\n        },\n        hideZAxis: false,\n    };\n}\n\n/* Allow non-cartesian graph renderers to reuse the shared sphere/tube renderer without forcing plot chrome. */\nexport function wantsVisibleAxes(node) {\n    return node?._plotHideAxes !== true;\n}\n\n/* Separate axis title and unit text so renderers can style the two spans independently. */\nexport function axisTitleGapText(unit) {\n    return unit ? '  ' : '';\n}\n\n/* Render axis units in one compact bracketed form shared across cartesian previews. */\nexport function axisTitleUnitText(unit) {\n    return unit ? `[${unit}]` : '';\n}\n\n/* Keep outward-rounded bounds numerically stable so label churn stays low across small data changes. */\nfunction normaliseBound(value) {\n    return Number(value.toPrecision(12));\n}\n\n/* Keep tooltip numbers short while retaining enough precision to diagnose plotted values. */\nfunction formatTooltipNumber(value) {\n    if (!Number.isFinite(value)) {\n        return String(value);\n    }\n    return Number(value.toPrecision(8)).toString();\n}\n\n/* Present tooltip values in a shared number-plus-unit form across cartesian plugins. */\nexport function formatTooltipValue(value, unit = '') {\n    const text = formatTooltipNumber(value);\n    return unit ? `${text} ${unit}` : text;\n}\n\n/* Quantise raw steps by order of magnitude before selecting a human-friendly major-tick interval. */\nfunction significantFigureUnit(value) {\n    if (!Number.isFinite(value) || value === 0) {\n        return 1;\n    }\n    return 10 ** Math.floor(Math.log10(Math.abs(value)));\n}\n\n/* Snap one raw interval onto the small fixed family of tick steps we want users to internalise. */\nfunction niceStep(rawStep) {\n    if (!Number.isFinite(rawStep) || rawStep <= 0) {\n        return 1;\n    }\n    const unit = significantFigureUnit(rawStep);\n    const scaled = rawStep / unit;\n    for (const choice of [1, 2, 2.5, 3, 5]) {\n        if (scaled <= choice) {\n            return choice * unit;\n        }\n    }\n    return 10 * unit;\n}\n\n/* Clamp the major tick count onto a small sane range so downstream geometry code can stay simple. */\nexport function axisMajorCount(axis) {\n    const count = axis?.majorCount ?? DEFAULT_MAJOR_TICK_COUNT;\n    return Math.max(2, Math.round(count));\n}\n\n/* Read one axis model from the portable node contract, falling back to the shared default shape. */\nexport function plotAxis(node, key) {\n    return node._plotAxes?.[key] ?? defaultAxisModel(key);\n}\n\n/* Build outward-rounded cartesian bounds so the visible frame stays easy to read and compare. */\nexport function outwardBounds(min, max) {\n    if (!Number.isFinite(min) || !Number.isFinite(max)) {\n        return { min: 0, max: 9, step: 1, majorCount: DEFAULT_MAJOR_TICK_COUNT };\n    }\n    const targetIntervals = DEFAULT_MAJOR_TICK_COUNT - 1;\n    const span = max - min;\n    let step = span > 0\n        ? niceStep(span / targetIntervals)\n        : (min === 0 && max === 0 ? 1 : niceStep(significantFigureUnit(min || max) / 10));\n    let lo = step * Math.floor(min / step);\n    let hi = step * Math.ceil(max / step);\n    if (lo === hi) {\n        lo -= step;\n        hi += step;\n    }\n    let majorCount = Math.round((hi - lo) / step) + 1;\n    if (majorCount < 2) {\n        step = Math.max(step, 1);\n        lo = -step;\n        hi = step;\n        majorCount = 3;\n    }\n    return {\n        min: normaliseBound(lo),\n        max: normaliseBound(hi),\n        step: normaliseBound(step),\n        majorCount,\n    };\n}\n\n/* Normalise one coordinate into the plotted unit cube while tolerating degenerate or malformed bounds. */\nexport function normaliseToBounds(value, axis) {\n    const span = axis.max - axis.min;\n    if (!Number.isFinite(span) || span <= 0) {\n        return 0.5;\n    }\n    return Math.max(0.0, Math.min(1.0, (value - axis.min) / span));\n}\n\n/* Resolve the absolute value for one major tick using the shared axis contract. */\nfunction tickValue(axis, i, count = axisMajorCount(axis)) {\n    if (count <= 1) {\n        return axis.min;\n    }\n    const step = axis.step ?? ((axis.max - axis.min) / (count - 1));\n    return normaliseBound(axis.min + step * i);\n}\n\n/* Format one tick using only the precision implied by the chosen step size. */\nexport function formatTick(value, step) {\n    const absStep = Math.abs(Number(step));\n    let decimals = 0;\n    if (Number.isFinite(absStep) && absStep > 0) {\n        let scaled = Number(absStep.toPrecision(12));\n        while (decimals < 6 && !Number.isInteger(scaled)) {\n            scaled *= 10;\n            decimals += 1;\n        }\n    }\n    const rounded = value.toFixed(decimals);\n    return rounded.replace(/\\.0+$/, '').replace(/(\\.\\d*?)0+$/, '$1');\n}\n\n/* Derive the visible label text for one axis tick from the shared tick geometry contract. */\nfunction axisTickText(axis, i, count = axisMajorCount(axis)) {\n    const step = axis.step ?? (count <= 1 ? 0 : (axis.max - axis.min) / (count - 1));\n    return formatTick(tickValue(axis, i, count), step);\n}\n\n/* Keep the z-axis visibility contract explicit so cartesian plugins can hide the depth rail consistently. */\nexport function wantsVisibleZAxis(node) {\n    return wantsVisibleAxes(node) && !node?._plotHideZAxis;\n}\n\n/* Reserve one stable frame inside the node bounds so plot content and chrome scale together. */\nexport function plotFrame(node) {\n    const hideAxes = !wantsVisibleAxes(node);\n    const left = hideAxes ? 18 : 88;\n    const right = hideAxes ? 18 : 72;\n    const top = hideAxes ? 18 : 56;\n    const bottom = hideAxes ? 18 : 76;\n    const front = hideAxes ? 12 : 22;\n    const width = Math.max(180, node.state.width - left - right);\n    const height = Math.max(140, node.state.height - top - bottom);\n    const depth = Math.max(96, Math.min(width, height) * 0.58);\n    const originZ = wantsVisibleZAxis(node) ? -front : -front;\n    return {\n        originX: left,\n        originY: node.state.height - bottom,\n        originZ,\n        width,\n        height,\n        depth,\n    };\n}\n\n/* Emit the shared axis rails and cone heads so plot kinds can reuse one spatial baseline. */\nexport function axisPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const plot = plotFrame(node);\n    const radius = Math.max(0.625, Math.min(plot.width, plot.height, plot.depth) / 88);\n    const coneLen = 6.0 * radius;\n    const coneDiam = 4.0 * radius;\n    const color = [0.70, 0.73, 0.78, 1.0];\n    return [\n        {\n            x: plot.originX + 0.5 * plot.width,\n            y: plot.originY,\n            z: plot.originZ,\n            width: plot.width,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: 0.0,\n            angleY: 0.0,\n            markerStyle: 'tube',\n            color,\n        },\n        {\n            x: plot.originX,\n            y: plot.originY - 0.5 * plot.height,\n            z: plot.originZ,\n            width: plot.height,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: -0.5 * Math.PI,\n            angleY: 0.0,\n            markerStyle: 'tube',\n            color,\n        },\n        ...(wantsVisibleZAxis(node) ? [{\n            x: plot.originX,\n            y: plot.originY,\n            z: plot.originZ + 0.5 * plot.depth,\n            width: plot.depth,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: 0.0,\n            angleY: 0.5 * Math.PI,\n            markerStyle: 'tube',\n            color,\n        }] : []),\n        {\n            x: plot.originX + plot.width + 0.5 * coneLen,\n            y: plot.originY,\n            z: plot.originZ,\n            width: coneLen,\n            height: coneDiam,\n            depth: coneDiam,\n            angleZ: 0.0,\n            angleY: 0.0,\n            markerStyle: 'cone',\n            color,\n        },\n        {\n            x: plot.originX,\n            y: plot.originY - plot.height - 0.5 * coneLen,\n            z: plot.originZ,\n            width: coneLen,\n            height: coneDiam,\n            depth: coneDiam,\n            angleZ: -0.5 * Math.PI,\n            angleY: 0.0,\n            markerStyle: 'cone',\n            color,\n        },\n        ...(wantsVisibleZAxis(node) ? [{\n            x: plot.originX,\n            y: plot.originY,\n            z: plot.originZ + plot.depth + 0.5 * coneLen,\n            width: coneLen,\n            height: coneDiam,\n            depth: coneDiam,\n            angleZ: 0.0,\n            angleY: -0.5 * Math.PI,\n            markerStyle: 'cone',\n            color,\n        }] : []),\n    ];\n}\n\n/* Build the major x-axis tick rods using the shared cartesian frame and z-axis visibility rules. */\nfunction xMajorTickPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const plot = plotFrame(node);\n    const axis = plotAxis(node, 'x');\n    const majorCount = axisMajorCount(axis);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = Math.max(4.0 * radius, plot.height * 0.035);\n    const color = [0.56, 0.59, 0.63, 1.0];\n    const is3D = wantsVisibleZAxis(node);\n    const ticks = [];\n    for (let i = 0; i < majorCount; i++) {\n        const u = majorCount === 1 ? 0.0 : i / (majorCount - 1);\n        ticks.push({\n            x: plot.originX + u * plot.width,\n            y: is3D ? plot.originY : plot.originY + 0.5 * majorLen,\n            z: is3D ? plot.originZ - 0.5 * majorLen : plot.originZ,\n            width: majorLen,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: 0.5 * Math.PI,\n            angleX: is3D ? X_TICK_TILT : 0.0,\n            angleY: 0.0,\n            markerStyle: 'tube',\n            color,\n        });\n    }\n    return ticks;\n}\n\n/* Build the full x-axis tick set, adding minor and midpoint ticks between each major interval. */\nfunction xTickPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const majors = xMajorTickPlacements(node);\n    const plot = plotFrame(node);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = majors[0]?.width ?? Math.max(4.0 * radius, plot.height * 0.035);\n    const minorLen = 0.56 * majorLen;\n    const midLen = 0.5 * (majorLen + minorLen);\n    const minorColor = [0.34, 0.37, 0.41, 1.0];\n    const midColor = [0.45, 0.48, 0.52, 1.0];\n    const is3D = wantsVisibleZAxis(node);\n    const ticks = [...majors];\n    for (let i = 0; i < majors.length - 1; i++) {\n        const a = majors[i];\n        const b = majors[i + 1];\n        const x0 = a.x;\n        const dx = b.x - a.x;\n        for (let j = 1; j <= X_MINOR_TICKS_PER_INTERVAL; j++) {\n            const frac = j / (X_MINOR_TICKS_PER_INTERVAL + 1);\n            const width = j === 5 ? midLen : minorLen;\n            ticks.push({\n                x: x0 + dx * frac,\n                y: is3D ? plot.originY : plot.originY + 0.5 * width,\n                z: is3D ? plot.originZ - 0.5 * width : plot.originZ,\n                width,\n                height: 2.0 * radius,\n                depth: 2.0 * radius,\n                angleZ: 0.5 * Math.PI,\n                angleX: is3D ? X_TICK_TILT : 0.0,\n                angleY: 0.0,\n                markerStyle: 'tube',\n                color: j === 5 ? midColor : minorColor,\n            });\n        }\n    }\n    return ticks;\n}\n\n/* Place x-axis tick labels off the shared tick rods so the numbers follow the 2D or 3D baseline. */\nfunction xTickLabelPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const ticks = xMajorTickPlacements(node);\n    const fontSize = 12;\n    const gap = 3;\n    const axis = plotAxis(node, 'x');\n    const is3D = wantsVisibleZAxis(node);\n    return ticks.map((tick, i) => ({\n        text: axisTickText(axis, i),\n        x: tick.x,\n        y: is3D ? tick.y : tick.y + 0.5 * tick.width + gap,\n        z: is3D ? tick.z - 0.5 * tick.width - gap : tick.z,\n        fontSize,\n        fontColor: [0.70, 0.72, 0.76, 1.0],\n        angleX: is3D ? -X_TICK_TILT : 0.0,\n    }));\n}\n\n/* Place the x-axis title from the shared frame so cartesian plugins align on one visual grammar. */\nfunction xAxisTitlePlacement(node) {\n    if (!wantsVisibleAxes(node)) {\n        return null;\n    }\n    const plot = plotFrame(node);\n    const major = xMajorTickPlacements(node)[0];\n    const axis = plotAxis(node, 'x');\n    const majorLen = major?.width ?? Math.max(4.0, plot.height * 0.035);\n    const is3D = wantsVisibleZAxis(node);\n    return {\n        name: axis.name,\n        unit: axis.unit,\n        x: plot.originX + 0.5 * plot.width,\n        y: is3D ? plot.originY : plot.originY + majorLen + 18,\n        z: is3D ? plot.originZ - majorLen - 18 : plot.originZ,\n        angleX: is3D ? -X_TICK_TILT : 0.0,\n        nameFontSize: 18,\n        unitFontSize: 18,\n        nameColor: [0.82, 0.84, 0.88, 1.0],\n        unitColor: [0.60, 0.63, 0.68, 1.0],\n    };\n}\n\n/* Build the major y-axis tick rods using the shared cartesian frame. */\nfunction yMajorTickPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const plot = plotFrame(node);\n    const axis = plotAxis(node, 'y');\n    const majorCount = axisMajorCount(axis);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = Math.max(4.0 * radius, plot.width * 0.03);\n    const color = [0.56, 0.59, 0.63, 1.0];\n    const ticks = [];\n    for (let i = 0; i < majorCount; i++) {\n        const u = majorCount === 1 ? 0.0 : i / (majorCount - 1);\n        ticks.push({\n            x: plot.originX - 0.5 * majorLen,\n            y: plot.originY - u * plot.height,\n            z: plot.originZ,\n            width: majorLen,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: 0.0,\n            angleX: 0.0,\n            angleY: 0.0,\n            markerStyle: 'tube',\n            color,\n        });\n    }\n    return ticks;\n}\n\n/* Build the full y-axis tick set, including shared midpoint emphasis. */\nfunction yTickPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const majors = yMajorTickPlacements(node);\n    const plot = plotFrame(node);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = majors[0]?.width ?? Math.max(4.0 * radius, plot.width * 0.03);\n    const minorLen = 0.56 * majorLen;\n    const midLen = 0.5 * (majorLen + minorLen);\n    const minorColor = [0.34, 0.37, 0.41, 1.0];\n    const midColor = [0.45, 0.48, 0.52, 1.0];\n    const ticks = [...majors];\n    for (let i = 0; i < majors.length - 1; i++) {\n        const a = majors[i];\n        const b = majors[i + 1];\n        const y0 = a.y;\n        const dy = b.y - a.y;\n        for (let j = 1; j <= X_MINOR_TICKS_PER_INTERVAL; j++) {\n            const frac = j / (X_MINOR_TICKS_PER_INTERVAL + 1);\n            const width = j === 5 ? midLen : minorLen;\n            ticks.push({\n                x: plot.originX - 0.5 * width,\n                y: y0 + dy * frac,\n                z: plot.originZ,\n                width,\n                height: 2.0 * radius,\n                depth: 2.0 * radius,\n                angleZ: 0.0,\n                angleX: 0.0,\n                angleY: 0.0,\n                markerStyle: 'tube',\n                color: j === 5 ? midColor : minorColor,\n            });\n        }\n    }\n    return ticks;\n}\n\n/* Place y-axis tick labels using the shared left-of-axis convention. */\nfunction yTickLabelPlacements(node) {\n    if (!wantsVisibleAxes(node)) {\n        return [];\n    }\n    const ticks = yMajorTickPlacements(node);\n    const fontSize = 12;\n    const gap = 6;\n    const axis = plotAxis(node, 'y');\n    return ticks.map((tick, i) => ({\n        text: axisTickText(axis, i),\n        x: tick.x - 0.5 * tick.width - gap,\n        y: tick.y,\n        z: tick.z,\n        fontSize,\n        fontColor: [0.70, 0.72, 0.76, 1.0],\n    }));\n}\n\n/* Place the y-axis title using the shared vertical title treatment. */\nfunction yAxisTitlePlacement(node) {\n    if (!wantsVisibleAxes(node)) {\n        return null;\n    }\n    const plot = plotFrame(node);\n    const major = yMajorTickPlacements(node)[0];\n    const axis = plotAxis(node, 'y');\n    const majorLen = major?.width ?? Math.max(4.0, plot.width * 0.03);\n    return {\n        name: axis.name,\n        unit: axis.unit,\n        x: plot.originX - majorLen - 54,\n        y: plot.originY - 0.5 * plot.height,\n        z: plot.originZ,\n        angleZ: -0.5 * Math.PI,\n        nameFontSize: 18,\n        unitFontSize: 18,\n        nameColor: [0.82, 0.84, 0.88, 1.0],\n        unitColor: [0.60, 0.63, 0.68, 1.0],\n    };\n}\n\n/* Build the major z-axis tick rods only when the shared visibility contract says the depth rail is shown. */\nfunction zMajorTickPlacements(node) {\n    if (!wantsVisibleAxes(node) || !wantsVisibleZAxis(node)) {\n        return [];\n    }\n    const plot = plotFrame(node);\n    const axis = plotAxis(node, 'z');\n    const majorCount = axisMajorCount(axis);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = Math.max(4.0 * radius, plot.width * 0.03);\n    const color = [0.56, 0.59, 0.63, 1.0];\n    const ticks = [];\n    for (let i = 0; i < majorCount; i++) {\n        const u = majorCount === 1 ? 0.0 : i / (majorCount - 1);\n        ticks.push({\n            x: plot.originX - 0.5 * majorLen,\n            y: plot.originY,\n            z: plot.originZ + u * plot.depth,\n            width: majorLen,\n            height: 2.0 * radius,\n            depth: 2.0 * radius,\n            angleZ: 0.0,\n            angleX: 0.0,\n            angleY: 0.0,\n            markerStyle: 'tube',\n            color,\n        });\n    }\n    return ticks;\n}\n\n/* Build the full z-axis tick set, including shared midpoint emphasis. */\nfunction zTickPlacements(node) {\n    if (!wantsVisibleAxes(node) || !wantsVisibleZAxis(node)) {\n        return [];\n    }\n    const majors = zMajorTickPlacements(node);\n    const plot = plotFrame(node);\n    const radius = Math.max(0.1875, Math.min(plot.width, plot.height, plot.depth) / 288);\n    const majorLen = majors[0]?.width ?? Math.max(4.0 * radius, plot.width * 0.03);\n    const minorLen = 0.56 * majorLen;\n    const midLen = 0.5 * (majorLen + minorLen);\n    const minorColor = [0.34, 0.37, 0.41, 1.0];\n    const midColor = [0.45, 0.48, 0.52, 1.0];\n    const ticks = [...majors];\n    for (let i = 0; i < majors.length - 1; i++) {\n        const a = majors[i];\n        const b = majors[i + 1];\n        const z0 = a.z;\n        const dz = b.z - a.z;\n        for (let j = 1; j <= X_MINOR_TICKS_PER_INTERVAL; j++) {\n            const frac = j / (X_MINOR_TICKS_PER_INTERVAL + 1);\n            const width = j === 5 ? midLen : minorLen;\n            ticks.push({\n                x: plot.originX - 0.5 * width,\n                y: plot.originY,\n                z: z0 + dz * frac,\n                width,\n                height: 2.0 * radius,\n                depth: 2.0 * radius,\n                angleZ: 0.0,\n                angleX: 0.0,\n                angleY: 0.0,\n                markerStyle: 'tube',\n                color: j === 5 ? midColor : minorColor,\n            });\n        }\n    }\n    return ticks;\n}\n\n/* Place z-axis tick labels so the shared depth rail remains readable in the tilted presentation. */\nfunction zTickLabelPlacements(node) {\n    if (!wantsVisibleAxes(node) || !wantsVisibleZAxis(node)) {\n        return [];\n    }\n    const ticks = zMajorTickPlacements(node);\n    const fontSize = 12;\n    const gap = 6;\n    const axis = plotAxis(node, 'z');\n    return ticks.map((tick, i) => ({\n        text: axisTickText(axis, i),\n        x: tick.x - 0.5 * tick.width - gap,\n        y: tick.y,\n        z: tick.z,\n        fontSize,\n        fontColor: [0.70, 0.72, 0.76, 1.0],\n        angleX: -X_TICK_TILT,\n        angleZ: -0.5 * Math.PI,\n    }));\n}\n\n/* Place the z-axis title from the shared tilted depth-rail baseline. */\nfunction zAxisTitlePlacement(node) {\n    if (!wantsVisibleAxes(node) || !wantsVisibleZAxis(node)) {\n        return null;\n    }\n    const plot = plotFrame(node);\n    const major = zMajorTickPlacements(node)[0];\n    const axis = plotAxis(node, 'z');\n    const majorLen = major?.width ?? Math.max(4.0, plot.width * 0.03);\n    return {\n        name: axis.name,\n        unit: axis.unit,\n        x: plot.originX - majorLen - 26,\n        y: plot.originY + 6,\n        z: plot.originZ + 0.5 * plot.depth,\n        angleX: -X_TICK_TILT,\n        angleZ: -0.5 * Math.PI,\n        nameFontSize: 18,\n        unitFontSize: 18,\n        nameColor: [0.82, 0.84, 0.88, 1.0],\n        unitColor: [0.60, 0.63, 0.68, 1.0],\n    };\n}\n\n/* Gather every shared tick rod so cartesian renderers can batch the chrome in one pass. */\nexport function allTickPlacements(node) {\n    return [\n        ...xTickPlacements(node),\n        ...yTickPlacements(node),\n        ...zTickPlacements(node),\n    ];\n}\n\n/* Rotate shared text labels in axis order so title and tick transforms stay consistent across plugins. */\nexport function applyTextRotations(localToParent, spec) {\n    let out = localToParent;\n    if (spec.angleX) {\n        out = twgl.m4.multiply(out, twgl.m4.rotationX(spec.angleX));\n    }\n    if (spec.angleY) {\n        out = twgl.m4.multiply(out, twgl.m4.rotationY(spec.angleY));\n    }\n    if (spec.angleZ) {\n        out = twgl.m4.multiply(out, twgl.m4.rotationZ(spec.angleZ));\n    }\n    return out;\n}\n\n/* Surface the shared axis title placements as one compact bundle for cartesian plugins. */\nexport function axisTitlePlacements(node) {\n    return {\n        x: xAxisTitlePlacement(node),\n        y: yAxisTitlePlacement(node),\n        z: zAxisTitlePlacement(node),\n    };\n}\n\n/* Surface the shared tick-label placements as one compact bundle for cartesian plugins. */\nexport function axisTickLabelPlacements(node) {\n    return {\n        x: xTickLabelPlacements(node),\n        y: yTickLabelPlacements(node),\n        z: zTickLabelPlacements(node),\n    };\n}\n\n/* Surface the shared major tick placements for testing and for future cartesian plugin reuse. */\nexport function axisMajorTickPlacements(node) {\n    return {\n        x: xMajorTickPlacements(node),\n        y: yMajorTickPlacements(node),\n        z: zMajorTickPlacements(node),\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as ptlf from '../ptrless/flags.mjs';\n\nexport const DEFAULT_COLUMN_WINDOW = 12;\nconst HIDDEN_DIMENSION = '\u2026';\nconst tableDataCache = new WeakMap();\n\n/*\n * Project the canonical List[Hetero] representation into TableView's compact\n * column interface. The LogicalAxis owns row cardinality; its physical\n * Struct, Tuple, or NamedTuple child owns the columns.\n */\nexport function tableViewData(value) {\n    if (!value) {\n        return null;\n    }\n    const physicalType = typeof value.physicalType === 'function' ? value.physicalType() : '';\n    if (physicalType !== 'LogicalAxis') {\n        return typeof value.fieldNames === 'function' && typeof value.field === 'function'\n            ? value\n            : null;\n    }\n    const cached = tableDataCache.get(value);\n    if (cached) {\n        return cached;\n    }\n    if (typeof value.items !== 'function' || typeof value.length !== 'function') {\n        return null;\n    }\n    const items = value.items();\n    const itemType = typeof items?.physicalType === 'function' ? items.physicalType() : '';\n    if (!['Struct', 'Tuple', 'NamedTuple'].includes(itemType)\n        || typeof items?.fieldNames !== 'function' || typeof items?.field !== 'function') {\n        return null;\n    }\n    const sourceNames = items.fieldNames();\n    const names = sourceNames.map((name, index) => {\n        if (itemType === 'Tuple') return `[${index}]`;\n        if (itemType === 'NamedTuple') return `[${index}] ${name}`;\n        return name;\n    });\n    if (new Set(names).size !== names.length) {\n        throw new Error(`TableView requires distinct rendered column headers; got ${JSON.stringify(names)}.`);\n    }\n    const sourceNameByDisplayName = new Map(names.map((name, index) => [name, sourceNames[index]]));\n    const table = Object.freeze({\n        fieldNames: () => names,\n        field: (name) => {\n            if (!sourceNameByDisplayName.has(name)) {\n                throw new Error(`TableView column '${name}' does not exist.`);\n            }\n            return items.field(sourceNameByDisplayName.get(name));\n        },\n        length: () => value.length(),\n        meta: () => value.meta(),\n        logicalType: () => value.logicalType(),\n        deepLogicalType: () => value.deepLogicalType?.() ?? value.logicalType(),\n        totalHashHex: () => value.totalHashHex?.(),\n        _builder: value._builder,\n    });\n    tableDataCache.set(value, table);\n    return table;\n}\n\nexport function isTableViewData(value) {\n    return tableViewData(value) !== null;\n}\n\nexport function isPassiveTablePreviewMode({ isScreenshot = false, inlineInputEnabled = false } = {}) {\n    return !!isScreenshot && !inlineInputEnabled;\n}\n\n// Metadata objects should preview as one table cell, not as nested lazy data.\nfunction isMetadataValue(value) {\n    if (!value) {\n        return false;\n    }\n    try {\n        const physical = typeof value.physicalType === 'function' ? value.physicalType() : '';\n        const logical = typeof value.logicalType === 'function' ? value.logicalType() : '';\n        return physical === 'MetadataV1' || physical === 'MetadataV2'\n            || logical === 'MetadataV1' || logical === 'MetadataV2';\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction previewFlagsValue(value) {\n    if (value?._slot !== 'flags' || typeof value.valueBig !== 'function') {\n        return null;\n    }\n    try {\n        const flags = value.valueBig();\n        return flags === null ? 'NULL' : '0x' + flags.toString(16);\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction previewValue(value) {\n    if (!value) {\n        return value;\n    }\n    // Show metadata flags as the raw hex bitset.\n    const flagsValue = previewFlagsValue(value);\n    if (flagsValue !== null) {\n        return flagsValue;\n    }\n    // Table cells display string content rather than its quoted source representation.\n    if (typeof value.toText === 'function' && value.valid() !== false) {\n        const type = value.logicalType();\n        if (type === 'Str' || type === 'oStr') {\n            return value.toText();\n        }\n    }\n    if (typeof value.preview === 'function') {\n        try {\n            return value.preview();\n        } catch (_err) {\n        }\n    }\n    if (typeof value.toString === 'function') {\n        try {\n            return value.toString();\n        } catch (_err) {\n        }\n    }\n    return value;\n}\n\nexport function previewRowCount(field) {\n    // Typed null values still occupy one visible preview row.\n    if (field && typeof field.valid === 'function' && !field.valid()) {\n        return 1;\n    }\n    if (!field || typeof field.isScalar !== 'function' || field.isScalar()) {\n        return 1;\n    }\n    if (typeof field.length === 'function') {\n        return field.length();\n    }\n    return 1;\n}\n\nexport function previewCell(field, i) {\n    if (!field) {\n        return null;\n    }\n    // Show typed null values directly instead of dereferencing them.\n    if (typeof field.valid === 'function' && !field.valid()) {\n        return i === 0 ? previewValue(field) : null;\n    }\n    if (isMetadataValue(field)) {\n        return i === 0 ? previewValue(field) : null;\n    }\n    if (typeof field.isScalar !== 'function' || field.isScalar()) {\n        const nested = typeof field.isLeaf === 'function' && !field.isLeaf();\n        if (i !== 0) {\n            return null;\n        }\n        if (nested) {\n            return HIDDEN_DIMENSION;\n        }\n        return previewValue(field);\n    }\n    if (field.isLeaf() && typeof field.at === 'function') {\n        // Other columns can make this row visible even when this list is empty.\n        if (typeof field.length === 'function' && i >= field.length()) {\n            return null;\n        }\n        return previewValue(field.at(i));\n    }\n    return HIDDEN_DIMENSION;\n}\n\nexport function tablePreviewSignature(struct, columnCount = DEFAULT_COLUMN_WINDOW, rowCount = 10) {\n    if (!struct || typeof struct.fieldNames !== 'function' || typeof struct.field !== 'function') {\n        return '';\n    }\n    const cols = struct.fieldNames().slice(0, columnCount);\n    const rows = [];\n    let visibleRows = 0;\n    for (const name of cols) {\n        visibleRows = Math.max(visibleRows, previewRowCount(struct.field(name)));\n    }\n    visibleRows = Math.min(rowCount, visibleRows);\n    for (let row = 0; row < visibleRows; row++) {\n        const values = [];\n        for (const name of cols) {\n            values.push(String(previewCell(struct.field(name), row)));\n        }\n        rows.push(values.join('\\u241f'));\n    }\n    return `${cols.join('\\u241e')}|${rows.join('\\u241d')}`;\n}\n\nexport function measureCellHeight(value, style) {\n    const entrylayout = evilfont.MSDFText.measureFromState({\n        font: style.font,\n        fontSize: style.fontSize,\n        text: String(value),\n    });\n    return entrylayout.height + style.cellPadding;\n}\n\nfunction scalarInt(value, name, index) {\n    if (typeof value === 'number') {\n        if (!Number.isInteger(value)) {\n            throw new Error(`Field ${name} entry ${index} must be an integer.`);\n        }\n        return value;\n    }\n    if (typeof value === 'bigint') {\n        return Number(value);\n    }\n    if (!value) {\n        throw new Error(`Field ${name} must be a list of Int values.`);\n    }\n    if (typeof value.valueBig === 'function') {\n        const big = value.valueBig();\n        if (typeof big === 'bigint') {\n            return Number(big);\n        }\n    }\n    if (typeof value.value === 'function') {\n        const n = value.value();\n        if (!Number.isInteger(n)) {\n            throw new Error(`Field ${name} entry ${index} must be an integer.`);\n        }\n        return n;\n    }\n    throw new Error(`Field ${name} must be a list of Int values.`);\n}\n\nfunction fieldIntList(obj, name) {\n    const value = safeField(obj, name);\n    if (!value || typeof value.length !== 'function' || typeof value.at !== 'function') {\n        return [];\n    }\n    const out = [];\n    const n = value.length();\n    for (let i = 0; i < n; i++) {\n        out.push(scalarInt(value.at(i), name, i));\n    }\n    return out;\n}\n\n/* Use nearest-rank percentile so a small set of tall columns still pulls the shared row height upward. */\nfunction nearestRank(values, percentile) {\n    if (!Array.isArray(values) || values.length === 0) {\n        return null;\n    }\n    const p = Math.max(0, Math.min(1, percentile));\n    const sorted = values.slice().sort((a, b) => a - b);\n    const rank = Math.max(0, Math.ceil(sorted.length * p) - 1);\n    return sorted[rank];\n}\n\n/* Reduce preview-hint sidecar values to one width per column and one shared row height. */\nexport function inferPreviewTableLayout(previewHints, { rowHeightPercentile = 0.9 } = {}) {\n    const displayWidths = fieldIntList(previewHints, 'display_width');\n    const displayHeights = fieldIntList(previewHints, 'display_height');\n    const count = Math.max(displayWidths.length, displayHeights.length);\n    if (count === 0) {\n        return {\n            columnWidths: [],\n            rowHeight: null,\n        };\n    }\n\n    const columnWidths = Array.from({ length: count }, (_x, i) => {\n        const chars = displayWidths[i];\n        if (!Number.isInteger(chars) || chars <= 0) {\n            return null;\n        }\n        return chars;\n    });\n\n    const rowHeightChars = nearestRank(\n        displayHeights.filter((n) => Number.isInteger(n) && n > 0),\n        rowHeightPercentile,\n    );\n    return {\n        columnWidths,\n        rowHeight: rowHeightChars,\n    };\n}\n\nexport function unquoteText(text) {\n    if (typeof text !== 'string') {\n        return text;\n    }\n    if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n        return text.slice(1, -1);\n    }\n    return text;\n}\n\nexport function safeField(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        return null;\n    }\n    try {\n        return obj.field(name);\n    } catch (_err) {\n        return null;\n    }\n}\n\nexport function safeMeta(obj) {\n    if (!obj || typeof obj.meta !== 'function') {\n        return null;\n    }\n    try {\n        return obj.meta();\n    } catch (_err) {\n        return null;\n    }\n}\n\nexport function scalarText(obj) {\n    if (!obj || typeof obj.valid !== 'function' || !obj.valid()) {\n        return null;\n    }\n    if (typeof obj.toString !== 'function') {\n        return null;\n    }\n    return unquoteText(obj.toString());\n}\n\nfunction metadataText(meta, name) {\n    let cur = meta;\n    const seen = new Set();\n    while (cur) {\n        if (typeof cur.valid === 'function' && !cur.valid()) {\n            return null;\n        }\n        if (seen.has(cur)) {\n            throw new Error(`Cycle detected while resolving metadata ${name}.`);\n        }\n        seen.add(cur);\n        const text = scalarText(safeField(cur, name));\n        if (text) {\n            return text;\n        }\n        const flags = metadataDescribedFlags(cur);\n        if (flags === null) {\n            return null;\n        }\n        switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_ARRAY_VEC:\n        case ptlf.outer_ARRAY_LIST:\n        case ptlf.outer_ARRAY_SET:\n        case ptlf.outer_ARRAY_BAG:\n        case ptlf.outer_HOMO_VEC:\n        case ptlf.outer_HOMO_LIST:\n        case ptlf.outer_HOMO_SET:\n        case ptlf.outer_HOMO_BAG:\n            cur = safeField(cur, 'items_metatype');\n            break;\n        default:\n            return null;\n        }\n    }\n    return null;\n}\n\nexport function metadataDescribedFlags(meta) {\n    const field = safeField(meta, 'flags');\n    if (!field || typeof field.valid !== 'function' || !field.valid()) {\n        return null;\n    }\n    if (typeof field.valueBig === 'function') {\n        try {\n            return field.valueBig();\n        } catch (_err) {\n        }\n    }\n    if (typeof field.value === 'function') {\n        try {\n            const value = field.value();\n            return value === null ? null : BigInt(value);\n        } catch (_err) {\n        }\n    }\n    return null;\n}\n\nexport function metadataUnit(meta) {\n    return metadataText(meta, 'unit');\n}\n\nexport function metadataBasis(meta) {\n    return metadataText(meta, 'basis');\n}\n\n/* Resolve one integer metadata field through collection wrappers so column display hints survive cold loads. */\nfunction metadataInt(meta, name) {\n    let cur = meta;\n    const seen = new Set();\n    while (cur) {\n        if (typeof cur.valid === 'function' && !cur.valid()) {\n            return null;\n        }\n        if (seen.has(cur)) {\n            throw new Error(`Cycle detected while resolving metadata ${name}.`);\n        }\n        seen.add(cur);\n        const field = safeField(cur, name);\n        if (field && typeof field.valid === 'function' && field.valid()) {\n            const value = scalarInt(field, name, 0);\n            if (Number.isInteger(value) && value > 0) {\n                return value;\n            }\n            return null;\n        }\n        const flags = metadataDescribedFlags(cur);\n        if (flags === null) {\n            return null;\n        }\n        switch (flags & ptlf.outer_MASK) {\n        case ptlf.outer_ARRAY_VEC:\n        case ptlf.outer_ARRAY_LIST:\n        case ptlf.outer_ARRAY_SET:\n        case ptlf.outer_ARRAY_BAG:\n        case ptlf.outer_HOMO_VEC:\n        case ptlf.outer_HOMO_LIST:\n        case ptlf.outer_HOMO_SET:\n        case ptlf.outer_HOMO_BAG:\n            cur = safeField(cur, 'items_metatype');\n            break;\n        default:\n            return null;\n        }\n    }\n    return null;\n}\n\nexport function fieldUnit(field) {\n    return metadataUnit(safeMeta(field));\n}\n\nexport function fieldBasis(field) {\n    return metadataBasis(safeMeta(field));\n}\n\nexport function fieldDescription(field) {\n    return metadataText(safeMeta(field), 'description');\n}\n\n/* Include table provenance when inspecting a column, as Puff field lookup does. */\nexport function fieldLineage(field, table = null) {\n    const fieldMeta = safeMeta(field);\n    const tableMeta = safeMeta(table);\n    const readList = (meta, name) => {\n        const list = safeField(meta, name);\n        if (!list || (list.isScalar() && (list.flags() & ptlf.SCALAR_VALID) === 0n)) {\n            return [];\n        }\n        return list.toArray();\n    };\n    const readInheritedList = (name) => {\n        const entries = readList(fieldMeta, name);\n        return tableMeta\n            ? [...new Set([...entries, ...readList(tableMeta, name)])].sort()\n            : entries;\n    };\n    return {\n        sources: readInheritedList('source_lineage'),\n        artifacts: readInheritedList('artifact_lineage'),\n    };\n}\n\nexport function fieldNullable(field) {\n    const nullable = fieldValueNullable(field);\n    return nullable === null ? null : String(nullable);\n}\n\nfunction metadataBool(meta, name) {\n    const text = scalarText(safeField(meta, name));\n    if (text === 'true') return true;\n    if (text === 'false') return false;\n    return null;\n}\n\n/* Read one cell's nullability, removing only the column's row collection. */\nexport function fieldValueNullable(field) {\n    const meta = safeMeta(field);\n    const flags = metadataDescribedFlags(meta);\n    if (flags === null) return metadataBool(meta, 'object_nullable');\n    switch (flags & ptlf.outer_MASK) {\n    case ptlf.outer_ARRAY_VEC:\n    case ptlf.outer_ARRAY_LIST:\n    case ptlf.outer_ARRAY_SET:\n    case ptlf.outer_ARRAY_BAG:\n        return (flags & ptlf.inner_NULLABLE) !== 0n;\n    case ptlf.outer_HOMO_VEC:\n    case ptlf.outer_HOMO_LIST:\n    case ptlf.outer_HOMO_SET:\n    case ptlf.outer_HOMO_BAG:\n        return metadataBool(safeField(meta, 'items_metatype'), 'object_nullable');\n    default:\n        return metadataBool(meta, 'object_nullable');\n    }\n}\n\nexport function fieldPIIState(field) {\n    const text = fieldPII(field);\n    if (text === 'true') return true;\n    if (text === 'false') return false;\n    return null;\n}\n\nexport function fieldSorted(field) {\n    return metadataText(safeMeta(field), 'sorted');\n}\n\nexport function fieldUnique(field) {\n    return metadataText(safeMeta(field), 'unique');\n}\n\nexport function fieldPII(field) {\n    return metadataText(safeMeta(field), 'pii');\n}\n\nexport function fieldDisplayWidth(field) {\n    return metadataInt(safeMeta(field), 'display_width');\n}\n\nexport function headerLogicalType(field) {\n    const type = typeof field?.logicalType === 'function' ? field.logicalType() : '';\n    return type.replace(/:([A-Za-z_][A-Za-z0-9_]*)\\[/g, '[');\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { VisualizationPlugin } from './visualization-plugin.mjs';\nimport {\n    GeometryPlot,\n    syncComposedGeometryPlotBufferInfo,\n    testingBuildComposedGeometryPlotArrays,\n    testingBuildComposedGeometryPlotTickArrays,\n    testingGeometryPlotHoverBlinkForNode,\n} from './geometry-plot.mjs';\nimport {\n    allTickPlacements,\n    applyTextRotations,\n    axisMajorTickPlacements,\n    axisPlacements,\n    axisTickLabelPlacements,\n    axisTitleGapText,\n    axisTitlePlacements,\n    axisTitleUnitText,\n    defaultAxisModel,\n    defaultPlotModel,\n    formatTick,\n    formatTooltipValue,\n    normaliseToBounds,\n    outwardBounds,\n    plotFrame,\n    wantsVisibleZAxis,\n} from './cartesian-plot-baseline.mjs';\nimport { DIRTY } from './dirty-flags.mjs';\nimport { fieldUnit } from './tableview-helpers.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nexport { formatTick, outwardBounds } from './cartesian-plot-baseline.mjs';\n\nexport function syncScatterPlotBufferInfo(gl, shared, opts = {}) {\n    return syncComposedGeometryPlotBufferInfo(gl, shared, opts);\n}\n\nexport function testingBuildScatterPlotArrays(shared) {\n    return testingBuildComposedGeometryPlotArrays(shared);\n}\n\nexport function testingBuildScatterPlotTickArrays(shared) {\n    return testingBuildComposedGeometryPlotTickArrays(shared);\n}\n\nexport function testingScatterplotHoverBlinkForNode(node, nowS) {\n    return testingGeometryPlotHoverBlinkForNode(node, nowS);\n}\n\nconst POINT_HOME_HUE = 0.10;\nconst POINT_HUE_JITTER = 0.045;\nconst POINT_SAT_MIN = 0.34;\nconst POINT_SAT_MAX = 0.52;\nconst POINT_VAL_MIN = 0.72;\nconst POINT_VAL_MAX = 0.86;\nconst COLOR_AXIS_HUE_MIN = 0.03;\nconst COLOR_AXIS_HUE_MAX = 0.78;\nconst LINEPLOT_POINT_RADIUS_SCALE = 0.23;\nconst LINEPLOT_DEFAULT_COLOR = Object.freeze([0.996, 0.384, 0.184, 0.94]);\nconst PALETTE_COLOR_LABEL = 'Color';\n\nconst NAMED_PALETTE_COLOR_MAP = (() => {\n    const entries = Object.entries(Palette ?? {});\n    const map = new Map();\n    for (const [name, rgba] of entries) {\n        if (typeof name !== 'string' || !Array.isArray(rgba)) {\n            continue;\n        }\n        map.set(name.trim().toLowerCase(), [...rgba]);\n    }\n    return map;\n})();\n\n/* Resolve one palette constant-color token into the canonical RGBA payload used by point specs. */\nfunction paletteColorByName(name) {\n    if (typeof name !== 'string') {\n        throw new Error('ScatterPlot constant color must be supplied as palette text.');\n    }\n    const trimmed = name.trim();\n    if (!trimmed) {\n        throw new Error('Color unknown or not available from the palette.');\n    }\n    const match = NAMED_PALETTE_COLOR_MAP.get(trimmed.toLowerCase());\n    if (!match) {\n        throw new Error('Color unknown or not available from the palette.');\n    }\n    return { rgba: [...match], label: trimmed };\n}\n\n/* Map one HSV triple onto the soft default palette used by scatter rows. */\nfunction hueColor(h, s = 0.42, v = 0.78) {\n    const i = Math.floor(h * 6.0);\n    const f = h * 6.0 - i;\n    const p = v * (1.0 - s);\n    const q = v * (1.0 - f * s);\n    const t = v * (1.0 - (1.0 - f) * s);\n    switch (i % 6) {\n    case 0: return [v, t, p, 1.0];\n    case 1: return [q, v, p, 1.0];\n    case 2: return [p, v, t, 1.0];\n    case 3: return [p, q, v, 1.0];\n    case 4: return [t, p, v, 1.0];\n    default: return [v, p, q, 1.0];\n    }\n}\n\n/* Keep the point-colour noise deterministic from the row values themselves. */\nfunction fract(x) {\n    return x - Math.floor(x);\n}\n\n/* Hash one row into a stable pseudo-random scalar used for hue, saturation, and value jitter. */\nfunction hashPointSeed(x, y, z, i) {\n    const seed = x * 0.754877666 + y * 0.569840291 + z * 0.438289623 + i * 0.618033989;\n    return fract(Math.sin(seed * 12.9898) * 43758.5453123);\n}\n\nexport function scatterPointColor(row, i, colorAxis = null, plotKind = 'scatterplot') {\n    const r0 = hashPointSeed(row.x, row.y, row.z, i);\n    const r1 = hashPointSeed(row.y, row.z, row.x, i + 17);\n    const r2 = hashPointSeed(row.z, row.x, row.y, i + 43);\n    if (!colorAxis && plotKind === 'lineplot') {\n        return [...LINEPLOT_DEFAULT_COLOR];\n    }\n    const hue = colorAxis && Number.isFinite(row.c)\n        ? COLOR_AXIS_HUE_MIN + (COLOR_AXIS_HUE_MAX - COLOR_AXIS_HUE_MIN) * normaliseToBounds(row.c, colorAxis)\n        : fract(POINT_HOME_HUE + (r0 - 0.5) * 2.0 * POINT_HUE_JITTER);\n    const sat = POINT_SAT_MIN + (POINT_SAT_MAX - POINT_SAT_MIN) * r1;\n    const val = POINT_VAL_MIN + (POINT_VAL_MAX - POINT_VAL_MIN) * r2;\n    return hueColor(hue, sat, val);\n}\n\nexport function scatterPointRadius(baseRadius, row, sizeAxis = null) {\n    if (!sizeAxis || !Number.isFinite(row.s) || row.s <= 0) {\n        return baseRadius;\n    }\n    if (!Number.isFinite(sizeAxis.maxPositive) || sizeAxis.maxPositive <= 0) {\n        return 0.0;\n    }\n    return baseRadius * Math.cbrt(row.s / sizeAxis.maxPositive);\n}\n\n/* Undo the ptrless quoted-scalar presentation when we want user-facing axis titles. */\nfunction unquoteText(text) {\n    if (typeof text !== 'string') {\n        return '';\n    }\n    if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n        return text.slice(1, -1);\n    }\n    return text;\n}\n\n/* Project one scalar-like ptrless object into display text, failing closed to the empty string. */\nfunction scalarText(obj) {\n    if (!obj || typeof obj.valid === 'function' && !obj.valid()) {\n        return '';\n    }\n    if (typeof obj.toText === 'function') {\n        try {\n            return obj.toText();\n        } catch (_err) {\n        }\n    }\n    if (typeof obj.toString === 'function') {\n        try {\n            return unquoteText(obj.toString());\n        } catch (_err) {\n        }\n    }\n    return '';\n}\n\n/* Read one optional metadata field without letting malformed metadata break plot construction. */\nfunction metaFieldText(obj, name) {\n    if (!obj || typeof obj.meta !== 'function') {\n        return '';\n    }\n    try {\n        const meta = obj.meta();\n        if (!meta || typeof meta.field !== 'function') {\n            return '';\n        }\n        return scalarText(meta.field(name));\n    } catch (_err) {\n        return '';\n    }\n}\n\n/* Resolve one top-level struct field title from the authoritative field_metatypes tuple when present. */\nfunction fieldMetatypeTitle(struct, index) {\n    if (!struct || typeof struct.meta !== 'function') {\n        return '';\n    }\n    try {\n        const meta = struct.meta();\n        if (!meta || typeof meta.field !== 'function') {\n            return '';\n        }\n        const tuple = meta.field('field_metatypes');\n        if (!tuple || typeof tuple.storageAt !== 'function') {\n            return '';\n        }\n        const fieldMeta = tuple.storageAt(index);\n        return scalarText(fieldMeta?.field?.('title'));\n    } catch (_err) {\n        return '';\n    }\n}\n\n/* Find one named field in the struct metadata so field titles can be derived in field order. */\nfunction scatterplotFieldIndex(struct, name) {\n    if (!struct || typeof struct.meta !== 'function') {\n        return -1;\n    }\n    try {\n        const meta = struct.meta();\n        if (!meta || typeof meta.field !== 'function') {\n            return -1;\n        }\n        const names = meta.field('field_names');\n        if (!names || typeof names.length !== 'function' || typeof names.at !== 'function') {\n            return -1;\n        }\n        const len = names.length();\n        for (let i = 0; i < len; i += 1) {\n            if (scalarText(names.at(i)) === name) {\n                return i;\n            }\n        }\n    } catch (_err) {\n    }\n    return -1;\n}\n\n/* Prefer the struct-level metadata title, then the field-local title, then the raw field name. */\nfunction fieldTitle(struct, name, field) {\n    const index = scatterplotFieldIndex(struct, name);\n    return (index >= 0 ? fieldMetatypeTitle(struct, index) : '')\n        || metaFieldText(field, 'title')\n        || name;\n}\n\n/* Read one optional field without letting absent axes throw during empty/fallback plot construction. */\nfunction maybeField(struct, name) {\n    if (!struct || typeof struct.field !== 'function') {\n        return null;\n    }\n    try {\n        return struct.field(name);\n    } catch (_err) {\n        return null;\n    }\n}\n\n/* Build the cartesian scatter/line model from the conventional x/y/z/(c)/(s) struct contract. */\nfunction buildScatterPlotModel(struct, plotKind = 'scatterplot') {\n    if (!struct || typeof struct.field !== 'function') {\n        return defaultPlotModel();\n    }\n\n    const xField = maybeField(struct, 'x');\n    const yField = maybeField(struct, 'y');\n    const zField = maybeField(struct, 'z');\n    const cField = maybeField(struct, 'c');\n    const sField = maybeField(struct, 's');\n    if (typeof xField.length !== 'function' || typeof yField.length !== 'function' || typeof zField.length !== 'function') {\n        throw new Error('ScatterPlot requires array-like x/y/z fields.');\n    }\n    const len = xField.length();\n    if (yField.length() !== len || zField.length() !== len) {\n        throw new Error(`ScatterPlot requires equal-length x/y/z fields. Got x=${len} y=${yField.length()} z=${zField.length()}.`);\n    }\n    const cFieldIsSeries = !!cField && typeof cField.length === 'function' && typeof cField.at === 'function';\n    let constantColor = null;\n    if (cField && !cFieldIsSeries) {\n        const text = scalarText(cField);\n        constantColor = paletteColorByName(text);\n    }\n    if (cFieldIsSeries && cField.length() !== len) {\n        throw new Error(`ScatterPlot requires color axis length to match x/y/z. Got x=${len} c=${cField.length()}.`);\n    }\n    if (sField && typeof sField.length !== 'function') {\n        throw new Error('ScatterPlot size axis must be array-like.');\n    }\n    if (sField && sField.length() !== len) {\n        throw new Error(`ScatterPlot requires size axis length to match x/y/z. Got x=${len} s=${sField.length()}.`);\n    }\n\n    const rows = [];\n    let xMin = Infinity;\n    let xMax = -Infinity;\n    let yMin = Infinity;\n    let yMax = -Infinity;\n    let zMin = Infinity;\n    let zMax = -Infinity;\n    let cMin = Infinity;\n    let cMax = -Infinity;\n    let sMin = Infinity;\n    let sMax = -Infinity;\n    for (let i = 0; i < len; i += 1) {\n        const xVal = xField.at(i);\n        const yVal = yField.at(i);\n        const zVal = zField.at(i);\n        if (xVal === null || yVal === null || zVal === null) {\n            continue;\n        }\n        const cVal = cFieldIsSeries ? cField.at(i) : null;\n        const sVal = sField ? sField.at(i) : null;\n        const x = Number(xVal);\n        const y = Number(yVal);\n        const z = Number(zVal);\n        if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n            throw new Error(`ScatterPlot requires finite numeric x/y/z values. Row ${i} is x=${xVal} y=${yVal} z=${zVal}.`);\n        }\n        let c = null;\n        if (cFieldIsSeries && cVal !== null) {\n            c = Number(cVal);\n            if (!Number.isFinite(c)) {\n                throw new Error(`ScatterPlot requires finite numeric c values. Row ${i} is c=${cVal}.`);\n            }\n            cMin = Math.min(cMin, c);\n            cMax = Math.max(cMax, c);\n        }\n        let s = null;\n        if (sField && sVal !== null) {\n            const raw = Number(sVal);\n            if (Number.isFinite(raw) && raw > 0) {\n                s = raw;\n                sMin = Math.min(sMin, s);\n                sMax = Math.max(sMax, s);\n            }\n        }\n        rows.push({ x, y, z, c, s });\n        xMin = Math.min(xMin, x);\n        xMax = Math.max(xMax, x);\n        yMin = Math.min(yMin, y);\n        yMax = Math.max(yMax, y);\n        zMin = Math.min(zMin, z);\n        zMax = Math.max(zMax, z);\n    }\n\n    const xBounds = outwardBounds(xMin, xMax);\n    const yBounds = outwardBounds(yMin, yMax);\n    const zBounds = outwardBounds(zMin, zMax);\n    const hideZAxis = Number.isFinite(zMin) && Number.isFinite(zMax) && zMin === 0 && zMax === 0;\n    const colorAxis = cFieldIsSeries && Number.isFinite(cMin) && Number.isFinite(cMax)\n        ? {\n            key: 'c',\n            name: fieldTitle(struct, 'c', cField),\n            unit: fieldUnit(cField) || '',\n            ...outwardBounds(cMin, cMax),\n            type: cField.logicalType?.() ?? '?',\n        }\n        : null;\n    const sizeAxis = sField && Number.isFinite(sMin) && Number.isFinite(sMax)\n        ? {\n            key: 's',\n            name: fieldTitle(struct, 's', sField),\n            unit: fieldUnit(sField) || '',\n            ...outwardBounds(sMin, sMax),\n            maxPositive: sMax,\n            type: sField.logicalType?.() ?? '?',\n        }\n        : null;\n    const axes = {\n        x: {\n            key: 'x',\n            name: fieldTitle(struct, 'x', xField),\n            unit: fieldUnit(xField) || '',\n            min: xBounds.min,\n            max: xBounds.max,\n            step: xBounds.step,\n            majorCount: xBounds.majorCount,\n            type: xField.logicalType?.() ?? '?',\n        },\n        y: {\n            key: 'y',\n            name: fieldTitle(struct, 'y', yField),\n            unit: fieldUnit(yField) || '',\n            min: yBounds.min,\n            max: yBounds.max,\n            step: yBounds.step,\n            majorCount: yBounds.majorCount,\n            type: yField.logicalType?.() ?? '?',\n        },\n        z: {\n            key: 'z',\n            name: fieldTitle(struct, 'z', zField),\n            unit: fieldUnit(zField) || '',\n            min: zBounds.min,\n            max: zBounds.max,\n            step: zBounds.step,\n            majorCount: zBounds.majorCount,\n            type: zField.logicalType?.() ?? '?',\n        },\n    };\n    if (colorAxis) {\n        axes.c = colorAxis;\n    }\n    if (sizeAxis) {\n        axes.s = sizeAxis;\n    }\n    const pointRadiusScale = plotKind === 'lineplot' ? LINEPLOT_POINT_RADIUS_SCALE : 1.0;\n    const points = rows.map((row, i) => ({\n        u: normaliseToBounds(row.x, axes.x),\n        v: normaliseToBounds(row.y, axes.y),\n        w: normaliseToBounds(row.z, axes.z),\n        s: row.s,\n        rx: 0.0,\n        ry: 0.0,\n        rz: 0.0,\n        markerStyle: 'sphere',\n        radiusScale: pointRadiusScale,\n        color: constantColor ? [...constantColor.rgba] : scatterPointColor(row, i, colorAxis, plotKind),\n        details: [\n            { key: 'x', label: axes.x.name, value: formatTooltipValue(row.x, axes.x.unit) },\n            { key: 'y', label: axes.y.name, value: formatTooltipValue(row.y, axes.y.unit) },\n            ...(hideZAxis\n                ? []\n                : [{ key: 'z', label: axes.z.name, value: formatTooltipValue(row.z, axes.z.unit) }]),\n            ...(colorAxis && Number.isFinite(row.c)\n                ? [{ key: 'c', label: colorAxis.name, value: formatTooltipValue(row.c, colorAxis.unit) }]\n                : constantColor\n                    ? [{ key: 'color', label: PALETTE_COLOR_LABEL, value: constantColor.label }]\n                    : []),\n            ...(sizeAxis && Number.isFinite(row.s)\n                ? [{ key: 's', label: sizeAxis.name, value: formatTooltipValue(row.s, sizeAxis.unit) }]\n                : []),\n        ],\n    }));\n    const segments = [];\n    if (plotKind === 'lineplot') {\n        for (let i = 0; i < points.length - 1; i += 1) {\n            const a = points[i];\n            const b = points[i + 1];\n            const c0 = a.color;\n            const c1 = b.color;\n            segments.push({\n                a: i,\n                b: i + 1,\n                markerStyle: 'tube',\n                color: [\n                    0.5 * (c0[0] + c1[0]),\n                    0.5 * (c0[1] + c1[1]),\n                    0.5 * (c0[2] + c1[2]),\n                    0.88 * 0.5 * ((c0[3] ?? 1.0) + (c1[3] ?? 1.0)),\n                ],\n            });\n        }\n    }\n    return {\n        points,\n        segments,\n        count: rows.length,\n        axes,\n        hideZAxis,\n    };\n}\n\n/* Render one cartesian visualisation plugin inside a rectangular viewport while delegating primitive batching to child renderers. */\nexport class ScatterPlot extends VisualizationPlugin {\n    #xTickLabels;\n    #xAxisLabelName;\n    #xAxisLabelUnit;\n    #yTickLabels;\n    #yAxisLabelName;\n    #yAxisLabelUnit;\n    #zTickLabels;\n    #zAxisLabelName;\n    #zAxisLabelUnit;\n    #ownGeometryPlot;\n\n    _plotError = null;\n\n    static setHoveringID(id) {\n        GeometryPlot.setHoveringID(id);\n    }\n\n    /* Create one retained tick label node so cartesian label pools can resize without churn. */\n    #newTickLabel(spec) {\n        const label = new evilfont.MSDFText({\n            x: spec.x,\n            y: spec.y,\n            z: spec.z,\n            font: this.state.font,\n            fontSize: spec.fontSize,\n            fontColor: spec.fontColor,\n            text: spec.text,\n        });\n        this.appendChild(label);\n        return label;\n    }\n\n    /* Resize one retained tick-label pool onto the latest placement count. */\n    #syncTickLabelPool(labels, specs) {\n        while (labels.length < specs.length) {\n            labels.push(this.#newTickLabel(specs[labels.length]));\n        }\n        while (labels.length > specs.length) {\n            const label = labels.pop();\n            this.removeChild(label);\n        }\n    }\n\n    constructor(state = {}) {\n        super({\n            struct: null,\n            font: null,\n            titleFont: null,\n            unitFont: null,\n            plotKind: 'scatterplot',\n            markerStyle: 'sphere',\n            hideAxes: false,\n            width: 720,\n            height: 512,\n            ...state,\n        });\n\n        if (!this.state.font) {\n            throw new Error('ScatterPlot requires a font.');\n        }\n        const titleFont = this.state.titleFont || this.state.font;\n        const unitFont = this.state.unitFont || this.state.font;\n\n        this._plotAxes = {\n            x: defaultAxisModel('x'),\n            y: defaultAxisModel('y'),\n            z: defaultAxisModel('z'),\n        };\n        this._plotHideAxes = this.state.hideAxes === true;\n        this._plotHideZAxis = false;\n        this.#ownGeometryPlot = new GeometryPlot({\n            font: this.state.font,\n            width: this.state.width,\n            height: this.state.height,\n        });\n        this.#ownGeometryPlot.setPluginOwner(this);\n        this.#ownGeometryPlot.setLayoutProvider({\n            pointPlacement: (spec) => this.#pointPlacement(spec),\n            axisPlacements: () => axisPlacements(this).filter((spec) => spec.markerStyle === 'tube'),\n            tickPlacements: () => allTickPlacements(this),\n        });\n        this.appendChild(this.#ownGeometryPlot);\n        this.#xTickLabels = axisTickLabelPlacements(this).x.map(spec => this.#newTickLabel(spec));\n\n        this.#xAxisLabelName = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: titleFont,\n            fontSize: 18,\n            fontColor: [0.82, 0.84, 0.88, 1.0],\n            text: 'character_height_cm',\n        });\n        this.appendChild(this.#xAxisLabelName);\n\n        this.#xAxisLabelUnit = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: unitFont,\n            fontSize: 15,\n            fontColor: [0.60, 0.63, 0.68, 1.0],\n            text: 'cm',\n        });\n        this.appendChild(this.#xAxisLabelUnit);\n\n        this.#yTickLabels = axisTickLabelPlacements(this).y.map(spec => this.#newTickLabel(spec));\n\n        this.#yAxisLabelName = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: titleFont,\n            fontSize: 18,\n            fontColor: [0.82, 0.84, 0.88, 1.0],\n            text: 'character_weight_kg',\n        });\n        this.appendChild(this.#yAxisLabelName);\n\n        this.#yAxisLabelUnit = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: unitFont,\n            fontSize: 18,\n            fontColor: [0.60, 0.63, 0.68, 1.0],\n            text: 'kg',\n        });\n        this.appendChild(this.#yAxisLabelUnit);\n\n        this.#zTickLabels = axisTickLabelPlacements(this).z.map(spec => this.#newTickLabel(spec));\n\n        this.#zAxisLabelName = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: titleFont,\n            fontSize: 18,\n            fontColor: [0.82, 0.84, 0.88, 1.0],\n            text: 'reaction_time_ms',\n        });\n        this.appendChild(this.#zAxisLabelName);\n\n        this.#zAxisLabelUnit = new evilfont.MSDFText({\n            x: 0,\n            y: 0,\n            z: 0,\n            font: unitFont,\n            fontSize: 18,\n            fontColor: [0.60, 0.63, 0.68, 1.0],\n            text: 'ms',\n        });\n        this.appendChild(this.#zAxisLabelUnit);\n\n        this.#syncXTickLabelLayout();\n        this.#syncXAxisTitleLayout();\n        this.#syncYTickLabelLayout();\n        this.#syncYAxisTitleLayout();\n        this.#syncZTickLabelLayout();\n        this.#syncZAxisTitleLayout();\n\n        this.setStruct(this.state.struct);\n    }\n\n    mutate(newState) {\n        const prevPlotKind = this.state.plotKind;\n        super.mutate(newState);\n        this._plotHideAxes = this.state.hideAxes === true;\n        this.#ownGeometryPlot.mutate({\n            font: this.state.font,\n            width: this.state.width,\n            height: this.state.height,\n        });\n        if (prevPlotKind !== this.state.plotKind) {\n            this.setStruct(this.state.struct);\n            return;\n        }\n        this.#syncXTickLabelLayout();\n        this.#syncXAxisTitleLayout();\n        this.#syncYTickLabelLayout();\n        this.#syncYAxisTitleLayout();\n        this.#syncZTickLabelLayout();\n        this.#syncZAxisTitleLayout();\n    }\n\n    /* Rebuild the cartesian point/segment model from the authoritative struct contract. */\n    setStruct(struct) {\n        this.state.struct = struct;\n        let model;\n        let plotError = null;\n        try {\n            model = buildScatterPlotModel(struct, this.state.plotKind);\n        } catch (err) {\n            plotError = err;\n            model = defaultPlotModel();\n        }\n        this._plotError = plotError;\n        this._plotAxes = model.axes;\n        this._plotHideZAxis = model.hideZAxis;\n        this.#ownGeometryPlot.setGeometryModel({\n            points: model.points,\n            segments: model.segments,\n            error: plotError,\n        });\n        this.#syncXTickLabelLayout();\n        this.#syncXAxisTitleLayout();\n        this.#syncYTickLabelLayout();\n        this.#syncYAxisTitleLayout();\n        this.#syncZTickLabelLayout();\n        this.#syncZAxisTitleLayout();\n    }\n\n    testingPointPlacement(index = 0) {\n        return this.#ownGeometryPlot.testingPointPlacement(index);\n    }\n\n    testingSegmentPlacement(index = 0) {\n        return this.#ownGeometryPlot.testingSegmentPlacement(index);\n    }\n\n    /* Expose the composed primitive children to local helper shims without pretending the wrapper is itself one batcher. */\n    _primitiveShapeNodes() {\n        return this.#ownGeometryPlot._primitiveShapeNodes();\n    }\n\n    get _pointSpecs() {\n        return this.#ownGeometryPlot._pointSpecs;\n    }\n\n    get _segmentSpecs() {\n        return this.#ownGeometryPlot._segmentSpecs;\n    }\n\n    /* Place one cartesian point inside the plot frame using the current axis and size metadata. */\n    #pointPlacement(spec) {\n        const plot = plotFrame(this);\n        const baseSpan = wantsVisibleZAxis(this)\n            ? Math.min(plot.width, plot.height, plot.depth)\n            : Math.min(plot.width, plot.height);\n        const baseRadius = Math.max(2.5, baseSpan / 20);\n        const pointRadius = scatterPointRadius(baseRadius, spec, this._plotAxes?.s ?? null) * (spec.radiusScale ?? 1.0);\n        const pointSize = 2.0 * pointRadius;\n        const pointDepth = pointSize;\n        const pointZ = wantsVisibleZAxis(this)\n            ? plot.originZ + 0.5 * pointDepth + (plot.depth - pointDepth) * spec.w\n            : plot.originZ + 0.5 * pointDepth;\n        return {\n            x: plot.originX + (plot.width - pointSize) * spec.u,\n            y: plot.originY - pointSize - (plot.height - pointSize) * spec.v,\n            z: pointZ,\n            width: pointSize,\n            height: pointSize,\n            depth: pointDepth,\n        };\n    }\n\n    testingXMajorTickPlacement(index = 0) {\n        return axisMajorTickPlacements(this).x[index] ?? null;\n    }\n\n    testingXAxisTitlePlacement() {\n        return axisTitlePlacements(this).x;\n    }\n\n    testingZAxisTitlePlacement() {\n        return axisTitlePlacements(this).z;\n    }\n\n    testingPlotFrame() {\n        return plotFrame(this);\n    }\n\n    /* Reflow the retained x-axis tick labels against the latest axis placements. */\n    #syncXTickLabelLayout() {\n        if (!this.#xTickLabels) {\n            return;\n        }\n        const specs = axisTickLabelPlacements(this).x;\n        this.#syncTickLabelPool(this.#xTickLabels, specs);\n        for (let i = 0; i < this.#xTickLabels.length; i += 1) {\n            const label = this.#xTickLabels[i];\n            const spec = specs[i];\n            const layout = evilfont.MSDFText.measureFromState({\n                font: label.state.font,\n                fontSize: spec.fontSize,\n                text: spec.text,\n            });\n            let localToParent = twgl.m4.translation([spec.x - 0.5 * layout.width, spec.y, spec.z]);\n            if (spec.angleX) {\n                localToParent = twgl.m4.multiply(localToParent, twgl.m4.rotationX(spec.angleX));\n            }\n            label.setLocalToParent(localToParent);\n            label.mutate({\n                fontSize: spec.fontSize,\n                fontColor: spec.fontColor,\n            });\n            label.setText(spec.text);\n        }\n    }\n\n    /* Reflow the retained x-axis title and unit labels against the latest axis placement. */\n    #syncXAxisTitleLayout() {\n        if (!this.#xAxisLabelName || !this.#xAxisLabelUnit) {\n            return;\n        }\n        const spec = axisTitlePlacements(this).x;\n        if (!spec) {\n            this.#xAxisLabelName.setText('');\n            this.#xAxisLabelUnit.setText('');\n            return;\n        }\n        const nameLayout = evilfont.MSDFText.measureFromState({\n            font: this.#xAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: spec.name,\n        });\n        const unitLayout = evilfont.MSDFText.measureFromState({\n            font: this.#xAxisLabelUnit.state.font,\n            fontSize: spec.unitFontSize,\n            text: axisTitleUnitText(spec.unit),\n        });\n        const hasUnit = Boolean(spec.unit);\n        const gapLayout = evilfont.MSDFText.measureFromState({\n            font: this.#xAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: axisTitleGapText(hasUnit),\n        });\n        const totalWidth = nameLayout.width + gapLayout.width + unitLayout.width;\n        const baseX = spec.x - 0.5 * totalWidth;\n        let nameLocalToParent = twgl.m4.translation([baseX, spec.y, spec.z]);\n        if (spec.angleX) {\n            nameLocalToParent = twgl.m4.multiply(nameLocalToParent, twgl.m4.rotationX(spec.angleX));\n        }\n        let unitLocalToParent = twgl.m4.translation([baseX + nameLayout.width + gapLayout.width, spec.y, spec.z]);\n        if (spec.angleX) {\n            unitLocalToParent = twgl.m4.multiply(unitLocalToParent, twgl.m4.rotationX(spec.angleX));\n        }\n        this.#xAxisLabelName.setLocalToParent(nameLocalToParent);\n        this.#xAxisLabelUnit.setLocalToParent(unitLocalToParent);\n        this.#xAxisLabelName.mutate({\n            fontSize: spec.nameFontSize,\n            fontColor: spec.nameColor,\n        });\n        this.#xAxisLabelUnit.mutate({\n            fontSize: spec.unitFontSize,\n            fontColor: spec.unitColor,\n        });\n        this.#xAxisLabelName.setText(spec.name);\n        this.#xAxisLabelUnit.setText(axisTitleUnitText(spec.unit));\n    }\n\n    /* Reflow the retained y-axis tick labels against the latest axis placements. */\n    #syncYTickLabelLayout() {\n        if (!this.#yTickLabels) {\n            return;\n        }\n        const specs = axisTickLabelPlacements(this).y;\n        this.#syncTickLabelPool(this.#yTickLabels, specs);\n        for (let i = 0; i < this.#yTickLabels.length; i += 1) {\n            const label = this.#yTickLabels[i];\n            const spec = specs[i];\n            const layout = evilfont.MSDFText.measureFromState({\n                font: label.state.font,\n                fontSize: spec.fontSize,\n                text: spec.text,\n            });\n            label.setLocalToParent(twgl.m4.translation([spec.x - layout.width, spec.y - 0.5 * layout.height, spec.z]));\n            label.mutate({\n                fontSize: spec.fontSize,\n                fontColor: spec.fontColor,\n            });\n            label.setText(spec.text);\n        }\n    }\n\n    /* Reflow the retained y-axis title and unit labels against the latest axis placement. */\n    #syncYAxisTitleLayout() {\n        if (!this.#yAxisLabelName || !this.#yAxisLabelUnit) {\n            return;\n        }\n        const spec = axisTitlePlacements(this).y;\n        if (!spec) {\n            this.#yAxisLabelName.setText('');\n            this.#yAxisLabelUnit.setText('');\n            return;\n        }\n        const nameLayout = evilfont.MSDFText.measureFromState({\n            font: this.#yAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: spec.name,\n        });\n        const unitLayout = evilfont.MSDFText.measureFromState({\n            font: this.#yAxisLabelUnit.state.font,\n            fontSize: spec.unitFontSize,\n            text: axisTitleUnitText(spec.unit),\n        });\n        const hasUnit = Boolean(spec.unit);\n        const gapLayout = evilfont.MSDFText.measureFromState({\n            font: this.#yAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: axisTitleGapText(hasUnit),\n        });\n        const totalWidth = nameLayout.width + gapLayout.width + unitLayout.width;\n        let nameLocalToParent = twgl.m4.translation([spec.x, spec.y + 0.5 * totalWidth, spec.z]);\n        nameLocalToParent = twgl.m4.multiply(nameLocalToParent, twgl.m4.rotationZ(spec.angleZ));\n        let unitLocalToParent = twgl.m4.translation([spec.x, spec.y + 0.5 * totalWidth - nameLayout.width - gapLayout.width, spec.z]);\n        unitLocalToParent = twgl.m4.multiply(unitLocalToParent, twgl.m4.rotationZ(spec.angleZ));\n        this.#yAxisLabelName.setLocalToParent(nameLocalToParent);\n        this.#yAxisLabelUnit.setLocalToParent(unitLocalToParent);\n        this.#yAxisLabelName.mutate({\n            fontSize: spec.nameFontSize,\n            fontColor: spec.nameColor,\n        });\n        this.#yAxisLabelUnit.mutate({\n            fontSize: spec.unitFontSize,\n            fontColor: spec.unitColor,\n        });\n        this.#yAxisLabelName.setText(spec.name);\n        this.#yAxisLabelUnit.setText(axisTitleUnitText(spec.unit));\n    }\n\n    /* Reflow the retained z-axis tick labels against the latest axis placements. */\n    #syncZTickLabelLayout() {\n        if (!this.#zTickLabels) {\n            return;\n        }\n        const specs = axisTickLabelPlacements(this).z;\n        this.#syncTickLabelPool(this.#zTickLabels, specs);\n        for (let i = 0; i < this.#zTickLabels.length; i += 1) {\n            const label = this.#zTickLabels[i];\n            const spec = specs[i];\n            const layout = evilfont.MSDFText.measureFromState({\n                font: label.state.font,\n                fontSize: spec.fontSize,\n                text: spec.text,\n            });\n            let localToParent = twgl.m4.translation([spec.x, spec.y, spec.z + 0.5 * layout.width]);\n            localToParent = applyTextRotations(localToParent, spec);\n            label.setLocalToParent(localToParent);\n            label.mutate({\n                fontSize: spec.fontSize,\n                fontColor: spec.fontColor,\n            });\n            label.setText(spec.text);\n        }\n    }\n\n    /* Reflow the retained z-axis title and unit labels against the latest axis placement. */\n    #syncZAxisTitleLayout() {\n        if (!this.#zAxisLabelName || !this.#zAxisLabelUnit) {\n            return;\n        }\n        const spec = axisTitlePlacements(this).z;\n        if (!spec) {\n            this.#zAxisLabelName.setText('');\n            this.#zAxisLabelUnit.setText('');\n            return;\n        }\n        const nameLayout = evilfont.MSDFText.measureFromState({\n            font: this.#zAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: spec.name,\n        });\n        const unitLayout = evilfont.MSDFText.measureFromState({\n            font: this.#zAxisLabelUnit.state.font,\n            fontSize: spec.unitFontSize,\n            text: axisTitleUnitText(spec.unit),\n        });\n        const hasUnit = Boolean(spec.unit);\n        const gapLayout = evilfont.MSDFText.measureFromState({\n            font: this.#zAxisLabelName.state.font,\n            fontSize: spec.nameFontSize,\n            text: axisTitleGapText(hasUnit),\n        });\n        const totalWidth = nameLayout.width + gapLayout.width + unitLayout.width;\n        const baseZ = spec.z - 0.5 * totalWidth;\n        let nameLocalToParent = twgl.m4.translation([spec.x, spec.y, baseZ]);\n        nameLocalToParent = applyTextRotations(nameLocalToParent, spec);\n        let unitLocalToParent = twgl.m4.translation([spec.x, spec.y, baseZ + nameLayout.width + gapLayout.width]);\n        unitLocalToParent = applyTextRotations(unitLocalToParent, spec);\n        this.#zAxisLabelName.setLocalToParent(nameLocalToParent);\n        this.#zAxisLabelUnit.setLocalToParent(unitLocalToParent);\n        this.#zAxisLabelName.mutate({\n            fontSize: spec.nameFontSize,\n            fontColor: spec.nameColor,\n        });\n        this.#zAxisLabelUnit.mutate({\n            fontSize: spec.unitFontSize,\n            fontColor: spec.unitColor,\n        });\n        this.#zAxisLabelName.setText(spec.name);\n        this.#zAxisLabelUnit.setText(axisTitleUnitText(spec.unit));\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst VISUALIZATION_PLUGIN_FACTORIES = new Map();\n\n/* Register one visualization plugin constructor under a stable host-facing kind string. */\nexport function registerVisualizationPlugin(kind, factory) {\n    if (typeof kind !== 'string' || !kind) {\n        throw new Error('registerVisualizationPlugin(kind, factory): kind must be non-empty text.');\n    }\n    if (typeof factory !== 'function') {\n        throw new Error(`registerVisualizationPlugin(${kind}, factory): factory must be a function.`);\n    }\n    if (VISUALIZATION_PLUGIN_FACTORIES.has(kind)) {\n        throw new Error(`Visualization plugin '${kind}' is already registered.`);\n    }\n    VISUALIZATION_PLUGIN_FACTORIES.set(kind, factory);\n}\n\n/* Materialise one visualization plugin through the registry so host code stays decoupled from concrete plugin classes. */\nexport function createVisualizationPlugin(kind, state = {}) {\n    const factory = VISUALIZATION_PLUGIN_FACTORIES.get(kind);\n    if (!factory) {\n        throw new Error(`Visualization plugin '${kind}' is not registered.`);\n    }\n    return factory(state);\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { ScatterPlot } from './scatterplot.mjs';\nimport { createVisualizationPlugin, registerVisualizationPlugin } from './visualization-plugin-registry.mjs';\n\nlet registered = false;\n\n/* Register the current built-in plugin set exactly once so host code can depend only on the registry seam. */\nexport function ensureBuiltInVisualizationPlugins() {\n    if (registered) {\n        return;\n    }\n    registerVisualizationPlugin('scatterplot', (state) => new ScatterPlot(state));\n    registered = true;\n}\n\n/* Force eager registration of live plugins. TaskVisualization is deliberately\n * absent: it is a standalone diagnostic module and has no live registry,\n * Puffbook transport, or document-state entrypoint. */\nensureBuiltInVisualizationPlugins();\n\nexport { createVisualizationPlugin };\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\n\nfunction clampDim(v) {\n    return Math.max(1, Math.round(v || 1));\n}\n\nfunction dims(width, height) {\n    return {\n        width: clampDim(width),\n        height: clampDim(height),\n    };\n}\n\nfunction scaleDims(framebufferDims, viewportDims, targetViewportDims) {\n    if (!framebufferDims || !viewportDims || !targetViewportDims) {\n        return dims(targetViewportDims?.width, targetViewportDims?.height);\n    }\n    if (!Number.isFinite(viewportDims.width) || !Number.isFinite(viewportDims.height) || viewportDims.width <= 0 || viewportDims.height <= 0) {\n        return dims(targetViewportDims.width, targetViewportDims.height);\n    }\n    return dims(\n        targetViewportDims.width * (framebufferDims.width / viewportDims.width),\n        targetViewportDims.height * (framebufferDims.height / viewportDims.height),\n    );\n}\n\nfunction canvasFramebufferDims(gl) {\n    return dims(gl.canvas.width, gl.canvas.height);\n}\n\nfunction canvasViewportDims(gl) {\n    return dims(gl.canvas.clientWidth, gl.canvas.clientHeight);\n}\n\nfunction sameDims(a, b) {\n    return !!a && !!b && a.width === b.width && a.height === b.height;\n}\n\nfunction deleteFramebufferInfo(gl, framebufferInfo) {\n    if (!gl || !framebufferInfo) {\n        return;\n    }\n    const attachments = framebufferInfo.attachments || [];\n    for (const attachment of attachments) {\n        if (!attachment) {\n            continue;\n        }\n        if (typeof WebGLTexture !== 'undefined' && attachment instanceof WebGLTexture) {\n            gl.deleteTexture(attachment);\n            continue;\n        }\n        if (typeof WebGLRenderbuffer !== 'undefined' && attachment instanceof WebGLRenderbuffer) {\n            gl.deleteRenderbuffer(attachment);\n            continue;\n        }\n        if (gl.isTexture?.(attachment)) {\n            gl.deleteTexture(attachment);\n            continue;\n        }\n        if (gl.isRenderbuffer?.(attachment)) {\n            gl.deleteRenderbuffer(attachment);\n        }\n    }\n    if (framebufferInfo.framebuffer) {\n        gl.deleteFramebuffer(framebufferInfo.framebuffer);\n    }\n}\n\nexport class RenderTarget {\n    constructor() {\n        this.gl = null;\n        this._framebufferDimensions = dims(1, 1);\n        this._viewportDimensions = dims(1, 1);\n    }\n\n    acquireContext(gl) {\n        if (!gl) {\n            throw new Error(`${this.constructor.name}.acquireContext(${gl}): expected a live WebGL context.`);\n        }\n        if (this.gl) {\n            throw new Error(`${this.constructor.name}.acquireContext(...) called while already live.`);\n        }\n        this.gl = gl;\n        this._onAcquireContext(gl);\n    }\n\n    releaseContext(gl = this.gl) {\n        if (!this.gl) {\n            console.warn(`${this.constructor.name}.releaseContext(...) called without a live context.`);\n            return;\n        }\n        if (gl && gl !== this.gl) {\n            throw new Error(`${this.constructor.name}.releaseContext(...) called with the wrong WebGL context.`);\n        }\n        const liveGl = this.gl;\n        this._onReleaseContext(liveGl);\n        this.gl = null;\n    }\n\n    bind(gl = this.gl) {\n        const liveGl = this._requireLive(gl, 'bind');\n        this._onBind(liveGl);\n        liveGl.viewport(0, 0, this._framebufferDimensions.width, this._framebufferDimensions.height);\n    }\n\n    framebufferResized(gl = this.gl) {\n        const liveGl = this._requireLive(gl, 'framebufferResized');\n        this._syncFramebufferDimensions(liveGl);\n    }\n\n    viewportResized(gl = this.gl) {\n        const liveGl = this._requireLive(gl, 'viewportResized');\n        this._syncViewportDimensions(liveGl);\n    }\n\n    applyRenderlessViewport({\n        framebufferWidth,\n        framebufferHeight,\n        viewportWidth,\n        viewportHeight,\n    }) {\n        this._framebufferDimensions = dims(framebufferWidth, framebufferHeight);\n        this._viewportDimensions = dims(viewportWidth, viewportHeight);\n        return {\n            framebufferDimensions: this._framebufferDimensions,\n            viewportDimensions: this._viewportDimensions,\n        };\n    }\n\n    framebufferDimensions() {\n        return this._framebufferDimensions;\n    }\n\n    viewportDimensions() {\n        return this._viewportDimensions;\n    }\n\n    borGlFramebufferInfo() {\n        return null;\n    }\n\n    borGlColorTexture() {\n        return null;\n    }\n\n    isOffscreen() {\n        return false;\n    }\n\n    _requireLive(gl, action) {\n        if (!this.gl) {\n            throw new Error(`${this.constructor.name}.${action}(...) called without acquireContext().`);\n        }\n        if (gl && gl !== this.gl) {\n            throw new Error(`${this.constructor.name}.${action}(...) called with the wrong WebGL context.`);\n        }\n        return this.gl;\n    }\n\n    _onAcquireContext(_gl) {\n    }\n\n    _onReleaseContext(_gl) {\n    }\n\n    _onBind(_gl) {\n    }\n\n    _syncFramebufferDimensions(_gl) {\n    }\n\n    _syncViewportDimensions(_gl) {\n    }\n}\n\nexport class CanvasRenderTarget extends RenderTarget {\n    _onBind(gl) {\n        twgl.bindFramebufferInfo(gl, null);\n    }\n\n    _syncFramebufferDimensions(gl) {\n        this._framebufferDimensions = canvasFramebufferDims(gl);\n    }\n\n    _syncViewportDimensions(gl) {\n        this._viewportDimensions = canvasViewportDims(gl);\n    }\n}\n\nexport class TextureRenderTarget extends RenderTarget {\n    constructor() {\n        super();\n        this.ownGlFramebufferInfo = null;\n        this._desiredDimensions = null;\n    }\n\n    isOffscreen() {\n        return true;\n    }\n\n    borGlFramebufferInfo() {\n        return this.ownGlFramebufferInfo;\n    }\n\n    borGlColorTexture() {\n        return this.ownGlFramebufferInfo?.attachments?.[0] ?? null;\n    }\n\n    setDesiredSize(width, height) {\n        if (width === null || height === null) {\n            this._desiredDimensions = null;\n        } else {\n            this._desiredDimensions = dims(width, height);\n        }\n        const viewportDims = this._effectiveViewportDimensions();\n        const framebufferDims = this._effectiveFramebufferDimensions();\n        if (this.gl) {\n            this._ensureFramebufferInfo(this.gl, framebufferDims);\n        } else {\n            this._framebufferDimensions = framebufferDims;\n            this._viewportDimensions = viewportDims;\n        }\n    }\n\n    dropFramebuffer() {\n        if (this.ownGlFramebufferInfo && this.gl) {\n            deleteFramebufferInfo(this.gl, this.ownGlFramebufferInfo);\n        }\n        this.ownGlFramebufferInfo = null;\n    }\n\n    applyRenderlessViewport({\n        framebufferWidth,\n        framebufferHeight,\n        viewportWidth,\n        viewportHeight,\n    }) {\n        const fallbackFramebuffer = dims(framebufferWidth, framebufferHeight);\n        const fallbackViewport = dims(viewportWidth, viewportHeight);\n        const viewportDims = this._desiredDimensions ?? fallbackViewport;\n        const framebufferDims = this._desiredDimensions\n            ? scaleDims(fallbackFramebuffer, fallbackViewport, this._desiredDimensions)\n            : fallbackFramebuffer;\n        this._framebufferDimensions = framebufferDims;\n        this._viewportDimensions = viewportDims;\n        return {\n            framebufferDimensions: this._framebufferDimensions,\n            viewportDimensions: this._viewportDimensions,\n        };\n    }\n\n    _onAcquireContext(gl) {\n        this._ensureFramebufferInfo(gl);\n    }\n\n    _onReleaseContext(gl) {\n        deleteFramebufferInfo(gl, this.ownGlFramebufferInfo);\n        this.ownGlFramebufferInfo = null;\n    }\n\n    _onBind(gl) {\n        this._ensureFramebufferInfo(gl);\n        twgl.bindFramebufferInfo(gl, this.ownGlFramebufferInfo);\n    }\n\n    _syncFramebufferDimensions(gl) {\n        this._ensureFramebufferInfo(gl, this._effectiveFramebufferDimensions(gl));\n    }\n\n    _syncViewportDimensions(_gl) {\n        this._viewportDimensions = this._effectiveViewportDimensions();\n    }\n\n    _effectiveViewportDimensions() {\n        return this._desiredDimensions ?? this._viewportDimensions;\n    }\n\n    _effectiveFramebufferDimensions(gl = this.gl) {\n        if (!this._desiredDimensions) {\n            return this._framebufferDimensions;\n        }\n        if (gl) {\n            return scaleDims(\n                canvasFramebufferDims(gl),\n                canvasViewportDims(gl),\n                this._desiredDimensions,\n            );\n        }\n        return scaleDims(\n            this._framebufferDimensions,\n            this._viewportDimensions,\n            this._desiredDimensions,\n        );\n    }\n\n    _ensureFramebufferInfo(gl, targetDims = this._effectiveFramebufferDimensions(gl)) {\n        const currentDims = this._framebufferDimensions;\n        if (!this.ownGlFramebufferInfo) {\n            this.ownGlFramebufferInfo = twgl.createFramebufferInfo(gl, undefined, targetDims.width, targetDims.height);\n        } else if (!sameDims(currentDims, targetDims)) {\n            twgl.resizeFramebufferInfo(gl, this.ownGlFramebufferInfo, undefined, targetDims.width, targetDims.height);\n        } else {\n            const attachment = this.ownGlFramebufferInfo.attachments?.[0] ?? null;\n            if (!attachment) {\n                deleteFramebufferInfo(gl, this.ownGlFramebufferInfo);\n                this.ownGlFramebufferInfo = twgl.createFramebufferInfo(gl, undefined, targetDims.width, targetDims.height);\n            }\n        }\n        this._framebufferDimensions = targetDims;\n        this._viewportDimensions = this._effectiveViewportDimensions();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { beginGlAcquire, invalidateGlAcquire, isCurrentGlAcquire } from './gl-program.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\n\nconst g_glImageTextureContexts = new WeakMap();\n\nfunction getGlImageTextureContext(gl) {\n    let ctx = g_glImageTextureContexts.get(gl);\n    if (!ctx) {\n        ctx = {\n            refCount: 0,\n            alive: true,\n            entries: new Map(),\n        };\n        g_glImageTextureContexts.set(gl, ctx);\n    }\n    return ctx;\n}\n\n/* Prefer one explicit fetch+bitmap decode path when the browser can decode large WebGL textures off the Image.onload path. */\nfunction canLoadViaImageBitmap() {\n    return typeof fetch === 'function' && typeof createImageBitmap === 'function';\n}\n\n/* Materialise one decoded image source via fetch/createImageBitmap so browser image-priority heuristics do not stall atlas startup. */\nasync function loadTextureSource(url, crossOrigin) {\n    if (canLoadViaImageBitmap()) {\n        const mode = crossOrigin === 'anonymous' ? 'cors' : 'same-origin';\n        const response = await fetch(url, {\n            mode,\n            cache: 'force-cache',\n        });\n        if (!response.ok) {\n            throw new Error(`Image texture fetch failed for ${url}: HTTP ${response.status}.`);\n        }\n        const blob = await response.blob();\n        return await createImageBitmap(blob);\n    }\n    return await new Promise((resolve, reject) => {\n        const img = new Image();\n        img.crossOrigin = crossOrigin;\n        img.onload = () => resolve(img);\n        img.onerror = () => reject(new Error(`Image texture load failed for ${url}.`));\n        img.src = url;\n    });\n}\n\n/* Keep one context-scoped image-texture cache alive while any stage or standalone scene still owns the GL context. */\nexport function retainContextImageTextures(gl) {\n    if (!gl) {\n        throw new Error('retainContextImageTextures(gl): expected a live WebGL context.');\n    }\n    const ctx = getGlImageTextureContext(gl);\n    ctx.alive = true;\n    ctx.refCount += 1;\n}\n\n/* Drop all cached image textures only when the last context owner releases that GL context. */\nexport function releaseContextImageTextures(gl) {\n    if (!gl) {\n        throw new Error('releaseContextImageTextures(gl): expected a live WebGL context.');\n    }\n    const ctx = g_glImageTextureContexts.get(gl);\n    if (!ctx) {\n        return;\n    }\n    if (ctx.refCount < 1) {\n        throw new Error(`releaseContextImageTextures(gl): refCount underflow for GL context. Actual value=${ctx.refCount}.`);\n    }\n    ctx.refCount -= 1;\n    if (ctx.refCount > 0) {\n        return;\n    }\n    ctx.alive = false;\n    for (const entry of ctx.entries.values()) {\n        invalidateGlAcquire(entry, 'ownPendingGlTexture');\n        entry.ownPendingImage = null;\n        entry.ownPendingSourcePromise = null;\n        if (entry.ownGlTexture) {\n            gl.deleteTexture(entry.ownGlTexture);\n            entry.ownGlTexture = null;\n        }\n        entry.textureState = 'idle';\n    }\n    ctx.entries.clear();\n    g_glImageTextureContexts.delete(gl);\n}\n\n/* Read one cached image texture synchronously so recreated batchers can avoid a cold-start flash. */\nexport function peekContextImageTexture(gl, key) {\n    if (!gl) {\n        throw new Error('peekContextImageTexture(gl, key): expected a live WebGL context.');\n    }\n    if (typeof key !== 'string' || key.length < 1) {\n        throw new Error(`peekContextImageTexture(gl, key): key must be a non-empty string. Actual value='${key ?? '<null>'}'.`);\n    }\n    return g_glImageTextureContexts.get(gl)?.entries.get(key)?.ownGlTexture ?? null;\n}\n\n/* Read the current image-texture load state for readiness diagnostics. */\nexport function contextImageTextureState(gl, key) {\n    if (!gl) {\n        throw new Error('contextImageTextureState(gl, key): expected a live WebGL context.');\n    }\n    if (typeof key !== 'string' || key.length < 1) {\n        throw new Error(`contextImageTextureState(gl, key): key must be a non-empty string. Actual value='${key ?? '<null>'}'.`);\n    }\n    return g_glImageTextureContexts.get(gl)?.entries.get(key)?.textureState ?? 'idle';\n}\n\n/* Reuse one image-backed texture per context/key; late async completions self-drop once the cache entry goes stale. */\nexport function ensureContextImageTexture(gl, key, {\n    url,\n    origin = 'evilui.image_texture',\n    crossOrigin = 'anonymous',\n    makeOwnGlTexture,\n} = {}) {\n    if (!gl) {\n        throw new Error('ensureContextImageTexture(gl, key, ...): expected a live WebGL context.');\n    }\n    if (typeof key !== 'string' || key.length < 1) {\n        throw new Error(`ensureContextImageTexture(gl, key, ...): key must be a non-empty string. Actual value='${key ?? '<null>'}'.`);\n    }\n    if (typeof url !== 'string' || url.length < 1) {\n        throw new Error(`ensureContextImageTexture(gl, key, ...): url must be a non-empty string. Actual value='${url ?? '<null>'}'.`);\n    }\n    if (typeof makeOwnGlTexture !== 'function') {\n        throw new Error('ensureContextImageTexture(gl, key, ...): makeOwnGlTexture must be a function.');\n    }\n    const ctx = getGlImageTextureContext(gl);\n    let entry = ctx.entries.get(key);\n    if (!entry) {\n        entry = {\n            ownGlTexture: null,\n            textureState: 'idle',\n            ownPendingGlTexture: 0,\n            ownPendingImage: null,\n            ownPendingSourcePromise: null,\n        };\n        ctx.entries.set(key, entry);\n    }\n    if (entry.ownGlTexture || entry.textureState === 'loading') {\n        return entry.ownGlTexture;\n    }\n\n    entry.textureState = 'loading';\n    const token = beginGlAcquire(entry, 'ownPendingGlTexture');\n    const sourcePromise = loadTextureSource(url, crossOrigin);\n    entry.ownPendingSourcePromise = sourcePromise;\n    sourcePromise.then((source) => {\n        const ImageCtor = globalThis.Image;\n        if (!ctx.alive) {\n            source?.close?.();\n            return;\n        }\n        if (!isCurrentGlAcquire(entry, token, 'ownPendingGlTexture') || ctx.entries.get(key) !== entry) {\n            source?.close?.();\n            return;\n        }\n        entry.ownPendingImage = ImageCtor && source instanceof ImageCtor ? source : null;\n        entry.ownGlTexture = gpuDiagWithResourceOrigin(origin, () => makeOwnGlTexture(gl, source));\n        entry.ownPendingImage = null;\n        entry.ownPendingSourcePromise = null;\n        entry.textureState = 'idle';\n        source?.close?.();\n    }).catch((_err) => {\n        if (!isCurrentGlAcquire(entry, token, 'ownPendingGlTexture') || ctx.entries.get(key) !== entry) {\n            return;\n        }\n        entry.ownPendingImage = null;\n        entry.ownPendingSourcePromise = null;\n        entry.textureState = 'failed';\n    });\n    return entry.ownGlTexture;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Tile } from './tile.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n/* Render the single stage-owned keyboard caret, defaulting to theme orange until a focused input supplies its colour. */\nexport class Caret extends Tile {\n    constructor(state = {}) {\n        super({\n            tileBatch: 'editor.caret',\n            width: 2,\n            height: 16,\n            color: Palette.orange,\n            z: -0.01,\n            ...state,\n        });\n        this.setVisibility(false);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nlet g_diagnosticsCollectionEnabled = false;\n\nexport function setDiagnosticsCollectionEnabled(enabled) {\n  g_diagnosticsCollectionEnabled = !!enabled;\n}\n\nexport function diagnosticsCollectionEnabled() {\n  return g_diagnosticsCollectionEnabled;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Reserve control-wheel for camera ownership; shift-wheel stays with the current local wheel owner. */\nexport function shouldYieldWheelToCamera(controls) {\n    if (!controls) {\n        return false;\n    }\n    const hasWheel = controls.has('SCROLL_DOWN')\n        || controls.has('SCROLL_UP')\n        || controls.has('SCROLL_LEFT')\n        || controls.has('SCROLL_RIGHT')\n        || controls.has('SCROLL_DOWN_PIXEL')\n        || controls.has('SCROLL_UP_PIXEL')\n        || controls.has('SCROLL_LEFT_PIXEL')\n        || controls.has('SCROLL_RIGHT_PIXEL');\n    if (!hasWheel) {\n        return false;\n    }\n    return controls.has('CTRL_KEY');\n}\n\n/* Decide whether the frame needs a pre-input pick pass before normal input propagation runs. */\nexport function wantsDirectPick(controls, { fullscreenViewportActive = false } = {}) {\n    if (!controls) {\n        return false;\n    }\n    return controls.has('L_MOUSE_DOWN')\n        || controls.has('L_MOUSE_UP')\n        || (!fullscreenViewportActive && controls.has('L_MOUSE_DOWN_HOLD'))\n        || controls.has('R_MOUSE_DOWN')\n        || controls.has('R_MOUSE_UP')\n        || (!fullscreenViewportActive && controls.has('R_MOUSE_DOWN_HOLD'))\n        || controls.has('SCROLL_LEFT')\n        || controls.has('SCROLL_RIGHT')\n        || controls.has('SCROLL_DOWN')\n        || controls.has('SCROLL_UP')\n        || controls.has('SCROLL_LEFT_PIXEL')\n        || controls.has('SCROLL_RIGHT_PIXEL')\n        || controls.has('SCROLL_DOWN_PIXEL')\n        || controls.has('SCROLL_UP_PIXEL')\n        || controls.has('DOUBLE_CLICK');\n}\n\n/* Skip passive hover picks when fullscreen churn is only changing pose during drag/throw motion. */\nexport function wantsPassivePick({\n    gl = null,\n    sceneFullyRendered = false,\n    needsPassiveHoverPick = false,\n    fullscreenViewportActive = false,\n    pickReason = '',\n} = {}) {\n    if (!gl || !sceneFullyRendered) {\n        return false;\n    }\n    if (fullscreenViewportActive && pickReason === 'picker_pose_dirty') {\n        return false;\n    }\n    return needsPassiveHoverPick;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport { PORTAL_DEBUG_BUILD_VERSION } from '../../debug-build-version.mjs';\nimport { currentEvil, jsTimeFromEvil } from '../eviltime.mjs';\nimport * as glpicker from './gl-picker.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { releaseContextImageTextures, retainContextImageTextures } from './context-image-texture.mjs';\nimport {\n    gpuDiagNotePickerGlFallbackAttempt,\n    gpuDiagNotePickerTrigger,\n    gpuDiagNotePresentationRevision,\n    gpuDiagWithResourceOrigin,\n} from './browser-gpu-diagnostics.mjs';\nimport { DIRTY, clearResourceDirty, hasAnyResourceDirty, markResourceDirty, resourceDirtyKinds } from './dirty-flags.mjs';\nimport { diagnosticsCollectionEnabled } from './diagnostics-control.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { releaseContextFontTextures, retainContextFontTextures } from '../evilfont/evilfont.mjs';\nimport { dispatchFocusedBeforeInput, dispatchFocusedKeyDown } from './focus-manager.mjs';\nimport { releaseContextGlPrograms, retainContextGlPrograms } from './gl-program.mjs';\nimport { routeNodeLabel } from './input-route-log.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { CanvasRenderTarget, RenderTarget } from './render-target.mjs';\nimport { withPortalTimingScope } from './testing-trace.mjs';\nimport { normaliseSceneLighting } from './scene-lighting.mjs';\n\n// Lightweight performance helper to declutter scene methods\nconst Perf = {\n    begin: (name) => __PORTAL_PERF_BUILD__ ? globalThis.__eviluiPerformanceTracker?.beginTimer(name) : null,\n    end: (name, token) => { if (__PORTAL_PERF_BUILD__) globalThis.__eviluiPerformanceTracker?.endTimer(name, token); },\n    inc: (name, delta = 1) => { if (__PORTAL_PERF_BUILD__) globalThis.__eviluiPerformanceTracker?.incrementCounter(name, delta); },\n    gpuBegin: (name) => { if (__PORTAL_PERF_BUILD__) globalThis.__eviluiGpuDrawTimer?.begin(name); },\n    gpuEnd: () => { if (__PORTAL_PERF_BUILD__) globalThis.__eviluiGpuDrawTimer?.end(); }\n};\n\nconst DRAW_PASS_NAMES = Object.freeze(['opaque', 'text', 'transparent']);\n\n/* Classify one shared batcher into its owning pass using the class hook contract. */\nfunction batcherDrawPass(res) {\n    const ctor = res?.classConstructor ?? null;\n    if (!ctor) {\n        throw new Error(`batcherDrawPass(${res?.resourceKey ?? res}): classConstructor is required.`);\n    }\n    if (typeof ctor._batchPassForShared !== 'function') {\n        const hasOpaque = typeof ctor._drawOpaque === 'function';\n        const hasText = typeof ctor._drawText === 'function';\n        const hasTransparent = typeof ctor._drawTransparent === 'function';\n        const count = (hasOpaque ? 1 : 0) + (hasText ? 1 : 0) + (hasTransparent ? 1 : 0);\n        if (count === 0) {\n            return 'opaque';\n        }\n        if (count === 1) {\n            if (hasOpaque) return 'opaque';\n            if (hasText) return 'text';\n            return 'transparent';\n        }\n        throw new Error(`batcherDrawPass(${res?.resourceKey ?? res}): legacy test batcher spans multiple passes; add _batchPassForShared(...).`);\n    }\n    const pass = ctor._batchPassForShared(res);\n    if (!DRAW_PASS_NAMES.includes(pass)) {\n        throw new Error(`batcherDrawPass(${res?.resourceKey ?? res}): bad pass '${pass}'.`);\n    }\n    return pass;\n}\n\n/* Treat backdrop capture as a material capability; keep the class flag for legacy wrappers. */\nfunction batcherRequiresBackdrop(shared) {\n    return shared?.batchDescriptor?.material?.requiresBackdrop === true\n        || shared?.classConstructor?._isFrostedGlassBatch === true;\n}\n\ntry {\n    globalThis.__sceneDebugBuildVersion__ = PORTAL_DEBUG_BUILD_VERSION;\n} catch (_err) {\n    // Ignore if globalThis is not writable.\n}\n\nfunction noteSceneTraversalProbe(entry) {\n    globalThis.__sceneTraversalProbe?.note?.(entry);\n}\n\nfunction sceneProbeLabel(node) {\n    if (!node) {\n        return 'null';\n    }\n    return node.state?.name ?? node.constructor?.name ?? 'Node';\n}\n\n/* Forward scheduled-think instrumentation into the rolling portal jitter probe when it is live. */\nfunction noteScheduledThinkProbe(entry) {\n    globalThis.__portalJitterProbe?.noteScheduledThink?.(entry);\n}\n\n/* Label one pending sparse wake by the most useful stable node identity available. */\nfunction scheduledThinkOwnerLabel(node) {\n    if (!node) {\n        return 'Node';\n    }\n    return node.state?.name ?? node.constructor?.name ?? 'Node';\n}\n\n/* Collapse pending sparse wakes into deterministic descending owner counts for diagnostics. */\nfunction summarizeScheduledThinkOwners(records) {\n    const counts = new Map();\n    for (const rec of records ?? []) {\n        const key = rec?.owner_label ?? scheduledThinkOwnerLabel(rec?.node);\n        counts.set(key, (counts.get(key) || 0) + 1);\n    }\n    return Array.from(counts.entries())\n        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n        .map(([key, count]) => ({ key, count }));\n}\n\n/* Collapse pending sparse wakes into deterministic descending reason counts for diagnostics. */\nfunction summarizeScheduledThinkReasons(records) {\n    const counts = new Map();\n    for (const rec of records ?? []) {\n        const key = rec?.reason ?? 'unspecified';\n        counts.set(key, (counts.get(key) || 0) + 1);\n    }\n    return Array.from(counts.entries())\n        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n        .map(([key, count]) => ({ key, count }));\n}\n\n/* Classify one sparse wake delay so frame-step loops stand out from genuinely sparse timers. */\nfunction scheduledThinkCadence(scene, atS) {\n    const nowS = scene?.stage?.frameNowS ?? currentEvil();\n    const delayMs = Math.max(0, (atS - nowS) * 1000.0);\n    const frameStepMs = Math.max(1, (scene?.stage?.frameDeltaS ?? (1 / 60)) * 1000.0);\n    if (delayMs <= 1) {\n        return { delay_ms: delayMs, cadence: 'immediate' };\n    }\n    if (delayMs <= frameStepMs * 1.5) {\n        return { delay_ms: delayMs, cadence: 'frame_step' };\n    }\n    return { delay_ms: delayMs, cadence: 'sparse' };\n}\n\nfunction sameMatrix(a, b) {\n    if (!a || !b) return false;\n    for (let i = 0; i < 16; i++) {\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\n\nfunction identityMat16() {\n    return new Float32Array(twgl.m4.identity());\n}\n\nlet g_nextSceneScopeId = 1;\n\nfunction sceneOwnsContextProgramCache(scene, gl) {\n    return !scene.stage || scene.stage.gl !== gl;\n}\n\n/* Read one attached node's authoritative shared resources before trusting a recomputed batch key. */\nfunction nodeSharedResources(node) {\n    const direct = node?._resources ?? null;\n    if (direct) {\n        return direct;\n    }\n    const batchKey = ui.nodeBatchKey(node);\n    return node?.scene?._getBatcher(batchKey) ?? null;\n}\n\nfunction isPointLike(point) {\n    return point != null && typeof point.length === 'number' && point.length >= 2;\n}\n\n\n/**\n    A Scene contains a scene graph, starting from `root` plus a collection of\n    resources objects, one per Node class, shared amongst those nodes.\n\n    The Scene object helps maintain invariants across the scene graph, responding to the\n    following mutations:\n      - The first node of a specific class is added (_onAttachClass)\n      - The last node of a specific class is removed (_onDetachClass).\n      - When each new node is added (_onAttachNode).\n      - When each new node is removed (_onDetachNode).\n      - WebGLRendingContext is acquired and released.\n\n    One draw call is made for each Node class (not per Node), and the specific Node class\n    determines how to arrange drawing.\n*/\n\n/*\n    Scene owns one retained graph and one native depth space.\n\n    Stage composes scene surfaces back-to-front: first the active world scene,\n    then the orthographic HUD scene with colour preserved and depth cleared.\n    A stage-camera scene therefore uses the active perspective camera, while a\n    scene-camera surface such as the HUD uses its own ScreenCamera. Within\n    either scene, nodes use ordinary transformed Z and the normal depth buffer;\n    opaque, text, and transparent are material draw phases rather than visual\n    layering APIs.\n*/\nexport class Scene {\n    constructor(root, opts = {}) {\n        const {\n            renderTarget = new CanvasRenderTarget(),\n            cameraPolicy = 'stage',\n            lighting = null,\n        } = opts;\n        if (!(renderTarget instanceof RenderTarget)) {\n            throw new Error(`Scene(renderTarget=${renderTarget}): expected a RenderTarget instance.`);\n        }\n        if (cameraPolicy !== 'stage' && cameraPolicy !== 'scene') {\n            throw new Error(`Scene(cameraPolicy=${cameraPolicy}): expected 'stage' or 'scene'.`);\n        }\n        this._sceneScopeId = g_nextSceneScopeId++;\n        this._localOpaqueBatchers = new Map();\n        this._localTextBatchers = new Map();\n        this._localTransparentBatchers = new Map();\n        this.stage = null;\n        this.gl = null;\n        this.camera = null;\n        this.cameraPolicy = cameraPolicy;\n        this.lighting = normaliseSceneLighting(lighting);\n        this.frozen = false;\n        this.rootViewport = null;\n        this.activeViewport = null;\n        this._presentationRevision = 0;\n        this._presentationWorldMatrix = identityMat16();\n        this._presentationWorldInverse = identityMat16();\n        this._presentationPoseRevision = 0;\n        this.renderTarget = renderTarget;\n        this.viewportDimensions = renderTarget.viewportDimensions();\n        this.dragCapture = null;\n        // The actual owner receives primary drag frames even after the pointer leaves its hit area.\n        this.pointerCaptureOwner = null;\n        this.selectedIteractable = 0;\n        this.inputPickedInteractable = 0;\n        this.ownGlPickFramebufferInfo = null;\n        this.framebufferDimensions = renderTarget.framebufferDimensions();\n        this.sceneFullyRendered = true;\n        this._glPickerData = null;\n        this._pickedOnce = false;\n        this._debugPickerOnly = false;\n        this._pickCam = null;\n        this._pickPixel = null;\n        this._pickProjectionRev = 0;\n        this._pickFramebufferRev = 0;\n        this._pickPresentationPoseRev = -1;\n        this._pickSampleProjectionRev = -1;\n        this._pickSampleFramebufferRev = -1;\n        this._pickFrameStamp = -1;\n        this._pickFrameResolved = false;\n        this._acquiringContext = false;\n        this._animatedNodes = new Set();\n        this._pointerInputCaptureListeners = new Set();\n        this._windowStack = [];\n        this._scheduledThinks = new Map();\n        this._queuedWakes = new Map();\n        this._scheduledThinkWakeHandle = null;\n        if (root) {\n            if (!(root instanceof ui.Anchor)) {\n                throw new Error(`Scene(root=${root?.constructor?.name ?? root}): root must be an Anchor.`);\n            }\n            this.root = root;\n            this.root.scene = this;\n            this.root.anchorNode = this.root;\n            this.root.localToAnchor = new Float32Array(twgl.m4.identity());\n            this.root.anchorToRoot = new Float32Array(twgl.m4.identity());\n            ui.bootstrapClipScope(this.root);\n            this.root._setLifecycle('attached_no_gl');\n            this.root._linkResources();\n            this.root._onAttachNode(this.root._resources);\n        } else {\n            this.root = new ui.Anchor({ name: 'scene_root', anchorId: 1 });\n            this.root.scene = this;\n            this.root.anchorNode = this.root;\n            this.root.localToAnchor = new Float32Array(twgl.m4.identity());\n            this.root.anchorToRoot = new Float32Array(twgl.m4.identity());\n            ui.bootstrapClipScope(this.root);\n            this.root._setLifecycle('attached_no_gl');\n            this.root._linkResources();\n            this.root._onAttachNode(this.root._resources);\n        }\n        this.root._childAttachGuard = (child, op) => {\n            if (!(child instanceof ui.Viewport)) {\n                throw new Error(`Scene root ${op}(${child.constructor?.name ?? typeof child}) is forbidden. Rehome ordinary content under a Viewport instead.`);\n            }\n        };\n    }\n\n    /* Expose one stable scene scope key so Stage-owned batch registries can partition per-scene state explicitly. */\n    batchScopeKey() {\n        return `sc${this._sceneScopeId}`;\n    }\n\n    /* Replace the complete scene-owned light rig without dirtying retained geometry buffers. */\n    setLighting(lighting) {\n        this.lighting = normaliseSceneLighting(lighting);\n        requestFrame('scene_lighting_changed');\n    }\n\n    /* Resolve the authoritative opaque registry, delegating to Stage once the scene is staged. */\n    get _opaqueBatchers() {\n        return this.stage?.sceneOpaqueBatchers?.(this) ?? this._localOpaqueBatchers;\n    }\n\n    /* Resolve the authoritative text registry, delegating to Stage once the scene is staged. */\n    get _textBatchers() {\n        return this.stage?.sceneTextBatchers?.(this) ?? this._localTextBatchers;\n    }\n\n    /* Resolve the authoritative transparent registry, delegating to Stage once the scene is staged. */\n    get _transparentBatchers() {\n        return this.stage?.sceneTransparentBatchers?.(this) ?? this._localTransparentBatchers;\n    }\n\n    /* Report only visible retained glass so an empty batch never forces capture work. */\n    hasPresentedFrostedGlass() {\n        for (const shared of this._transparentBatchers.values()) {\n            const requiresBackdrop = batcherRequiresBackdrop(shared);\n            if (!requiresBackdrop) {\n                continue;\n            }\n            if (shared.nodes?.some(node => node?.computedVisible !== false)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /* Read one batcher from the authoritative scene registry without exposing stage-internal storage details. */\n    _getBatcher(key) {\n        return this._opaqueBatchers.get(key)\n            ?? this._textBatchers.get(key)\n            ?? this._transparentBatchers.get(key)\n            ?? undefined;\n    }\n\n    /* Publish one batcher into the authoritative scene registry, keeping one pass owner per key. */\n    _setBatcher(key, value) {\n        const cur = this._getBatcher(key);\n        if (cur && cur !== value) {\n            throw new Error(`Scene._setBatcher(${key}): duplicate batcher key.`);\n        }\n        const pass = batcherDrawPass(value);\n        const map = pass === 'opaque'\n            ? this._opaqueBatchers\n            : pass === 'text'\n                ? this._textBatchers\n                : this._transparentBatchers;\n        map.set(key, value);\n    }\n\n    /* Remove one batcher from the authoritative scene registry, regardless of which pass owns it. */\n    _deleteBatcher(key) {\n        const map = this._opaqueBatchers.has(key)\n            ? this._opaqueBatchers\n            : this._textBatchers.has(key)\n                ? this._textBatchers\n                : this._transparentBatchers.has(key)\n                    ? this._transparentBatchers\n                    : null;\n        if (map == null) {\n            return false;\n        }\n        return map.delete(key);\n    }\n\n    /*\n     * Resolve one of the two presentation policies: world scenes follow the\n     * Stage camera; retained screen surfaces use their own orthographic camera.\n     * Drawing and picking both call this seam so their projections stay equal.\n     */\n    presentationCamera() {\n        if (this.cameraPolicy === 'scene') {\n            return this.camera ?? null;\n        }\n        return this.stage?.activeCamera ?? this.camera ?? null;\n    }\n\n    /* Read presentation time from the Stage-local frame clock so draw and pick stay on one sampled timebase. */\n    presentationTimeSeconds() {\n        return this.stage?.frameNowJSMs != null\n            ? this.stage.frameNowS\n            : currentEvil();\n    }\n\n    /* Keep draw/pick failure messages crisp at the presentation boundary. */\n    _requirePresentationCamera(context) {\n        const cam = this.presentationCamera();\n        if (!cam) {\n            throw new Error(`Scene.${context}(...): presentation camera is required.`);\n        }\n        if (this.cameraPolicy === 'scene' && cam.scene !== this) {\n            throw new Error(`Scene.${context}(...): scene-owned presentation camera must belong to this scene.`);\n        }\n        if (this.cameraPolicy === 'stage' && cam.scene !== this && this.stage?.activeCamera !== cam) {\n            throw new Error(`Scene.${context}(...): presentation camera must belong to this scene or be the stage active camera.`);\n        }\n        return cam;\n    }\n\n    #assertViewportOwnership(viewport, label) {\n        if (!(viewport instanceof ui.Viewport)) {\n            throw new Error(`Scene.${label}(${viewport}): expected a Viewport.`);\n        }\n        if (viewport.scene !== this) {\n            throw new Error(`Scene.${label}(${viewport.constructor?.name ?? typeof viewport}): viewport must belong to this scene.`);\n        }\n    }\n\n    setRootViewport(viewport) {\n        this.#assertViewportOwnership(viewport, 'setRootViewport');\n        let refreshVisibility = false;\n        if (this.rootViewport !== viewport) {\n            this._presentationRevision += 1;\n            gpuDiagNotePresentationRevision(this._presentationRevision, 'set_root_viewport');\n            refreshVisibility = true;\n        }\n        this.rootViewport = viewport;\n        if (!this.activeViewport) {\n            this.activeViewport = viewport;\n            refreshVisibility = true;\n        }\n        if (refreshVisibility) {\n            this.root._refreshComputedVisibility(true);\n        }\n    }\n\n    setActiveViewport(viewport) {\n        this.#assertViewportOwnership(viewport, 'setActiveViewport');\n        if (this.activeViewport !== viewport) {\n            this._presentationRevision += 1;\n            gpuDiagNotePresentationRevision(this._presentationRevision, 'set_active_viewport');\n            this.activeViewport = viewport;\n            this.root._refreshComputedVisibility(true);\n            return;\n        }\n        this.activeViewport = viewport;\n    }\n\n    presentedRoot() {\n        return this.activeViewport ?? this.rootViewport ?? this.root;\n    }\n\n    presentationWorldMatrix() {\n        return this._presentationWorldMatrix;\n    }\n\n    hasPresentationWorldMatrix() {\n        return !sameMatrix(this._presentationWorldMatrix, identityMat16());\n    }\n\n    /* Apply a scene-global presentation transform without mutating node-local transforms or scene-local dirty flags. */\n    setPresentationWorldMatrix(matrix) {\n        const next = matrix ? new Float32Array(matrix) : identityMat16();\n        if (sameMatrix(this._presentationWorldMatrix, next)) {\n            return false;\n        }\n        this._presentationWorldMatrix = next;\n        this._presentationWorldInverse = new Float32Array(twgl.m4.inverse(next));\n        this._presentationPoseRevision += 1;\n        return true;\n    }\n\n    /* Convert a stage/world point into this scene's local presentation space. */\n    worldToPresentationPoint(point) {\n        if (!isPointLike(point)) {\n            throw new Error('Scene.worldToPresentationPoint(...): expected a world-space point.');\n        }\n        return twgl.m4.transformPoint(this._presentationWorldInverse, [\n            point[0],\n            point[1],\n            point[2] ?? 0,\n        ]);\n    }\n\n    /* Convert a scene-local presentation-space point into stage/world coordinates. */\n    presentationToWorldPoint(point) {\n        if (!isPointLike(point)) {\n            throw new Error('Scene.presentationToWorldPoint(...): expected a presentation-space point.');\n        }\n        return twgl.m4.transformPoint(this._presentationWorldMatrix, [\n            point[0],\n            point[1],\n            point[2] ?? 0,\n        ]);\n    }\n\n    _isPresentedNode(node) {\n        const root = this.presentedRoot();\n        for (let cur = node; cur; cur = cur.parentNode) {\n            if (cur === root) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /* Keep the per-scene animation registry aligned with which attached nodes still own live animation records. */\n    _syncAnimatedNode(node) {\n        const hadNode = this._animatedNodes.has(node);\n        if (!node || node.scene !== this || !node._hasActiveAnimations()) {\n            this._animatedNodes.delete(node);\n            return;\n        }\n        this._animatedNodes.add(node);\n        if (!hadNode) {\n            requestFrame('scene_active_animation');\n        }\n    }\n\n    /* Register one sparse node-owned wake against this scene's shared evil-time clock. */\n    _scheduleNodeThinkAt(node, rec) {\n        if (!node || node.scene !== this) {\n            throw new Error('Scene._scheduleNodeThinkAt(...): node must belong to this scene.');\n        }\n        if (!rec || !Number.isFinite(rec.at_s) || typeof rec.onWake !== 'function') {\n            throw new Error('Scene._scheduleNodeThinkAt(...): bad scheduled think record.');\n        }\n        this._scheduledThinks.set(rec.token, {\n            token: rec.token,\n            node,\n            at_s: rec.at_s,\n            onWake: rec.onWake,\n            owner_label: scheduledThinkOwnerLabel(node),\n            reason: rec.reason ?? null,\n        });\n        const timing = scheduledThinkCadence(this, rec.at_s);\n        noteScheduledThinkProbe({\n            kind: 'schedule',\n            scene_label: sceneProbeLabel(this.presentedRoot?.() ?? this.root),\n            owner_label: scheduledThinkOwnerLabel(node),\n            reason: rec.reason ?? null,\n            delay_ms: timing.delay_ms,\n            cadence: timing.cadence,\n            pending_count: this._scheduledThinks.size,\n        });\n        this.#syncScheduledThinkWake();\n    }\n\n    /* Cancel one sparse node-owned wake and recompute the shared timer if it was pending. */\n    _cancelNodeThinkAt(node, token) {\n        const rec = this._scheduledThinks.get(token);\n        if (!rec) {\n            return false;\n        }\n        if (rec.node !== node) {\n            throw new Error('Scene._cancelNodeThinkAt(...): token owner mismatch.');\n        }\n        this._scheduledThinks.delete(token);\n        noteScheduledThinkProbe({\n            kind: 'cancel',\n            scene_label: sceneProbeLabel(this.presentedRoot?.() ?? this.root),\n            owner_label: rec.owner_label ?? scheduledThinkOwnerLabel(node),\n            reason: rec.reason ?? null,\n            pending_count: this._scheduledThinks.size,\n        });\n        this.#syncScheduledThinkWake();\n        return true;\n    }\n\n    /* Queue one readiness-driven node wake against the next scene update and request exactly one frame for it. */\n    _queueNodeWake(node, rec) {\n        if (!node || node.scene !== this) {\n            throw new Error('Scene._queueNodeWake(...): node must belong to this scene.');\n        }\n        if (!rec || typeof rec.onWake !== 'function') {\n            throw new Error('Scene._queueNodeWake(...): bad queued wake record.');\n        }\n        this._queuedWakes.set(rec.token, {\n            token: rec.token,\n            node,\n            onWake: rec.onWake,\n            owner_label: scheduledThinkOwnerLabel(node),\n            reason: rec.reason ?? null,\n        });\n        requestFrame(rec.reason ?? 'scene_node_wake');\n    }\n\n    /* Cancel one queued readiness wake if it is still pending for this scene. */\n    _cancelNodeWake(node, token) {\n        const rec = this._queuedWakes.get(token);\n        if (!rec) {\n            return false;\n        }\n        if (rec.node !== node) {\n            throw new Error('Scene._cancelNodeWake(...): token owner mismatch.');\n        }\n        this._queuedWakes.delete(token);\n        return true;\n    }\n\n    /* Resolve all node-owned animations against the shared Stage clock before transform propagation. */\n    evaluateAnimations(nowS = this.stage?.frameNowS ?? currentEvil()) {\n        for (const node of [...this._animatedNodes]) {\n            if (node.scene !== this || !node._hasActiveAnimations()) {\n                this._animatedNodes.delete(node);\n                continue;\n            }\n            node._evaluateAnimations(nowS);\n        }\n    }\n\n    /* Report whether the scene still owns active animation records that require more frames. */\n    hasActiveAnimations() {\n        return this._animatedNodes.size > 0;\n    }\n\n    /* Summarise scene-local reasons that should keep the Stage from going quiescent. */\n    quiescenceSnapshot() {\n        const reasons = [];\n        const scheduledThinkOwners = summarizeScheduledThinkOwners(this._scheduledThinks.values());\n        const scheduledThinkReasons = summarizeScheduledThinkReasons(this._scheduledThinks.values());\n        if (!this.sceneFullyRendered) {\n            reasons.push('scene_not_fully_rendered');\n        }\n        if (this.hasActiveAnimations()) {\n            reasons.push('active_animations');\n        }\n        // Formerly \"scheduled_thinks\": sparse thinkAt wakes own their own JS timer\n        // re-entry and therefore do not by themselves require continuous rAF.\n        const pickReason = this.getPassiveHoverPickReason();\n        if (pickReason) {\n            reasons.push(`passive_pick:${pickReason}`);\n        }\n        return {\n            hot: reasons.length > 0,\n            reasons,\n            scheduled_think_owners: scheduledThinkOwners,\n            scheduled_think_reasons: scheduledThinkReasons,\n        };\n    }\n\n    setRenderTarget(renderTarget) {\n        if (!(renderTarget instanceof RenderTarget)) {\n            throw new Error(`Scene.setRenderTarget(${renderTarget}): expected a RenderTarget instance.`);\n        }\n        if (renderTarget === this.renderTarget) {\n            throw new Error('Scene.setRenderTarget(...) called with the current RenderTarget.');\n        }\n        if (this.gl) {\n            this.renderTarget.releaseContext(this.gl);\n        }\n        this.renderTarget = renderTarget;\n        if (this.gl) {\n            this.renderTarget.acquireContext(this.gl);\n            this.framebufferResized(this.gl);\n            this.viewportResized(this.gl);\n        } else {\n            this.framebufferDimensions = renderTarget.framebufferDimensions();\n            this.viewportDimensions = renderTarget.viewportDimensions();\n        }\n    }\n\n    applyRenderlessViewport({\n        framebufferWidth,\n        framebufferHeight,\n        viewportWidth,\n        viewportHeight,\n    }) {\n        const dims = this.renderTarget.applyRenderlessViewport({\n            framebufferWidth,\n            framebufferHeight,\n            viewportWidth,\n            viewportHeight,\n        });\n        this.framebufferDimensions = dims.framebufferDimensions;\n        this.viewportDimensions = dims.viewportDimensions;\n\n        const cam = this.presentationCamera();\n        if (cam) {\n            cam._onViewportResized(null, null, this.viewportDimensions);\n            this._pickProjectionRev += 1;\n        }\n        this.sceneFullyRendered = true;\n        ewu.propagateMethod(this.root, 'onViewportResized', null);\n    }\n\n    getTargetFramebufferDimensions(gl) {\n        this.renderTarget.framebufferResized(gl);\n        return this.renderTarget.framebufferDimensions();\n    }\n\n    getTargetViewportDimensions(gl) {\n        this.renderTarget.viewportResized(gl);\n        return this.renderTarget.viewportDimensions();\n    }\n\n    dropOwnGlPickFramebufferInfo() {\n        if (this.ownGlPickFramebufferInfo && this.gl) {\n            deleteFramebufferInfo(this.gl, this.ownGlPickFramebufferInfo);\n        }\n        this.ownGlPickFramebufferInfo = null;\n    }\n\n    updateScene(gl, deltatime) {\n        const perfToken = Perf.begin('scene_update');\n        const collectDiagnostics = diagnosticsCollectionEnabled();\n        const sceneStartedAt = collectDiagnostics ? performance.now() : 0;\n        this.#runQueuedWakes(this.stage?.frameNowS ?? currentEvil());\n        this.#runDueScheduledThinks(this.stage?.frameNowS ?? currentEvil());\n        const rootMatrix = twgl.m4.identity();\n        const transformsStartedAt = collectDiagnostics ? performance.now() : 0;\n        const prep = collectDiagnostics\n            ? { node_count: 0, max_depth: 0, subtree_records: {} }\n            : null;\n        this.presentedRoot().propagateTransforms(rootMatrix, prep, 0, false, null);\n        if (collectDiagnostics) {\n            const transformsMS = performance.now() - transformsStartedAt;\n            const topSubtrees = Object.entries(prep.subtree_records)\n                .map(([label, rec]) => ({ label, ...rec }))\n                .sort((a, b) => (b.time_ms - a.time_ms) || (b.node_count - a.node_count))\n                .slice(0, 8);\n            const sceneUpdateMS = performance.now() - sceneStartedAt;\n            if (sceneUpdateMS >= 8 || transformsMS >= 8 || topSubtrees.length > 0) {\n                noteSceneTraversalProbe({\n                    scene_label: sceneProbeLabel(this.presentedRoot()),\n                    scene_update_ms: sceneUpdateMS,\n                    transforms_ms: transformsMS,\n                    scheduled_think_count: this._scheduledThinks.size,\n                    transform_node_count: prep.node_count,\n                    transform_max_depth: prep.max_depth,\n                    top_subtrees: topSubtrees,\n                });\n            }\n        }\n        \n        Perf.end('scene_update', perfToken);\n    }\n\n    acquireContext(gl) {\n        if (this.gl) {\n            throw new Error('Scene.acquireContext(...) called while already live.');\n        }\n        let visited = new WeakMap();\n        this.gl = gl;\n        this._acquiringContext = true;\n        try {\n            if (sceneOwnsContextProgramCache(this, gl)) {\n                retainContextGlPrograms(gl);\n                retainContextFontTextures(gl);\n                retainContextImageTextures(gl);\n            }\n            this.renderTarget.acquireContext(gl);\n            this.framebufferDimensions = this.getTargetFramebufferDimensions(gl);\n\n            for (const res of this._opaqueBatchers.values()) {\n                res.classConstructor._onAcquireContext(gl, res, visited);\n            }\n            for (const res of this._textBatchers.values()) {\n                res.classConstructor._onAcquireContext(gl, res, visited);\n            }\n            for (const res of this._transparentBatchers.values()) {\n                res.classConstructor._onAcquireContext(gl, res, visited);\n            }\n\n            this.framebufferResized(gl);\n            this.viewportResized(gl);\n            this._ensureGlPickerResources(gl);\n\n            const visit = (node) => {\n                const res = nodeSharedResources(node);\n                if (!res) {\n                    const batchKey = ui.nodeBatchKey(node);\n                    throw new Error(`Batcher for ${node.constructor.name} (${batchKey}) not instantiated.`);\n                }\n\n                node._assertLifecycle('attached_no_gl', `${node.state?.name ?? node.constructor?.name ?? 'Node'} Scene.acquireContext`);\n                node._onAcquireNode(gl, res, visited);\n                node._glAttached = true;\n                node._setLifecycle('attached_gl');\n\n                for (const ch of node.children) visit(ch);\n            };\n            visit(this.root);\n        } catch (err) {\n            this._acquiringContext = false;\n            if (sceneOwnsContextProgramCache(this, gl)) {\n                releaseContextGlPrograms(gl);\n                releaseContextFontTextures(gl);\n                releaseContextImageTextures(gl);\n            }\n            this.gl = null;\n            throw err;\n        }\n        this._acquiringContext = false;\n    }\n\n    releaseContext(gl) {\n        const liveGl = this.gl;\n        if (gl && liveGl && gl !== liveGl) {\n            console.warn(`Scene.releaseContext) Passed WebGLRenderingContext does not match the one passed to acquireContext. (Ignoring passed context.)`);\n        }\n\n        const visit = (node, visitedMap) => {\n            const res = nodeSharedResources(node);\n            if (!res) {\n                const batchKey = ui.nodeBatchKey(node);\n                throw new Error(`Batcher for ${node.constructor.name} (${batchKey}) not instantiated.`);\n            }\n\n            node._assertLifecycle('attached_gl', `${node.state?.name ?? node.constructor?.name ?? 'Node'} Scene.releaseContext`);\n            node._onReleaseNode(liveGl, res, visitedMap);\n            node._glAttached = false;\n            node._setLifecycle('attached_no_gl');\n\n            for (const ch of node.children) visit(ch, visitedMap);\n        };\n\n        const visited = new WeakMap();\n        visit(this.root, visited);\n\n        for (const b of this._opaqueBatchers.values()) {\n            b.classConstructor._onReleaseContext(liveGl, b, visited);\n        }\n        for (const b of this._textBatchers.values()) {\n            b.classConstructor._onReleaseContext(liveGl, b, visited);\n        }\n        for (const b of this._transparentBatchers.values()) {\n            b.classConstructor._onReleaseContext(liveGl, b, visited);\n        }\n\n        this.renderTarget.releaseContext(liveGl);\n        this.dropOwnGlPickFramebufferInfo();\n        this._disposeGlPickerResources(liveGl);\n        if (sceneOwnsContextProgramCache(this, liveGl)) {\n            releaseContextGlPrograms(liveGl);\n            releaseContextFontTextures(liveGl);\n            releaseContextImageTextures(liveGl);\n        }\n\n        this.gl = null;\n    }\n\n    /* Drop the current cold sparse-think wake before recomputing the next owner. */\n    #clearScheduledThinkWake() {\n        if (this._scheduledThinkWakeHandle === null) {\n            return;\n        }\n        clearTimeout(this._scheduledThinkWakeHandle);\n        this._scheduledThinkWakeHandle = null;\n    }\n\n    /* Re-arm one one-shot JS timer for the earliest pending sparse scene-clock think. */\n    #syncScheduledThinkWake() {\n        this.#clearScheduledThinkWake();\n        let next = null;\n        for (const rec of this._scheduledThinks.values()) {\n            if (!next || rec.at_s < next.at_s) {\n                next = rec;\n            }\n        }\n        if (!next) {\n            return;\n        }\n        const delayMs = this.#scheduledThinkDelayMs(next.at_s);\n        const handle = setTimeout(() => {\n            if (this._scheduledThinkWakeHandle !== handle) {\n                return;\n            }\n            this._scheduledThinkWakeHandle = null;\n            if (this._scheduledThinks.size === 0) {\n                noteScheduledThinkProbe({\n                    kind: 'orphan_timer_fire',\n                    scene_label: sceneProbeLabel(this.presentedRoot?.() ?? this.root),\n                    owner_label: 'none',\n                    reason: 'orphan_timer_fire',\n                    delay_ms: delayMs,\n                    pending_count: 0,\n                });\n                return;\n            }\n            requestFrame('scene_scheduled_think');\n        }, delayMs);\n        this._scheduledThinkWakeHandle = handle;\n    }\n\n    /* Reconcile cold sparse-think timer ownership with the current stage hot/idle mode. */\n    syncColdScheduledThinkWake() {\n        if (this.stage?._coldScheduledThinkWakesEnabled === false) {\n            this.#clearScheduledThinkWake();\n            return;\n        }\n        this.#syncScheduledThinkWake();\n    }\n\n    /* Convert one target evil-time wake into a bounded JS delay using the Stage epoch when available. */\n    #scheduledThinkDelayMs(atS) {\n        const dueMs = this.stage?.timeEpochJSMs != null\n            ? jsTimeFromEvil(atS, this.stage.timeEpochJSMs)\n            : Date.now() + Math.max(0.0, (atS - currentEvil()) * 1000.0);\n        return Math.max(1, Math.ceil(Math.max(0, dueMs - Date.now())));\n    }\n\n    /* Run all queued readiness wakes exactly once at the next scene update. */\n    #runQueuedWakes(nowS) {\n        if (this._queuedWakes.size === 0) {\n            return;\n        }\n        const due = [...this._queuedWakes.values()].sort((a, b) => a.token - b.token);\n        this._queuedWakes.clear();\n        for (const rec of due) {\n            rec.node?._queuedWakes?.delete(rec.token);\n            if (rec.node?.scene !== this) {\n                continue;\n            }\n            rec.onWake({\n                node: rec.node,\n                now_s: nowS,\n                token: rec.token,\n            });\n        }\n    }\n\n    /* Run all sparse wakes that are now due for this scene clock sample. */\n    #runDueScheduledThinks(nowS) {\n        if (this._scheduledThinks.size === 0) {\n            return;\n        }\n        const due = [...this._scheduledThinks.values()]\n            .filter((rec) => rec.at_s <= nowS)\n            .sort((a, b) => (a.at_s - b.at_s) || (a.token - b.token));\n        if (due.length === 0) {\n            this.#syncScheduledThinkWake();\n            return;\n        }\n        for (const rec of due) {\n            const live = this._scheduledThinks.get(rec.token);\n            if (!live) {\n                continue;\n            }\n            this._scheduledThinks.delete(rec.token);\n            live.node?._scheduledThinks?.delete(rec.token);\n            if (live.node?.scene !== this) {\n                continue;\n            }\n            noteScheduledThinkProbe({\n                kind: 'wake',\n                scene_label: sceneProbeLabel(this.presentedRoot?.() ?? this.root),\n                owner_label: live.owner_label ?? scheduledThinkOwnerLabel(live.node),\n                reason: live.reason ?? null,\n                pending_count: this._scheduledThinks.size,\n            });\n            live.onWake({\n                node: live.node,\n                at_s: live.at_s,\n                now_s: nowS,\n                token: live.token,\n            });\n        }\n        this.#syncScheduledThinkWake();\n    }\n\n    framebufferResized(gl) {\n        Perf.inc('scene_framebuffer_resized_count');\n        const perfToken = Perf.begin('scene_framebuffer_resized');\n        \n        this.renderTarget.framebufferResized(gl);\n        this.framebufferDimensions = this.renderTarget.framebufferDimensions();\n        gl.viewport(0, 0, this.framebufferDimensions.width, this.framebufferDimensions.height);\n        gl.clearColor(0.5, 0.5, 0.5, 1.0);\n\n        this._ensureGlPickerResources(gl);\n        this._pickFramebufferRev += 1;\n\n        for (const b of this._opaqueBatchers.values()) {\n            b.classConstructor._onFramebufferResized(gl, b, this.framebufferDimensions);\n        }\n        for (const b of this._textBatchers.values()) {\n            b.classConstructor._onFramebufferResized(gl, b, this.framebufferDimensions);\n        }\n        for (const b of this._transparentBatchers.values()) {\n            b.classConstructor._onFramebufferResized(gl, b, this.framebufferDimensions);\n        }\n        \n        Perf.end('scene_framebuffer_resized', perfToken);\n    }\n\n    _ensureGlPickerResources(gl) {\n        if (!gl) return;\n        const targetWidth = 1;\n        const targetHeight = 1;\n\n        if (!this._glPickerData) {\n            this._glPickerData = {\n                frameBuffer: null, texture: null, depthRenderbuffer: null,\n                buffer: null, lastPickedId: 0, width: 0, height: 0\n            };\n        }\n\n        const picker = this._glPickerData;\n        let attachmentsDirty = false;\n\n        if (!picker.frameBuffer) {\n            picker.frameBuffer = gpuDiagWithResourceOrigin('scene.picker.framebuffer', () => gl.createFramebuffer());\n            attachmentsDirty = true;\n        }\n        if (!picker.texture) {\n            picker.texture = gpuDiagWithResourceOrigin('scene.picker.texture', () => gl.createTexture());\n            attachmentsDirty = true;\n        }\n        if (!picker.depthRenderbuffer) {\n            picker.depthRenderbuffer = gpuDiagWithResourceOrigin('scene.picker.depth_renderbuffer', () => gl.createRenderbuffer());\n            attachmentsDirty = true;\n        }\n        \n        if (!picker.buffer) {\n            picker.buffer = gpuDiagWithResourceOrigin('scene.picker.pixel_pack_buffer', () => gl.createBuffer());\n            gl.bindBuffer(gl.PIXEL_PACK_BUFFER, picker.buffer);\n            gl.bufferData(gl.PIXEL_PACK_BUFFER, 4, gl.STREAM_READ);\n            gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);\n        }\n\n        const needsResize = picker.width !== targetWidth || picker.height !== targetHeight;\n\n        if (needsResize || attachmentsDirty || !picker.width || !picker.height) {\n            gpuDiagWithResourceOrigin('scene.picker.attachments', () => {\n                gl.bindTexture(gl.TEXTURE_2D, picker.texture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, targetWidth, targetHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n                gl.bindTexture(gl.TEXTURE_2D, null);\n\n                gl.bindRenderbuffer(gl.RENDERBUFFER, picker.depthRenderbuffer);\n                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, targetWidth, targetHeight);\n                gl.bindRenderbuffer(gl.RENDERBUFFER, null);\n            });\n\n            gl.bindFramebuffer(gl.FRAMEBUFFER, picker.frameBuffer);\n            gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, picker.texture, 0);\n            gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, picker.depthRenderbuffer);\n            gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n            picker.width = targetWidth;\n            picker.height = targetHeight;\n            picker.lastPickedId = 0;\n        }\n    }\n\n    _disposeGlPickerResources(gl) {\n        if (!this._glPickerData || !gl) return;\n\n        const picker = this._glPickerData;\n        if (picker.buffer && gl.deleteBuffer) gl.deleteBuffer(picker.buffer);\n        if (picker.frameBuffer && gl.deleteFramebuffer) gl.deleteFramebuffer(picker.frameBuffer);\n        if (picker.texture && gl.deleteTexture) gl.deleteTexture(picker.texture);\n        if (picker.depthRenderbuffer && gl.deleteRenderbuffer) gl.deleteRenderbuffer(picker.depthRenderbuffer);\n        \n        this._glPickerData = null;\n    }\n\n    viewportResized(gl) {\n        Perf.inc('scene_viewport_resized_count');\n        const perfToken = Perf.begin('scene_viewport_resized');\n        \n        this.renderTarget.viewportResized(gl);\n        this.viewportDimensions = this.renderTarget.viewportDimensions();\n        this._ensureGlPickerResources(gl);\n\n        const cam = this._requirePresentationCamera('viewportResized');\n        cam._onViewportResized(gl, null, this.viewportDimensions);\n        this._pickProjectionRev += 1;\n        \n        for (const b of this._opaqueBatchers.values()) {\n            b.classConstructor._onViewportResized(gl, b, this.viewportDimensions);\n        }\n        for (const b of this._textBatchers.values()) {\n            b.classConstructor._onViewportResized(gl, b, this.viewportDimensions);\n        }\n        for (const b of this._transparentBatchers.values()) {\n            b.classConstructor._onViewportResized(gl, b, this.viewportDimensions);\n        }\n        ewu.propagateMethod(this.root, \"onViewportResized\", gl);\n        \n        Perf.end('scene_viewport_resized', perfToken);\n    }\n\n    bindTarget(gl) {\n        this.renderTarget.bind(gl);\n    }\n\n    getPickReasonDetails() {\n        if (!this._pickedOnce) return { reason: 'cold_start' };\n        if (!Mouse.inside) return null;\n        if (Mouse.mouseMoved()) return { reason: 'mouse_move' };\n        const cam = this._requirePresentationCamera('getPickReasonDetails');\n        if (!sameMatrix(this._pickCam, cam.localToWorld())) return { reason: 'camera_move' };\n        if (this._pickSampleProjectionRev !== this._pickProjectionRev) return { reason: 'projection_change' };\n        if (this._pickSampleFramebufferRev !== this._pickFramebufferRev) return { reason: 'framebuffer_change' };\n        if (this._pickPresentationPoseRev !== this._presentationPoseRevision) return { reason: 'presentation_pose_change' };\n\n        for (const res of this._opaqueBatchers.values()) {\n            if (res.pickerBatchDirty) {\n                return {\n                    reason: 'picker_batch_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n            if (res.pickerPoseDirty) {\n                return {\n                    reason: 'picker_pose_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n        }\n        for (const res of this._textBatchers.values()) {\n            if (res.pickerBatchDirty) {\n                return {\n                    reason: 'picker_batch_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n            if (res.pickerPoseDirty) {\n                return {\n                    reason: 'picker_pose_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n        }\n        for (const res of this._transparentBatchers.values()) {\n            if (res.pickerBatchDirty) {\n                return {\n                    reason: 'picker_batch_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n            if (res.pickerPoseDirty) {\n                return {\n                    reason: 'picker_pose_dirty',\n                    resource_key: res.key ?? res.resourceKey ?? res.classConstructor?.name ?? 'unknown',\n                    dirty_kinds: resourceDirtyKinds(res),\n                };\n            }\n        }\n        return null;\n    }\n\n    getPickReason() {\n        return this.getPickReasonDetails()?.reason ?? null;\n    }\n\n    /* Keep passive hover invalidation aligned with direct picks so hover chrome does not advertise stale hit targets after picker geometry changes. */\n    getPassiveHoverPickReason() {\n        if (!Mouse.inside) return null;\n        if (!this._pickedOnce) return 'cold_start';\n\n        const reasonInfo = this.getPickReasonDetails();\n        if (!reasonInfo) return null;\n        if (reasonInfo.reason === 'mouse_move') {\n            const pixel = this.#currentPickPixel();\n            if (!samePickPixel(pixel, this._pickPixel)) return 'mouse_move';\n            return null;\n        }\n\n        return reasonInfo.reason ?? null;\n    }\n\n    needsPassiveHoverPick() {\n        return this.getPassiveHoverPickReason() !== null;\n    }\n\n    #acknowledgePickerDirty() {\n        for (const res of this._opaqueBatchers.values()) {\n            if (!hasAnyResourceDirty(res)) {\n                continue;\n            }\n            const kinds = [];\n            if (res.pickerBatchDirty) {\n                kinds.push(DIRTY.pickerBatch);\n            }\n            if (res.pickerPoseDirty) {\n                kinds.push(DIRTY.pickerPose);\n            }\n            if (kinds.length > 0) {\n                clearResourceDirty(res, kinds);\n            }\n        }\n        for (const res of this._textBatchers.values()) {\n            if (!hasAnyResourceDirty(res)) {\n                continue;\n            }\n            const kinds = [];\n            if (res.pickerBatchDirty) {\n                kinds.push(DIRTY.pickerBatch);\n            }\n            if (res.pickerPoseDirty) {\n                kinds.push(DIRTY.pickerPose);\n            }\n            if (kinds.length > 0) {\n                clearResourceDirty(res, kinds);\n            }\n        }\n        for (const res of this._transparentBatchers.values()) {\n            if (!hasAnyResourceDirty(res)) {\n                continue;\n            }\n            const kinds = [];\n            if (res.pickerBatchDirty) {\n                kinds.push(DIRTY.pickerBatch);\n            }\n            if (res.pickerPoseDirty) {\n                kinds.push(DIRTY.pickerPose);\n            }\n            if (kinds.length > 0) {\n                clearResourceDirty(res, kinds);\n            }\n        }\n    }\n\n    glPick(gl, frameStamp, { force = false } = {}) {\n        const perfToken = Perf.begin('scene_pick_ensure');\n\n        const earlyOut = () => {\n            Perf.end('scene_pick_ensure', perfToken);\n            return this.selectedIteractable;\n        };\n\n        if (this._pickFrameStamp === frameStamp && this._pickFrameResolved) return earlyOut();\n\n        this._pickFrameStamp = frameStamp;\n        this._pickFrameResolved = true;\n\n        if (!glContextUsable(gl)) {\n            this.selectedIteractable = 0;\n            return earlyOut();\n        }\n\n        if (!Mouse.inside || Mouse.x === undefined || Mouse.y === undefined) {\n            this.selectedIteractable = 0;\n            return earlyOut();\n        }\n\n        if (!this.sceneFullyRendered) {\n            if (!force) {\n                this.selectedIteractable = 0;\n                return earlyOut();\n            }\n            const pickPrepareToken = Perf.begin('scene_pick_prepare');\n            this.#preparePickTransforms();\n            Perf.end('scene_pick_prepare', pickPrepareToken);\n            const cam = this._requirePresentationCamera('glPick(force_js)');\n            const viewMatrix = this.presentationViewMatrix(cam);\n            const jsProjectionMatrix = cam.projectionMatrix;\n            const usedJSPick = this.#pickJS(viewMatrix, jsProjectionMatrix);\n            if (!usedJSPick) {\n                this.selectedIteractable = 0;\n            }\n            return earlyOut();\n        }\n\n        const reasonInfo = force\n            ? { reason: 'forced_input_pick' }\n            : this.getPickReasonDetails();\n        if (!reasonInfo) return earlyOut();\n\n        const pickPrepareToken = Perf.begin('scene_pick_prepare');\n        this.#preparePickTransforms();\n        Perf.end('scene_pick_prepare', pickPrepareToken);\n\n        this.pick(gl, reasonInfo);\n\n        return earlyOut();\n    }\n\n    #preparePickTransforms() {\n        this.presentedRoot().propagateTransforms(twgl.m4.identity(), null, 0, false, null);\n    }\n\n    /* Resolve the current picked interactable only if it still belongs to this scene and can accept input. */\n    pickedInteractable() {\n        const id = this.selectedIteractable;\n        if (!Number.isInteger(id) || id <= 0) {\n            return null;\n        }\n        const node = ui.Interactable._allInteractables.get(id) ?? null;\n        if (!node || node.scene !== this || node.enabled === false) {\n            return null;\n        }\n        return node;\n    }\n\n    /* Let transient UI observe pointer frames without consuming their normal routing. */\n    addPointerInputCaptureListener(listener) {\n        if (typeof listener !== 'function') {\n            throw new TypeError('Scene.addPointerInputCaptureListener(listener): listener must be a function.');\n        }\n        this._pointerInputCaptureListeners.add(listener);\n        return () => this._pointerInputCaptureListeners.delete(listener);\n    }\n\n    #notifyPointerInputCaptureListeners(event, picked) {\n        for (const listener of [...this._pointerInputCaptureListeners]) {\n            listener(event, picked);\n        }\n    }\n\n\n    /* Register one floating window in visual back-to-front order. */\n    registerWindow(window) {\n        this.unregisterWindow(window);\n        this._windowStack.push(window);\n        this.#syncWindowStack();\n    }\n\n    /* Apply a Stage-owned window order without changing scene/batcher ownership. */\n    setWindowOrder(windows) {\n        if (!Array.isArray(windows)) {\n            throw new Error('Scene.setWindowOrder(...): expected an array.');\n        }\n        if (windows.length !== this._windowStack.length || windows.some((window) => !this._windowStack.includes(window))) {\n            throw new Error('Scene.setWindowOrder(...): order must contain every registered scene window exactly once.');\n        }\n        this._windowStack = [...windows];\n        this.#syncWindowStack();\n    }\n\n    /* Remove one floating window from the visual stack. */\n    unregisterWindow(window) {\n        const index = this._windowStack.indexOf(window);\n        if (index === -1) {\n            return false;\n        }\n        this._windowStack.splice(index, 1);\n        this.#syncWindowStack();\n        return true;\n    }\n\n    /* Promote a floating window without changing modal or keyboard focus policy. */\n    bringWindowToFront(window) {\n        const index = this._windowStack.indexOf(window);\n        if (index === -1) {\n            return false;\n        }\n        if (index !== this._windowStack.length - 1) {\n            this._windowStack.splice(index, 1);\n            this._windowStack.push(window);\n            this.#syncWindowStack();\n        }\n        return true;\n    }\n\n    #syncWindowStack() {\n        for (let index = 0; index < this._windowStack.length; index += 1) {\n            const window = this._windowStack[index];\n            const position = window?.localPosition?.();\n            if (!position || typeof window?.setLocalPosition !== 'function') {\n                continue;\n            }\n            window.setLocalPosition([position[0], position[1], index === 0 ? 0 : -index]);\n        }\n    }\n\n    /* Route one pointer-input frame through the picked node first, then bubble to the scene root. */\n    propagatePointerInput(event, trace = null) {\n        this.stage?.prepareDialogPointerInput(event, this.pointerCaptureOwner ?? this.pickedInteractable());\n        if (shouldYieldWheelToCamera(event)) {\n            if (trace) {\n                trace.picked = null;\n                trace.steps.push({\n                    target: '<reserved-ctrl-wheel>',\n                    via: 'scene',\n                    outcome: 'propagated',\n                    reason: 'ctrl_wheel_reserved_for_camera',\n                });\n            }\n            const viewport = this.activeViewport ?? this.rootViewport ?? null;\n            return viewport && typeof viewport.onPointerInput === 'function'\n                ? viewport.onPointerInput(event) === true\n                : false;\n        }\n        let captured = this.pointerCaptureOwner;\n        if (!captured && this.dragCapture === 'button') {\n            this.dragCapture = null;\n        }\n        if (captured && (captured.scene !== this || captured.enabled === false || captured.computedVisible === false)) {\n            this.pointerCaptureOwner = null;\n            if (this.dragCapture === 'button') {\n                this.dragCapture = null;\n            }\n            captured = null;\n        }\n        if (captured) {\n            this.#notifyPointerInputCaptureListeners(event, captured);\n            if (trace) {\n                trace.picked = routeNodeLabel(captured);\n                trace.picked_id = captured.id ?? null;\n                trace.steps.push({\n                    target: routeNodeLabel(captured),\n                    via: 'pointer_capture',\n                    outcome: 'captured',\n                });\n            }\n            return captured._propagateInputEvent(event, trace);\n        }\n        const picked = this.pickedInteractable();\n        /* The picker is scene-global; apply Stage window ownership before any listener or node sees the event. */\n        const windowTarget = this.stage?.windowManager?.pointerTarget?.(this, picked) ?? { target: picked, masked: false };\n        const target = windowTarget.target;\n        this.#notifyPointerInputCaptureListeners(event, target);\n        if (!target) {\n            if (trace) {\n                trace.picked = null;\n                trace.steps.push({\n                    target: '<no-pick>',\n                    via: 'scene',\n                    outcome: 'propagated',\n                    reason: 'no_picked_interactable',\n                });\n            }\n            const viewport = this.activeViewport ?? this.rootViewport ?? null;\n            if (viewport && typeof viewport.onPointerInput === 'function') {\n                const before = trace ? routeNodeLabel(viewport) && JSON.stringify({\n                    selected_interactable: this.selectedIteractable ?? null,\n                    target: routeNodeLabel(viewport),\n                    expanded: viewport.expanded === true,\n                }) : null;\n                const handled = viewport.onPointerInput(event) === true;\n                if (trace) {\n                    const after = JSON.stringify({\n                        selected_interactable: this.selectedIteractable ?? null,\n                        target: routeNodeLabel(viewport),\n                        expanded: viewport.expanded === true,\n                    });\n                    trace.steps.push({\n                        target: routeNodeLabel(viewport),\n                        via: 'viewport',\n                        outcome: handled\n                            ? (before === after ? 'masked' : 'consumed')\n                            : 'propagated',\n                    });\n                }\n                if (handled) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        this.stage?.windowManager?.activateFromNode?.(this, target);\n        if (trace) {\n            trace.picked = routeNodeLabel(target);\n            trace.picked_id = target.id ?? null;\n            if (windowTarget.masked) {\n                trace.steps.push({\n                    target: routeNodeLabel(target),\n                    via: 'window_manager',\n                    outcome: 'masked',\n                    reason: 'higher_window_covers_pointer',\n                });\n            }\n        }\n        const handled = target._propagateInputEvent(event, trace);\n        /* A masked lower target must not fall through to the document/viewport. */\n        return handled || windowTarget.masked;\n    }\n\n    // Fast path for the common 2D UI case: if every pickable node in the scene\n    // can be reduced to an axis-aligned projected rect, pick entirely in JS and\n    // avoid the expensive synchronous GPU readback.\n    #pickJS(viewMatrix, projectionMatrix) {\n        const mouse = {\n            x: Mouse.x * 2.0 - 1.0,\n            y: 1.0 - Mouse.y * 2.0,\n        };\n        const cam = this._requirePresentationCamera('#pickJS');\n        const rawMouseWorld = cam.getMouseWorldPosition();\n        const mouseWorld = rawMouseWorld ? this.worldToPresentationPoint(rawMouseWorld) : null;\n        const result = walkNodeForJSPick(this.presentedRoot(), mouse, mouseWorld, viewMatrix, projectionMatrix);\n        if (result.fallback) {\n            return false;\n        }\n        this.selectedIteractable = result.best?.id ?? 0;\n        return true;\n    }\n\n    pick(gl, reasonInfo = '<unknown>') {\n        const perfToken = Perf.begin('scene_pick_read');\n        \n        const cam = this._requirePresentationCamera('pick');\n\n        const pickPixel = this.#currentPickPixel(gl);\n        const t = this.presentationTimeSeconds();\n        const viewMatrix = this.presentationViewMatrix(cam);\n        const jsProjectionMatrix = cam.projectionMatrix;\n        const reason = typeof reasonInfo === 'string' ? reasonInfo : (reasonInfo?.reason ?? '<unknown>');\n\n        const usedJSPick = this.#pickJS(viewMatrix, jsProjectionMatrix);\n        gpuDiagNotePickerTrigger(usedJSPick ? 'js_pick' : 'gl_pick', reason, {\n            pick_x: pickPixel.x,\n            pick_y: pickPixel.y,\n            pick_width: pickPixel.width,\n            pick_height: pickPixel.height,\n            resource_key: reasonInfo?.resource_key ?? '',\n            dirty_kinds: Array.isArray(reasonInfo?.dirty_kinds) ? reasonInfo.dirty_kinds : [],\n        });\n\n        if (!usedJSPick) {\n            gpuDiagNotePickerGlFallbackAttempt(reason, {\n                pick_x: pickPixel.x,\n                pick_y: pickPixel.y,\n                pick_width: pickPixel.width,\n                pick_height: pickPixel.height,\n                resource_key: reasonInfo?.resource_key ?? '',\n                dirty_kinds: Array.isArray(reasonInfo?.dirty_kinds) ? reasonInfo.dirty_kinds : [],\n            });\n            const projectionMatrix = this.#pickProjectionMatrix();\n            glpicker.readPixelBuffer(gl, this, t, viewMatrix, projectionMatrix, {\n                readWidth: pickPixel.width, readHeight: pickPixel.height,\n                readX: pickPixel.x, readY: pickPixel.y\n            });\n            const result = this._glPickerData?.lastPickedId || 0;\n            if (typeof result === 'number') {\n                this.selectedIteractable = result;\n            }\n        }\n\n        this._pickedOnce = true;\n        this._pickCam = new Float32Array(cam.localToWorld());\n        this._pickPixel = pickPixel;\n        this._pickPresentationPoseRev = this._presentationPoseRevision;\n        this._pickSampleProjectionRev = this._pickProjectionRev;\n        this._pickSampleFramebufferRev = this._pickFramebufferRev;\n        this.#acknowledgePickerDirty();\n\n        Perf.end('scene_pick_read', perfToken);\n    }\n\n    /*\n     * Draw one scene surface. Stage clears colour and depth for the world, then\n     * draws the HUD with world colour preserved and a fresh HUD depth buffer.\n     * That depth reset makes the HUD categorically above the world; ordinary Z\n     * coordinates determine ordering among nodes inside each surface.\n     */\n    draw(gl, {\n        clearColor = true,\n        clearDepth = true,\n        captureFrostedBackdrop = null,\n    } = {}) {\n        const perfLabel = this._perfLabel || 'scene_unknown';\n        const perfToken = Perf.begin('scene_draw');\n        Perf.inc('scene_draw_call_count');\n        Perf.inc(`scene_draw_call_count.${perfLabel}`);\n        const cam = this._requirePresentationCamera('draw');\n        if (!glContextUsable(gl)) {\n            this.sceneFullyRendered = false;\n            Perf.end('scene_draw', perfToken);\n            return;\n        }\n\n        let stepToken = Perf.begin('scene_draw_bind_target');\n        this.bindTarget(gl);\n        Perf.end('scene_draw_bind_target', stepToken);\n\n        const t = this.presentationTimeSeconds();\n        const projectionMatrix = cam.projectionMatrix;\n        const viewMatrix = this.presentationViewMatrix(cam);\n\n        let clearMask = 0;\n        if (clearColor) {\n            gl.clearColor(...Palette.black);\n            clearMask |= gl.COLOR_BUFFER_BIT;\n        }\n        if (clearDepth) {\n            clearMask |= gl.DEPTH_BUFFER_BIT;\n        }\n        if (clearMask !== 0) {\n            stepToken = Perf.begin('scene_draw_clear');\n            gl.clear(clearMask);\n            Perf.end('scene_draw_clear', stepToken);\n        }\n\n        if (this._debugPickerOnly) {\n            this.#drawPickerDebugPass(gl, t, viewMatrix, projectionMatrix);\n            Perf.end('scene_draw', perfToken);\n            return;\n        }\n\n        gl.enable(gl.BLEND);\n        this.#drawPasses(gl, t, viewMatrix, projectionMatrix, perfLabel, {\n            captureFrostedBackdrop,\n        });\n\n        gl.depthMask(true);\n        Perf.end('scene_draw', perfToken);\n    }\n\n    #drawPickerDebugPass(gl, t, viewMatrix, projectionMatrix) {\n        this.sceneFullyRendered = true;\n\n        const hadBlend = gl.isEnabled(gl.BLEND);\n        const hadDither = gl.isEnabled(gl.DITHER);\n        const hadDepthTest = gl.isEnabled(gl.DEPTH_TEST);\n        const hadDepthMask = gl.getParameter(gl.DEPTH_WRITEMASK);\n\n        gl.disable(gl.BLEND);\n        gl.disable(gl.DITHER);\n        gl.depthMask(true);\n        gl.enable(gl.DEPTH_TEST);\n        gl.clear(gl.DEPTH_BUFFER_BIT);\n\n        const perfToken = Perf.begin('scene_draw_picker_debug');\n        try {\n            glpicker.drawGLPicker(gl, this, t, viewMatrix, projectionMatrix);\n        } finally {\n            Perf.end('scene_draw_picker_debug', perfToken);\n            gl.depthMask(Boolean(hadDepthMask));\n            if (hadBlend) {\n                gl.enable(gl.BLEND);\n            } else {\n                gl.disable(gl.BLEND);\n            }\n            if (hadDither) {\n                gl.enable(gl.DITHER);\n            } else {\n                gl.disable(gl.DITHER);\n            }\n            if (hadDepthTest) {\n                gl.enable(gl.DEPTH_TEST);\n            } else {\n                gl.disable(gl.DEPTH_TEST);\n            }\n        }\n    }\n\n    /*\n     * Dispatch material phases against one shared native depth space. These\n     * phases optimize blending and depth writes; they do not encode semantic\n     * UI order. HUD content, windows, menus, system chrome, tooltips, and\n     * toasts obtain their order from their root transforms.\n     * Explicit overlay batches compose last with depth disabled, outside those material phases.\n     */\n    #drawPasses(gl, t, viewMatrix, projectionMatrix, perfLabel, {\n        captureFrostedBackdrop = null,\n    } = {}) {\n        const status = { response: ui.RENDER_STATUS.READY };\n        const opaqueBatchers = Array.from(this._opaqueBatchers.values());\n        const textBatchers = Array.from(this._textBatchers.values());\n        const allTransparentBatchers = Array.from(this._transparentBatchers.values());\n        const sceneTransparentBatchers = allTransparentBatchers.filter(\n            res => res.batchDescriptor?.composition !== 'overlay',\n        );\n        const overlayBatchers = allTransparentBatchers.filter(\n            res => res.batchDescriptor?.composition === 'overlay'\n                && res.classConstructor._hasPresentedOverlay(res),\n        );\n        const frostedBatchers = sceneTransparentBatchers.filter(\n            res => batcherRequiresBackdrop(res)\n                && res.nodes?.some(node => node?.computedVisible !== false),\n        );\n        const transparentBatchers = sceneTransparentBatchers.filter(\n            res => !batcherRequiresBackdrop(res),\n        );\n        const batcherCount = opaqueBatchers.length + textBatchers.length + allTransparentBatchers.length;\n\n        if (frostedBatchers.length > 0 && typeof captureFrostedBackdrop !== 'function') {\n            throw new Error('Scene.draw(...): frosted glass requires a Stage capture callback.');\n        }\n        gl.enable(gl.DEPTH_TEST);\n        this.sceneFullyRendered = true;\n        Perf.inc('scene_draw_batcher_count', batcherCount);\n        Perf.inc(`scene_draw_batcher_count.${perfLabel}`, batcherCount);\n\n        const drawPhase = (phase, batchers, draw) => {\n            const phaseToken = Perf.begin(`scene_draw_${phase}`);\n            const scenePhaseToken = Perf.begin(`scene_draw_${phase}.${perfLabel}`);\n            for (const res of batchers) {\n                const key = perfDrawKey(res);\n                Perf.inc(`scene_draw_dispatch_count.${phase}`);\n                Perf.inc(`scene_draw_dispatch_count.${phase}.${key}`);\n                const resToken = Perf.begin(`scene_draw_${phase}.${key}`);\n                Perf.gpuBegin(`gpu_draw_${phase}.${key}`);\n                draw(res, status);\n                Perf.gpuEnd();\n                Perf.end(`scene_draw_${phase}.${key}`, resToken);\n                if (status.response !== ui.RENDER_STATUS.READY) {\n                    this.sceneFullyRendered = false;\n                }\n            }\n            Perf.end(`scene_draw_${phase}.${perfLabel}`, scenePhaseToken);\n            Perf.end(`scene_draw_${phase}`, phaseToken);\n        };\n\n        const drawOpaque = () => {\n            gl.depthMask(true);\n            drawPhase('opaque', opaqueBatchers, (res, drawStatus) => {\n                res.classConstructor._drawOpaque(gl, res, t, viewMatrix, projectionMatrix, drawStatus);\n            });\n        };\n        const drawText = () => {\n            gl.depthMask(false);\n            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            gl.depthFunc(gl.LEQUAL);\n            drawPhase('text', textBatchers, (res, drawStatus) => {\n                res.classConstructor._drawText(gl, res, t, viewMatrix, projectionMatrix, drawStatus);\n            });\n        };\n        const drawTransparent = () => {\n            gl.depthMask(false);\n            gl.enable(gl.BLEND);\n            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            gl.depthFunc(gl.LEQUAL);\n            drawPhase('transparent', transparentBatchers, (res, drawStatus) => {\n                res.classConstructor._drawTransparent(gl, res, t, viewMatrix, projectionMatrix, drawStatus);\n            });\n        };\n\n        drawOpaque();\n        if (frostedBatchers.length === 0) {\n            drawText();\n            drawTransparent();\n        } else {\n            drawTransparent();\n            captureFrostedBackdrop();\n            gl.depthMask(true);\n            gl.enable(gl.BLEND);\n            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            gl.depthFunc(gl.LEQUAL);\n            drawPhase('frosted', frostedBatchers, (res, drawStatus) => {\n                res.classConstructor._drawTransparent(gl, res, t, viewMatrix, projectionMatrix, drawStatus);\n            });\n            drawText();\n        }\n        if (overlayBatchers.length > 0) {\n            // Overlay batches blend over the completed scene, including late icons and glass.\n            gl.disable(gl.DEPTH_TEST);\n            gl.depthMask(false);\n            gl.enable(gl.BLEND);\n            gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n            try {\n                drawPhase('overlay', overlayBatchers, (res, drawStatus) => {\n                    res.classConstructor._drawTransparent(gl, res, t, viewMatrix, projectionMatrix, drawStatus);\n                });\n            } finally {\n                gl.depthMask(true);\n                gl.enable(gl.DEPTH_TEST);\n            }\n        }\n        gl.depthFunc(gl.LESS);\n    }\n\n\n    #currentPickPixel(gl = this.gl) {\n        if (!gl) return null;\n        const width = gl.drawingBufferWidth;\n        const height = gl.drawingBufferHeight;\n        const pickPixel = (v, limit) => Math.max(0, Math.min(limit - 1, Math.floor(v * limit)));\n        \n        return {\n            width, height,\n            x: pickPixel(Mouse.x, width),\n            y: pickPixel(Mouse.y, height),\n        };\n    }\n\n    #pickProjectionMatrix(gl = this.gl) {\n        const pixel = this.#currentPickPixel(gl);\n        const cam = this._requirePresentationCamera('#pickProjectionMatrix');\n        if (!pixel) return cam.projectionMatrix;\n        \n        const focus = twgl.m4.identity();\n        focus[0] = pixel.width;\n        focus[5] = pixel.height;\n        focus[12] = pixel.width - (2 * pixel.x) - 1;\n        focus[13] = (2 * pixel.y) + 1 - pixel.height;\n        \n        return twgl.m4.multiply(focus, cam.projectionMatrix);\n    }\n\n    presentationViewMatrix(cam = this._requirePresentationCamera('presentationViewMatrix')) {\n        return twgl.m4.multiply(\n            twgl.m4.inverse(cam.localToWorld()),\n            this._presentationWorldMatrix,\n        );\n    }\n\n    /* Handle scene-scoped function keys before handing the rest to focus-aware viewport routing. */\n    sendKeyDown(evt) {\n        return withPortalTimingScope('scene.send_keydown', {\n            key: evt?.key ?? null,\n        }, () => {\n            if (evt?.key === 'F7') {\n                this._requirePresentationCamera('sendKeyDown').toggleViewMode();\n                return true;\n            }\n            if (evt?.key === 'F2') {\n                this._debugPickerOnly = !this._debugPickerOnly;\n                this.sceneFullyRendered = false;\n                requestFrame(this._debugPickerOnly ? 'scene_debug_picker_enabled' : 'scene_debug_picker_disabled');\n                return true;\n            }\n            return dispatchFocusedKeyDown(this, evt);\n        });\n    }\n\n    sendBeforeInput(evt) {\n        return dispatchFocusedBeforeInput(this, evt);\n    }\n}\n\nfunction deleteFramebufferInfo(gl, framebufferInfo) {\n    if (!gl || !framebufferInfo) return;\n\n    for (const attachment of framebufferInfo.attachments || []) {\n        if (!attachment) continue;\n\n        if (typeof WebGLTexture !== 'undefined' && attachment instanceof WebGLTexture) {\n            gl.deleteTexture(attachment);\n        } \n        else if (typeof WebGLRenderbuffer !== 'undefined' && attachment instanceof WebGLRenderbuffer) {\n            gl.deleteRenderbuffer(attachment);\n        } \n        else {\n            try {\n                if (gl.isTexture?.(attachment)) {\n                    gl.deleteTexture(attachment);\n                } else if (gl.isRenderbuffer?.(attachment)) {\n                    gl.deleteRenderbuffer(attachment);\n                }\n            } catch (err) {\n                // Suppress strict WebIDL TypeErrors if it still complains\n            }\n        }\n    }\n    \n    if (framebufferInfo.framebuffer) {\n        gl.deleteFramebuffer(framebufferInfo.framebuffer);\n    }\n}\n\nfunction perfDrawKey(res) {\n    const key = res?.resourceKey ?? res?.classConstructor?.name ?? 'unknown';\n    return `${key}`.replaceAll(' ', '_');\n}\n\nfunction glContextUsable(gl) {\n    if (!gl) {\n        return false;\n    }\n    try {\n        return !(typeof gl.isContextLost === 'function' && gl.isContextLost());\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction samePickPixel(a, b) {\n    if (!a || !b) return false;\n    return a.width === b.width && a.height === b.height && a.x === b.x && a.y === b.y;\n}\n\nfunction walkNodeForJSPick(node, mouse, mouseWorld, viewMatrix, projectionMatrix) {\n    if (!node || node.computedVisible === false || !pickClipAllowsNode(node, mouseWorld)) {\n        return {\n            fallback: false,\n            best: null,\n        };\n    }\n\n    let best = null;\n\n    // Walk children first so front-most descendants keep precedence over parents.\n    for (let i = node.children.length - 1; i >= 0; i--) {\n        const child = node.children[i];\n        const result = walkNodeForJSPick(child, mouse, mouseWorld, viewMatrix, projectionMatrix);\n        if (result.fallback) {\n            return result;\n        }\n        best = betterPick(best, result.best);\n    }\n\n    if (node._usesGLPicker?.()) {\n        if (node.enabled === false) {\n            return {\n                fallback: false,\n                best,\n            };\n        }\n\n        if (!node._hasTrivialJSPick?.()) {\n            // This scene contains a genuinely non-trivial pickable. Abort the JS\n            // path and let the GL picker remain the source of truth.\n            return {\n                fallback: true,\n                best: null,\n            };\n        }\n\n        const localRect = node._jsPickLocalRect?.();\n        const rect = projectPickRect(localRect, node, viewMatrix, projectionMatrix);\n\n        if (!rect) {\n            return {\n                fallback: false,\n                best,\n            };\n        }\n\n        if (!rect.axisAligned) {\n            return {\n                fallback: true,\n                best: null,\n            };\n        }\n\n        if (pickRectContains(rect, mouse)) {\n            best = betterPick(best, {\n                id: node.id,\n                depth: rect.depth,\n            });\n        }\n    }\n\n    return {\n        fallback: false,\n        best,\n    };\n}\n\nconst g_pickCorner00 = { x: 0, y: 0, z: 0 };\nconst g_pickCorner10 = { x: 0, y: 0, z: 0 };\nconst g_pickCorner01 = { x: 0, y: 0, z: 0 };\nconst g_pickCorner11 = { x: 0, y: 0, z: 0 };\n\nfunction projectPickRect(localRect, node, viewMatrix, projectionMatrix) {\n    if (!localRect || !node) {\n        return null;\n    }\n    const pose = node._pickPose?.(node.scene) ?? node._batchPose?.(node.scene);\n    if (!pose) {\n        return null;\n    }\n\n    // Project the four local rect corners through the normal draw matrices and\n    // then test whether the projected quad is still an axis-aligned rectangle.\n    const { anchorToRoot, localToAnchor } = pose;\n    const p00 = g_pickCorner00;\n    const p10 = g_pickCorner10;\n    const p01 = g_pickCorner01;\n    const p11 = g_pickCorner11;\n    if (!projectPickPointInto(p00, localRect.minX, localRect.minY, 0, anchorToRoot, localToAnchor, viewMatrix, projectionMatrix)\n        || !projectPickPointInto(p10, localRect.maxX, localRect.minY, 0, anchorToRoot, localToAnchor, viewMatrix, projectionMatrix)\n        || !projectPickPointInto(p01, localRect.minX, localRect.maxY, 0, anchorToRoot, localToAnchor, viewMatrix, projectionMatrix)\n        || !projectPickPointInto(p11, localRect.maxX, localRect.maxY, 0, anchorToRoot, localToAnchor, viewMatrix, projectionMatrix)) {\n        return null;\n    }\n\n    const depth = node.pickerAlwaysBehind ? 0.99999 : Math.min(p00.z, p10.z, p01.z, p11.z);\n    const axisAligned = nearlyEqual(p00.y, p10.y)\n        && nearlyEqual(p01.y, p11.y)\n        && nearlyEqual(p00.x, p01.x)\n        && nearlyEqual(p10.x, p11.x);\n\n    return {\n        minX: Math.min(p00.x, p10.x, p01.x, p11.x),\n        maxX: Math.max(p00.x, p10.x, p01.x, p11.x),\n        minY: Math.min(p00.y, p10.y, p01.y, p11.y),\n        maxY: Math.max(p00.y, p10.y, p01.y, p11.y),\n        depth,\n        axisAligned,\n    };\n}\n\n/* Project one pick corner without allocating intermediate vec4 arrays on the hot JS-pick path. */\nfunction projectPickPointInto(out, x, y, z, anchorToRoot, localToAnchor, viewMatrix, projectionMatrix) {\n    const al0 = localToAnchor[0] * x + localToAnchor[4] * y + localToAnchor[8] * z + localToAnchor[12];\n    const al1 = localToAnchor[1] * x + localToAnchor[5] * y + localToAnchor[9] * z + localToAnchor[13];\n    const al2 = localToAnchor[2] * x + localToAnchor[6] * y + localToAnchor[10] * z + localToAnchor[14];\n    const al3 = localToAnchor[3] * x + localToAnchor[7] * y + localToAnchor[11] * z + localToAnchor[15];\n\n    const w0 = anchorToRoot[0] * al0 + anchorToRoot[4] * al1 + anchorToRoot[8] * al2 + anchorToRoot[12] * al3;\n    const w1 = anchorToRoot[1] * al0 + anchorToRoot[5] * al1 + anchorToRoot[9] * al2 + anchorToRoot[13] * al3;\n    const w2 = anchorToRoot[2] * al0 + anchorToRoot[6] * al1 + anchorToRoot[10] * al2 + anchorToRoot[14] * al3;\n    const w3 = anchorToRoot[3] * al0 + anchorToRoot[7] * al1 + anchorToRoot[11] * al2 + anchorToRoot[15] * al3;\n\n    const v0 = viewMatrix[0] * w0 + viewMatrix[4] * w1 + viewMatrix[8] * w2 + viewMatrix[12] * w3;\n    const v1 = viewMatrix[1] * w0 + viewMatrix[5] * w1 + viewMatrix[9] * w2 + viewMatrix[13] * w3;\n    const v2 = viewMatrix[2] * w0 + viewMatrix[6] * w1 + viewMatrix[10] * w2 + viewMatrix[14] * w3;\n    const v3 = viewMatrix[3] * w0 + viewMatrix[7] * w1 + viewMatrix[11] * w2 + viewMatrix[15] * w3;\n\n    const c0 = projectionMatrix[0] * v0 + projectionMatrix[4] * v1 + projectionMatrix[8] * v2 + projectionMatrix[12] * v3;\n    const c1 = projectionMatrix[1] * v0 + projectionMatrix[5] * v1 + projectionMatrix[9] * v2 + projectionMatrix[13] * v3;\n    const c2 = projectionMatrix[2] * v0 + projectionMatrix[6] * v1 + projectionMatrix[10] * v2 + projectionMatrix[14] * v3;\n    const c3 = projectionMatrix[3] * v0 + projectionMatrix[7] * v1 + projectionMatrix[11] * v2 + projectionMatrix[15] * v3;\n    const w = c3;\n\n    if (!Number.isFinite(w) || Math.abs(w) < 1e-6) {\n        return false;\n    }\n\n    out.x = c0 / w;\n    out.y = c1 / w;\n    out.z = c2 / w;\n    return true;\n}\n\nfunction pickRectContains(rect, mouse) {\n    if (!rect) {\n        return false;\n    }\n    return mouse.x >= rect.minX\n        && mouse.x <= rect.maxX\n        && mouse.y >= rect.minY\n        && mouse.y <= rect.maxY;\n}\n\nfunction betterPick(a, b) {\n    if (!a) return b;\n    if (!b) return a;\n    // Smaller NDC z is visually nearer. On ties, preserve the existing\n    // winner so JS picking matches the scene's reverse child traversal order.\n    if (b.depth < a.depth - 1e-6) {\n        return b;\n    }\n    if (a.depth < b.depth - 1e-6) {\n        return a;\n    }\n    return a;\n}\n\nfunction nearlyEqual(a, b, eps = 1e-4) {\n    return Math.abs(a - b) <= eps;\n}\n\nfunction pickClipAllowsNode(node, mouseWorld) {\n    const rect = node?.computedClipRect;\n    if (!rect || !mouseWorld) {\n        return true;\n    }\n    const [x, y] = mouseWorld;\n    return x >= rect[0]\n        && x <= rect[2]\n        && y >= rect[1]\n        && y <= rect[3];\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { removeFocusEntry, reconcileControlFocus } from './focus-manager.mjs';\n\n/* Stage-owned desktop policy for retained UIWindow nodes. It owns no GL state:\n * window descendants remain ordinary nodes in the existing scene-wide batches. */\nexport class WindowManager {\n    constructor(stage) {\n        if (!stage) throw new Error('WindowManager(...): Stage is required.');\n        this.stage = stage;\n        this._records = new Map();\n        this._nextId = 1;\n        this._nextActivation = 1;\n        this.activeWindow = null;\n    }\n\n    register(window) {\n        if (!window?.scene || window.scene.stage !== this.stage) {\n            throw new Error('WindowManager.register(...): window must be attached to this Stage.');\n        }\n        if (this._records.has(window)) return this._records.get(window).id;\n        const id = this.#allocateId(window.windowId);\n        const owner = this.#resolveOwner(window);\n        if (owner && owner.scene !== window.scene) {\n            throw new Error('WindowManager.register(...): an owned window must share its owner\\'s scene.');\n        }\n        const record = { id, window, scene: window.scene, owner, workspaceId: window.workspaceId ?? 'default', activation: this._nextActivation++ };\n        this._records.set(window, record);\n        window.windowId = id;\n        window.windowManager = this;\n        window.scene.registerWindow?.(window);\n        this.#syncScene(record.scene);\n        return id;\n    }\n\n    unregister(window) {\n        const record = this._records.get(window);\n        if (!record) return false;\n        this._records.delete(window);\n        if (this.activeWindow === window) this.activeWindow = null;\n        if (window.windowManager === this) window.windowManager = null;\n        record.scene.unregisterWindow?.(window);\n        this.#syncScene(record.scene);\n        return true;\n    }\n\n    activate(window) {\n        const record = this.#record(window, 'activate');\n        this.#rootRecord(record).activation = this._nextActivation++;\n        this.activeWindow = window;\n        this.#syncScene(record.scene);\n        return true;\n    }\n\n    activateFromNode(scene, node) {\n        const window = this.windowForNode(scene, node);\n        return window ? this.activate(window) : false;\n    }\n\n    windowForNode(scene, node) {\n        for (let current = node ?? null; current; current = current.parentNode ?? null) {\n            const owner = current.inputOwnerWindow;\n            if (owner && this._records.get(owner)?.scene === scene) return owner;\n            const record = this._records.get(current);\n            if (record?.scene === scene) return current;\n        }\n        return null;\n    }\n\n    /* Keyboard traversal ignores entire background windows, even exposed parts. */\n    allowsKeyboardTarget(node, modal = null) {\n        const window = this.windowForNode(node.scene, node);\n        if (modal) return !window || window === modal;\n        if (!window) return true;\n        const records = this.#orderedRecords().filter(record => {\n            const candidate = record.window;\n            if (record.scene !== this.stage.activeScene && record.scene !== this.stage.hudScene) return false;\n            for (let current = candidate; current; current = current.parentNode) {\n                if (current.visible === false || current.closed) return false;\n            }\n            return true;\n        });\n        return records.at(-1)?.window === window;\n    }\n\n    /* Resolve the foremost managed window containing the pointer in scene-local window coordinates. */\n    topmostWindowAtPointer(scene) {\n        const records = this.#orderedRecords(scene);\n        for (let index = records.length - 1; index >= 0; index -= 1) {\n            const window = records[index].window;\n            if (this.#windowContainsPointer(window)) return window;\n        }\n        return null;\n    }\n\n    /*\n     * Picking identifies an Interactable, not a desktop window owner. Resolve the\n     * window at the pointer separately so an exposed lower-window button cannot\n     * receive input through the body of a higher-ranked managed window.\n     */\n    pointerTarget(scene, candidate = null) {\n        if (this.stage.activeDialog?.ownsNode(candidate)) return { target: candidate, masked: false };\n        const topmost = this.topmostWindowAtPointer(scene);\n        if (!topmost) return { target: candidate, masked: false };\n        if (this.windowForNode(scene, candidate) === topmost\n            || this.#overlayBelongsToWindowFamily(scene, candidate, topmost)) {\n            return { target: candidate, masked: false };\n        }\n        /* The blocker also forwards wheel input to the foreground window's own ScrollBoxes. */\n        return {\n            target: topmost.bodyInputBlocker ?? topmost,\n            masked: true,\n        };\n    }\n\n    /* Permit a HUD overlay only when it was explicitly opened by the foreground window family. */\n    #overlayBelongsToWindowFamily(scene, node, window) {\n        let owner = null;\n        for (let current = node; current; current = current.parentNode ?? null) {\n            if (current.inputOwnerWindow) {\n                owner = current.inputOwnerWindow;\n                break;\n            }\n        }\n        const ownerRecord = owner ? this._records.get(owner) : null;\n        const windowRecord = this._records.get(window);\n        return ownerRecord?.scene === scene\n            && windowRecord?.scene === scene\n            && this.#rootRecord(ownerRecord).window === this.#rootRecord(windowRecord).window;\n    }\n\n    windowSnapshot() {\n        return this.#orderedRecords().map((record) => ({\n            id: record.id,\n            ownerId: record.owner ? this._records.get(record.owner)?.id ?? null : null,\n            workspaceId: record.workspaceId,\n            active: record.window === this.activeWindow,\n        }));\n    }\n\n    closeWindow(window) {\n        const record = this.#record(window, 'closeWindow');\n        for (const child of this.#descendantsIncluding(record).reverse()) {\n            child.window.closed = true;\n            removeFocusEntry(child.window);\n            const mount = child.window.ownMount ?? child.window;\n            mount.parentNode?.removeChild(mount);\n        }\n        return true;\n    }\n\n    #windowContainsPointer(window) {\n        if (window?.computedVisible === false || !window?.scene || !Number.isFinite(window.state?.width) || !Number.isFinite(window.state?.height)) {\n            return false;\n        }\n        let point = null;\n        try {\n            point = window.getLocalMousePosition?.() ?? null;\n        } catch (_error) {\n            return false;\n        }\n        return Array.isArray(point)\n            && point[0] >= 0 && point[0] <= window.state.width\n            && point[1] >= 0 && point[1] <= window.state.height;\n    }\n\n    #allocateId(requested) {\n        const id = requested ?? `window-${this._nextId++}`;\n        if (typeof id !== 'string' || id.length === 0) throw new Error('WindowManager.register(...): windowId must be a non-empty string.');\n        for (const record of this._records.values()) {\n            if (record.id === id) throw new Error(`WindowManager.register(...): duplicate windowId '${id}'.`);\n        }\n        return id;\n    }\n\n    #resolveOwner(window) {\n        if (window.ownerWindow) {\n            if (!this._records.has(window.ownerWindow)) throw new Error('WindowManager.register(...): ownerWindow must already be registered.');\n            return window.ownerWindow;\n        }\n        if (window.ownerWindowId == null) return null;\n        for (const record of this._records.values()) {\n            if (record.id === window.ownerWindowId) return record.window;\n        }\n        throw new Error(`WindowManager.register(...): ownerWindowId '${window.ownerWindowId}' is not registered.`);\n    }\n\n    #record(window, caller) {\n        const record = this._records.get(window);\n        if (!record) throw new Error(`WindowManager.${caller}(...): window is not registered.`);\n        return record;\n    }\n\n    #rootRecord(record) {\n        let current = record;\n        const seen = new Set();\n        while (current.owner) {\n            if (seen.has(current.window)) throw new Error('WindowManager: window ownership cycle.');\n            seen.add(current.window);\n            current = this.#record(current.owner, 'rootRecord');\n        }\n        return current;\n    }\n\n    #depth(record) {\n        let depth = 0;\n        let current = record;\n        const seen = new Set();\n        while (current.owner) {\n            if (seen.has(current.window)) throw new Error('WindowManager: window ownership cycle.');\n            seen.add(current.window);\n            depth += 1;\n            current = this.#record(current.owner, 'depth');\n        }\n        return depth;\n    }\n\n    #orderedRecords(scene = null) {\n        return Array.from(this._records.values()).filter((record) => scene === null || record.scene === scene).sort((a, b) => {\n            const rootOrder = this.#rootRecord(a).activation - this.#rootRecord(b).activation;\n            if (rootOrder !== 0) return rootOrder;\n            const depthOrder = this.#depth(a) - this.#depth(b);\n            if (depthOrder !== 0) return depthOrder;\n            return a.activation - b.activation;\n        });\n    }\n\n    #descendantsIncluding(record) {\n        const out = [record];\n        for (const candidate of this._records.values()) {\n            if (candidate.owner === record.window) out.push(...this.#descendantsIncluding(candidate));\n        }\n        return out;\n    }\n\n    #syncScene(scene) {\n        scene.setWindowOrder?.(this.#orderedRecords(scene).map((record) => record.window));\n        reconcileControlFocus(this.stage);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport * as twgl from 'twgl';\nimport { releaseContextImageTextures, retainContextImageTextures } from './context-image-texture.mjs';\nimport { appendClickTraceEvent, activeClickFocusTrace } from './click-trace.mjs';\nimport { currentEvilSnapshot, evilFromJSTime } from '../eviltime.mjs';\nimport { releaseContextFontTextures, retainContextFontTextures } from '../evilfont/evilfont.mjs';\nimport { Caret } from './caret.mjs';\nimport { currentFocusEntry, currentFocusedInputCell, reconcileControlFocus, onFocusStackChange, setFocusStackRoot } from './focus-manager.mjs';\nimport { releaseContextGlPrograms, retainContextGlPrograms } from './gl-program.mjs';\nimport { Scene } from './scene.mjs';\nimport { WindowManager } from './window-manager.mjs';\n\n/* Keep explicit stage-owned batcher registries typed as real Maps. */\nfunction assertBatcherMap(label, map) {\n    if (!(map instanceof Map)) {\n        throw new Error(`${label}: expected a Map.`);\n    }\n}\n\nfunction cloneDims(dims) {\n    return {\n        width: dims?.width ?? 1,\n        height: dims?.height ?? 1,\n    };\n}\n\nfunction sameMat16(a, b) {\n    if (!a || !b) {\n        return false;\n    }\n    for (let i = 0; i < 16; i++) {\n        if (a[i] !== b[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction cloneMat16(matrix) {\n    return matrix ? new Float32Array(matrix) : null;\n}\n\n/* Assert that one scene's pass registries stay disjoint so a key cannot silently span passes. */\nfunction assertDistinctBatcherKeys(label, opaqueBatchers, textBatchers, transparentBatchers) {\n    const seen = new Map();\n    const visit = (pass, map) => {\n        for (const [key] of map.entries()) {\n            const prev = seen.get(key);\n            if (prev) {\n                throw new Error(`${label}: duplicate batcher key '${key}' across ${prev} and ${pass}.`);\n            }\n            seen.set(key, pass);\n        }\n    };\n    visit('opaque', opaqueBatchers);\n    visit('text', textBatchers);\n    visit('transparent', transparentBatchers);\n}\n\nfunction findNode(root, predicate) {\n    if (!root) {\n        return null;\n    }\n    if (predicate(root)) {\n        return root;\n    }\n    for (const child of root.children ?? []) {\n        const found = findNode(child, predicate);\n        if (found) {\n            return found;\n        }\n    }\n    return null;\n}\n\nfunction quiescenceSceneLabel(scene) {\n    return scene?.activeViewport?.state?.name\n        ?? scene?.rootViewport?.state?.name\n        ?? scene?.root?.state?.name\n        ?? 'scene';\n}\n\n/* Add one counted diagnostic key into an aggregate map without forcing callers to repeat boilerplate. */\nfunction incCount(counts, key, delta = 1) {\n    counts.set(key, (counts.get(key) || 0) + delta);\n}\n\n/* Merge one scene-local owner list into the stage-wide quiescence owner summary. */\nfunction mergeScheduledThinkOwners(counts, prefix, entries) {\n    for (const entry of entries ?? []) {\n        if (!entry?.key || !Number.isFinite(entry.count) || entry.count <= 0) {\n            continue;\n        }\n        incCount(counts, `${prefix}:${entry.key}`, entry.count);\n    }\n}\n\n/* Sort stage-wide owner counters so the busiest pending wake owners stay at the top. */\nfunction sortCountEntries(counts) {\n    return Array.from(counts.entries())\n        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n        .map(([key, count]) => ({ key, count }));\n}\n\nfunction deriveViewRelativeAnchorWorld(camera, anchorDepth) {\n    if (!camera?.vpBounds) {\n        return null;\n    }\n    const camPos = camera.worldPosition();\n    const viewportSize = camera.getViewportSize();\n    const fovRad = camera.fov * (Math.PI / 180);\n    const distance = (viewportSize[1] * 0.5) / Math.tan(fovRad * 0.5);\n    const scale = (distance - anchorDepth) / distance;\n    const x = camPos[0] - viewportSize[0] * 0.5 * scale;\n    const y = camPos[1] - viewportSize[1] * 0.5 * scale;\n    const z = camPos[2] + distance - anchorDepth;\n    return {\n        camera_position_world: [camPos[0], camPos[1], camPos[2]],\n        viewport_px: {\n            width: viewportSize[0],\n            height: viewportSize[1],\n        },\n        anchor_depth: anchorDepth,\n        anchor_scale: scale,\n        anchor_world: cloneMat16(twgl.m4.scale(\n            twgl.m4.translation([x, y, z]),\n            [scale, scale, 1.0],\n        )),\n    };\n}\n\n/* Stage is the once-per-canvas owner for scene composition, context lifetime, and presentation camera choice. */\nexport class Stage {\n    focusContainerKind = 'Stage';\n\n    constructor() {\n        this.gl = null;\n        this.scenes = [];\n        this._sceneOpaqueBatchers = new Map();\n        this._sceneTextBatchers = new Map();\n        this._sceneTransparentBatchers = new Map();\n        this.activeScene = null;\n        this.hudScene = null;\n        this.hudMountRoots = new Map();\n        this.ownGlFrostedBackdropTexture = null;\n        this._frostedBackdropWidth = 0;\n        this._frostedBackdropHeight = 0;\n        this._frostedBackdropLod = 0;\n        this.activeCamera = null;\n        this.fullscreenScene = null;\n        this.fullscreenSceneFactory = null;\n        this.fullscreenSceneRecycleDelayMs = 0;\n        this._fullscreenSceneRecycleTimer = null;\n        this.chromeAnchorMode = 'view_relative';\n        this.chromeAnchorDepth = 12.0;\n        this.presentationRevision = 0;\n        this.presentationAnchorFrame = null;\n        this.viewportDimensions = { width: 1, height: 1 };\n        this.framebufferDimensions = { width: 1, height: 1 };\n        this.timeEpochJSMs = null;\n        this.frameNowJSMs = null;\n        this.frameNowS = 0.0;\n        this.frameDeltaS = 0.0;\n        this.frameIndex = 0;\n        this._coldScheduledThinkWakesEnabled = true;\n        /* Policy only: retained windows still render through the shared scene batchers. */\n        this.windowManager = new WindowManager(this);\n        this.activeDialog = null;\n        this.ownCaret = new Caret({});\n        setFocusStackRoot(this);\n        this.ownOnFocusStackChange = onFocusStackChange(() => {\n            this.syncFocusCaret();\n            this.activeDialog?.onFocusChanged();\n        });\n        this.syncFocusCaret();\n    }\n\n    /* Keep the permanent root stack entry concrete so unclaimed keys can land on Stage policy later. */\n    onKeyDown(_evt) {\n        return false;\n    }\n\n    /* Close before ordinary pointer focus transfer; the same press still reaches\n     * its picked target. Internal panel buttons keep the dialog's input focus. */\n    prepareDialogPointerInput(events, target) {\n        if ((events.has('L_MOUSE_DOWN') || events.has('R_MOUSE_DOWN'))\n            && this.activeDialog && !this.activeDialog.ownsNode(target)) {\n            this.activeDialog.dismiss('outside_click');\n        }\n    }\n\n    /* Route background pointer input through the presented document owner before giving up. */\n    onPointerInput(scene, events) {\n        if (!scene || scene.stage !== this) {\n            return false;\n        }\n        const root = scene.presentedRoot?.() ?? null;\n        const host = findNode(root, (node) => {\n            if (node?.focusContainerKind === 'DocumentView' && typeof node.onPointerInput === 'function') {\n                return true;\n            }\n            if (typeof node?.getDocumentView === 'function') {\n                return true;\n            }\n            return false;\n        });\n        const docView = typeof host?.getDocumentView === 'function'\n            ? host.getDocumentView()\n            : host;\n        if (!docView || typeof docView.onPointerInput !== 'function') {\n            return false;\n        }\n        return docView.onPointerInput(events) === true;\n    }\n\n    /* Add a scene to the stage draw/update order and attach the back-pointer used by shared presentation seams. */\n    addScene(scene) {\n        if (!(scene instanceof Scene)) {\n            throw new Error(`Stage.addScene(${scene}): expected a Scene.`);\n        }\n        if (this.scenes.includes(scene)) {\n            throw new Error('Stage.addScene(...): scene already belongs to this stage.');\n        }\n        if (scene.stage && scene.stage !== this) {\n            throw new Error('Stage.addScene(...): scene already belongs to another stage.');\n        }\n        scene.stage = this;\n        this.#adoptSceneBatchers(scene);\n        this.scenes.push(scene);\n        if (!this.activeScene) {\n            this.activeScene = scene;\n        }\n        this.#syncDimensionsFromScene(scene);\n        if (this.gl && !scene.gl) {\n            scene.acquireContext(this.gl);\n            this.#syncDimensionsFromScene(scene);\n        }\n        scene.syncColdScheduledThinkWake();\n    }\n\n    /* Toggle whether sparse thinkAt work should use cold JS timers or rely on the hot frame loop. */\n    setColdScheduledThinkWakesEnabled(enabled) {\n        const next = enabled === true;\n        if (this._coldScheduledThinkWakesEnabled === next) {\n            return;\n        }\n        this._coldScheduledThinkWakesEnabled = next;\n        for (const scene of this.scenes) {\n            scene.syncColdScheduledThinkWake();\n        }\n    }\n\n    /* Keep one authoritative active scene per Stage so fullscreen swaps are mode flips, not multi-scene presentation blends. */\n    setActiveScene(scene) {\n        if (!(scene instanceof Scene)) {\n            throw new Error(`Stage.setActiveScene(${scene}): expected a Scene.`);\n        }\n        if (!this.scenes.includes(scene)) {\n            throw new Error('Stage.setActiveScene(...): scene must belong to this stage.');\n        }\n        const prev = this.activeScene;\n        this.activeScene = scene;\n        this.activeDialog?.syncPlacement();\n        this.#reconcilePresentedInputFocus();\n        if (scene === this.fullscreenScene) {\n            this.#clearFullscreenSceneRecycleTimer();\n            return;\n        }\n        if (prev === this.fullscreenScene) {\n            this.#scheduleFullscreenSceneRecycle();\n        }\n    }\n    /* Register one always-on non-interactive HUD scene so overlays can outlive fullscreen scene flips without participating in input routing. */\n    setHudScene(scene) {\n        if (scene === null) {\n            this.hudScene = null;\n            this.#reconcilePresentedInputFocus();\n            return;\n        }\n        if (!(scene instanceof Scene)) {\n            throw new Error(`Stage.setHudScene(${scene}): expected a Scene.`);\n        }\n        if (!this.scenes.includes(scene)) {\n            throw new Error('Stage.setHudScene(...): scene must belong to this stage.');\n        }\n        if (scene === this.fullscreenScene) {\n            throw new Error('Stage.setHudScene(...): HUD scene must have one distinct presentation role.');\n        }\n        this.hudScene = scene;\n        this.#reconcilePresentedInputFocus();\n    }\n\n    /* HUD materials share the active world's light definitions while resolving them in HUD coordinates. */\n    sceneLightingSource(scene) {\n        if (scene === this.hudScene) {\n            return this.activeScene ?? scene;\n        }\n        return scene;\n    }\n\n    setHudMountRoot(kind, root) {\n        if (typeof kind !== 'string' || kind.length === 0) {\n            throw new Error('Stage.setHudMountRoot(...): kind must be a non-empty string.');\n        }\n        if (!root || root.scene !== this.hudScene) {\n            throw new Error('Stage.setHudMountRoot(...): root must belong to the HUD scene.');\n        }\n        this.hudMountRoots.set(kind, root);\n    }\n\n    hudMountRoot(kind = 'content') {\n        return this.hudMountRoots.get(kind) ?? this.hudScene?.presentedRoot?.() ?? null;\n    }\n\n    /* Project one scene-world point into HUD world coordinates without choosing a mount root. */\n    projectSceneWorldPointToHud(sourceScene, worldPoint) {\n        const camera = sourceScene?.presentationCamera?.() ?? sourceScene?.camera ?? null;\n        if (!sourceScene || !camera || !worldPoint) {\n            return null;\n        }\n        if (sourceScene === this.hudScene) {\n            return Array.from(worldPoint);\n        }\n        const presented = sourceScene.worldToPresentationPoint(worldPoint);\n        const view = typeof camera.localToWorld === 'function'\n            ? sourceScene.presentationViewMatrix(camera)\n            : twgl.m4.identity();\n        const projection = camera.projectionMatrix ?? twgl.m4.identity();\n        const clip = twgl.m4.transformPoint(twgl.m4.multiply(projection, view), presented);\n        const hudCamera = this.hudScene?.presentationCamera?.() ?? this.hudScene?.camera ?? null;\n        const hudCameraWorld = hudCamera?.worldPosition?.() ?? [0, 0, 0];\n        return [\n            (clip[0] * 0.5 + 0.5) * Math.max(1, this.viewportDimensions.width),\n            (1.0 - (clip[1] * 0.5 + 0.5)) * Math.max(1, this.viewportDimensions.height),\n            hudCameraWorld[2] ?? 0,\n        ];\n    }\n\n    /* Express a world-scene direction in the HUD camera-aligned world basis. */\n    projectSceneWorldDirectionToHud(sourceScene, worldDirection) {\n        const camera = sourceScene?.presentationCamera?.() ?? sourceScene?.camera ?? null;\n        if (!sourceScene || !camera || !worldDirection) {\n            return null;\n        }\n        if (sourceScene === this.hudScene) {\n            return Array.from(worldDirection);\n        }\n        const view = typeof camera.localToWorld === 'function'\n            ? sourceScene.presentationViewMatrix(camera)\n            : twgl.m4.identity();\n        return twgl.v3.normalize(twgl.m4.transformDirection(view, worldDirection));\n    }\n\n    /* Convert a point owned by any presented scene into CSS-pixel HUD coordinates. */\n    projectNodePointToHud(node, localPoint = [0, 0, 0], mountRoot = null) {\n        const sourceScene = node?.scene ?? null;\n        const target = mountRoot ?? this.hudMountRoot('content');\n        if (!sourceScene || !target) {\n            return null;\n        }\n        if (sourceScene === this.hudScene) {\n            const world = twgl.m4.transformPoint(node.localToWorld(), localPoint);\n            return twgl.m4.transformPoint(twgl.m4.inverse(target.localToWorld()), world);\n        }\n        const world = twgl.m4.transformPoint(node.localToWorld(), localPoint);\n        const hudWorld = this.projectSceneWorldPointToHud(sourceScene, world);\n        if (!hudWorld) {\n            return null;\n        }\n        return twgl.m4.transformPoint(twgl.m4.inverse(target.localToWorld()), hudWorld);\n    }\n\n    hudViewportCenter(mountRoot = null) {\n        const target = mountRoot ?? this.hudMountRoot('content');\n        if (!target) {\n            return null;\n        }\n        const center = [this.viewportDimensions.width * 0.5, this.viewportDimensions.height * 0.5, 0];\n        return twgl.m4.transformPoint(twgl.m4.inverse(target.localToWorld()), center);\n    }\n\n    /* Convert one normalized canvas pointer into the static HUD mount's local CSS-pixel space. */\n    pointerPointToHud(pointer, mountRoot = null) {\n        const target = mountRoot ?? this.hudMountRoot('content');\n        const x = Number(pointer?.[0]);\n        const y = Number(pointer?.[1]);\n        if (!target || !Number.isFinite(x) || !Number.isFinite(y)) {\n            return null;\n        }\n        const hudWorld = [\n            x * Math.max(1, this.viewportDimensions.width),\n            y * Math.max(1, this.viewportDimensions.height),\n            0,\n        ];\n        return twgl.m4.transformPoint(twgl.m4.inverse(target.localToWorld()), hudWorld);\n    }\n\n    /* Express the CSS-pixel HUD viewport as local bounds for one HUD mount node.\n     * A scene resize callback can supply its freshly-published dimensions before\n     * Stage completes the traversal and updates its own snapshot. */\n    hudViewportBounds(mountRoot = null, viewportDimensions = this.viewportDimensions) {\n        const target = mountRoot ?? this.hudMountRoot('content');\n        if (!target) {\n            return null;\n        }\n        const width = Math.max(1, viewportDimensions.width);\n        const height = Math.max(1, viewportDimensions.height);\n        const inverseTarget = twgl.m4.inverse(target.localToWorld());\n        const corners = [\n            [0, 0, 0],\n            [width, 0, 0],\n            [0, height, 0],\n            [width, height, 0],\n        ].map((point) => twgl.m4.transformPoint(inverseTarget, point));\n        return {\n            left: Math.min(...corners.map((point) => point[0])),\n            top: Math.min(...corners.map((point) => point[1])),\n            right: Math.max(...corners.map((point) => point[0])),\n            bottom: Math.max(...corners.map((point) => point[1])),\n        };\n    }\n\n    /* Register the dedicated fullscreen scene so viewport expansion can flip stage mode without portal-global wiring. */\n    setFullscreenScene(scene) {\n        if (scene === null) {\n            this.fullscreenScene = null;\n            this.#clearFullscreenSceneRecycleTimer();\n            this.#reconcilePresentedInputFocus();\n            return;\n        }\n        if (!(scene instanceof Scene)) {\n            throw new Error(`Stage.setFullscreenScene(${scene}): expected a Scene.`);\n        }\n        if (!this.scenes.includes(scene)) {\n            throw new Error('Stage.setFullscreenScene(...): scene must belong to this stage.');\n        }\n        if (scene === this.hudScene) {\n            throw new Error('Stage.setFullscreenScene(...): fullscreen scene must have one distinct presentation role.');\n        }\n        this.fullscreenScene = scene;\n        this.#reconcilePresentedInputFocus();\n    }\n\n    /* Reattach the single stage-owned caret only to an input that explicitly delegates caret rendering to Stage. */\n    syncFocusCaret() {\n        const inputCell = currentFocusedInputCell();\n        if (!inputCell?.usesStageCaret?.() || !inputCell.scene || inputCell.scene.stage !== this || !this.#isScenePresented(inputCell.scene)) {\n            this.#detachFocusCaret();\n            return;\n        }\n        const rect = inputCell.caretPixelRect?.() ?? null;\n        if (!rect) {\n            throw new Error('Stage.syncFocusCaret(): focused input cell did not provide caret geometry.');\n        }\n        if (this.ownCaret.parentNode !== inputCell) {\n            if (!this.ownCaret.parentNode) {\n                inputCell.appendChild(this.ownCaret);\n            } else {\n                this.remountNode(this.ownCaret, inputCell, { preserveWorld: false });\n            }\n        }\n        this.ownCaret.mutate({\n            width: rect.width,\n            height: rect.height,\n            color: inputCell.caretColor,\n        });\n        this.ownCaret.setLocalPosition(rect.x, rect.y, this.ownCaret.localPosition()[2]);\n        this.ownCaret.setVisibility(inputCell.hasVisibleCaret?.() !== false);\n    }\n\n    #detachFocusCaret() {\n        if (this.ownCaret.parentNode) {\n            this.ownCaret.parentNode.removeChild(this.ownCaret);\n        }\n    }\n\n    /* Install one lazy fullscreen-scene factory so ordinary viewport expansion does not force portal-global bootstrap ordering. */\n    setFullscreenSceneFactory(factory) {\n        if (factory !== null && typeof factory !== 'function') {\n            throw new Error('Stage.setFullscreenSceneFactory(...): expected a function or null.');\n        }\n        this.fullscreenSceneFactory = factory;\n    }\n\n    /* Control how long an inactive fullscreen scene shell may stay cached before being recycled. */\n    setFullscreenSceneRecycleDelay(ms) {\n        if (!Number.isInteger(ms) || ms < 0) {\n            throw new Error(`Stage.setFullscreenSceneRecycleDelay(${ms}): expected a non-negative integer.`);\n        }\n        this.fullscreenSceneRecycleDelayMs = ms;\n        if (ms === 0) {\n            this.#clearFullscreenSceneRecycleTimer();\n        }\n    }\n\n    /* Materialise the fullscreen scene lazily and cancel any pending recycle once it becomes active again. */\n    ensureFullscreenScene() {\n        this.#clearFullscreenSceneRecycleTimer();\n        if (this.fullscreenScene) {\n            return this.fullscreenScene;\n        }\n        if (typeof this.fullscreenSceneFactory !== 'function') {\n            throw new Error('Stage.ensureFullscreenScene(...): no fullscreen scene factory installed.');\n        }\n        const scene = this.fullscreenSceneFactory();\n        if (!(scene instanceof Scene)) {\n            throw new Error('Stage.ensureFullscreenScene(...): fullscreen scene factory must return a Scene.');\n        }\n        if (scene !== this.fullscreenScene) {\n            throw new Error('Stage.ensureFullscreenScene(...): fullscreen scene factory must register the created scene.');\n        }\n        return scene;\n    }\n\n    /* Remove one scene from the Stage and release its scene-scoped resources immediately. */\n    removeScene(scene) {\n        if (!(scene instanceof Scene)) {\n            throw new Error(`Stage.removeScene(${scene}): expected a Scene.`);\n        }\n        const idx = this.scenes.indexOf(scene);\n        if (idx === -1) {\n            throw new Error('Stage.removeScene(...): scene does not belong to this stage.');\n        }\n        if (this.activeScene === scene) {\n            throw new Error('Stage.removeScene(...): cannot remove the active scene.');\n        }\n        if (this.activeDialog?.source.scene === scene || this.activeDialog?.scene === scene) {\n            this.activeDialog.dismiss('owner_removed');\n        }\n        if (this.hudScene === scene) {\n            this.hudScene = null;\n            this.hudMountRoots.clear();\n        }\n        if (scene.gl) {\n            scene.releaseContext(this.gl);\n        }\n        this._sceneOpaqueBatchers.delete(scene);\n        this._sceneTextBatchers.delete(scene);\n        this._sceneTransparentBatchers.delete(scene);\n        this.scenes.splice(idx, 1);\n        scene.stage = null;\n        if (this.fullscreenScene === scene) {\n            this.fullscreenScene = null;\n            this.#clearFullscreenSceneRecycleTimer();\n        }\n        if (this.activeCamera?.scene === scene) {\n            this.activeCamera = null;\n        }\n        this.#reconcilePresentedInputFocus();\n    }\n\n    /* Return the authoritative opaque batchers for one staged scene. */\n    sceneOpaqueBatchers(scene) {\n        const map = this._sceneOpaqueBatchers.get(scene);\n        if (!map) {\n            throw new Error('Stage.sceneOpaqueBatchers(...): scene is not registered with this stage.');\n        }\n        return map;\n    }\n\n    /* Return the authoritative text batchers for one staged scene. */\n    sceneTextBatchers(scene) {\n        const map = this._sceneTextBatchers.get(scene);\n        if (!map) {\n            throw new Error('Stage.sceneTextBatchers(...): scene is not registered with this stage.');\n        }\n        return map;\n    }\n\n    /* Return the authoritative transparent batchers for one staged scene. */\n    sceneTransparentBatchers(scene) {\n        const map = this._sceneTransparentBatchers.get(scene);\n        if (!map) {\n            throw new Error('Stage.sceneTransparentBatchers(...): scene is not registered with this stage.');\n        }\n        return map;\n    }\n\n    /* Replace one scene's named per-pass registries while preserving pass-local key uniqueness. */\n    replaceSceneBatchers(scene, opaqueBatchers, textBatchers, transparentBatchers) {\n        if (!this._sceneOpaqueBatchers.has(scene)) {\n            throw new Error('Stage.replaceSceneBatchers(...): scene is not registered with this stage.');\n        }\n        assertBatcherMap('Stage.replaceSceneBatchers(...).opaqueBatchers', opaqueBatchers);\n        assertBatcherMap('Stage.replaceSceneBatchers(...).textBatchers', textBatchers);\n        assertBatcherMap('Stage.replaceSceneBatchers(...).transparentBatchers', transparentBatchers);\n        assertDistinctBatcherKeys('Stage.replaceSceneBatchers(...)', opaqueBatchers, textBatchers, transparentBatchers);\n        this._sceneOpaqueBatchers.set(scene, opaqueBatchers);\n        this._sceneTextBatchers.set(scene, textBatchers);\n        this._sceneTransparentBatchers.set(scene, transparentBatchers);\n    }\n\n    /* Borrow the current-frame backdrop; frosted materials never own this texture. */\n    frostedBackdropState() {\n        if (!this.ownGlFrostedBackdropTexture) {\n            return null;\n        }\n        return {\n            borGlTexture: this.ownGlFrostedBackdropTexture,\n            width: this._frostedBackdropWidth,\n            height: this._frostedBackdropHeight,\n            lod: this._frostedBackdropLod,\n        };\n    }\n\n    /* Keep the strongest blur local by retaining at least sixteen texels on the shorter axis. */\n    static maximumUsefulFrostedBackdropLod(width, height) {\n        const shorter = Math.max(1, Math.min(width, height));\n        return Math.max(0, Math.floor(Math.log2(shorter / 16)));\n    }\n\n    #dropFrostedBackdrop(gl) {\n        if (this.ownGlFrostedBackdropTexture) {\n            gl.deleteTexture(this.ownGlFrostedBackdropTexture);\n            this.ownGlFrostedBackdropTexture = null;\n        }\n        this._frostedBackdropWidth = 0;\n        this._frostedBackdropHeight = 0;\n        this._frostedBackdropLod = 0;\n    }\n\n    /* Snapshot the currently bound full-resolution framebuffer without disturbing its depth attachment. */\n    #captureFrostedBackdrop(gl) {\n        const width = Math.max(1, gl.drawingBufferWidth);\n        const height = Math.max(1, gl.drawingBufferHeight);\n        const previousActiveTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n        gl.activeTexture(gl.TEXTURE0);\n        const previousTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);\n\n        try {\n            if (!this.ownGlFrostedBackdropTexture) {\n                const ownGlTexture = gl.createTexture();\n                if (!ownGlTexture) {\n                    throw new Error('Stage frosted backdrop: gl.createTexture() returned null.');\n                }\n                this.ownGlFrostedBackdropTexture = ownGlTexture;\n                gl.bindTexture(gl.TEXTURE_2D, ownGlTexture);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            } else {\n                gl.bindTexture(gl.TEXTURE_2D, this.ownGlFrostedBackdropTexture);\n            }\n\n            if (width !== this._frostedBackdropWidth || height !== this._frostedBackdropHeight) {\n                gl.texImage2D(\n                    gl.TEXTURE_2D,\n                    0,\n                    gl.RGBA8,\n                    width,\n                    height,\n                    0,\n                    gl.RGBA,\n                    gl.UNSIGNED_BYTE,\n                    null,\n                );\n                this._frostedBackdropWidth = width;\n                this._frostedBackdropHeight = height;\n                this._frostedBackdropLod = Stage.maximumUsefulFrostedBackdropLod(width, height);\n            }\n\n            gl.copyTexSubImage2D(\n                gl.TEXTURE_2D,\n                0,\n                0,\n                0,\n                0,\n                0,\n                width,\n                height,\n            );\n            gl.generateMipmap(gl.TEXTURE_2D);\n        } finally {\n            gl.bindTexture(gl.TEXTURE_2D, previousTexture);\n            gl.activeTexture(previousActiveTexture);\n        }\n    }\n\n    /* Make the presentation camera explicit at the stage boundary without changing node-scene ownership. */\n    setActiveCamera(camera) {\n        if (!camera) {\n            throw new Error('Stage.setActiveCamera(...): camera is required.');\n        }\n        this.activeCamera = camera;\n    }\n\n    /* Reparent one attached subtree under this stage, including cross-scene moves, while preserving world pose by default. */\n    remountNode(node, newParent, opts = {}) {\n        const preserveWorld = opts.preserveWorld !== false;\n        if (!node || typeof node !== 'object') {\n            throw new Error('Stage.remountNode(...): node is required.');\n        }\n        if (!newParent || typeof newParent !== 'object') {\n            throw new Error('Stage.remountNode(...): new parent is required.');\n        }\n        if (!node.parentNode) {\n            throw new Error('Stage.remountNode(...): node must already have a parent.');\n        }\n        if (node === newParent) {\n            throw new Error('Stage.remountNode(...): node must not become its own parent.');\n        }\n        if (newParent === node.parentNode) {\n            return;\n        }\n        const sourceScene = node.scene;\n        const targetScene = newParent.scene;\n        if (!sourceScene || !targetScene) {\n            throw new Error('Stage.remountNode(...): both node and new parent must belong to a scene.');\n        }\n        if (!this.scenes.includes(sourceScene)) {\n            throw new Error('Stage.remountNode(...): node scene must belong to this stage.');\n        }\n        if (!this.scenes.includes(targetScene)) {\n            throw new Error('Stage.remountNode(...): new parent scene must belong to this stage.');\n        }\n        if (sourceScene === targetScene) {\n            node.remount(newParent);\n            return;\n        }\n\n        const oldParent = node.parentNode;\n        const oldWorld = preserveWorld ? cloneMat16(node.localToWorld()) : null;\n        oldParent.removeChild(node);\n        newParent.appendChild(node);\n        if (!preserveWorld) {\n            return;\n        }\n\n        const newParentWorld = newParent.localToWorld();\n        const newLocalToParent = twgl.m4.multiply(\n            twgl.m4.inverse(newParentWorld),\n            oldWorld,\n        );\n        node.setLocalToParent(newLocalToParent);\n    }\n\n    /* Acquire one shared WebGL context and publish it to all scenes in stage order. */\n    acquireContext(gl) {\n        if (this.gl) {\n            throw new Error('Stage.acquireContext(...) called while already live.');\n        }\n        this.gl = gl;\n        const acquiredScenes = [];\n        retainContextGlPrograms(gl);\n        retainContextFontTextures(gl);\n        retainContextImageTextures(gl);\n        try {\n            for (const scene of this.scenes) {\n                scene.acquireContext(gl);\n                acquiredScenes.push(scene);\n                this.#syncDimensionsFromScene(scene);\n            }\n        } catch (err) {\n            for (let i = acquiredScenes.length - 1; i >= 0; i--) {\n                const scene = acquiredScenes[i];\n                if (scene.gl === gl) {\n                    scene.releaseContext(gl);\n                }\n            }\n            releaseContextGlPrograms(gl);\n            releaseContextFontTextures(gl);\n            releaseContextImageTextures(gl);\n            this.gl = null;\n            throw err;\n        }\n    }\n\n    /* Release the shared WebGL context from all scenes in reverse order so overlay scenes unwind first. */\n    releaseContext(gl = this.gl) {\n        if (!this.gl) {\n            console.warn('Stage.releaseContext(...) called without a live context.');\n            return;\n        }\n        const liveGl = this.gl;\n        if (gl && gl !== liveGl) {\n            throw new Error('Stage.releaseContext(...) called with the wrong WebGL context.');\n        }\n        for (let i = this.scenes.length - 1; i >= 0; i--) {\n            const scene = this.scenes[i];\n            if (scene.gl) {\n                scene.releaseContext(liveGl);\n            }\n        }\n        this.#dropFrostedBackdrop(liveGl);\n        releaseContextGlPrograms(liveGl);\n        releaseContextFontTextures(liveGl);\n        releaseContextImageTextures(liveGl);\n        this.gl = null;\n    }\n\n    /* Propagate framebuffer resize to every scene and keep a stable stage-level dimensions snapshot. */\n    framebufferResized(gl = this.gl) {\n        for (const scene of this.scenes) {\n            scene.framebufferResized(gl);\n            this.#syncDimensionsFromScene(scene);\n        }\n    }\n\n    /* Propagate viewport resize to every scene and keep a stable stage-level dimensions snapshot. */\n    viewportResized(gl = this.gl) {\n        for (const scene of this.scenes) {\n            scene.viewportResized(gl);\n            this.#syncDimensionsFromScene(scene);\n        }\n    }\n\n    /* Keep renderless sizing logic at the stage boundary so scenes do not each guess canvas dimensions independently. */\n    applyRenderlessViewport(dims) {\n        for (const scene of this.scenes) {\n            scene.applyRenderlessViewport(dims);\n            this.#syncDimensionsFromScene(scene);\n        }\n    }\n\n    /* The old scene-wide physics sweep is retired; motion now self-schedules from the owning node. */\n    /* Run scene-local update passes in stage order under one frame loop. */\n    update(gl = this.gl, deltatime) {\n        for (const scene of this.#presentedScenes()) {\n            scene.evaluateAnimations(this.frameNowS);\n            if (scene === this.hudScene) this.activeDialog?.syncPlacement();\n            scene.updateScene(gl, deltatime);\n            this.#syncDimensionsFromScene(scene);\n        }\n    }\n\n    /* Draw scenes in stage order, clearing colour once at the base scene and depth between later overlay scenes. */\n    draw(gl = this.gl) {\n        const scenes = this.#presentedScenes();\n        if (!gl || scenes.length === 0) {\n            return;\n        }\n        for (let i = 0; i < scenes.length; i++) {\n            const scene = scenes[i];\n            const hasFrostedGlass = scene.hasPresentedFrostedGlass();\n            if (hasFrostedGlass && scene !== this.hudScene) {\n                throw new Error(\n                    'Stage.draw(...): frosted-glass materials are currently supported only in the HUD scene.',\n                );\n            }\n            const drawOptions = {\n                clearColor: i === 0,\n                clearDepth: true,\n            };\n            if (hasFrostedGlass) {\n                drawOptions.captureFrostedBackdrop = () => {\n                    this.#captureFrostedBackdrop(gl);\n                };\n            }\n            scene.draw(gl, drawOptions);\n        }\n    }\n\n    /* Aggregate scene readiness so stage-level orchestration can reason about whether the full canvas is settled. */\n    sceneFullyRendered() {\n        for (const scene of this.#presentedScenes()) {\n            if (!scene.sceneFullyRendered) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /* Summarise pending sparse-think ownership across all scenes so portal-level diagnostics can detect orphan wakes. */\n    debugScheduledThinkSummary() {\n        const counts = new Map();\n        const scopedCounts = new Map();\n        let totalPending = 0;\n        for (const scene of this.scenes) {\n            const sceneLabel = quiescenceSceneLabel(scene);\n            const snap = scene.quiescenceSnapshot?.() ?? { scheduled_think_owners: [] };\n            const owners = Array.isArray(snap.scheduled_think_owners) ? snap.scheduled_think_owners : [];\n            for (const entry of owners) {\n                if (!entry?.key || !Number.isFinite(entry.count) || entry.count <= 0) {\n                    continue;\n                }\n                counts.set(entry.key, (counts.get(entry.key) || 0) + entry.count);\n                scopedCounts.set(`${sceneLabel}:${entry.key}`, (scopedCounts.get(`${sceneLabel}:${entry.key}`) || 0) + entry.count);\n                totalPending += entry.count;\n            }\n        }\n        return {\n            total_pending: totalPending,\n            owners: sortCountEntries(counts),\n            scoped_owners: sortCountEntries(scopedCounts),\n        };\n    }\n\n    /* Summarise Stage-owned work so portal.mjs can binary-gate rAF without guessing at scene internals. */\n    quiescenceSnapshot() {\n        const reasons = [];\n        const scheduledThinkOwners = new Map();\n        const pendingScheduledThinkOwners = new Map();\n        const camMotion = this.activeCamera?.debugMotionState?.() ?? null;\n        if (camMotion?.moving) {\n            for (const reason of camMotion.reasons ?? []) {\n                reasons.push(`camera:${reason}`);\n            }\n        }\n        for (const scene of this.#presentedScenes()) {\n            const snap = scene.quiescenceSnapshot?.() ?? {\n                hot: !scene.sceneFullyRendered,\n                reasons: scene.sceneFullyRendered ? [] : ['scene_not_fully_rendered'],\n            };\n            mergeScheduledThinkOwners(pendingScheduledThinkOwners, quiescenceSceneLabel(scene), snap.scheduled_think_owners);\n            if (snap.hot) {\n                const label = quiescenceSceneLabel(scene);\n                for (const reason of snap.reasons) {\n                    reasons.push(`${label}:${reason}`);\n                }\n                mergeScheduledThinkOwners(scheduledThinkOwners, label, snap.scheduled_think_owners);\n            }\n        }\n        return {\n            hot: reasons.length > 0,\n            reasons,\n            scheduled_think_owners: sortCountEntries(scheduledThinkOwners),\n            pending_scheduled_think_owners: sortCountEntries(pendingScheduledThinkOwners),\n        };\n    }\n\n    /* Sample one stable Stage-local time snapshot so presentation and animation share one authoritative wall-clock read. */\n    beginFrameTime(nowMs = Date.now()) {\n        if (this.timeEpochJSMs == null) {\n            const snapshot = currentEvilSnapshot(nowMs);\n            this.timeEpochJSMs = snapshot.epoch_js_ms;\n            this.frameNowJSMs = snapshot.now_js_ms;\n            this.frameNowS = snapshot.now_s;\n            this.frameDeltaS = 0.0;\n            this.frameIndex = 1;\n            return this.frameTimeSnapshot();\n        }\n        const prevNowMs = this.frameNowJSMs;\n        this.frameNowJSMs = nowMs;\n        this.frameNowS = evilFromJSTime(nowMs, this.timeEpochJSMs);\n        this.frameDeltaS = Math.max(0.0, (nowMs - prevNowMs) / 1000.0);\n        this.frameIndex += 1;\n        return this.frameTimeSnapshot();\n    }\n\n    /* Expose the current Stage-local frame clock as the authoritative presentation/animation snapshot. */\n    frameTimeSnapshot() {\n        return {\n            epoch_js_ms: this.timeEpochJSMs,\n            now_js_ms: this.frameNowJSMs,\n            now_s: this.frameNowS,\n            delta_s: this.frameDeltaS,\n            frame_index: this.frameIndex,\n        };\n    }\n\n    /* Expose the current chrome anchor frame as a read-only stage snapshot. */\n    chromePresentationAnchorFrame() {\n        return this.presentationAnchorFrame;\n    }\n\n    /* Derive the global chrome anchor mode from the active camera free-look state. */\n    syncChromeAnchorModeFromCamera() {\n        const camMode = this.activeCamera?.viewMode?.() ?? 'locked';\n        const nextMode = camMode === 'free' ? 'world_frozen' : 'view_relative';\n        if (nextMode === this.chromeAnchorMode) {\n            return false;\n        }\n        if (nextMode === 'world_frozen') {\n            const current = this.#deriveChromeAnchorFrame('view_relative');\n            if (current?.anchor_world) {\n                this.presentationAnchorFrame = {\n                    ...current,\n                    anchor_mode: 'world_frozen',\n                    presentation_revision: this.presentationRevision + 1,\n                };\n            }\n        }\n        this.chromeAnchorMode = nextMode;\n        return true;\n    }\n\n    /* Refresh the chrome presentation snapshot after camera motion so chrome-scene placement can stay stage-owned. */\n    updateChromePresentationAnchorFrame() {\n        const derived = this.#deriveChromeAnchorFrame(this.chromeAnchorMode);\n        if (!derived?.anchor_world) {\n            return this.presentationAnchorFrame;\n        }\n        const prev = this.presentationAnchorFrame;\n        const changed = !prev\n            || prev.anchor_mode !== derived.anchor_mode\n            || prev.camera_id !== derived.camera_id\n            || prev.viewport_px?.width !== derived.viewport_px?.width\n            || prev.viewport_px?.height !== derived.viewport_px?.height\n            || prev.anchor_depth !== derived.anchor_depth\n            || !sameMat16(prev.anchor_world, derived.anchor_world);\n        if (changed) {\n            this.presentationRevision += 1;\n        }\n        this.presentationAnchorFrame = {\n            ...derived,\n            presentation_revision: this.presentationRevision,\n        };\n        return this.presentationAnchorFrame;\n    }\n\n    /* Keep the stage dimensions anchored to the latest scene snapshot until render-target ownership moves fully here. */\n    #syncDimensionsFromScene(scene) {\n        this.viewportDimensions = cloneDims(scene?.viewportDimensions);\n        this.framebufferDimensions = cloneDims(scene?.framebufferDimensions);\n    }\n\n    /* Cancel one pending fullscreen recycle timer before the cached scene becomes active again. */\n    #clearFullscreenSceneRecycleTimer() {\n        if (this._fullscreenSceneRecycleTimer === null) {\n            return;\n        }\n        clearTimeout(this._fullscreenSceneRecycleTimer);\n        this._fullscreenSceneRecycleTimer = null;\n    }\n\n    /* Drop focused InputCell ownership when its scene is no longer presented so hidden scenes cannot keep caret blink wakes alive. */\n    #reconcilePresentedInputFocus() {\n        reconcileControlFocus(this);\n        const focused = currentFocusEntry();\n        const cell = currentFocusedInputCell();\n        const owner = focused?.container ?? null;\n        const ownerScene = cell?.scene ?? owner?.scene ?? null;\n        if (!ownerScene || ownerScene.stage !== this) {\n            this.syncFocusCaret();\n            return;\n        }\n        if (this.#isScenePresented(ownerScene)) {\n            cell?.syncFocusVisual?.(true, 'focus_stack_restore');\n            this.syncFocusCaret();\n            return;\n        }\n        if (activeClickFocusTrace()) {\n            appendClickTraceEvent('focus-render', {\n                action: 'stage_clear_rendered_focus',\n                owner: focused.container?.focusContainerKind ?? focused.container?.constructor?.name ?? null,\n                scene: ownerScene?.constructor?.name ?? null,\n                cause: 'scene_not_presented',\n            });\n        }\n        owner?.clearRenderedFocus?.();\n        if (this.ownCaret.parentNode) {\n            this.ownCaret.parentNode.removeChild(this.ownCaret);\n        }\n    }\n\n    /* Recycle an inactive cached fullscreen scene after a bounded idle window so heavy scene-scoped payloads do not linger forever. */\n    #scheduleFullscreenSceneRecycle() {\n        this.#clearFullscreenSceneRecycleTimer();\n        if (!this.fullscreenScene || this.fullscreenSceneRecycleDelayMs <= 0) {\n            return;\n        }\n        this._fullscreenSceneRecycleTimer = setTimeout(() => {\n            this._fullscreenSceneRecycleTimer = null;\n            const scene = this.fullscreenScene;\n            if (!scene || this.#isScenePresented(scene)) {\n                return;\n            }\n            this.removeScene(scene);\n        }, this.fullscreenSceneRecycleDelayMs);\n    }\n\n    /* Return presented surfaces in deterministic back-to-front composition order. */\n    #presentedScenes() {\n        const out = [];\n        if (this.activeScene) {\n            out.push(this.activeScene);\n        }\n        if (this.hudScene && !out.includes(this.hudScene)) {\n            out.push(this.hudScene);\n        }\n        return out;\n    }\n\n    /* Treat the active world and orthographic HUD as presented. */\n    #isScenePresented(scene) {\n        return !!scene && (\n            scene === this.activeScene\n            || scene === this.hudScene\n        );\n    }\n\n    /* Promote pre-stage scene batchers into the Stage-owned registries without changing their identity. */\n    #adoptSceneBatchers(scene) {\n        if (this._sceneOpaqueBatchers.has(scene) || this._sceneTextBatchers.has(scene) || this._sceneTransparentBatchers.has(scene)) {\n            throw new Error('Stage.#adoptSceneBatchers(...): scene batchers already registered.');\n        }\n        const opaqueBatchers = scene._localOpaqueBatchers ?? new Map();\n        const textBatchers = scene._localTextBatchers ?? new Map();\n        const transparentBatchers = scene._localTransparentBatchers ?? new Map();\n        assertBatcherMap('Stage.#adoptSceneBatchers(...).opaqueBatchers', opaqueBatchers);\n        assertBatcherMap('Stage.#adoptSceneBatchers(...).textBatchers', textBatchers);\n        assertBatcherMap('Stage.#adoptSceneBatchers(...).transparentBatchers', transparentBatchers);\n        assertDistinctBatcherKeys('Stage.#adoptSceneBatchers(...)', opaqueBatchers, textBatchers, transparentBatchers);\n        this._sceneOpaqueBatchers.set(scene, opaqueBatchers);\n        this._sceneTextBatchers.set(scene, textBatchers);\n        this._sceneTransparentBatchers.set(scene, transparentBatchers);\n        scene._localOpaqueBatchers = new Map();\n        scene._localTextBatchers = new Map();\n        scene._localTransparentBatchers = new Map();\n    }\n\n    #deriveChromeAnchorFrame(mode) {\n        const cam = this.activeCamera;\n        if (!cam) {\n            return null;\n        }\n        if (mode === 'world_frozen') {\n            const frozen = this.presentationAnchorFrame?.anchor_world ?? null;\n            if (!frozen) {\n                return this.#deriveChromeAnchorFrame('view_relative');\n            }\n            return {\n                anchor_mode: 'world_frozen',\n                camera_id: cam.state?.name ?? cam.constructor?.name ?? 'Camera',\n                viewport_px: {\n                    width: this.viewportDimensions.width,\n                    height: this.viewportDimensions.height,\n                },\n                anchor_depth: this.chromeAnchorDepth,\n                anchor_world: cloneMat16(frozen),\n            };\n        }\n        const next = deriveViewRelativeAnchorWorld(cam, this.chromeAnchorDepth);\n        if (!next) {\n            return null;\n        }\n        return {\n            anchor_mode: 'view_relative',\n            camera_id: cam.state?.name ?? cam.constructor?.name ?? 'Camera',\n            ...next,\n        };\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\n\n/**\n    Draws a page background that always fills the entire screen, and is not\n    affected by the model-view-world transformation (like a skybox).\n*/\nexport class Backdrop extends ui.Node {\n    constructor(state) {\n        super(state);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.nodes = [];\n        shared.ownGlBufferInfo = null;\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.backdrop');\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        this._onFramebufferResized(gl, /*ref*/ shared, shared.scene.framebufferDimensions);  // populate bufferInfo\n\n        (async function () {\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.backdrop', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(\"lib/evilui/backdrop.vs.glsl\", \"lib/evilui/backdrop.fs.glsl\");\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n        })();\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        shared.ownGlBufferInfo = null;\n        shared.ownGlProgram = null;\n    }\n\n    _onAcquireNode(gl, shared) {\n        shared.nodes.push(this);\n    }\n\n    _onReleaseNode(gl, shared) {\n        shared.nodes = shared.nodes.filter(n => n !== this);\n    }\n\n    static _onFramebufferResized(gl, shared, {width, height}) {\n        const [w, h] = [width, height];\n\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n\n        // Normalised device coordinates\n        // Quad covering (-1, -1) -- (+1, +1)\n        // According to the OpenGL screen convention(?), where (-1, -1) is bottom-left.\n        const ndcs = [\n            -1, +1,   +1, +1,   -1, -1,\n            -1, -1,   +1, +1,   +1, -1,\n        ];\n\n        // screen coordinates\n        // TODO: we can move this rescaling into the vertex shader, and avoid\n        // reallocating the buffer, at a minimal increase in VS complexity.\n        const screens = [\n             0,  0,    w,  0,    0,  h,\n             0,  h,    w,  0,    w,  h,\n        ];\n\n        shared.ownGlBufferInfo = gpuDiagWithResourceOrigin('backdrop.framebuffer_resized_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n            a_ndc: {numComponents: 2, data: ndcs},\n            a_screen: {numComponents: 2, data: screens},\n        }));\n    }\n\n    static _drawOpaque(gl, shared) {\n        if (!shared.ownGlProgram) {\n            console.warn(`Backdrop shader not ready. Ignoring.`);\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n\n        gl.enable(gl.DEPTH_TEST);\n        gl.enable(gl.CULL_FACE);\n        for (const node of shared.nodes) {\n            if (node.computedVisible === false) {\n                continue;\n            }\n            const pose = node._batchPose?.(shared.scene);\n            if (!pose) {\n                throw new Error(`${node.state?.name ?? node.constructor?.name ?? 'Backdrop'} reached draw without a live batch pose.`);\n            }\n            twgl.setUniforms(borGlProgram, {\n                u_totalMatrix: pose.worldMatrix,\n            });\n            twgl.drawBufferInfo(gl, shared.ownGlBufferInfo);\n\n            // Only draw once, even if multiple copies present, since they are identical anyway.\n            break;\n        }\n    }\n};\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Tile } from './tile.mjs';\nimport { translucentSolidTileMaterial } from './tile-material.mjs';\nimport { MSDFTextTransparent } from '../evilfont/evilfont.mjs';\n\n/* Explicit overlay families retain ordinary GPU resources but compose after the scene. */\nexport class OverlayTile extends Tile {\n    constructor(state) {\n        super({ ...state, material: translucentSolidTileMaterial() });\n    }\n\n    _batchDescriptor() {\n        return { ...super._batchDescriptor(), composition: 'overlay' };\n    }\n\n    static _hasPresentedOverlay(shared) {\n        return shared.nodes.some(node => node.computedVisible !== false && shared.scene._isPresentedNode(node));\n    }\n}\n\nexport class OverlayText extends MSDFTextTransparent {\n    _batchDescriptor() {\n        return { composition: 'overlay' };\n    }\n\n    static _hasPresentedOverlay(shared) {\n        return [...shared.groupByFont.values()].some(group =>\n            group.nodes.some(node => node.computedVisible !== false\n                && shared.scene._isPresentedNode(node) && node.glyphCount() > 0));\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty } from './dirty-flags.mjs';\nimport { Tile, syncTileBufferInfo, tileDrawUniformState } from './tile.mjs';\nimport { drawArraysInstancedChecked } from './gl-buffer.mjs';\n\nconst CARET_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\n\nexport class CaretQuad extends Tile {\n    constructor(state = {}) {\n        super({\n            tileBatch: 'editor.caret',\n            width: 2,\n            height: 16,\n            color: [0.996, 0.384, 0.184, 1.0],\n            ...state,\n        });\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        return;\n    }\n\n    /* The caret is blended over editor content, so its batch belongs to the transparent pass. */\n    static _batchPassForNode(_node) {\n        return 'transparent';\n    }\n\n    /* Shared caret resources stay owned by the transparent pass even without a live node instance. */\n    static _batchPassForShared(_shared) {\n        return 'transparent';\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) {\n            status.response = 1;\n        }\n        if (!shared.ownGlProgram) {\n            return;\n        }\n\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, CARET_BUFFER_KINDS)) {\n            shared.ownGlBufferInfo = syncTileBufferInfo(gl, shared);\n            clearNonPickerResourceDirty(shared);\n        }\n\n        if (!shared.ownGlBufferInfo) {\n            if (status) {\n                status.response = 2;\n            }\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            ...tileDrawUniformState(shared, `CaretQuad(${shared.resourceKey})`),\n        });\n        drawArraysInstancedChecked(gl, `CaretQuad(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n        if (status) {\n            status.response = 2;\n        }\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport function warnProgramPending(shared, batchName, details = '') {\n    const now = performance.now();\n    const wait = shared.progWait || (shared.progWait = { at: now, level: 0 });\n\n    if (wait.level === 0) {\n        wait.level = 1;\n        console.warn(\n            `${batchName} draw is waiting for its GL program${details}. `\n            + `This usually means async shader load has not finished yet.`\n        );\n        return;\n    }\n\n    if (wait.level === 1 && now - wait.at >= 5000) {\n        wait.level = 2;\n        console.warn(\n            `${batchName} draw is still missing its GL program after 5s${details}. `\n            + `This is no longer normal startup delay; check shader fetch/compile failure.`\n        );\n    }\n}\n\nexport function noteProgramReady(shared, batchName) {\n    const wait = shared.progWait;\n    if (!wait || wait.level === 0 || wait.closed) {\n        return;\n    }\n    if (performance.now() - wait.at < 5000) {\n        return;\n    }\n\n    wait.closed = true;\n    console.warn(`${batchName} GL program loaded after startup delay.`);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from './base.mjs';\nimport { sceneLightUniformState } from './scene-lighting.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo, drawArraysInstancedChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { noteProgramReady, warnProgramPending } from './gl-program-wait.mjs';\n\nconst SLAB_FULL_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n]);\n\nconst SLAB_INSTANCE_BUFFER_KINDS = Object.freeze([\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\n/* Hash one float stream so transform-only slab sync can distinguish local churn from scope motion. */\nfunction hashFloat32Array(data) {\n    if (!(data instanceof Float32Array)) {\n        return 'none';\n    }\n    const bits = new Uint32Array(data.buffer, data.byteOffset, data.length);\n    let h = 2166136261 >>> 0;\n    for (let i = 0; i < bits.length; i++) {\n        h ^= bits[i];\n        h = Math.imul(h, 16777619) >>> 0;\n    }\n    return `${data.length}:${h}`;\n}\n\nfunction setBufferData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n}\n\n/* Update an existing slab instance buffer without reallocating when only transforms changed. */\nfunction setBufferSubData(gl, attrib, data) {\n    gl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n    gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n}\n\nfunction isTransformStateKey(key) {\n    return key === 'x' || key === 'y' || key === 'z' || key === 'localToParent';\n}\n\n/* Accept the cheap path only for pure movement or clip propagation, not style or opacity churn. */\nfunction isTransformOnlySlabDirty(kinds, diag = null) {\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    if (list.length === 0) {\n        return false;\n    }\n    for (const kind of list) {\n        if (kind === DIRTY.transform) {\n            continue;\n        }\n        if (kind !== DIRTY.instance) {\n            return false;\n        }\n    }\n    if (!list.includes(DIRTY.instance)) {\n        return true;\n    }\n    const reasons = diag?.instance_propagation?.reasons ?? [];\n    if (reasons.length === 0) {\n        return false;\n    }\n    return reasons.every(reason => reason === 'ancestor' || reason === 'transform' || reason === 'clip_rect');\n}\n\n/* Track whether the pending slab dirtiness can stay on the transform-only sync path. */\nfunction markSlabSharedDirty(shared, kinds, source = null, diag = null) {\n    markResourceDirty(shared, kinds, source);\n    const list = Array.isArray(kinds) ? kinds : [kinds];\n    const transformOnly = isTransformOnlySlabDirty(list, diag);\n    shared.pendingTransformOnly = shared.pendingTransformOnly == null\n        ? transformOnly\n        : shared.pendingTransformOnly && transformOnly;\n}\n\nfunction classifySlabDirtyKinds(prevState, nextState) {\n    const kinds = new Set();\n    for (const key of Object.keys(nextState)) {\n        if (prevState[key] === nextState[key]) {\n            continue;\n        }\n        if (isTransformStateKey(key)) {\n            kinds.add(DIRTY.transform);\n            continue;\n        }\n        if (key === 'width' || key === 'height' || key === 'depth') {\n            kinds.add(DIRTY.layout);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        if (key === 'color') {\n            kinds.add(DIRTY.style);\n            kinds.add(DIRTY.instance);\n            continue;\n        }\n        kinds.add(DIRTY.content);\n        kinds.add(DIRTY.instance);\n    }\n    return Array.from(kinds);\n}\n\n/* Resolve the shared slab anchor pose so scope motion can stay uniform-driven. */\nfunction slabScopeMatrix(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    const matrix = node?.anchorNode?.anchorToRoot ?? null;\n    return matrix ? new Float32Array(matrix) : new Float32Array(twgl.m4.identity());\n}\n\n/* Resolve the shared slab anchor owner so scope-local inertia can project through one uniform payload. */\nfunction slabScopeNode(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    return node?.anchorNode ?? null;\n}\n\n/* Resolve one slab instance pose within the active anchor scope. */\nfunction slabLocalMatrix(node, scene) {\n    const pose = node._batchPose?.(scene) ?? null;\n    return pose?.localToAnchor ?? node.localToAnchor ?? node._worldMatrixForBatch?.(scene) ?? null;\n}\n\n/* Derive one shared clip uniform payload for a slab batch from the authoritative clip-chain model. */\nfunction slabClipUniformState(shared, nodes = shared.nodes) {\n    return ui.batchClipUniformState(nodes, shared.scene, `Slab(${shared.resourceKey})`);\n}\n\n/* Filter slab instances to the currently presented subtree so fullscreen switches rebuild deterministically. */\nfunction presentedSlabNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes;\n    }\n    return shared.nodes.filter(node => scene._isPresentedNode(node));\n}\n\n/* Build the full slab instance payload in anchor-local space. */\nfunction buildSlabArrays(shared, { nodes = shared.nodes } = {}) {\n    const count = nodes.length;\n    if (count === 0 || !shared.cpuCubeVertices) {\n        return null;\n    }\n\n    const instanceMatrices = new Float32Array(count * 16);\n    const resolutions = new Float32Array(count * 3);\n    const colors = new Float32Array(count * 4);\n    const texoffsets = new Float32Array(count * 2);\n    let instanceCount = 0;\n    for (let i = 0; i < count; i++) {\n        const node = nodes[i];\n        if (!node || node.computedVisible === false) {\n            continue;\n        }\n        const localMatrix = slabLocalMatrix(node, shared.scene);\n        if (!localMatrix) {\n            continue;\n        }\n        instanceMatrices.set(localMatrix, instanceCount * 16);\n        resolutions[instanceCount * 3 + 0] = node.state.width;\n        resolutions[instanceCount * 3 + 1] = node.state.height;\n        resolutions[instanceCount * 3 + 2] = node.state.depth;\n        const color = node.state.color;\n        colors.set([\n            color[0],\n            color[1],\n            color[2],\n            (color[3] ?? 1.0) * (node.computedOpacity ?? 1.0),\n        ], instanceCount * 4);\n        texoffsets[instanceCount * 2 + 0] = -1;\n        texoffsets[instanceCount * 2 + 1] = -1;\n        instanceCount++;\n    }\n\n    return {\n        arrays: {\n            position: {\n                numComponents: 3,\n                data: shared.cpuCubeVertices.position,\n            },\n            matrix: {\n                numComponents: 16,\n                data: instanceMatrices.subarray(0, instanceCount * 16),\n                divisor: 1,\n            },\n            resolution: {\n                numComponents: 3,\n                data: resolutions.subarray(0, instanceCount * 3),\n                divisor: 1,\n            },\n            color: {\n                numComponents: 4,\n                data: colors.subarray(0, instanceCount * 4),\n                divisor: 1,\n            },\n            baseuvs: {\n                numComponents: 2,\n                data: shared.cpuCubeVertices.texcoord,\n            },\n            normal: {\n                numComponents: 3,\n                data: shared.cpuCubeVertices.normal ?? new Float32Array(shared.cpuCubeVertices.position.length),\n            },\n            texoffset: {\n                numComponents: 2,\n                data: texoffsets.subarray(0, instanceCount * 2),\n                divisor: 1,\n            },\n        },\n        instanceCount,\n    };\n}\n\n/* Build only slab-local transforms for pure motion churn. */\nfunction buildSlabTransformArrays(shared, {\n    nodes = shared.nodes,\n} = {}) {\n    const count = nodes.length;\n    const instanceMatrices = new Float32Array(count * 16);\n\n    let instanceCount = 0;\n    for (let i = 0; i < count; i++) {\n        const node = nodes[i];\n        if (!node || node.computedVisible === false) {\n            continue;\n        }\n        const localMatrix = slabLocalMatrix(node, shared.scene);\n        if (!localMatrix) {\n            continue;\n        }\n        instanceMatrices.set(localMatrix, instanceCount * 16);\n        instanceCount++;\n    }\n\n    return {\n        matrix: {\n            numComponents: 16,\n            data: instanceMatrices.subarray(0, instanceCount * 16),\n            divisor: 1,\n        },\n        instanceCount,\n    };\n}\n\nexport function testingBuildSlabArrays(shared, opts = {}) {\n    return buildSlabArrays(shared, opts);\n}\n\n/* Keep slab sync cheap for anchor motion and force rebuilds when presentation membership changes. */\nfunction needsSlabBufferSync(shared) {\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    if (shared.lastPresentationRevision !== presentationRev) {\n        return true;\n    }\n    if (shared.lastDrawScopeRoot !== drawScopeRoot) {\n        return true;\n    }\n    if (hasAnyResourceDirty(shared, SLAB_FULL_BUFFER_KINDS) || hasAnyResourceDirty(shared, SLAB_INSTANCE_BUFFER_KINDS)) {\n        return true;\n    }\n    return !shared.ownGlBufferInfo && shared.emptyPresentedBatch !== true;\n}\n\n/* Keep slab sync cheap for anchor motion and force rebuilds when presentation membership changes. */\nexport function syncSlabBufferInfo(gl, shared, opts = {}) {\n    const nodes = opts.nodes ?? presentedSlabNodes(shared);\n    const presentationRev = shared.scene?._presentationRevision ?? 0;\n    const drawScopeRoot = shared.scene?._drawScopeRoot ?? null;\n    const presentationChanged = shared.lastPresentationRevision !== presentationRev;\n    const drawScopeChanged = shared.lastDrawScopeRoot !== drawScopeRoot;\n    const needsFullRebuild = drawScopeChanged || presentationChanged || !shared.ownGlBufferInfo || hasAnyResourceDirty(shared, SLAB_FULL_BUFFER_KINDS);\n    const needsInstanceUpdate = needsFullRebuild || hasAnyResourceDirty(shared, SLAB_INSTANCE_BUFFER_KINDS);\n    const transformOnly = !needsFullRebuild && shared.pendingTransformOnly === true;\n    if (!needsInstanceUpdate) {\n        return shared.ownGlBufferInfo;\n    }\n\n    const batch = transformOnly\n        ? buildSlabTransformArrays(shared, {\n            ...opts,\n            nodes,\n        })\n        : buildSlabArrays(shared, { ...opts, nodes });\n    const scopeMatrixHash = hashFloat32Array(slabScopeMatrix(shared, nodes));\n    const localMatrixHash = hashFloat32Array(transformOnly ? batch.matrix.data : batch.arrays.matrix.data);\n    const localMatrixChanged = shared.lastLocalMatrixHash != null && shared.lastLocalMatrixHash !== localMatrixHash;\n    if (!batch) {\n        if (needsFullRebuild) {\n            deleteBufferInfo(gl, shared.ownGlBufferInfo);\n            shared.ownGlBufferInfo = null;\n        }\n        return null;\n    }\n    const arrays = transformOnly ? null : batch.arrays;\n    const instanceCount = batch.instanceCount;\n\n    if (needsFullRebuild) {\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        if (instanceCount === 0) {\n            shared.ownGlBufferInfo = null;\n            shared.emptyPresentedBatch = true;\n            shared.lastPresentationRevision = presentationRev;\n            shared.lastDrawScopeRoot = drawScopeRoot;\n            shared.lastScopeMatrixHash = scopeMatrixHash;\n            shared.lastLocalMatrixHash = localMatrixHash;\n            shared.pendingTransformOnly = null;\n            return null;\n        }\n        shared.ownGlBufferInfo = gpuDiagWithResourceOrigin(`slab.sync_buffer_info.${shared.resourceKey}`, () => twgl.createBufferInfoFromArrays(gl, arrays));\n        shared.ownGlBufferInfo.instanceCount = instanceCount;\n        shared.emptyPresentedBatch = false;\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        shared.pendingTransformOnly = null;\n        return shared.ownGlBufferInfo;\n    }\n\n    if (transformOnly && shared.ownGlBufferInfo.instanceCount !== instanceCount) {\n        throw new Error(\n            `syncSlabBufferInfo(${shared.resourceKey}): transform-only sync changed batch shape `\n            + `from ${shared.ownGlBufferInfo.instanceCount} to ${instanceCount}.`,\n        );\n    }\n    if (transformOnly && shared.lastLocalMatrixHash != null && !localMatrixChanged) {\n        shared.lastPresentationRevision = presentationRev;\n        shared.lastDrawScopeRoot = drawScopeRoot;\n        shared.lastScopeMatrixHash = scopeMatrixHash;\n        shared.lastLocalMatrixHash = localMatrixHash;\n        shared.pendingTransformOnly = null;\n        return shared.ownGlBufferInfo;\n    }\n    if (transformOnly) {\n        setBufferSubData(gl, shared.ownGlBufferInfo.attribs.matrix, batch.matrix.data);\n    } else {\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.matrix, arrays.matrix.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.resolution, arrays.resolution.data);\n        setBufferData(gl, shared.ownGlBufferInfo.attribs.color, arrays.color.data);\n    }\n    shared.ownGlBufferInfo.instanceCount = instanceCount;\n    shared.emptyPresentedBatch = false;\n    shared.lastPresentationRevision = presentationRev;\n    shared.lastDrawScopeRoot = drawScopeRoot;\n    shared.lastScopeMatrixHash = scopeMatrixHash;\n    shared.lastLocalMatrixHash = localMatrixHash;\n    shared.pendingTransformOnly = null;\n    return shared.ownGlBufferInfo;\n}\n\n\n/**\n    Generic axis-aligned rectangular box, suitable for use as UI\n    backgrounds for panels, frames, text boxes, etc. Suitable for displaying a\n    shader effect that doesn't need any data, and which has a (roughly) rectangular\n    outline.\n\n    Unlike with Tile, a Slab has depth to it. \n*/\nexport class Slab extends ui.Node {\n    constructor(state) {\n        super({\n            width: state.width || 100, // wpx\n            height: state.height || 100, // wpx\n            depth: state.depth || 50, // wpx\n            color: [0.5, 0.5, 0.6, 1],\n            ...state,\n        });\n    }\n\n    mutate(modState) {\n        const prevState = this.state;\n        this.state = {\n            ...this.state,\n            ...modState,\n        };\n\n        const kinds = classifySlabDirtyKinds(prevState, this.state);\n        if (kinds.includes(DIRTY.transform)) {\n            this._markTransformDirty();\n        }\n        if (this._resources && kinds.length > 0) {\n            markSlabSharedDirty(this._resources, kinds, this);\n        }\n    }\n\n    static _onAttachClass(shared) {\n        shared.nodes = [];\n    }\n\n    _onAttachNode(shared) {\n        shared.pendingTransformOnly = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        shared.nodes.push(this);\n    }\n\n    _onDetachNode(shared) {\n        shared.pendingTransformOnly = null;\n        markResourceDirty(shared, [DIRTY.detach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        shared.nodes = shared.nodes.filter(n => n !== this);\n    }\n\n    getMesh(){\n        throw new Error(`not impl`);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.slab');\n        shared.cpuCubeVertices = null;\n        shared.ownGlBufferInfo = null;\n        shared.emptyPresentedBatch = null;\n        shared.progWait = null;\n        shared.lastPresentationRevision = null;\n        shared.lastDrawScopeRoot = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markSlabSharedDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            shared.cpuCubeVertices = twgl.primitives.deindexVertices(\n                twgl.primitives.createCubeVertices(1.0),\n            );\n\n            const shaderName = 'lib/evilui/slab-anchor';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.slab', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(shaderName + '.vs.glsl', 'lib/evilui/slab-solid.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                console.warn(`Shader ${shaderName} not found. Slab ${this.state.name} will not render.`);\n            }\n        })();  // fire-and-forget\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        shared.ownGlProgram = null;\n        shared.cpuCubeVertices = null;\n        shared.ownGlBufferInfo = null;\n        shared.emptyPresentedBatch = null;\n        shared.progWait = null;\n        shared.lastPresentationRevision = null;\n        shared.lastDrawScopeRoot = null;\n        shared.lastScopeMatrixHash = null;\n        shared.lastLocalMatrixHash = null;\n        shared.pendingTransformOnly = null;\n        markSlabSharedDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) status.response = ui.RENDER_STATUS.LOADING;\n        const nodes = presentedSlabNodes(shared);\n        if (nodes.length < 1) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        if (!shared.ownGlProgram) {\n            warnProgramPending(shared, 'Slab batch', ` (nodes=${nodes.length})`);\n            return;\n        }\n        noteProgramReady(shared, 'Slab batch');\n\n        if (!shared.cpuCubeVertices) {\n            console.warn(`Slab._drawOpaque(t=${t}): cubeVertices not created.`);\n            return;\n        }\n\n        if (needsSlabBufferSync(shared)) {\n            shared.ownGlBufferInfo = syncSlabBufferInfo(gl, shared, { nodes });\n            clearNonPickerResourceDirty(shared);\n        }\n        if (!shared.ownGlBufferInfo) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        /*\n            To bake the mesh with the node offsets, we need the GL, we can't use the \n            have a baked bufferInfo to be recycled on gl loss, this means gl loss is not\n            something we need to worry about for this case.\n            The only 2 objects that we can save in bettwen gl loss is:\n            - Shader\n            - mesh\n\n            Program can be kept in bettwen calls but not bufferinfo\n        */\n        const borGlProgram = shared.ownGlProgram;\n        const hadCullFace = gl.isEnabled(gl.CULL_FACE);\n        const prevCullFaceMode = gl.getParameter(gl.CULL_FACE_MODE);\n        const prevFrontFace = gl.getParameter(gl.FRONT_FACE);\n        if (!hadCullFace) {\n            gl.enable(gl.CULL_FACE);\n        }\n        // ScatterPlot flips cube z in shader and therefore wants CW front faces.\n        // Slab keeps cube handedness, so preserve the default CCW-facing exterior.\n        gl.frontFace(gl.CCW);\n        gl.cullFace(gl.BACK);\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        const clipState = slabClipUniformState(shared);\n\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            u_anchorMatrix: slabScopeMatrix(shared),\n            ...ui.presentationOffsetUniformState(slabScopeNode(shared), shared.scene, `Slab(${shared.resourceKey})`),\n            ...clipState,\n            ...sceneLightUniformState(shared.scene),\n        });\n\n        drawArraysInstancedChecked(gl, `Slab(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n        gl.frontFace(prevFrontFace);\n        gl.cullFace(prevCullFaceMode);\n        if (!hadCullFace) {\n            gl.disable(gl.CULL_FACE);\n        }\n        if (status) status.response = ui.RENDER_STATUS.READY;\n    }\n\n    _markLocalResourcesDirty({ kinds = null, diag = null } = {}) {\n        if (!this._resources) {\n            return;\n        }\n        const dirtyKinds = kinds ?? [DIRTY.content, DIRTY.style, DIRTY.layout, DIRTY.transform, DIRTY.instance];\n        markSlabSharedDirty(this._resources, dirtyKinds, this, diag);\n    }\n}\n\n/*\n    Iterates the shared resource and fetches all data to be baked\n    onto the shader bufferInfo, then combines static mesh of the Node Tile\n    to create the bufferInfo. Requires GL and must be baked when any Slab\n    in the scene becomes \"dirty\".\n*/\nfunction batchBufferInfo(gl, shared) {\n    const batch = buildSlabArrays(shared);\n    if (!batch || batch.instanceCount === 0) {\n        return null;\n    }\n    return gpuDiagWithResourceOrigin(`slab.batch_buffer_info.${shared?.resourceKey ?? 'unknown'}`, () => twgl.createBufferInfoFromArrays(gl, batch.arrays));\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport class Document {\n    constructor(fileRef) {\n        this.fileRef = fileRef;\n        this._changeListeners = new Set();\n    }\n\n    update() {\n        return { edits: [] };\n    }\n\n    /* Documents without a Puffbook subscription allow general assistant chat.\n     * Puffbooks override this with their document-level request context. */\n    assistantDocumentSnapshot() {\n        return {};\n    }\n\n    /* Register one narrow document-change listener so views can schedule work from real edits rather than frame polling. */\n    onChange(listener) {\n        if (typeof listener !== 'function') {\n            throw new Error(`Document.onChange(${listener}): listener must be a function.`);\n        }\n        this._changeListeners.add(listener);\n    }\n\n    /* Remove one previously registered document-change listener. */\n    offChange(listener) {\n        this._changeListeners.delete(listener);\n    }\n\n    /* Notify attached views that new document edits are queued. */\n    _emitChange() {\n        for (const listener of [...this._changeListeners]) {\n            listener();\n        }\n    }\n\n    isClosed() {\n        return false;\n    }\n\n    keyboardNavigate(cursor, key) {\n        return cursor;\n    }\n\n    keyboardModify(cursor, key) {\n        return [null, cursor];\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Pointer release and keyboard activation share the same feature action. */\nexport function isActivationEvent(event) {\n    return event === 'L_MOUSE_UP' || event === 'ACTIVATE';\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as textutils from './text-utils.mjs';\n\nconst PANEL_WIDTH = 420;\nconst PANEL_PAD = 10;\nconst PANEL_ROW_HEIGHT = 18;\nconst PANEL_FONT_SIZE = 12;\nconst PANEL_MAX_BODY_HEIGHT = 420;\n\n/* Render one output object's existing metadata rows in shared UIWindow chrome. */\nexport class OutputMetadataPanel extends Placeholder {\n    constructor(state) {\n        super({ name: 'output-metadata-panel' });\n        if (!state?.font) {\n            throw new Error('OutputMetadataPanel requires a font.');\n        }\n        if (!Array.isArray(state.rows)) {\n            throw new Error('OutputMetadataPanel requires state.rows.');\n        }\n        this.font = state.font;\n        this.rows = state.rows;\n    }\n\n    build(_window) {\n        this.#build();\n    }\n\n    #build() {\n        const contentHeight = Math.max(\n            PANEL_ROW_HEIGHT + 2 * PANEL_PAD,\n            this.rows.length * PANEL_ROW_HEIGHT + 2 * PANEL_PAD,\n        );\n        const bodyHeight = Math.min(contentHeight, PANEL_MAX_BODY_HEIGHT);\n        this.mutate({ width: PANEL_WIDTH });\n        this.mutate({ height: bodyHeight });\n\n        const scroll = new ui.ScrollBox({\n            width: PANEL_WIDTH,\n            height: bodyHeight,\n            x: 0,\n            y: 0,\n            z: -0.2,\n            mouseSpace: 'view',\n        });\n        this.appendChild(scroll);\n\n        for (let i = 0; i < this.rows.length; i += 1) {\n            const text = this.rows[i] ?? '';\n            const row = new evilfont.MSDFText({\n                x: PANEL_PAD,\n                y: PANEL_PAD + i * PANEL_ROW_HEIGHT,\n                z: -0.1,\n                width: PANEL_WIDTH - 2 * PANEL_PAD,\n                height: PANEL_ROW_HEIGHT,\n                font: this.font,\n                fontSize: PANEL_FONT_SIZE,\n                fontColor: [1.0, 0.9411, 0.8745, 0.9],\n                text: textutils.formatCellValue(text, PANEL_WIDTH - 2 * PANEL_PAD, {\n                    font: this.font,\n                    fontSize: PANEL_FONT_SIZE,\n                    maxCellHeight: PANEL_ROW_HEIGHT,\n                }, 1),\n            });\n            row.setVisibility(text !== '');\n            scroll.appendChild(row);\n        }\n        scroll.syncContentLayout();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/base.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { DIRTY, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\n\n// Where he looks (on average)\nconst damonGazeBase = [-0.1, 0.15, 1.0];\nconst DAMON_SHADER_REV = '20260613d';\n\nfunction signedRandom() {\n    return 2.0 * Math.random() - 1.0;\n}\n\nexport class Demon extends ui.Node {\n    constructor(state) {\n        let startState = Object.assign({\n            elapsed: 0.0,\n            eyelidAngle: -0.6,\n            nextBlink: 7.0, // seconds since elapsed = 0\n            nextStaccade: 5.0, // seconds since elapsed = 0\n            damonGaze: damonGazeBase,\n        }, state);\n        super(startState);\n        this.ownLoopThink = null;\n        this._lastLoopS = null;\n    }\n\n    #runLoop(dt) {\n        const state = this.state;\n        state.elapsed += dt;\n        const t = state.elapsed;\n\n        if (t > state.nextBlink + 1.0) {\n            state.nextBlink = t + 1.0 + 10.0 * Math.random();\n        }\n        state.eyelidAngle = -0.6 + 1.5 * Math.exp(-40.0 * (state.nextBlink - t)**2);\n\n        if (t > state.nextStaccade) {\n            state.damonGaze = [damonGazeBase[0] + 0.02 * signedRandom(), damonGazeBase[1] + 0.02 * signedRandom(), damonGazeBase[2]];\n            if (Math.random() > 0.1) {\n                state.nextStaccade = t + 0.15 + Math.random() * 0.20;\n            } else {\n                state.nextStaccade = t + 3.0 + Math.random() * 5.0;\n            }\n        }\n    }\n\n    /* Cancel one retained procedural animation wake when the node detaches. */\n    #clearLoop() {\n        if (this.ownLoopThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownLoopThink);\n        this.ownLoopThink = null;\n    }\n\n    /* Keep the procedural blink/gaze loop explicit by rearming one frame at a time. */\n    #scheduleLoop() {\n        this.#clearLoop();\n        if (!this.scene) {\n            return;\n        }\n        this.ownLoopThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), ({ now_s }) => {\n            this.ownLoopThink = null;\n            const last = this._lastLoopS ?? (now_s - this.sceneFrameStepS());\n            this._lastLoopS = now_s;\n            this.#runLoop(Math.max(0, now_s - last));\n            this.#scheduleLoop();\n        });\n    }\n\n    static _onAcquireContext(gl, res) {\n        res.ownGlProgram = peekContextGlProgram(gl, `gl_program.demon.${DAMON_SHADER_REV}`);\n        res.ownGlBufferInfo = null;\n        const acquireToken = beginGlAcquire(res, 'ownPendingGlProgram');\n\n        // Damon is a particular Demon, but since he's all we got for now, we\n        // just use him for all Demon instances currently.\n        (async () => {\n            // Bump the revision when debugging Damon preview placement so a\n            // page reload does not silently reuse a stale shader pair from the\n            // in-session source cache.\n            const ownGlProgram = await getContextGlProgram(gl, `gl_program.demon.${DAMON_SHADER_REV}`, async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(\n                    `lib/evilui/damon.vs.glsl?rev=${DAMON_SHADER_REV}`,\n                    `lib/evilui/damon.fs.glsl?rev=${DAMON_SHADER_REV}`,\n                );\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(res, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            res.ownGlProgram = ownGlProgram;\n\n            res.ownGlBufferInfo = gpuDiagWithResourceOrigin('demon.acquire_context_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n                position: {numComponents: 2, data: [\n                    -1.0, -1.0,   -1.0, 1.0,    1.0,  1.0,\n                    -1.0, -1.0,    1.0, 1.0,    1.0, -1.0,\n                ]},\n            }));\n        })();\n    }\n\n    static _onAttachClass(res) {\n        res.nodes = [];\n    }\n\n    _onAttachNode(res) {\n        markResourceDirty(res, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        res.nodes.push(this);\n        this.#scheduleLoop();\n    }\n\n    _onDetachNode(res) {\n        this.#clearLoop();\n        markResourceDirty(res, [DIRTY.detach, DIRTY.structure, DIRTY.instance, DIRTY.buffer]);\n        res.nodes = res.nodes.filter(n => n !== this);\n    }\n\n    static _onReleaseContext(gl, res) {\n        invalidateGlAcquire(res, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, res.ownGlBufferInfo);\n        res.ownGlBufferInfo = null;\n        res.ownGlProgram = null;\n    }\n\n    static #draw(gl, res, t, viewMatrix, projectionMatrix) {\n        if (!res.ownGlProgram || !res.ownGlBufferInfo || !Array.isArray(res.nodes) || res.nodes.length === 0) {\n            return;\n        }\n        const borGlProgram = res.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, res.ownGlBufferInfo);\n\n        for (let node of res.nodes) {\n            if (node.computedVisible === false) {\n                continue;\n            }\n            const worldMatrix = node._worldMatrixForBatch?.(res.scene) ?? node._worldMatrix;\n            if (!worldMatrix) {\n                throw new Error(\n                    `${node.state?.name ?? node.constructor?.name ?? 'Demon'} reached draw without a world matrix. ` +\n                    `Ensure propagateTransforms() runs before Demon draw.`\n                );\n            }\n            twgl.setUniforms(borGlProgram, {\n                u_totalMatrix: worldMatrix,\n                u_viewMatrix: viewMatrix,\n                u_projectionMatrix: projectionMatrix,\n                u_time: t,\n                u_damonGaze: node.state.damonGaze,\n                u_eyelidAngle: node.state.eyelidAngle,\n            });\n\n            twgl.drawBufferInfo(gl, res.ownGlBufferInfo);\n        }\n    }\n\n    static _drawOpaque(_gl, _res, _t, _viewMatrix, _projectionMatrix) {\n    }\n\n    /* Demon is a translucent overlay effect, so keep the batch in the transparent pass. */\n    static _batchPassForNode(_node) {\n        return 'transparent';\n    }\n\n    /* Shared Demon resources remain transparent-owned after detaching all nodes. */\n    static _batchPassForShared(_shared) {\n        return 'transparent';\n    }\n\n    static _drawTransparent(gl, res, t, viewMatrix, projectionMatrix) {\n        this.#draw(gl, res, t, viewMatrix, projectionMatrix);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n/*\n    Quaternion functions.\n\n    This is taken from GL matrix. It has a private permissive licence (see\n    quat-licence.txt).\n\n    https://glmatrix.net/docs/quat.js.html\n\n    Its been modified to remove dependency on MathJS or other glMatrix\n    components (which duplicate a lot of stuff twgl already has). Changes:\n      - dst moved from first to last argument, and renamed from out. This is\n        to be consistent with other twgl functions.\n      - Dependencies on glMatrix vec3 replaced with twgl.v3.\n      - Dependencies on glMatrix vec4 replacled with explicit inline code.\n      - Dependencies on glMatrix mat4 replaced with twgl.m4.\n      - Dependencies on glMatrix mat3 ignored (raises an error) for now.\n*/\nimport * as twgl from \"twgl\";\n\nconst EPSILON = 1e-6; // formerly glMatrix.EPSILON\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nexport function create() {\n  let dst = new Float32Array(4); // TWGL has no vec4 to reuse for quaternions, so we create from scratch.\n  dst[0] = 0;\n  dst[1] = 0;\n  dst[2] = 0;\n  dst[3] = 1;\n  return dst;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} dst the receiving quaternion\n * @returns {dst} dst\n */\nexport function identity(dst) {\n  if (!dst) {\n    dst = create();\n  }\n  \n  dst[0] = 0;\n  dst[1] = 0;\n  dst[2] = 0;\n  dst[3] = 1;\n  return dst;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n **/\nexport function setAxisAngle(axis, rad, dst) {\n  if (!dst) {\n    dst = create();\n  }\n  \n  rad = rad * 0.5;\n  let s = Math.sin(rad);\n  dst[0] = s * axis[0];\n  dst[1] = s * axis[1];\n  dst[2] = s * axis[2];\n  dst[3] = Math.cos(rad);\n  return dst;\n}\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {ReadonlyQuat} q     Quaternion to be decomposed\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @return      2-element array, first is axis as a 3-vector, second is angle, in radians, of the rotation\n */\nexport function getAxisAngle(q, dst_axis) {\n  if (!dst_axis) {\n    // If s is zero, return any axis (no rotation - axis does not matter)\n    dst_axis = twgl.v3.create(1, 0, 0);\n  }\n\n  let rad = Math.acos(q[3]) * 2.0;\n  let s = Math.sin(rad / 2.0);\n  if (s > EPSILON) {\n    dst_axis[0] = q[0] / s;\n    dst_axis[1] = q[1] / s;\n    dst_axis[2] = q[2] / s;\n  }\n  return [axis, rad];\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {ReadonlyQuat} a     Origin unit quaternion\n * @param  {ReadonlyQuat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */\nexport function getAngle(a, b) {\n  let dotproduct = dot(a, b);\n  return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n */\nexport function multiply(a, b, dst) {\n  if (!dst) {\n    dst = create();\n  }\n\n  let ax = a[0],\n    ay = a[1],\n    az = a[2],\n    aw = a[3];\n  let bx = b[0],\n    by = b[1],\n    bz = b[2],\n    bw = b[3];\n  dst[0] = ax * bw + aw * bx + ay * bz - az * by;\n  dst[1] = ay * bw + aw * by + az * bx - ax * bz;\n  dst[2] = az * bw + aw * bz + ax * by - ay * bx;\n  dst[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return dst;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} dst quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} dst\n */\nexport function rotateX(a, rad, dst) {\n  rad *= 0.5;\n  let ax = a[0],\n    ay = a[1],\n    az = a[2],\n    aw = a[3];\n  let bx = Math.sin(rad),\n    bw = Math.cos(rad);\n  dst[0] = ax * bw + aw * bx;\n  dst[1] = ay * bw + az * bx;\n  dst[2] = az * bw - ay * bx;\n  dst[3] = aw * bw - ax * bx;\n  return dst;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} dst quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} dst\n */\nexport function rotateY(a, rad, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  rad *= 0.5;\n  let ax = a[0],\n    ay = a[1],\n    az = a[2],\n    aw = a[3];\n  let by = Math.sin(rad),\n    bw = Math.cos(rad);\n  dst[0] = ax * bw - az * by;\n  dst[1] = ay * bw + aw * by;\n  dst[2] = az * bw + ax * by;\n  dst[3] = aw * bw - ay * by;\n  return dst;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} dst quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} dst\n */\nexport function rotateZ(a, rad, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  rad *= 0.5;\n  let ax = a[0],\n    ay = a[1],\n    az = a[2],\n    aw = a[3];\n  let bz = Math.sin(rad),\n    bw = Math.cos(rad);\n  dst[0] = ax * bw + ay * bz;\n  dst[1] = ay * bw - ax * bz;\n  dst[2] = az * bw + aw * bz;\n  dst[3] = aw * bw - az * bz;\n  return dst;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} dst\n */\nexport function calculateW(a, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  let x = a[0],\n    y = a[1],\n    z = a[2];\n  dst[0] = x;\n  dst[1] = y;\n  dst[2] = z;\n  dst[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n  return dst;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} dst\n */\nexport function exp(a, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  let x = a[0],\n    y = a[1],\n    z = a[2],\n    w = a[3];\n  let r = Math.sqrt(x * x + y * y + z * z);\n  let et = Math.exp(w);\n  let s = r > 0 ? (et * Math.sin(r)) / r : 0;\n  dst[0] = x * s;\n  dst[1] = y * s;\n  dst[2] = z * s;\n  dst[3] = et * Math.cos(r);\n  return dst;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} dst\n */\nexport function ln(a, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  let x = a[0],\n    y = a[1],\n    z = a[2],\n    w = a[3];\n  let r = Math.sqrt(x * x + y * y + z * z);\n  let t = r > 0 ? Math.atan2(r, w) / r : 0;\n  dst[0] = x * t;\n  dst[1] = y * t;\n  dst[2] = z * t;\n  dst[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n  return dst;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} dst\n */\nexport function pow(a, b, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  ln(dst, a);\n  scale(dst, dst, b);\n  exp(dst, dst);\n  return dst;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} dst\n */\nexport function slerp(a, b, t, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  // benchmarks:\n  //    http://jsperf.com/quaternion-slerp-implementations\n  let ax = a[0],\n    ay = a[1],\n    az = a[2],\n    aw = a[3];\n  let bx = b[0],\n    by = b[1],\n    bz = b[2],\n    bw = b[3];\n  let omega, cosom, sinom, scale0, scale1;\n  // calc cosine\n  cosom = ax * bx + ay * by + az * bz + aw * bw;\n  // adjust signs (if necessary)\n  if (cosom < 0.0) {\n    cosom = -cosom;\n    bx = -bx;\n    by = -by;\n    bz = -bz;\n    bw = -bw;\n  }\n  // calculate coefficients\n  if (1.0 - cosom > EPSILON) {\n    // standard case (slerp)\n    omega = Math.acos(cosom);\n    sinom = Math.sin(omega);\n    scale0 = Math.sin((1.0 - t) * omega) / sinom;\n    scale1 = Math.sin(t * omega) / sinom;\n  } else {\n    // \"from\" and \"to\" quaternions are very close\n    //  ... so we can do a linear interpolation\n    scale0 = 1.0 - t;\n    scale1 = t;\n  }\n  // calculate final values\n  dst[0] = scale0 * ax + scale1 * bx;\n  dst[1] = scale0 * ay + scale1 * by;\n  dst[2] = scale0 * az + scale1 * bz;\n  dst[3] = scale0 * aw + scale1 * bw;\n  return dst;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n */\nexport function random(dst) {\n    throw new Error('Not ported to twgl.');\n  // Implementation of http://planning.cs.uiuc.edu/node198.html\n  // TODO: Calling random 3 times is probably not the fastest solution\n  /*let u1 = glMatrix.RANDOM();\n  let u2 = glMatrix.RANDOM();\n  let u3 = glMatrix.RANDOM();\n  let sqrt1MinusU1 = Math.sqrt(1 - u1);\n  let sqrtU1 = Math.sqrt(u1);\n  dst[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n  dst[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n  dst[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n  dst[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n  return dst;*/\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} dst\n */\nexport function invert(a, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  let a0 = a[0],\n    a1 = a[1],\n    a2 = a[2],\n    a3 = a[3];\n  let dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n  let invDot = dot ? 1.0 / dot : 0;\n  // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n  dst[0] = -a0 * invDot;\n  dst[1] = -a1 * invDot;\n  dst[2] = -a2 * invDot;\n  dst[3] = a3 * invDot;\n  return dst;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} dst\n */\nexport function conjugate(a, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  dst[0] = -a[0];\n  dst[1] = -a[1];\n  dst[2] = -a[2];\n  dst[3] = a[3];\n  return dst;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {ReadonlyMat3} m rotation matrix\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n * @function\n */\nexport function fromMat3(m, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n  // article \"Quaternion Calculus and Fast Animation\".\n  let fTrace = m[0] + m[4] + m[8];\n  let fRoot;\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0); // 2w\n    dst[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot; // 1/(4w)\n    dst[0] = (m[5] - m[7]) * fRoot;\n    dst[1] = (m[6] - m[2]) * fRoot;\n    dst[2] = (m[1] - m[3]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    let i = 0;\n    if (m[4] > m[0]) i = 1;\n    if (m[8] > m[i * 3 + i]) i = 2;\n    let j = (i + 1) % 3;\n    let k = (i + 2) % 3;\n    fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n    dst[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    dst[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n    dst[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n    dst[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n  }\n  return dst;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z using the provided intrinsic order for the conversion.\n *\n * @param {Number} x Angle to rotate around X axis in degrees.\n * @param {Number} y Angle to rotate around Y axis in degrees.\n * @param {Number} z Angle to rotate around Z axis in degrees.\n * @param {'xyz'|'xzy'|'yxz'|'yzx'|'zxy'|'zyx'} order Intrinsic order for conversion, default is zyx.\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n * @function\n */\nexport function fromEuler(x, y, z, order = \"zyx\", dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  let halfToRad = Math.PI / 360;\n  x *= halfToRad;\n  z *= halfToRad;\n  y *= halfToRad;\n  let sx = Math.sin(x);\n  let cx = Math.cos(x);\n  let sy = Math.sin(y);\n  let cy = Math.cos(y);\n  let sz = Math.sin(z);\n  let cz = Math.cos(z);\n  switch (order) {\n    case \"xyz\":\n      dst[0] = sx * cy * cz + cx * sy * sz;\n      dst[1] = cx * sy * cz - sx * cy * sz;\n      dst[2] = cx * cy * sz + sx * sy * cz;\n      dst[3] = cx * cy * cz - sx * sy * sz;\n      break;\n    case \"xzy\":\n      dst[0] = sx * cy * cz - cx * sy * sz;\n      dst[1] = cx * sy * cz - sx * cy * sz;\n      dst[2] = cx * cy * sz + sx * sy * cz;\n      dst[3] = cx * cy * cz + sx * sy * sz;\n      break;\n    case \"yxz\":\n      dst[0] = sx * cy * cz + cx * sy * sz;\n      dst[1] = cx * sy * cz - sx * cy * sz;\n      dst[2] = cx * cy * sz - sx * sy * cz;\n      dst[3] = cx * cy * cz + sx * sy * sz;\n      break;\n    case \"yzx\":\n      dst[0] = sx * cy * cz + cx * sy * sz;\n      dst[1] = cx * sy * cz + sx * cy * sz;\n      dst[2] = cx * cy * sz - sx * sy * cz;\n      dst[3] = cx * cy * cz - sx * sy * sz;\n      break;\n    case \"zxy\":\n      dst[0] = sx * cy * cz - cx * sy * sz;\n      dst[1] = cx * sy * cz + sx * cy * sz;\n      dst[2] = cx * cy * sz + sx * sy * cz;\n      dst[3] = cx * cy * cz - sx * sy * sz;\n      break;\n    case \"zyx\":\n      dst[0] = sx * cy * cz - cx * sy * sz;\n      dst[1] = cx * sy * cz + sx * cy * sz;\n      dst[2] = cx * cy * sz - sx * sy * cz;\n      dst[3] = cx * cy * cz + sx * sy * sz;\n      break;\n    default:\n      throw new Error('Unknown angle order ' + order);\n  }\n  return dst;\n}\n/**\n * Returns a string representation of a quaternion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n  return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nexport function clone(a) { // TWGL\n    const ret = new Float32Array(4);\n    ret[0] = a[0];\n    ret[1] = a[1];\n    ret[2] = a[2];\n    ret[3] = a[3];\n    return ret;\n}\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nexport function fromValues(x, y, z, w) { // TWGL\n    const ret = new Float32Array(4);\n    ret[0] = x;\n    ret[1] = y;\n    ret[2] = z;\n    ret[3] = w;\n    return ret;\n}\n/**\n * Copy the values from one quat to another\n *\n * @param {dst} dst the receiving quaternion\n * @param {src} a the source quaternion\n * @function\n */\nexport function copy(dst, src) {\n    dst[0] = src[0];\n    dst[1] = src[1];\n    dst[2] = src[2];\n    dst[3] = src[3];\n}\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} dst the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} dst\n * @function\n */\nexport function set(x, y, z, w, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  dst[0] = x;\n  dst[1] = y;\n  dst[2] = z;\n  dst[3] = w;\n}\n/**\n * Adds two quat's\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} dst\n * @function\n */\nexport function add(a, b, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  dst[0] = a[0] + b[0];\n  dst[1] = a[1] + b[1];\n  dst[2] = a[2] + b[2];\n  dst[3] = a[3] + b[3];\n  return dst;\n}\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} dst the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} dst\n * @function\n */\nexport function scale(a, scalar, dst) {\n  if (!dst) {\n     dst = create();\n  }\n\n  dst[0] = scalar * a[0];\n  dst[1] = scalar * a[1];\n  dst[2] = scalar * a[2];\n  dst[3] = scalar * a[3];\n  return dst;\n}\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nexport function dot(a, b) {\n  return  (a[0] * b[0]\n         + a[1] * b[1]\n         + a[2] * b[2]\n         + a[3] * b[3]);\n}\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @param {quat} dst the receiving quaternion\n * @returns {quat} dst\n * @function\n */\nexport function lerp(a, b, t, dst) {\n    if (!dst) {\n        dst = create();\n    }\n\n    const s = 1 - t;\n    dst[0] = s * a[0] + t * b[0];\n    dst[1] = s * a[1] + t * b[1];\n    dst[2] = s * a[2] + t * b[2];\n    dst[3] = s * a[3] + t * b[3];\n    return dst;\n}\n\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n    return Math.sqrt(squaredLength(a));\n}\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nexport function squaredLength(a) {\n    return a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3];\n}\n/**\n * Normalize a quat\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} dst\n * @function\n */\nexport function normalize(a, dst) {\n  if (!dst) {\n    dst = create();\n  }\n\n  const len = length(a);\n  if (len > EPSILON) {\n    const invLen = 1 / len;\n    dst[0] = invLen * a[0];\n    dst[1] = invLen * a[1];\n    dst[2] = invLen * a[2];\n    dst[3] = invLen * a[3];\n  } else {\n    dst[0] = 0.0;\n    dst[1] = 0.0;\n    dst[2] = 0.0;\n    dst[3] = 1.0;\n  }\n  return dst;\n}\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n    return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3];\n}\n/**\n * Returns whether or not the quaternions point approximately to the same direction.\n *\n * Both quaternions are assumed to be unit length.\n *\n * @param {ReadonlyQuat} a The first unit quaternion.\n * @param {ReadonlyQuat} b The second unit quaternion.\n * @returns {Boolean} True if the quaternions are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n    return Math.abs(dot(a, b)) >= 1 - EPSILON;\n}\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} dst the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} dst\n */\nexport const rotationTo = (function () {\n  let tmpvec3 = twgl.v3.create();\n  let xUnitVec3 = twgl.v3.create(1, 0, 0);\n  let yUnitVec3 = twgl.v3.create(0, 1, 0);\n  return function (dst, a, b) {\n    let dot = twgl.v3.dot(a, b);\n    if (dot < -0.999999) {\n      twgl.v3.cross(tmpvec3, xUnitVec3, a);\n      if (twgl.v3.length(tmpvec3) < 0.000001) twgl.v3.cross(tmpvec3, yUnitVec3, a);\n      twgl.v3.normalize(tmpvec3, tmpvec3);\n      setAxisAngle(dst, tmpvec3, Math.PI);\n      return dst;\n    } else if (dot > 0.999999) {\n      dst[0] = 0;\n      dst[1] = 0;\n      dst[2] = 0;\n      dst[3] = 1;\n      return dst;\n    } else {\n      twgl.v3.cross(tmpvec3, a, b);\n      dst[0] = tmpvec3[0];\n      dst[1] = tmpvec3[1];\n      dst[2] = tmpvec3[2];\n      dst[3] = 1 + dot;\n      return normalize(dst, dst);\n    }\n  };\n})();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} dst the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} dst\n */\nexport const sqlerp = (function () {\n  let temp1 = create();\n  let temp2 = create();\n  return function (dst, a, b, c, d, t) {\n    slerp(temp1, a, d, t);\n    slerp(temp2, b, c, t);\n    slerp(dst, temp1, temp2, 2 * t * (1 - t));\n    return dst;\n  };\n})();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view  the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up    the vector representing the local \"up\" direction\n * @returns {quat} dst\n */\nexport const setAxes = (function () {\n  let matr = 0; //twgl.mat3.create();\n  return function (dst, view, right, up) {\n    throw new Error('mat3 dependency not included yet');\n    matr[0] = right[0];\n    matr[3] = right[1];\n    matr[6] = right[2];\n    matr[1] = up[0];\n    matr[4] = up[1];\n    matr[7] = up[2];\n    matr[2] = -view[0];\n    matr[5] = -view[1];\n    matr[8] = -view[2];\n    return normalize(dst, fromMat3(dst, matr));\n  };\n})();\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { Node } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as glpicker from './gl-picker.mjs'\nimport { gpuDiagNoteButtonVisualTransition } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo, drawArraysChecked } from './gl-buffer.mjs';\nimport { DIRTY, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { identity } from '../quat.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { materials } from './tile-material.mjs';\nimport {\n    allocateNavigationOrdinal, registerFocusControl, unregisterFocusControl,\n    focusControl, reconcileControlFocus, notifyFocusTargetChange,\n} from './focus-manager.mjs';\n\nimport { isActivationEvent } from './activation.mjs';\n\nconst DEFAULT_FOCUS_OUTLINE_MATERIAL = materials.linearGradient({\n    points: [\n        { offset: 0, color: Palette.teal },\n        { offset: 1, color: [0.65, 0.9, 0.86, 1] },\n    ],\n    start: [0, 0.5],\n    end: [1, 0.5],\n});\n\n\n/*\nTODU:\nclass button becomes click area\nsimilar to godot and unity,\ncreate a global input dictionary\nobjects then refrence these input events \"RIGHT_MOUSE_UP, LEFT_MOUSE_DOWN...\"\nclickarea reads activity and calls single onInput()\nonInput is overriden to check the event type\nand perform whatever stuff...\n*/\n/*\nMake button have icon and text as optional,\ntext and icon may have X aligment options\ndo not account for padding\nbutton size may be min(given size, min(icon, text))\nif no given size, then size is 100\nicon may overlap text and vice versa, no restrictions here\nuser has to place them correctly\n*/\nexport const InputMode = {\n    PASS: 0,   // Process input, then pass to children\n    BLOCK: 1   // Process input, then stop (consume event)\n};\n\nconst CLICK_TRACE_EVENTS = new Set([\n    'L_MOUSE_DOWN',\n    'L_MOUSE_UP',\n    'L_MOUSE_DOWN_HOLD',\n    'R_MOUSE_DOWN',\n    'R_MOUSE_UP',\n    'R_MOUSE_DOWN_HOLD',\n    'DOUBLE_CLICK',\n]);\n\nfunction hasClickEvent(events) {\n    for (const event of events ?? []) {\n        if (CLICK_TRACE_EVENTS.has(event)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction hasLocalPointerHit(node) {\n    if (!node || typeof node.getLocalMousePosition !== 'function') {\n        return false;\n    }\n    const local = node.getLocalMousePosition();\n    if (!Array.isArray(local)) {\n        return false;\n    }\n    const [x, y] = local;\n    const width = node.width ?? node.state?.width ?? 0;\n    const height = node.height ?? node.state?.height ?? 0;\n    return Number.isFinite(x)\n        && Number.isFinite(y)\n        && Number.isFinite(width)\n        && Number.isFinite(height)\n        && x >= 0\n        && y >= 0\n        && x <= width\n        && y <= height;\n}\n\nfunction hasCurrentInputPickHit(node) {\n    const pickedId = node?.scene?.inputPickedInteractable ?? 0;\n    return Number.isInteger(pickedId)\n        && pickedId > 0\n        && node?.id != null\n        && pickedId === node.id;\n}\n\n// Click acceptance should trust an in-bounds local hit first, because overlay\n// focus/picker state can lag by one frame while the pointer is already inside\n// the new button. Failing that, trust the authoritative direct input pick for\n// the current input frame rather than re-deriving freshness from generic frame\n// counters inside the button layer.\nfunction hasCurrentClickHit(node, events = null) {\n    if (hasLocalPointerHit(node)) {\n        return true;\n    }\n    if (hasCurrentInputPickHit(node)) {\n        return true;\n    }\n    const allowPickFallback = !!events?.has?.('DOUBLE_CLICK');\n    if (!allowPickFallback) {\n        return false;\n    }\n    const pickedId = node?.scene?.selectedIteractable ?? 0;\n    if (Number.isInteger(pickedId) && pickedId > 0 && node?.id != null) {\n        return pickedId === node.id;\n    }\n    return false;\n}\n\nfunction buttonDiagKey(node) {\n    return `${node.constructor?.name ?? 'Unknown'}(${node.state?.name ?? 'unnamed'}#${node.id ?? 'na'})`;\n}\n\nfunction noteButtonVisualTransition(node, transition) {\n    gpuDiagNoteButtonVisualTransition(buttonDiagKey(node), {\n        transition,\n        hovering: !!node?._mouseIsHovering,\n        focus: false,\n        enabled: node?.enabled !== false,\n        text_dirty: !!node?.textLabel,\n        icon_dirty: !!node?.icon,\n        tile_dirty: !!node?.tile,\n        tooltip_enabled: !!node?.tooltipEnabled,\n        text: node?.state?.text ?? '',\n    });\n}\n\n\n//This tries to be the equivalent to a \"Collision Box\" or \"Collider\" in other engines, but for input events.\n//Tradionally, buttons and interactable objects have a \"collision box\" seperate from their visual instances. \nconst tl = [-1, -1, 0];\nconst tr = [+1, -1, 0];\nconst bl = [-1, +1, 0];\nconst br = [+1, +1, 0];\n\nconst mesh = new Float32Array([].concat(\n    tl, tr, bl,\n    tr, br, bl\n));\n\nexport class Interactable extends Node {\n\n    static _allInteractables = new Map();\n    static _idCounter = 0;\n    static _currentHover = null;\n\n    static #testingSnapshot(node) {\n        if (!node) {\n            return null;\n        }\n        return {\n            id: node.id ?? null,\n            class_name: node.constructor?.name ?? null,\n            name: node.state?.name ?? null,\n            icon_id: node.state?.iconID ?? null,\n            text: node.state?.text ?? null,\n            enabled: node.enabled !== false,\n            width: node.width ?? null,\n            height: node.height ?? null,\n        };\n    }\n\n\n    constructor(state) {\n        super(state);\n        this.id = null;\n        this._mouseIsHovering = false;\n        this.inputMode = state.inputMode ?? InputMode.BLOCK\n        this.enabled = true;\n        /* Keep non-action capture layers behind any ordinary picker target, independent of projection depth. */\n        this.pickerAlwaysBehind = state.pickerAlwaysBehind === true;\n\n        /*used to measure the interactable gl-picking mesh*/\n        this.width = 0;\n        this.height = 0;\n    }\n\n    /* Components may opt into a cross-session pointer identity without making\n       transient picker IDs or translated display text authoritative. */\n    recordingIdentity() {\n        const stableKey = this.state?.recordingKey;\n        return typeof stableKey === 'string' && stableKey !== ''\n            ? { stable_key: stableKey }\n            : null;\n    }\n\n    static _onAttachClass(shared) {\n        shared.nodes = [];\n    }\n\n    _dropOwnInteractableRegistration(shared) {\n        // Picker IDs must be rebuilt when buttons disappear, or stale invisible\n        // hit targets can keep intercepting later clicks.\n        markResourceDirty(shared, DIRTY.pickerBatch);\n\n        shared.nodes = shared.nodes.filter(n => n !== this);\n\n        if (Interactable._currentHover === this) {\n            Interactable._currentHover = null;\n        }\n\n        if (this.id && Interactable._allInteractables.get(this.id) === this) {\n            Interactable._allInteractables.delete(this.id);\n        }\n        this.id = null;\n    }\n\n    _onAttachNode(shared) {\n        markResourceDirty(shared, DIRTY.pickerBatch);\n\n        if (this.id !== null) {\n            this._dropOwnInteractableRegistration(shared);\n        }\n\n        shared.nodes.push(this);\n\n        this.id = ++Interactable._idCounter;\n        Interactable._allInteractables.set(this.id, this);\n        \n    }\n\n    _onDetachNode(shared) {\n        this._dropOwnInteractableRegistration(shared);\n    }\n\n    static setHoveringID(id) {\n        const candidate = Interactable._allInteractables.get(id);\n        const newInteractable = candidate?.enabled === false ? null : candidate;\n        const oldInteractable = Interactable._currentHover;\n\n        if (newInteractable === oldInteractable) return;\n\n        Interactable._currentHover = newInteractable || null;\n        oldInteractable?._onHoverExit?.();\n        newInteractable?._onHoverEnter?.();\n    }\n\n    static testingState() {\n        return {\n            hover: Interactable.#testingSnapshot(Interactable._currentHover),\n        };\n    }\n\n    getMeshGLOverride() {\n        return mesh;\n    }\n\n    // Buttons and click-areas are the canonical trivial picker case: their local\n    // width/height plane is the hit target, so we can test them in JS without any\n    // GPU readback so long as the projected quad stays axis-aligned.\n    _hasTrivialJSPick() {\n        return this.enabled !== false\n            && Number.isFinite(this.width)\n            && Number.isFinite(this.height)\n            && this.width > 0\n            && this.height > 0;\n    }\n\n    _jsPickLocalRect() {\n        if (!this._hasTrivialJSPick()) {\n            return null;\n        }\n        // Interactable quads are built from [0,0] to [width,height] in local space.\n        return {\n            minX: 0,\n            minY: 0,\n            maxX: this.width,\n            maxY: this.height,\n        };\n    }\n\n    static _onAcquireContext(gl, shared) {\n        super._onAcquireContext(gl, shared);\n\n        shared.ownGlPickerProgram = peekContextGlProgram(gl, 'gl_program.button.picker');\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlPickerProgram');\n\n        (async () => {\n            const shaderName = 'lib/evilui/gl-picker';\n            const ownGlPickerProgram = await getContextGlProgram(gl, 'gl_program.button.picker', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(shaderName + '.vs.glsl', shaderName + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlPickerProgram')) {\n                return;\n            }\n            shared.ownGlPickerProgram = ownGlPickerProgram;\n            if (!shared.ownGlPickerProgram) {\n                console.warn(`Shader ${shaderName} not found. GLPicker will not render.`);\n            }\n        })();  // fire-and-forget\n    }\n\n    static _onReleaseContext(gl, shared) {\n        super._onReleaseContext(gl, shared);\n        invalidateGlAcquire(shared, 'ownPendingGlPickerProgram');\n        deleteBufferInfo(gl, shared.ownGlPickerBufferInfo);\n        shared.ownGlPickerProgram = null;\n        shared.ownGlPickerBufferInfo = null;\n        shared.borPickerMesh = null;\n    }\n\n\n    static _drawGLPickable(gl, shared, t, viewMatrix, projectionMatrix) {\n        if (!shared.ownGlPickerProgram) {\n            return;\n        }\n        const nodes = shared.borPickerNodes ?? shared.nodes;\n        if (!nodes || nodes.length === 0) return;\n        const borGlProgram = shared.ownGlPickerProgram;\n\n        gl.useProgram(borGlProgram.program);\n        gl.enable(gl.DEPTH_TEST);\n        twgl.setUniforms(borGlProgram, {\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n        });\n        for (const node of nodes) {\n            if (!node?.enabled) {\n                continue;\n            }\n            const borGlBufferInfo = glpicker.getGLPickerBufferInfo(\n                gl,\n                shared,\n                node.getMeshGLOverride?.() ?? node.getMesh?.(),\n            );\n            if (!borGlBufferInfo) {\n                continue;\n            }\n            const pose = node._pickPose?.(shared.scene) ?? node._batchPose?.(shared.scene);\n            if (!pose) {\n                throw new Error(\n                    `${node.state?.name ?? node.constructor?.name ?? 'Pickable node'} reached picker draw without a live batch pose. ` +\n                    `Ensure the node is attached to the picker scene before draw.`\n                );\n            }\n            twgl.setBuffersAndAttributes(gl, borGlProgram, borGlBufferInfo);\n            twgl.setUniforms(borGlProgram, {\n                u_anchorMatrix: pose.anchorToRoot,\n                u_localMatrix: pose.localToAnchor,\n                u_resolution: [node.width, node.height],\n                u_id: node.id,\n                u_pickerAlwaysBehind: node.pickerAlwaysBehind ? 1 : 0,\n            });\n            drawArraysChecked(gl, `GLPicker(${shared.resourceKey})`, borGlBufferInfo);\n        }\n\n    }\n\n    setEnabled(state) {\n        if (this.enabled === state) {\n            return;\n        }\n        this.enabled = state;\n        if (!state) {\n            this.cancelActivation?.();\n            if (Interactable._currentHover === this) {\n                Interactable._currentHover = null;\n                this._onHoverExit?.();\n            }\n        }\n        this._dirtyResources({ kinds: [DIRTY.visibility, DIRTY.instance] });\n        if (this.scene?.stage) reconcileControlFocus(this.scene.stage);\n    }\n}\n\nexport class Button extends Interactable {\n    #ownTooltipShowThink = null;\n    #ownTooltipHideThink = null;\n\n    constructor(state) {\n\n        super(state);\n\n        this.focusTargetKind = 'control';\n        Object.defineProperty(this, 'navigationOrdinal', { value: allocateNavigationOrdinal(), enumerable: true });\n        this.navigationRegistered = false;\n        this.focusable = state.focusable !== false;\n        this.focused = false;\n        this.focusVisible = false;\n        this.pressed = false;\n        this.ownFocusRing = null;\n        this.selectionHighlighted = state.selectionHighlighted === true;\n        this.onActivate = state.onActivate ?? null;\n        this.selected = state.selected === true;\n        this.capturesPrimaryPointer = state.capturesPrimaryPointer !== false;\n        this.hideTile = state.hideTile === true;\n        //Components\n        this.tile = null;\n        this.icon = null;\n        this.iconPivot = null;\n        this.textLabel = null;\n\n        this.width = state.width ?? 1\n        this.height = state.height ?? 1\n        //Temp settings, customization patch will resolve this\n        //Tile Settings\n        this.hasExplicitTileSize = state.tileSize != null\n        this.tileSize = state.tileSize || [this.width, this.height]\n        this.color = state.color || Palette.orange\n        this.onHoverColor = state.onHoverColor || Palette.lightgrey\n        this.onFocusColor = state.onFocusColor || Palette.teal\n        this.disabledColor = state.disabledColor ?? Palette.darkgrey\n\n        //Icon settings\n        this.iconColor = state.iconColor || Palette.white\n        this.onHoverIconColor = state.onHoverIconColor || Palette.white\n        this.iconID = state.iconID ?? null\n        this.iconSize = state.iconSize || [state.width, state.height]\n        this.iconExpand = state.iconExpand ?? true; //if true, icon will expand button size, if false, icon will draw outside of button\n\n        //TextLabel settings\n        this.defaultTextColor = state.defaultTextColor || [1, 1, 1, 1]\n        this.disabledTextColor = state.disabledTextColor ?? this.defaultTextColor\n        this.onHovertextColor = state.onHovertextColor || this.defaultTextColor\n        this.onFocusTextColor = state.onFocusTextColor || this.defaultTextColor\n        this.text = this.state.text || \"\"\n        this.textExpand = state.textExpand ?? true; //if true, text will expand button size, if false, text will draw outside of button\n        this.textVAlignment = state.textVAlignment || 'TOP'\n        this.textHAlignment = state.textHAlignment || 'LEFT'\n       \n   \n        //this.textPadding = state.textPadding ?? 22; //??\n        //this.verticalPadding = state.verticalPadding ?? 0;\n        //this.horizontalPadding = state.horizontalPadding ?? 0;\n        \n        //Other\n        this.tooltipText = state.tooltipText || \"This is a tooltip. Most buttons in the scene will contain a tooltip text, this describes the button behaviour and gives hints on how to use it.\"\n        this.toastText = state.toastText || \"This is a toast message. It describes the action that was jsut taken. It will fade automatically.\"\n        this.toastEnabled = state.toastEnabled ?? false\n        this.toastOffsetX = state.toastOffsetX ?? 0\n        this.toastOffsetY = state.toastOffsetY ?? 0\n        this.tooltipEnabled = state.tooltipEnabled ?? false\n    \n    }\n\n    tooltipCD = 0.5;\n    tooltipInstance = null;\n    tooltipHideGrace = 0.15;\n\n    isTabStop() {\n        return this.focusTargetKind === 'control' && this.focusable\n            && (typeof this.onActivate === 'function' || this.onInput !== Button.prototype.onInput);\n    }\n\n    focusSemantics() {\n        return {\n            role: this.state.role ?? 'button',\n            name: this.state.accessibleName ?? (this.text || this.state.tooltipText || this.state.name || 'Button'),\n            description: this.state.tooltipText ?? '',\n            disabled: !this.enabled,\n            selected: this.selected,\n        };\n    }\n\n    syncFocusVisual(focused, reason = null) {\n        this.focused = focused;\n        if (!focused) {\n            this.cancelActivation();\n            if (!this._mouseIsHovering) {\n                this.#clearTooltipShowWake();\n                this.#dropTooltip();\n            }\n        } else if (this.focusVisible) {\n            this.#clearTooltipHideWake();\n            this.#armTooltipShow();\n        }\n        this.#syncFocusOutline();\n        if (reason === 'focus_stack_restore' && focused && this.focusVisible) {\n            for (let owner = this.parentNode; owner; owner = owner.parentNode) owner.revealFocusTarget?.(this);\n        }\n    }\n\n    /* Selection shares the focus outline's appearance without claiming keyboard focus. */\n    #syncFocusOutline() {\n        const visible = this.selectionHighlighted || (this.focused && this.focusVisible);\n        if (visible && !this.ownFocusRing) {\n            this.ownFocusRing = new ui.Tile({\n                name: 'keyboardFocusRing', width: this.width, height: this.height,\n                z: -0.3, color: Palette.clear, material: materials.translucentSolid(),\n                outlineEnabled: true, outlineColor: Palette.teal, outlineWidth: 2,\n                outlineAlignment: 'inner', outlineMaterial: DEFAULT_FOCUS_OUTLINE_MATERIAL,\n                ...(this.state.shape ? { shape: this.state.shape } : {}),\n            });\n            this.appendChild(this.ownFocusRing);\n        }\n        this.ownFocusRing?.setVisibility(visible);\n    }\n\n    cancelActivation() {\n        this.pressed = false;\n    }\n\n    activate() {\n        if (!this.enabled || !this.focusable) return false;\n        if (this.onActivate) {\n            this.onActivate.call(this);\n            return true;\n        }\n        return this.onInput('ACTIVATE') === true;\n    }\n\n    onKeyDown(event) {\n        if (event.ctrlKey || event.metaKey || event.altKey || event.isComposing) return false;\n        if (event.key !== 'Enter' && event.key !== ' ') return false;\n        this.focusVisible = true;\n        this.syncFocusVisual(true);\n        if (!event.repeat) {\n            if (event.key === ' ') this.pressed = true;\n            else this.activate();\n        }\n        return true;\n    }\n\n    onKeyUp(event) {\n        if (event.key !== ' ') return false;\n        const activate = this.pressed && !event.ctrlKey && !event.metaKey && !event.altKey;\n        this.cancelActivation();\n        if (activate) this.activate();\n        return true;\n    }\n\n    _containsTextLabelData(){\n        return this.state.font && this.state.fontSize && this.text.length > 0;\n    }\n\n    _createTextLabel() {\n        const textLayout = evilfont.MSDFText.measureFromState({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            text: this.state.text\n        });\n\n        if(this.textExpand){\n            this._assertDimentions(textLayout.width, textLayout.height)\n        }\n\n        const [x, y] = evilfont.MSDFText.getTextAligment({\n            font: this.state.font,\n            fontSize: this.state.fontSize || 20,\n            text: this.text},\n            this.width, this.height, this.textVAlignment, this.textHAlignment )\n\n        this.textLabel = new evilfont.MSDFText({\n            font: this.state.font,\n            fontSize: this.state.fontSize || 20,\n            text: this.text,\n            fontColor: this.enabled ? this.defaultTextColor : this.disabledTextColor,\n            x: x,\n            y: y,\n            // Keep button labels comfortably in front of the tile. Tiny depth\n            // deltas were allowing highlighted fills to wash out text on some\n            // platforms.\n            z: -0.1\n        })\n        this.appendChild(this.textLabel);\n\n        \n    }\n\n  \n    _containTileData(){\n        return this.state.width && this.state.height;\n    }\n\n    _createTile() {\n        this.tile = new ui.Tile({\n            width: this.tileSize[0],\n            height: this.tileSize[1],\n            x: (this.width - this.tileSize[0]) * 0.5,\n            y: (this.height - this.tileSize[1]) * 0.5,\n            color: this.enabled ? this.color : this.disabledColor,\n            z: 0.0,\n            ...(this.state.shape ? { shape: this.state.shape } : {}),\n            ...(this.state.material ? { material: this.state.material } : {}),\n            ...(Object.hasOwn(this.state, 'outlineEnabled') ? { outlineEnabled: this.state.outlineEnabled } : {}),\n            ...(Object.hasOwn(this.state, 'outlineColor') ? { outlineColor: this.state.outlineColor } : {}),\n            ...(Object.hasOwn(this.state, 'outlineWidth') ? { outlineWidth: this.state.outlineWidth } : {}),\n            ...(Object.hasOwn(this.state, 'outlineMaterial') ? { outlineMaterial: this.state.outlineMaterial } : {}),\n            ...(Object.hasOwn(this.state, 'outlineAlignment') ? { outlineAlignment: this.state.outlineAlignment } : {}),\n        })\n        this.appendChild(this.tile);\n        this._assertDimentions(this.state.width, this.state.height);\n    }\n\n    _containsIconData(){\n        return this.iconID != null;\n    }\n\n    _createIcon(){\n        if(this.iconExpand){\n            this._assertDimentions(this.iconSize[0], this.iconSize[1])\n        }\n\n        // The icon shader owns continuous spin; this pivot is static geometry.\n        const pivot = new ui.Placeholder({\n            x: (this.width - this.iconSize[0]) * 0.5 + this.iconSize[0] * 0.5,\n            y: (this.height - this.iconSize[1]) * 0.5 + this.iconSize[1] * 0.5,\n            z: -0.2,\n        });\n        this.appendChild(pivot);\n        this.iconPivot = pivot;\n\n        this.icon = new ui.Icon({\n            width: this.iconSize[0],\n            height: this.iconSize[1],\n            x: -this.iconSize[0] * 0.5,\n            y: -this.iconSize[1] * 0.5,\n            color: this.iconColor,\n            z: 0.0,\n            iconID: this.iconID\n        });\n\n        this.iconPivot.appendChild(this.icon);\n    }\n\n    _assertDimentions(width, height){\n        this.height = Math.max(this.height, height)\n        this.width = Math.max(this.width, width)\n        this.state.height = this.height\n        this.state.width = this.width\n    }\n\n    /* Keep the backing tile centred, while ordinary buttons continue to track the full hit envelope. */\n    #layoutTile(resetExplicitPosition = false) {\n        if (!this.tile) {\n            return;\n        }\n        const nextState = {\n            width: this.tileSize[0],\n            height: this.tileSize[1],\n        };\n        if (this.hasExplicitTileSize || resetExplicitPosition) {\n            nextState.x = (this.width - this.tileSize[0]) * 0.5;\n            nextState.y = (this.height - this.tileSize[1]) * 0.5;\n        }\n        this.tile.mutate(nextState);\n    }\n\n    /* Re-centre the icon after button size changes so icon-only chrome stays visually stable. */\n    #layoutIcon() {\n        if (!this.icon) {\n            return;\n        }\n        this.icon.mutate({\n            width: this.iconSize[0],\n            height: this.iconSize[1],\n        });\n        if (this.iconPivot) {\n            this.iconPivot.setLocalPosition([\n                (this.width - this.iconSize[0]) * 0.5 + this.iconSize[0] * 0.5,\n                (this.height - this.iconSize[1]) * 0.5 + this.iconSize[1] * 0.5,\n                this.iconPivot.localPosition()?.[2] ?? -0.2,\n            ]);\n        }\n        // Keep icon offset so the pivot node remains centred.\n        this.icon.setLocalPosition([\n            -this.iconSize[0] * 0.5,\n            -this.iconSize[1] * 0.5,\n            this.icon.localPosition()[2],\n        ]);\n    }\n\n    /* Recompute label placement after button size or text changes so centred captions follow relayout. */\n    #layoutTextLabel() {\n        if (!this.textLabel) {\n            return;\n        }\n        const [x, y] = evilfont.MSDFText.getTextAligment({\n            font: this.state.font,\n            fontSize: this.state.fontSize || 20,\n            text: this.text,\n        }, this.width, this.height, this.textVAlignment, this.textHAlignment);\n        this.textLabel.setLocalPosition([\n            x,\n            y,\n            this.textLabel.localPosition()[2],\n        ]);\n    }\n\n    /* Propagate live button state changes into the retained tile/text/icon children and picker bounds. */\n    mutate(newState) {\n        const prevWidth = this.width;\n        const prevHeight = this.height;\n        const prevText = this.text;\n        const prevHadExplicitTileSize = this.hasExplicitTileSize;\n        const prevTileSize = this.tileSize;\n        const prevIconSize = this.iconSize;\n        const prevIconId = this.iconID;\n        const backgroundChanged = Object.hasOwn(newState, 'color')\n            || Object.hasOwn(newState, 'onHoverColor')\n            || Object.hasOwn(newState, 'onFocusColor');\n\n        super.mutate(newState);\n\n        this.width = this.state.width ?? 1;\n        this.height = this.state.height ?? 1;\n        if (Object.hasOwn(newState, 'tileSize')) {\n            this.hasExplicitTileSize = newState.tileSize != null;\n        }\n        this.tileSize = this.hasExplicitTileSize\n            ? this.state.tileSize\n            : [this.width, this.height];\n        this.text = this.state.text || '';\n        this.iconID = this.state.iconID ?? null;\n        this.iconSize = this.state.iconSize || this.iconSize || [this.width, this.height];\n        this.color = this.state.color || Palette.orange;\n        this.onHoverColor = this.state.onHoverColor || Palette.lightgrey;\n        this.onFocusColor = this.state.onFocusColor || Palette.teal;\n\n        const widthChanged = this.width !== prevWidth;\n        const heightChanged = this.height !== prevHeight;\n        const textChanged = this.text !== prevText;\n        const tileSizeChanged = this.tileSize[0] !== prevTileSize[0]\n            || this.tileSize[1] !== prevTileSize[1];\n        const iconSizeChanged = this.iconSize !== prevIconSize;\n        const iconIdChanged = this.iconID !== prevIconId;\n\n        if (widthChanged || heightChanged || tileSizeChanged) {\n            this.#layoutTile(prevHadExplicitTileSize);\n        }\n        if (widthChanged || heightChanged) {\n            this.#layoutIcon();\n            this.#layoutTextLabel();\n            this._dirtyResources({ kinds: [DIRTY.pickerBatch] });\n            this.ownFocusRing?.mutate({ width: this.width, height: this.height });\n        }\n        if (Object.hasOwn(newState, 'selected')) this.selected = newState.selected === true;\n        if (Object.hasOwn(newState, 'selectionHighlighted')) {\n            this.selectionHighlighted = newState.selectionHighlighted === true;\n            this.#syncFocusOutline();\n        }\n\n        if (textChanged && this.textLabel) {\n            this.textLabel.setText(this.text);\n            this.#layoutTextLabel();\n        }\n\n        if ((iconSizeChanged || iconIdChanged) && this.icon) {\n            if (typeof this.icon.setIconID === 'function') {\n                this.icon.setIconID(this.iconID);\n            }\n            this.#layoutIcon();\n        }\n\n        notifyFocusTargetChange(this);\n\n        if (backgroundChanged && this.tile) {\n            const color = this.enabled\n                ? (this._mouseIsHovering ? this.onHoverColor : this.color)\n                : this.disabledColor;\n            this.tile.mutate({ color });\n        }\n    }\n    /*\n        Button is a special case in that it needs to have a stable picker ID and geometry even as its visual state changes. \n        This is because we don't want hover/click detection to break just because the button changed color or text. \n        To achieve this, the button's picker geometry is based on its overall width/height and does not change with hover/focus states. \n        The visual components (tile, text, icon) are then layered on top and can change appearance without affecting the picker's stability.\n        Because of this separation, the button can still be interactable and receive input events even if its visual representation is hidden or altered, as long as it remains enabled and has a valid picker ID.\n        If a button needs to become completely non-interactable, it should be disabled or removed from the scene, rather than relying on visual changes alone.\n    */\n    _onAttachNode(shared) {\n        if (this._containTileData() && !this.hideTile && !this.tile) {\n           this._createTile();\n        }\n        if(this._containsTextLabelData() && !this.textLabel){\n            this._createTextLabel();\n        }\n        if(this._containsIconData() && !this.icon){\n            this._createIcon();\n            /* The pivot is created during attachment, so expose this lifecycle\n               edge to consumers that configured icon behaviour while detached. */\n            this.onIconCreated?.(this.icon, this.iconPivot);\n        }\n\n        super._onAttachNode(shared)\n        if (this.focusTargetKind === 'control') registerFocusControl(this);\n        this.#syncFocusOutline();\n        markResourceDirty(shared, DIRTY.pickerBatch);\n    }\n\n    /* Cancel any delayed tooltip show so detached buttons cannot resurrect overlay chrome later. */\n    #clearTooltipShowWake() {\n        if (this.#ownTooltipShowThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.#ownTooltipShowThink);\n        this.#ownTooltipShowThink = null;\n    }\n\n    /* Cancel any delayed tooltip hide so hover re-entry can keep the current tooltip alive. */\n    #clearTooltipHideWake() {\n        if (this.#ownTooltipHideThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.#ownTooltipHideThink);\n        this.#ownTooltipHideThink = null;\n    }\n\n    /* Drop one mounted tooltip instance immediately and clear the retained handle. */\n    #dropTooltip() {\n        const mount = this.tooltipInstance?.parentNode ?? null;\n        if (mount) {\n            mount.removeChild(this.tooltipInstance);\n        }\n        this.tooltipInstance = null;\n    }\n\n    /* Resolve the unclipped overlay position from the button's right edge into its scene-level mount. */\n    #tooltipOverlayPlacement(mountRoot) {\n        const sourceEdge = twgl.m4.transformPoint(this.localToWorld(), [this.width, 0, 0]);\n        return twgl.m4.transformPoint(\n            twgl.m4.inverse(mountRoot.localToWorld()),\n            sourceEdge,\n        );\n    }\n\n    /* Materialise the tooltip only after the hover dwell completes and the button still owns hover. */\n    #showTooltipNow() {\n        this.#ownTooltipShowThink = null;\n        if (!this.tooltipEnabled || !(this._mouseIsHovering || (this.focused && this.focusVisible)) || this.tooltipInstance || !this.parentNode) {\n            return;\n        }\n        // A tooltip must be a sibling of clipped content, not a child of its\n        // trigger. The dedicated HUD root supplies order and avoids inheriting\n        // the trigger's structural clip scope.\n        const stage = this.scene?.stage ?? null;\n        const mountRoot = stage?.hudMountRoot?.('tooltip')\n            ?? this.scene?.tooltipMountRoot?.()\n            ?? this.scene?.presentedRoot?.()\n            ?? this;\n        const placement = stage?.projectNodePointToHud?.(this, [this.width, 0, 0], mountRoot)\n            ?? (mountRoot === this ? [0, 0, 0] : this.#tooltipOverlayPlacement(mountRoot));\n        const tooltipMount = new ui.Placeholder({\n            x: placement[0],\n            y: placement[1],\n            // The overlay root owns depth; projecting the trigger's Z would cancel it.\n            z: 0,\n        });\n        tooltipMount.appendChild(new ui.Tooltip({\n            x: 0,\n            font: this.state.font,\n            fontSize: this.state.fontSize || 20,\n            text: this.tooltipText,\n            viewportBounds: () => stage?.hudViewportBounds?.(tooltipMount) ?? null,\n            z: -4.0,\n        }));\n        this.tooltipInstance = tooltipMount;\n        mountRoot.appendChild(this.tooltipInstance);\n    }\n\n    /* Arm one dwell timer for tooltip creation instead of polling hover state every frame. */\n    #armTooltipShow() {\n        if (!this.tooltipEnabled || this.tooltipInstance || this.#ownTooltipShowThink !== null) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.#ownTooltipShowThink = this.thinkAt(nowS + this.tooltipCD, () => {\n            this.#showTooltipNow();\n        });\n    }\n\n    /* Arm one short grace timer before hiding the tooltip so brief hover gaps do not flicker. */\n    #armTooltipHide() {\n        if (!this.tooltipInstance || this.#ownTooltipHideThink !== null) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.#ownTooltipHideThink = this.thinkAt(nowS + this.tooltipHideGrace, () => {\n            this.#ownTooltipHideThink = null;\n            if (this._mouseIsHovering || (this.focused && this.focusVisible)) {\n                return;\n            }\n            this.#dropTooltip();\n        });\n    }\n\n    _onDetachNode(shared) {\n        if (this.focusTargetKind === 'control') unregisterFocusControl(this);\n        this.#clearTooltipShowWake();\n        this.#clearTooltipHideWake();\n        this.#dropTooltip();\n        super._onDetachNode(shared);\n    }\n\n    onPointerInput(events) {\n        const scene = this.scene ?? null;\n        let eventConsumed = false;\n        let ownsPrimaryCapture = scene?.pointerCaptureOwner === this;\n\n        if (!this.enabled && !ownsPrimaryCapture) {\n            return false;\n        }\n        const hasClick = hasClickEvent(events);\n        if (!ownsPrimaryCapture) {\n            if (hasClick && !hasCurrentClickHit(this, events)) {\n                return false;\n            }\n            if (!hasClick && !this._mouseIsHovering) {\n                return false;\n            }\n        }\n        if (!ownsPrimaryCapture && this.capturesPrimaryPointer && events?.has?.('L_MOUSE_DOWN') && this.inputMode === InputMode.BLOCK\n            && scene?.pointerCaptureOwner === null && scene.dragCapture === null) {\n            scene.pointerCaptureOwner = this;\n            scene.dragCapture = 'button';\n            ownsPrimaryCapture = true;\n        }\n        if (events?.has?.('L_MOUSE_DOWN') && this.isTabStop()) focusControl(this);\n\n        for (let event of events) {\n            const cancelledPrimaryRelease = event === 'L_MOUSE_UP'\n                && ownsPrimaryCapture\n                && !hasCurrentClickHit(this, events);\n            if (cancelledPrimaryRelease) {\n                scene.pointerCaptureOwner = null;\n                if (scene.dragCapture === 'button') scene.dragCapture = null;\n                eventConsumed = true;\n                continue;\n            }\n            const handled = event === 'L_MOUSE_UP' && this.onActivate\n                ? this.activate() : this.onInput(event, events) === true;\n            if (handled) {\n                eventConsumed = true;\n            } else if (event === 'L_MOUSE_DOWN_HOLD' || event === 'L_MOUSE_DOWN' || event === 'L_MOUSE_UP'\n                || event === 'R_MOUSE_DOWN_HOLD' || event === 'R_MOUSE_DOWN' || event === 'R_MOUSE_UP') {\n                eventConsumed = true;\n            }\n            if (event === 'L_MOUSE_UP' && ownsPrimaryCapture && scene?.pointerCaptureOwner === this) {\n                scene.pointerCaptureOwner = null;\n                if (scene.dragCapture === 'button') scene.dragCapture = null;\n            }\n        }\n        if (this.inputMode === InputMode.PASS) {\n            return false;\n        } else {\n            return eventConsumed;\n        }\n    }\n\n    onInput(event) {\n        return false;\n    }\n\n    static onPrimaryRelease(callback) {\n        return function (event) {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            callback.call(this);\n            return true;\n        };\n    }\n\n    #setTextLabelColor(fontColor) {\n        if (!this.textLabel) {\n            return;\n        }\n        if (typeof this.textLabel.mutate === 'function') {\n            this.textLabel.mutate({ fontColor });\n            return;\n        }\n        this.textLabel.state.fontColor = fontColor;\n        this.textLabel._dirtyResources({\n            includePicker: false,\n            kinds: [DIRTY.style, DIRTY.instance],\n        });\n    }\n\n    _onHoverEnter() {\n        this._mouseIsHovering = true;\n        this.#clearTooltipHideWake();\n        noteButtonVisualTransition(this, 'hover_enter');\n        if(this.tile){\n            this.tile.color = this.onHoverColor;\n            this.tile._dirtyResources({ includePicker: false });\n        }\n        this.#setTextLabelColor(this.onHovertextColor);\n        if(this.icon){\n            this.icon.color = this.onHoverIconColor\n            this.icon._dirtyResources({ includePicker: false });\n        }\n\n        // Hover styling should not force picker rebatching every frame.\n        this.#armTooltipShow();\n        this.onHoverEnter();\n    }\n\n    onHoverEnter() {\n    }\n\n    _onHoverExit() {\n        this._mouseIsHovering = false;\n        this.#clearTooltipShowWake();\n        noteButtonVisualTransition(this, 'hover_exit');\n        if(this.tile){\n            this.tile.color = this.color;\n            this.tile._dirtyResources({ includePicker: false });\n        }\n        this.#setTextLabelColor(this.defaultTextColor);\n        if(this.icon){\n            this.icon.color = this.iconColor\n            this.icon._dirtyResources({ includePicker: false });\n        }\n\n        this.#armTooltipHide();\n        this.onHoverExit();\n    }\n\n    setEnabled(state) {\n        const wasEnabled = this.enabled;\n        super.setEnabled(state);\n        if (wasEnabled === this.enabled) {\n            return;\n        }\n        if (this.tile) {\n            this.tile.color = this.enabled ? this.color : this.disabledColor;\n            this.tile._dirtyResources({ includePicker: false });\n        }\n        this.#setTextLabelColor(this.enabled ? this.defaultTextColor : this.disabledTextColor);\n    }\n\n    onHoverExit() {\n    }\n\n    /* Keep the normal icon colour authoritative while detached as well as after the visual child exists. */\n    setIconColor(color) {\n        this.iconColor = color;\n        this.state.iconColor = color;\n        if (this.icon) {\n            this.icon.mutate({ color });\n        }\n    }\n\n    displayToast() {\n        if(!this.toastEnabled){\n            return;\n        }\n        const scene = this.scene;\n        const mountRoot = scene?.stage?.hudMountRoot?.('toast')\n            ?? scene?.toastMountRoot?.()\n            ?? scene?.presentedRoot?.()\n            ?? null;\n        if (!mountRoot) {\n            throw new Error('Button.displayToast(): scene toast mount root is unavailable.');\n        }\n        const layout = ui.Toast.measureLayout({\n            text: this.toastText,\n            font: this.state.font,\n            fontSize: Math.max(12, (this.state.fontSize ?? 20) - 2),\n        });\n        const projected = scene?.stage?.projectNodePointToHud?.(this, [\n            this.toastOffsetX,\n            this.toastOffsetY,\n            0,\n        ], mountRoot);\n        const fallbackPos = projected ?? this.worldPosition();\n        const placementResolver = scene?.stage?.resolveToastPlacement ?? scene?.resolveToastPlacement;\n        const placement = placementResolver?.({\n            sourceNode: this,\n            mountRoot,\n            toastWidth: layout.width,\n            toastHeight: layout.height,\n            toastFont: this.state.font,\n            toastFontSize: Math.max(12, (this.state.fontSize ?? 20) - 2),\n            fallbackX: fallbackPos[0],\n            fallbackY: fallbackPos[1],\n        }) ?? {\n            x: fallbackPos[0] + this.toastOffsetX,\n            y: fallbackPos[1] + this.toastOffsetY,\n        };\n        const toastMount = new ui.Placeholder({ name: 'toastMount' });\n        toastMount.appendChild(new ui.Toast({\n            text: layout.text,\n            wrapText: false,\n            font: this.state.font,\n            fontSize: Math.max(12, (this.state.fontSize ?? 20) - 2),\n            // Like tooltips, toasts inherit layer depth rather than source depth.\n            z: -4,\n            x: placement.x,\n            y: placement.y,\n            color: [0.92, 0.92, 0.88, 0.98],\n            fontColor: [0.16, 0.16, 0.16, 1.0],\n        }));\n        mountRoot.appendChild(toastMount)\n    }\n\n\n    setVisibility(state){\n        if (this.visible === state) {\n            return;\n        }\n        super.setVisibility(state);\n        if(this.tile){\n            this.tile.setVisibility(state);\n        }\n        if(this.icon){\n            this.icon.setVisibility(state)\n        }\n        if(this.textLabel){\n            this.textLabel.setVisibility(state)\n        }\n        if (this.icon) {\n            this.icon.setVisibility(state);\n        }\n        this._dirtyResources({ kinds: [DIRTY.visibility, DIRTY.instance] });\n    }\n}\n\n\nexport class ClickArea extends Interactable {\n    constructor(state) {\n        super(state);    \n    }\n\n    mutate(newState) {\n        const widthChanged = Object.hasOwn(newState, 'width');\n        const heightChanged = Object.hasOwn(newState, 'height');\n        super.mutate(newState);\n        if (!widthChanged && !heightChanged) {\n            return;\n        }\n        this.width = this.state.width || 1;\n        this.height = this.state.height || 1;\n        this._dirtyResources({ kinds: [DIRTY.pickerBatch] });\n    }\n    \n    _onAttachNode(shared) {\n        this.width = this.state.width || 1;\n        this.height = this.state.height || 1;\n\n        super._onAttachNode(shared)\n        markResourceDirty(shared, DIRTY.pickerBatch);\n    }\n\n    _onHoverEnter() {\n        this._mouseIsHovering = true;\n        this.onHoverEnter()\n    }\n    onHoverEnter() {\n    }\n\n    _onHoverExit() {\n        this._mouseIsHovering = false;\n        this.onHoverExit()\n    }\n    onHoverExit() {\n    }\n\n    onPointerInput(events) {\n        let eventConsumed = false\n\n        if (!this._mouseIsHovering || !this.enabled) {\n            return false;\n        }\n        const hasClick = hasClickEvent(events);\n        if (hasClick && !hasCurrentClickHit(this, events)) {\n            return false;\n        }\n      \n        for (let event of events) {\n            if(this.onInput(event) === true) {\n                eventConsumed = true;\n            }\n        }\n        if (this.inputMode === InputMode.PASS) {\n            return false;\n        } else {\n            return eventConsumed;\n        }\n    }\n\n    onInput(event){\n        return false\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nclass Commander {\n    constructor() {\n        this.listeners = {};\n    }\n\n    // Subscribe\n    on(event, callback) {\n        if (!this.listeners[event]) this.listeners[event] = [];\n        this.listeners[event].push(callback);\n    }\n\n    off(event, callback) {\n        const listeners = this.listeners[event];\n        if (!listeners) {\n            return;\n        }\n        this.listeners[event] = listeners.filter(cb => cb !== callback);\n        if (this.listeners[event].length === 0) {\n            delete this.listeners[event];\n        }\n    }\n\n    // Publish\n    emit(event, data) {\n        if (this.listeners[event]) {\n            this.listeners[event].forEach(cb => cb(data));\n        }\n    }\n}\n\nexport const CommanderBus = new Commander();\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst TABLE_PREVIEW_COLUMN_COUNT = 12;\nconst TABLE_PREVIEW_ROW_COUNT = 10;\n\nfunction metadataTitle(obj) {\n    if (!obj || typeof obj.meta !== 'function') {\n        return '';\n    }\n    try {\n        const meta = obj.meta();\n        const title = meta?.field?.('title');\n        return typeof title?.toText === 'function' ? title.toText() : '';\n    } catch (_err) {\n        return '';\n    }\n}\n\nfunction scalarFallbackKey(obj) {\n    const logicalType = typeof obj.logicalType === 'function' ? obj.logicalType() : '<unknown>';\n    const title = metadataTitle(obj);\n    let value = '';\n    try {\n        value = typeof obj.preview === 'function' ? obj.preview() : obj.toString();\n    } catch (_err) {\n        value = '<preview-error>';\n    }\n    return `scalar|${logicalType}|${title}|${value}`;\n}\n\nfunction ptrlessKey(obj) {\n    if (!obj) {\n        return '';\n    }\n    if (typeof obj.totalHashHex !== 'function') {\n        throw new Error(`linear-space expected ptrless object with totalHashHex(), got ${obj.constructor?.name || typeof obj}.`);\n    }\n    try {\n        return obj.totalHashHex();\n    } catch (err) {\n        if (typeof obj.isScalar === 'function' && obj.isScalar()) {\n            return scalarFallbackKey(obj);\n        }\n        throw err;\n    }\n}\n\nfunction previewFlagsValue(value) {\n    if (value?._slot !== 'flags' || typeof value.valueBig !== 'function') {\n        return null;\n    }\n    try {\n        const flags = value.valueBig();\n        return flags === null ? 'NULL' : '0x' + flags.toString(16);\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction previewValue(value) {\n    if (!value) {\n        return value;\n    }\n    // Show metadata flags as the raw hex bitset.\n    const flagsValue = previewFlagsValue(value);\n    if (flagsValue !== null) {\n        return flagsValue;\n    }\n    if (typeof value.preview === 'function') {\n        try {\n            return value.preview();\n        } catch (_err) {\n        }\n    }\n    if (typeof value.toString === 'function') {\n        try {\n            return value.toString();\n        } catch (_err) {\n        }\n    }\n    return value;\n}\n\nfunction previewRowCount(field) {\n    if (!field) {\n        return 0;\n    }\n    // Typed null values still occupy one visible preview row.\n    if (typeof field.valid === 'function' && !field.valid()) {\n        return 1;\n    }\n    if (typeof field.isScalar === 'function' && field.isScalar()) {\n        return 1;\n    }\n    if (typeof field.length === 'function') {\n        return field.length();\n    }\n    return 1;\n}\n\nfunction previewCell(field, i) {\n    if (!field) {\n        return null;\n    }\n    // Show typed null values directly instead of dereferencing them.\n    if (typeof field.valid === 'function' && !field.valid()) {\n        return i === 0 ? previewValue(field) : null;\n    }\n    if (typeof field.isScalar === 'function' && field.isScalar()) {\n        const nested = typeof field.isLeaf === 'function' && !field.isLeaf();\n        if (i !== 0) {\n            return null;\n        }\n        return nested ? '\u2026' : previewValue(field);\n    }\n    if (typeof field.isLeaf === 'function' && field.isLeaf() && typeof field.at === 'function') {\n        // Other columns can make this row visible even when this list is empty.\n        if (typeof field.length === 'function' && i >= field.length()) {\n            return null;\n        }\n        return previewValue(field.at(i));\n    }\n    return '\u2026';\n}\n\nexport function tablePreviewKey(obj) {\n    if (!obj || typeof obj.fieldNames !== 'function' || typeof obj.field !== 'function') {\n        return ptrlessKey(obj);\n    }\n    const cols = obj.fieldNames().slice(0, TABLE_PREVIEW_COLUMN_COUNT);\n    const rows = [];\n    let rowCount = 0;\n    for (const name of cols) {\n        rowCount = Math.max(rowCount, previewRowCount(obj.field(name)));\n    }\n    const visibleRows = Math.min(TABLE_PREVIEW_ROW_COUNT, rowCount);\n    for (let row = 0; row < visibleRows; row++) {\n        const values = [];\n        for (const name of cols) {\n            values.push(String(previewCell(obj.field(name), row)));\n        }\n        rows.push(values.join('\\u241f'));\n    }\n    return `${cols.join('\\u241e')}|${rows.join('\\u241d')}`;\n}\n\nexport function blockIdentity(block) {\n    if (block.block_type === 'tableview') {\n        const kind = block.preview_kind ?? 'tableview';\n        const kindPrefix = kind === 'tableview' ? '' : `${kind}|`;\n        if (block.state === 'partial') {\n            return `tableview-preview|${kindPrefix}${tablePreviewKey(block.ptrless)}`;\n        }\n        return `tableview|${kindPrefix}${ptrlessKey(block.ptrless)}`;\n    }\n    return `${block.block_type}|${block.text}`;\n}\n\nexport function canRetargetBlock(oldBlock, newBlock) {\n    if (!oldBlock || !newBlock) {\n        return false;\n    }\n    if (oldBlock.disposition !== newBlock.disposition) {\n        return false;\n    }\n    if (oldBlock.disposition === 'in' && oldBlock.block_type === 'puff' && newBlock.block_type === 'puff') {\n        return true;\n    }\n    if (oldBlock.block_type === 'text' && newBlock.block_type === 'text') {\n        return true;\n    }\n    if (oldBlock.block_type === 'tableview' && newBlock.block_type === 'tableview') {\n        return (oldBlock.preview_kind ?? 'tableview') === (newBlock.preview_kind ?? 'tableview');\n    }\n    if (oldBlock.block_type === 'title' && newBlock.block_type === 'title') {\n        return true;\n    }\n    if (oldBlock.disposition === 'out') {\n        const oldIsOutputCell = oldBlock.block_type === 'hidden'\n            || oldBlock.block_type === 'text'\n            || oldBlock.block_type === 'tableview';\n        const newIsOutputCell = newBlock.block_type === 'hidden'\n            || newBlock.block_type === 'text'\n            || newBlock.block_type === 'tableview';\n        const touchesTableview = oldBlock.block_type === 'tableview' || newBlock.block_type === 'tableview';\n        if (oldIsOutputCell && newIsOutputCell && !touchesTableview) {\n            return true;\n        }\n    }\n    return false;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport function outputCellBoxColor(state, { refreshing = false } = {}) {\n    if (refreshing === true) {\n        return [0.22, 0.62, 0.50, 1.0];\n    }\n    return state === 'partial'\n        ? [0.4, 0.58, 0.46, 1.0]\n        : [0.4, 0.5, 0.6, 1.0];\n}\n\nexport function tableviewBoxColor(state, opts = {}) {\n    return outputCellBoxColor(state, opts);\n}\n\nexport function perfBlockType(block) {\n    const disp = block?.disposition ?? 'none';\n    const type = block?.block_type ?? 'unknown';\n    return `${disp}:${type}`.replaceAll(' ', '_');\n}\n\nexport function countBlockPerf(action, block, tracker = globalThis.__eviluiPerformanceTracker) {\n    tracker?.incrementCounter(`documentview_block_${action}.${perfBlockType(block)}`);\n}\n\nexport function countBlockTransitionPerf(action, oldBlock, newBlock, tracker = globalThis.__eviluiPerformanceTracker) {\n    const from = perfBlockType(oldBlock);\n    const to = perfBlockType(newBlock);\n    tracker?.incrementCounter(`documentview_block_${action}.${from}->${to}`);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptl from './lib/ptrless/ptrless.mjs';\nimport { newNominalStruct } from './lib/ptrless/export.mjs';\n\n\nconst EDIT_FIELDS = Object.freeze(['line', 'col', 'old_text', 'new_text']);\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\n\n/* Materialise one scalar Edit struct with the canonical field order. */\nexport function newEdit(line, col, oldText, newText) {\n    const parts = validateEditParts(line, col, oldText, newText, 'edit');\n    return newNominalStruct({\n        kind: ptl.newInt(editKindFromTexts(parts.old_text, parts.new_text)),\n        line: ptl.newInt(parts.line),\n        col: ptl.newInt(parts.col),\n        old_text: ptl.newStr(parts.old_text),\n        new_text: ptl.newStr(parts.new_text),\n    }, 'puff_Edit');\n}\n\n/* Materialise one shape-only columnar EditChain from ordered Edit rows. Body-aware validation belongs at the change boundary. */\nexport function newEditChain(edits) {\n    if (!Array.isArray(edits)) {\n        throw new Error('EditChain must be built from an array of Edit rows.');\n    }\n    const line = new Array(edits.length);\n    const col = new Array(edits.length);\n    const oldText = new Array(edits.length);\n    const newText = new Array(edits.length);\n    for (let i = 0; i < edits.length; i++) {\n        const row = editParts(edits[i], `edit chain row ${i}`);\n        line[i] = row.line;\n        col[i] = row.col;\n        oldText[i] = row.old_text;\n        newText[i] = row.new_text;\n    }\n    return newNominalStruct({\n        kind: ptl.newInt64Array(edits.map((edit) => editKindFromTexts(editParts(edit).old_text, editParts(edit).new_text))),\n        line: ptl.newInt64Array(line),\n        col: ptl.newInt64Array(col),\n        old_text: ptl.newStrArray(oldText),\n        new_text: ptl.newStrArray(newText),\n    }, 'puff_Edit');\n}\n\n/* Materialise one explicit empty EditChain. */\nexport function emptyEditChain() {\n    return newEditChain([]);\n}\n\n/* Materialise one ordered EditChain from variadic Edit rows. */\nexport function chain(...edits) {\n    return newEditChain(edits);\n}\n\n/* Append one Edit row onto one EditChain. */\nexport function appendEdit(chainObj, edit) {\n    return concatEditChains(chainObj, newEditChain([edit]));\n}\n\n/* Concatenate two shape-only ordered EditChain batches; callers with a body must validate the resulting chain at its boundary. */\nexport function concatEditChains(a, b) {\n    const left = editChainColumns(a, 'left edit chain');\n    const right = editChainColumns(b, 'right edit chain');\n    return newEditChainFromColumns({\n        line: concatIntColumns(\n            cloneIntColumn(left.line.obj, left.line.length, 'left edit chain line'),\n            cloneIntColumn(right.line.obj, right.line.length, 'right edit chain line'),\n        ),\n        col: concatIntColumns(\n            cloneIntColumn(left.col.obj, left.col.length, 'left edit chain col'),\n            cloneIntColumn(right.col.obj, right.col.length, 'right edit chain col'),\n        ),\n        old_text: concatTextColumns(\n            cloneTextColumn(left.oldText.obj, left.oldText.length, 'left edit chain old_text'),\n            cloneTextColumn(right.oldText.obj, right.oldText.length, 'right edit chain old_text'),\n        ),\n        new_text: concatTextColumns(\n            cloneTextColumn(left.newText.obj, left.newText.length, 'left edit chain new_text'),\n            cloneTextColumn(right.newText.obj, right.newText.length, 'right edit chain new_text'),\n        ),\n    });\n}\n\n/* Clone one EditChain into detached ptrless-native storage. */\nexport function cloneEditChain(obj) {\n    return sliceEditChain(obj, 0, editChainLen(obj));\n}\n\n/* Keep the half-open row interval [start, end) from one EditChain. */\nexport function sliceEditChain(obj, start, end) {\n    const n = editChainLen(obj);\n    if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < start || end > n) {\n        throw new Error(`edit chain slice out of range: start=${start} end=${end} len=${n}`);\n    }\n    const cols = editChainColumns(obj);\n    return newEditChainFromColumns({\n        line: cloneIntColumnRange(cols.line.obj, start, end, 'edit chain line'),\n        col: cloneIntColumnRange(cols.col.obj, start, end, 'edit chain col'),\n        old_text: cloneTextColumnRange(cols.oldText.obj, start, end, 'edit chain old_text'),\n        new_text: cloneTextColumnRange(cols.newText.obj, start, end, 'edit chain new_text'),\n    });\n}\n\n/* Report whether two Edit rows carry identical coordinates and replacement text. */\nexport function sameEdit(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (a === null || b === null) {\n        return false;\n    }\n    const left = editParts(a, 'left edit');\n    const right = editParts(b, 'right edit');\n    return left.line === right.line\n        && left.col === right.col\n        && left.old_text === right.old_text\n        && left.new_text === right.new_text;\n}\n\n/* Report whether two EditChains carry identical ordered edits. */\nexport function equalEditChain(a, b) {\n    const left = editChainColumns(a, 'left edit chain');\n    const right = editChainColumns(b, 'right edit chain');\n    if (left.line.length !== right.line.length) {\n        return false;\n    }\n    return equalIntColumns(left.line.obj, right.line.obj, left.line.length, 'line')\n        && equalIntColumns(left.col.obj, right.col.obj, left.col.length, 'col')\n        && equalTextColumns(left.oldText.obj, right.oldText.obj, left.oldText.length, 'old_text')\n        && equalTextColumns(left.newText.obj, right.newText.obj, left.newText.length, 'new_text');\n}\n\n/* Decode and validate one ptrless-native Edit row into plain field parts. */\nexport function editParts(edit, label = 'edit') {\n    const [lineObj, colObj, oldTextObj, newTextObj] = structFields(edit, label);\n    return validateEditParts(\n        readIntScalar(lineObj, `${label} line`),\n        readIntScalar(colObj, `${label} col`),\n        readTextScalar(oldTextObj, `${label} old_text`),\n        readTextScalar(newTextObj, `${label} new_text`),\n        label,\n    );\n}\n\n/* Read one Edit row line directly from ptrless storage. */\nexport function editLine(edit) {\n    return editParts(edit).line;\n}\n\n/* Read one Edit row column directly from ptrless storage. */\nexport function editCol(edit) {\n    return editParts(edit).col;\n}\n\n/* Read one Edit row deleted text directly from ptrless storage. */\nexport function editOldText(edit) {\n    return editParts(edit).old_text;\n}\n\n/* Read one Edit row inserted text directly from ptrless storage. */\nexport function editNewText(edit) {\n    return editParts(edit).new_text;\n}\n\n/* Enforce one ptrless-native Edit contract object. */\nexport function validateEdit(obj) {\n    void editParts(obj);\n}\n\n/* Enforce one ptrless-native EditChain contract object. */\nexport function validateEditChain(obj) {\n    const n = editChainLen(obj);\n    for (let i = 0; i < n; i++) {\n        void editChainPartsAt(obj, i);\n    }\n}\n\n/* Return the ordered edit count for one ptrless-native EditChain. */\nexport function editChainLen(obj, label = 'edit chain') {\n    const cols = editChainColumns(obj, label);\n    return cols.line.length;\n}\n\n/* Return one ordered Edit row from one ptrless-native EditChain. */\nexport function editChainAt(obj, i, label = 'edit chain') {\n    const row = editChainPartsAt(obj, i, label);\n    return newEdit(row.line, row.col, row.old_text, row.new_text);\n}\n\n/* Return one ordered Edit row's validated field parts from one ptrless-native EditChain. */\nexport function editChainPartsAt(obj, i, label = 'edit chain') {\n    const cols = editChainColumns(obj, label);\n    if (!Number.isInteger(i) || i < 0 || i >= cols.line.length) {\n        throw new Error(`edit chain index out of range: ${i} for ${cols.line.length}`);\n    }\n    return validateEditParts(\n        listIntAt(cols.line.obj, i, `${label} line`),\n        listIntAt(cols.col.obj, i, `${label} col`),\n        listTextAt(cols.oldText.obj, i, `${label} old_text`),\n        listTextAt(cols.newText.obj, i, `${label} new_text`),\n        `edit chain row ${i}`,\n    );\n}\n\n/* Derive one minimal ptrless-native EditChain from two whole-document bodies. */\nexport function editFromBodies(before, after) {\n    const edit = minimalEditFromBodies(before, after);\n    return edit === null ? null : newEditChain([edit]);\n}\n\n/* Apply one ptrless-native Edit directly to one source body. */\nexport function applyEdit(body, edit) {\n    if (edit === null) {\n        return body;\n    }\n    return applyEditParts(body, editParts(edit));\n}\n\n/* Apply one ptrless-native EditChain directly to one source body. */\nexport function applyEditChain(body, chainObj) {\n    let cur = body;\n    const cols = editChainColumns(chainObj);\n    for (let i = 0; i < cols.line.length; i++) {\n        cur = applyEditParts(cur, validateEditParts(\n            listIntAt(cols.line.obj, i, 'edit chain line'),\n            listIntAt(cols.col.obj, i, 'edit chain col'),\n            listTextAt(cols.oldText.obj, i, 'edit chain old_text'),\n            listTextAt(cols.newText.obj, i, 'edit chain new_text'),\n            `edit chain row ${i}`,\n        ));\n    }\n    return cur;\n}\n\n/* Apply one legacy EvilUI line-edit batch directly to one source body. */\nexport function applyLegacyLineEditBatch(body, edits) {\n    if (!Array.isArray(edits)) {\n        throw new Error('legacy edit batch must be an array.');\n    }\n    const lines = splitBody(body);\n    for (let i = 0; i < edits.length; i++) {\n        applyLegacyLineEdit(lines, edits[i], i);\n    }\n    if (lines.length === 0) {\n        throw new Error('legacy edit batch cannot produce a zero-line document.');\n    }\n    return lines.join('\\n');\n}\n\n/* Lower one legacy line-edit batch into one localised canonical EditChain without diffing the whole document body. */\nexport function editFromLegacyLineEditBatch(body, edits) {\n    if (typeof body !== 'string') {\n        throw new Error('editFromLegacyLineEditBatch requires a string body.');\n    }\n    return editFromLegacyLineEditBatchLines(splitBody(body), edits);\n}\n\n/* Lower one legacy line-edit batch from an existing line slice, with full-body canonicalisation for blank-run ambiguity. */\nexport function editFromLegacyLineEditBatchLines(beforeLines, edits) {\n    if (!Array.isArray(beforeLines) || beforeLines.some((line) => typeof line !== 'string')) {\n        throw new Error('editFromLegacyLineEditBatchLines requires an array of string lines.');\n    }\n    if (!Array.isArray(edits) || edits.length === 0) {\n        return null;\n    }\n    if (legacyBatchNeedsWholeBodyCanonicalisation(edits)) {\n        const afterLines = beforeLines.slice();\n        for (let i = 0; i < edits.length; i += 1) {\n            applyLegacyLineEdit(afterLines, edits[i], i);\n        }\n        return editFromBodies(beforeLines.join('\\n'), afterLines.join('\\n'));\n    }\n    let startLine = beforeLines.length;\n    let endLineBefore = 0;\n    for (let i = 0; i < edits.length; i += 1) {\n        const edit = edits[i];\n        if (!edit || typeof edit !== 'object') {\n            throw new Error(`legacy edit ${i} must be an object.`);\n        }\n        const pos = mustNonNegativeInt(edit.position, `legacy edit ${i} position`);\n        const type = `${edit.type ?? ''}`;\n        startLine = Math.min(startLine, pos);\n        switch (type) {\n        case 'replace':\n        case 'remove':\n            endLineBefore = Math.max(endLineBefore, pos + 1);\n            break;\n        case 'add':\n            endLineBefore = Math.max(endLineBefore, pos);\n            break;\n        default:\n            throw new Error(`legacy edit ${i} has unknown type ${JSON.stringify(type)}.`);\n        }\n    }\n    if (startLine === beforeLines.length) {\n        startLine = Math.max(0, beforeLines.length - 1);\n    }\n    const sliceStart = Math.max(0, startLine - 1);\n    const sliceEndBefore = Math.min(\n        beforeLines.length,\n        Math.max(startLine, endLineBefore) + 1,\n    );\n    const localBeforeLines = beforeLines.slice(sliceStart, sliceEndBefore);\n    const localAfterLines = localBeforeLines.slice();\n    for (let i = 0; i < edits.length; i += 1) {\n        const edit = edits[i];\n        applyLegacyLineEdit(localAfterLines, {\n            ...edit,\n            position: mustNonNegativeInt(edit.position, `legacy edit ${i} position`) - sliceStart,\n        }, i);\n    }\n    const beforeBody = localBeforeLines.join('\\n');\n    const afterBody = localAfterLines.join('\\n');\n    if (afterBody === beforeBody) {\n        return null;\n    }\n    const local = minimalEditFromBodies(beforeBody, afterBody);\n    if (local === null) {\n        return null;\n    }\n    const row = editParts(local);\n    return newEditChain([newEdit(sliceStart + row.line, row.col, row.old_text, row.new_text)]);\n}\n\n/* Detect the blank-only structural batches whose local slice diff is ambiguous inside runs of empty lines. */\nfunction legacyBatchNeedsWholeBodyCanonicalisation(edits) {\n    for (let i = 0; i < edits.length; i += 1) {\n        const edit = edits[i];\n        if (!edit || typeof edit !== 'object') {\n            throw new Error(`legacy edit ${i} must be an object.`);\n        }\n        const type = `${edit.type ?? ''}`;\n        switch (type) {\n        case 'add':\n            if (readLegacyLineContent(edit.old_content, `legacy edit ${i} old_content`) !== null) {\n                throw new Error(`legacy edit ${i} add old_content must be null.`);\n            }\n            if (readLegacyLineContent(edit.new_content, `legacy edit ${i} new_content`) !== '') {\n                return false;\n            }\n            break;\n        case 'remove':\n            if (readLegacyLineContent(edit.new_content, `legacy edit ${i} new_content`) !== null) {\n                throw new Error(`legacy edit ${i} remove new_content must be null.`);\n            }\n            if (readLegacyLineContent(edit.old_content, `legacy edit ${i} old_content`) !== '') {\n                return false;\n            }\n            break;\n        default:\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Invert one Edit against its source body. */\nexport function invertEdit(body, edit) {\n    const after = applyEdit(body, edit);\n    return minimalEditFromBodies(after, body);\n}\n\n/* Rebase one Edit over one already-applied peer Edit. */\nexport function rebaseEdit(baseBody, edit, over) {\n    if (edit === null) {\n        return null;\n    }\n    if (over === null) {\n        const row = editParts(edit);\n        return newEdit(row.line, row.col, row.old_text, row.new_text);\n    }\n\n    const span = spanFromEdit(baseBody, edit);\n    const overSpan = spanFromEdit(baseBody, over);\n    if (rangesOverlap(span.start, span.end, overSpan.start, overSpan.end)) {\n        return null;\n    }\n\n    let start = span.start;\n    let end = span.end;\n    const delta = utf8Length(editNewText(over)) - utf8Length(editOldText(over));\n    if (start >= overSpan.end) {\n        start += delta;\n        end += delta;\n    }\n    const rebasedBody = applyEdit(baseBody, over);\n    return editFromSpan(rebasedBody, start, end, editNewText(edit));\n}\n\n/* Split one body into display lines while preserving the empty trailing row. */\nexport function splitBody(body) {\n    if (body === '') {\n        return [''];\n    }\n    return body.split('\\n');\n}\n\n/* Derive one minimal ptrless-native Edit from two whole-document bodies for internal single-edit seams. */\nfunction minimalEditFromBodies(before, after) {\n    if (typeof before !== 'string' || typeof after !== 'string') {\n        throw new Error('editFromBodies requires string bodies.');\n    }\n    if (before === after) {\n        return null;\n    }\n\n    let prefixBefore = 0;\n    let prefixAfter = 0;\n    while (prefixBefore < before.length && prefixAfter < after.length) {\n        if (before.codePointAt(prefixBefore) !== after.codePointAt(prefixAfter)) {\n            break;\n        }\n        const step = scalarWidthAt(before, prefixBefore);\n        prefixBefore += step;\n        prefixAfter += step;\n    }\n\n    let beforeSuffix = before.length;\n    let afterSuffix = after.length;\n    while (beforeSuffix > prefixBefore && afterSuffix > prefixAfter) {\n        const nextBefore = prevScalarIndex(before, beforeSuffix);\n        const nextAfter = prevScalarIndex(after, afterSuffix);\n        if (before.codePointAt(nextBefore) !== after.codePointAt(nextAfter)) {\n            break;\n        }\n        beforeSuffix = nextBefore;\n        afterSuffix = nextAfter;\n    }\n\n    const startIndex = prefixBefore;\n    const endIndex = beforeSuffix;\n    const start = utf8Length(before.slice(0, startIndex));\n    return editFromSpan(before, start, start + utf8Length(before.slice(startIndex, endIndex)), after.slice(prefixAfter, afterSuffix));\n}\n\n/* Apply one validated legacy line edit to one mutable line vector. */\nfunction applyLegacyLineEdit(lines, edit, i) {\n    if (!Array.isArray(lines)) {\n        throw new Error('legacy line edits require a line array.');\n    }\n    if (!edit || typeof edit !== 'object') {\n        throw new Error(`legacy edit ${i} must be an object.`);\n    }\n    const type = `${edit.type ?? ''}`;\n    const pos = mustNonNegativeInt(edit.position, `legacy edit ${i} position`);\n    const oldContent = readLegacyLineContent(edit.old_content, `legacy edit ${i} old_content`);\n    const newContent = readLegacyLineContent(edit.new_content, `legacy edit ${i} new_content`);\n    switch (type) {\n    case 'replace':\n        requireLegacyLineIndex(lines, pos, `legacy edit ${i}`);\n        if (typeof newContent !== 'string') {\n            throw new Error(`legacy edit ${i} replace new_content must be a string.`);\n        }\n        lines[pos] = newContent;\n        return;\n    case 'add':\n        requireLegacyInsertIndex(lines, pos, `legacy edit ${i}`);\n        if (oldContent !== null) {\n            throw new Error(`legacy edit ${i} add old_content must be null.`);\n        }\n        if (typeof newContent !== 'string') {\n            throw new Error(`legacy edit ${i} add new_content must be a string.`);\n        }\n        lines.splice(pos, 0, newContent);\n        return;\n    case 'remove':\n        requireLegacyLineIndex(lines, pos, `legacy edit ${i}`);\n        if (newContent !== null) {\n            throw new Error(`legacy edit ${i} remove new_content must be null.`);\n        }\n        if (oldContent !== null && lines[pos] !== oldContent) {\n            throw new Error(`legacy edit ${i} remove old_content mismatch at line ${pos}.`);\n        }\n        lines.splice(pos, 1);\n        return;\n    default:\n        throw new Error(`legacy edit ${i} has unknown type ${JSON.stringify(type)}.`);\n    }\n}\n\n/* Decode and verify the four EditChain columns plus their common length. */\nfunction editChainColumns(obj, label) {\n    const [line, col, oldText, newText] = structFields(obj, label);\n    const lineLen = listLength(line, `${label} line`);\n    const colLen = listLength(col, `${label} col`);\n    const oldTextLen = listLength(oldText, `${label} old_text`);\n    const newTextLen = listLength(newText, `${label} new_text`);\n    if (lineLen !== colLen || lineLen !== oldTextLen || lineLen !== newTextLen) {\n        throw new Error(\n            `edit chain field length mismatch: line=${lineLen} col=${colLen} old_text=${oldTextLen} new_text=${newTextLen}`,\n        );\n    }\n    return {\n        line: { obj: line, length: lineLen },\n        col: { obj: col, length: colLen },\n        oldText: { obj: oldText, length: oldTextLen },\n        newText: { obj: newText, length: newTextLen },\n    };\n}\n\n/* Materialise one EditChain directly from detached column vectors. */\nfunction newEditChainFromColumns({ line, col, old_text, new_text }) {\n    if (!Array.isArray(line) || !Array.isArray(col) || !Array.isArray(old_text) || !Array.isArray(new_text)) {\n        throw new Error('newEditChainFromColumns requires array columns.');\n    }\n    if (line.length !== col.length || line.length !== old_text.length || line.length !== new_text.length) {\n        throw new Error(\n            `edit chain field length mismatch: line=${line.length} col=${col.length} old_text=${old_text.length} new_text=${new_text.length}`,\n        );\n    }\n    const kind = old_text.map((oldValue, i) => editKindFromTexts(oldValue, new_text[i]));\n    return newNominalStruct({\n        kind: ptl.newInt64Array(kind),\n        line: ptl.newInt64Array(line),\n        col: ptl.newInt64Array(col),\n        old_text: ptl.newStrArray(old_text),\n        new_text: ptl.newStrArray(new_text),\n    }, 'puff_Edit');\n}\n\n/* Resolve one canonical Edit or EditChain struct field vector. */\nfunction structFields(obj, label) {\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label} must be a ptrless struct.`);\n    }\n    if (typeof obj.field === 'function') {\n        return EDIT_FIELDS.map((name) => {\n            const value = obj.field(name);\n            if (value === undefined) {\n                throw new Error(`${label} field ${name} is missing.`);\n            }\n            return value;\n        });\n    }\n    if (obj.kind !== 'Hetero' || !Array.isArray(obj.fields) || (obj.fields.length !== EDIT_FIELDS.length && obj.fields.length !== EDIT_FIELDS.length + 1)) {\n        throw new Error(`${label} must be a ptrless struct with ${EDIT_FIELDS.length} fields.`);\n    }\n    return obj.fields.length === EDIT_FIELDS.length + 1 ? obj.fields.slice(1) : obj.fields;\n}\n\nfunction editKindFromTexts(oldText, newText) {\n    if (oldText === '') return 1;\n    if (newText === '') return 3;\n    return 2;\n}\n\n/* Decode one Int scalar from either imported or exported ptrless objects. */\nfunction readIntScalar(obj, label) {\n    if (typeof obj === 'number') {\n        return mustSafeInt(obj, label);\n    }\n    if (typeof obj === 'bigint') {\n        return bigIntToSafeInt(obj, label);\n    }\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label} must be an Int scalar.`);\n    }\n    if (typeof obj.value === 'function') {\n        return mustSafeInt(obj.value(), label);\n    }\n    if (obj.kind === 'IntScalar' && typeof obj.value === 'bigint') {\n        return bigIntToSafeInt(obj.value, label);\n    }\n    throw new Error(`${label} must be an Int scalar.`);\n}\n\n/* Decode one Str scalar from either imported or exported ptrless objects. */\nfunction readTextScalar(obj, label) {\n    if (typeof obj === 'string') {\n        return obj;\n    }\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label} must be a Str scalar.`);\n    }\n    if (typeof obj.toText === 'function') {\n        return obj.toText();\n    }\n    if (obj.kind === 'BytesScalar' && obj.value instanceof Uint8Array) {\n        return textDecoder.decode(obj.value);\n    }\n    throw new Error(`${label} must be a Str scalar.`);\n}\n\n/* Read one list length from imported or exported ptrless array storage. */\nfunction listLength(obj, label) {\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label} must be a ptrless list.`);\n    }\n    if (typeof obj.length === 'function') {\n        return mustSafeInt(obj.length(), `${label} length`);\n    }\n    if (typeof obj.length === 'bigint') {\n        return bigIntToSafeInt(obj.length, `${label} length`);\n    }\n    if (Number.isInteger(obj.length)) {\n        return mustSafeInt(obj.length, `${label} length`);\n    }\n    throw new Error(`${label} must be a ptrless list.`);\n}\n\n/* Read one integer list entry from imported or exported ptrless array storage. */\nfunction listIntAt(obj, i, label) {\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label}[${i}] must be an Int value.`);\n    }\n    if (typeof obj.at === 'function') {\n        return readIntScalar(obj.at(i), `${label}[${i}]`);\n    }\n    if (obj.kind === 'IntegralArrow64' && obj.values instanceof BigInt64Array) {\n        if (i < 0 || i >= obj.values.length) {\n            throw new Error(`${label}[${i}] out of range for ${obj.values.length}.`);\n        }\n        return bigIntToSafeInt(obj.values[i], `${label}[${i}]`);\n    }\n    throw new Error(`${label} must be a List[Int].`);\n}\n\n/* Read one text list entry from imported or exported ptrless array storage. */\nfunction listTextAt(obj, i, label) {\n    if (!obj || typeof obj !== 'object') {\n        throw new Error(`${label}[${i}] must be a Str value.`);\n    }\n    if (typeof obj.at === 'function') {\n        // Packed string columns return JS strings; pointer-backed columns\n        // return Str objects. Both use the same scalar decoding boundary.\n        return readTextScalar(obj.at(i), `${label}[${i}]`);\n    }\n    if (obj.kind === 'BytesArrow32' && obj.offsets instanceof Int32Array && obj.values instanceof Uint8Array) {\n        if (i < 0 || i >= obj.offsets.length - 1) {\n            throw new Error(`${label}[${i}] out of range for ${obj.offsets.length - 1}.`);\n        }\n        return textDecoder.decode(obj.values.slice(obj.offsets[i], obj.offsets[i + 1]));\n    }\n    throw new Error(`${label} must be a List[Str].`);\n}\n\n/* Detach one integer column into plain JS numeric storage. */\nfunction cloneIntColumn(obj, n, label) {\n    const out = new Array(n);\n    for (let i = 0; i < n; i += 1) {\n        out[i] = listIntAt(obj, i, label);\n    }\n    return out;\n}\n\n/* Detach one text column into plain JS string storage. */\nfunction cloneTextColumn(obj, n, label) {\n    const out = new Array(n);\n    for (let i = 0; i < n; i += 1) {\n        out[i] = listTextAt(obj, i, label);\n    }\n    return out;\n}\n\n/* Detach one integer subrange into plain JS numeric storage. */\nfunction cloneIntColumnRange(obj, start, end, label) {\n    const out = new Array(end - start);\n    for (let i = start; i < end; i += 1) {\n        out[i - start] = listIntAt(obj, i, label);\n    }\n    return out;\n}\n\n/* Detach one text subrange into plain JS string storage. */\nfunction cloneTextColumnRange(obj, start, end, label) {\n    const out = new Array(end - start);\n    for (let i = start; i < end; i += 1) {\n        out[i - start] = listTextAt(obj, i, label);\n    }\n    return out;\n}\n\n/* Compare two integer columns for exact ordered equality. */\nfunction equalIntColumns(a, b, n, label) {\n    for (let i = 0; i < n; i += 1) {\n        if (listIntAt(a, i, label) !== listIntAt(b, i, label)) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Compare two text columns for exact ordered equality. */\nfunction equalTextColumns(a, b, n, label) {\n    for (let i = 0; i < n; i += 1) {\n        if (listTextAt(a, i, label) !== listTextAt(b, i, label)) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Concatenate two detached integer columns. */\nfunction concatIntColumns(a, b) {\n    return [...a, ...b];\n}\n\n/* Concatenate two detached text columns. */\nfunction concatTextColumns(a, b) {\n    return [...a, ...b];\n}\n\n/* Validate one decoded edit row before it re-enters runtime semantics. */\nfunction validateEditParts(line, col, oldText, newText, label) {\n    const safeLine = mustNonNegativeInt(line, `${label} line`);\n    const safeCol = mustNonNegativeInt(col, `${label} col`);\n    if (typeof oldText !== 'string') {\n        throw new Error(`${label} old_text must be a string.`);\n    }\n    if (typeof newText !== 'string') {\n        throw new Error(`${label} new_text must be a string.`);\n    }\n    if (oldText === '' && newText === '') {\n        throw new Error(`${label} must change text: old_text empty new_text empty`);\n    }\n    return {\n        line: safeLine,\n        col: safeCol,\n        old_text: oldText,\n        new_text: newText,\n    };\n}\n\n/* Materialise one validated Edit row from one byte-span replacement. */\nfunction editFromSpan(body, start, end, newText) {\n    const startIndex = codeUnitIndexForByteOffset(body, start);\n    const endIndex = codeUnitIndexForByteOffset(body, end);\n    const prefix = body.slice(0, startIndex);\n    const line = countLines(prefix);\n    const lineStart = prefix.lastIndexOf('\\n') + 1;\n    return newEdit(\n        line,\n        utf8Length(prefix.slice(lineStart)),\n        body.slice(startIndex, endIndex),\n        newText,\n    );\n}\n\n/* Resolve one edit span to source-body byte offsets. */\nfunction spanFromEdit(body, edit) {\n    return spanFromEditParts(body, editParts(edit));\n}\n\n/* Resolve one decoded edit row to source-body byte offsets. */\nfunction spanFromEditParts(body, row) {\n    const startIndex = codeUnitIndexForLineCol(body, row.line, row.col);\n    const start = utf8Length(body.slice(0, startIndex));\n    const end = start + utf8Length(row.old_text);\n    const endIndex = codeUnitIndexForByteOffset(body, end);\n    const got = body.slice(startIndex, endIndex);\n    if (got !== row.old_text) {\n        throw new Error(`edit deleted text mismatch at ${row.line}:${row.col}: got=${JSON.stringify(got)} want=${JSON.stringify(row.old_text)}`);\n    }\n    return { start, end };\n}\n\n/* Apply one decoded edit row directly to one source body. */\nfunction applyEditParts(body, row) {\n    const span = spanFromEditParts(body, row);\n    const start = codeUnitIndexForByteOffset(body, span.start);\n    const end = codeUnitIndexForByteOffset(body, span.end);\n    return `${body.slice(0, start)}${row.new_text}${body.slice(end)}`;\n}\n\n/* Convert one (line, col) pair to a source-body code-unit index. */\nfunction codeUnitIndexForLineCol(body, line, col) {\n    let lineStart = 0;\n    for (let i = 0; i < line; i++) {\n        const next = body.indexOf('\\n', lineStart);\n        if (next < 0) {\n            if (i === line - 1 && col === 0) {\n                return body.length;\n            }\n            throw new Error(`Line ${line} out of range.`);\n        }\n        lineStart = next + 1;\n    }\n    const nextBreak = body.indexOf('\\n', lineStart);\n    const lineEnd = nextBreak < 0 ? body.length : nextBreak;\n    const rel = codeUnitIndexForByteOffset(body.slice(lineStart, lineEnd), col);\n    return lineStart + rel;\n}\n\n/* Slice one whole-body line range by line starts so inserted blank rows preserve their delimiter bytes. */\nfunction sliceBodyByLineRange(body, startLine, endLine) {\n    const start = codeUnitIndexForLineStart(body, startLine);\n    const end = codeUnitIndexForLineStart(body, endLine);\n    return body.slice(start, end);\n}\n\n/* Resolve one line start, allowing line==count as the logical end-of-body anchor. */\nfunction codeUnitIndexForLineStart(body, line) {\n    if (!Number.isInteger(line) || line < 0) {\n        throw new Error(`Line ${line} out of range.`);\n    }\n    let lineStart = 0;\n    for (let i = 0; i < line; i += 1) {\n        const next = body.indexOf('\\n', lineStart);\n        if (next < 0) {\n            if (i === line - 1) {\n                return body.length;\n            }\n            throw new Error(`Line ${line} out of range.`);\n        }\n        lineStart = next + 1;\n    }\n    return lineStart;\n}\n\n/* Count logical lines in one text prefix. */\nfunction countLines(text) {\n    let n = 0;\n    for (const ch of text) {\n        if (ch === '\\n') {\n            n++;\n        }\n    }\n    return n;\n}\n\n/* Accept one legacy line payload only when it is null or a string. */\nfunction readLegacyLineContent(value, label) {\n    if (value === null || typeof value === 'string') {\n        return value;\n    }\n    throw new Error(`${label} must be a string or null.`);\n}\n\n/* Require one existing line index for a legacy replace/remove operation. */\nfunction requireLegacyLineIndex(lines, pos, label) {\n    if (pos < 0 || pos >= lines.length) {\n        throw new Error(`${label} position ${pos} out of range for ${lines.length} lines.`);\n    }\n}\n\n/* Require one insert boundary index for a legacy add operation. */\nfunction requireLegacyInsertIndex(lines, pos, label) {\n    if (pos < 0 || pos > lines.length) {\n        throw new Error(`${label} insert position ${pos} out of range for ${lines.length} lines.`);\n    }\n}\n\n/* Require one non-negative integer in JS safe-int range. */\nfunction mustNonNegativeInt(value, label) {\n    const n = mustSafeInt(value, label);\n    if (n < 0) {\n        throw new Error(`${label} must be a non-negative integer.`);\n    }\n    return n;\n}\n\n/* Require one integer in JS safe-int range. */\nfunction mustSafeInt(value, label) {\n    if (!Number.isInteger(value) || !Number.isSafeInteger(value)) {\n        throw new Error(`${label} must be a safe integer.`);\n    }\n    return value;\n}\n\n/* Convert one bigint to a JS safe integer without silent truncation. */\nfunction bigIntToSafeInt(value, label) {\n    const n = Number(value);\n    if (!Number.isSafeInteger(n) || BigInt(n) !== value) {\n        throw new Error(`${label} must fit in a JS safe integer.`);\n    }\n    return n;\n}\n\n/* Measure one string in UTF-8 bytes. */\nfunction utf8Length(text) {\n    return textEncoder.encode(text).length;\n}\n\n/* Convert one UTF-8 byte offset back to a code-unit boundary. */\nfunction codeUnitIndexForByteOffset(text, want) {\n    if (want < 0) {\n        throw new Error(`Negative byte offset ${want}.`);\n    }\n    let seen = 0;\n    let i = 0;\n    while (i < text.length) {\n        const ch = text.slice(i, i + scalarWidthAt(text, i));\n        const next = seen + utf8Length(ch);\n        if (want === seen) {\n            return i;\n        }\n        if (want < next) {\n            throw new Error(`Byte offset ${want} splits a UTF-8 code point.`);\n        }\n        seen = next;\n        i += ch.length;\n    }\n    if (want !== seen) {\n        throw new Error(`Byte offset ${want} out of range for ${seen} bytes.`);\n    }\n    return text.length;\n}\n\n/* Measure the code-unit width of one scalar at one code-unit index. */\nfunction scalarWidthAt(text, i) {\n    if (!Number.isInteger(i) || i < 0 || i >= text.length) {\n        throw new Error(`Scalar index ${i} out of range.`);\n    }\n    const cp = text.codePointAt(i);\n    if (cp === undefined) {\n        throw new Error(`Missing code point at index ${i}.`);\n    }\n    return cp > 0xffff ? 2 : 1;\n}\n\n/* Step back from one code-unit end offset to the previous scalar boundary. */\nfunction prevScalarIndex(text, end) {\n    if (!Number.isInteger(end) || end <= 0 || end > text.length) {\n        throw new Error(`Scalar end ${end} out of range.`);\n    }\n    let i = end - 1;\n    if (i > 0) {\n        const ch = text.charCodeAt(i);\n        const prev = text.charCodeAt(i - 1);\n        if (ch >= 0xdc00 && ch <= 0xdfff && prev >= 0xd800 && prev <= 0xdbff) {\n            i--;\n        }\n    }\n    return i;\n}\n\n/* Report whether two half-open byte ranges overlap. */\nfunction rangesOverlap(aStart, aEnd, bStart, bEnd) {\n    return aStart < bEnd && bStart < aEnd;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { editChainLen, editChainPartsAt, editParts, newEdit, splitBody } from './puffbook-editchain.mjs';\n\n/* Materialise one canonical frontend text op with explicit deleted and inserted span text. */\nexport function newReplaceSpan({\n    start_line,\n    start_col,\n    deleted_text = '',\n    inserted_text = '',\n    op_id = null,\n    site_id = null,\n} = {}) {\n    const line = mustNonNegativeInt(start_line, 'ReplaceSpan start_line');\n    const col = mustNonNegativeInt(start_col, 'ReplaceSpan start_col');\n    if (typeof deleted_text !== 'string' || typeof inserted_text !== 'string') {\n        throw new Error('ReplaceSpan deleted_text and inserted_text must be strings.');\n    }\n    if (deleted_text === '' && inserted_text === '') {\n        throw new Error('ReplaceSpan must change text.');\n    }\n    return {\n        kind: 'replace_span',\n        start_line: line,\n        start_col: col,\n        deleted_text,\n        inserted_text,\n        op_id,\n        site_id,\n    };\n}\n\n/* Lower one transport Edit into the canonical ReplaceSpan form using the source body only at the boundary. */\nexport function replaceSpanFromEdit(body, edit, opts = {}) {\n    if (typeof body !== 'string') {\n        throw new Error('replaceSpanFromEdit requires a source body string.');\n    }\n    return replaceSpanFromEditParts(body, editParts(edit), opts);\n}\n\nfunction replaceSpanFromEditParts(body, row, opts = {}) {\n    let start = 0;\n    let end = 0;\n    try {\n        start = codeUnitIndexForLineByteCol(body, row.line, row.col);\n        end = advanceCodeUnitIndexByUtf8Bytes(body, start, utf8Length(row.old_text));\n    } catch (err) {\n        const bodyLines = splitBody(body).length;\n        const bodyBytes = utf8Length(body);\n        throw new Error(\n            `replaceSpanFromEdit failed: body_lines=${bodyLines} body_bytes=${bodyBytes} `\n            + `edit_line=${row.line} edit_col=${row.col} edit_old_text_bytes=${utf8Length(row.old_text)} `\n            + `edit_new_text_bytes=${utf8Length(row.new_text)}: ${err?.message || err}`,\n        );\n    }\n    if (body.slice(start, end) !== row.old_text) {\n        throw new Error(\n            `replaceSpanFromEdit failed: deleted text mismatch at ${row.line}:${row.col}: `\n            + `got=${JSON.stringify(body.slice(start, end))} want=${JSON.stringify(row.old_text)}`,\n        );\n    }\n    return newReplaceSpan({\n        start_line: row.line,\n        start_col: row.col,\n        deleted_text: row.old_text,\n        inserted_text: row.new_text,\n        op_id: opts.op_id ?? null,\n        site_id: opts.site_id ?? null,\n    });\n}\n\n/* Lower one transport change into one ordered canonical ReplaceSpan chain against the current body frame. */\nexport function replaceSpanChainFromChange(body, change, label = 'replace span change') {\n    if (typeof body !== 'string') {\n        throw new Error('replaceSpanChainFromChange requires a source body string.');\n    }\n    if (Array.isArray(change)) {\n        const spans = change.map((item, i) => validateReplaceSpan(item, `${label} span ${i}`));\n        let curBody = body;\n        for (let i = 0; i < spans.length; i += 1) {\n            try {\n                curBody = applyReplaceSpan(curBody, spans[i]);\n            } catch (err) {\n                throw new Error(\n                    `${label} span ${i} is invalid in its sequential body frame: ${err?.message || err}`,\n                    { cause: err },\n                );\n            }\n        }\n        return spans;\n    }\n    try {\n        return [validateReplaceSpan(change, label)];\n    } catch (_spanErr) {\n        // Fall through to the legacy edit/change boundary.\n    }\n    try {\n        const n = editChainLen(change, label);\n        const spans = new Array(n);\n        let curBody = body;\n        for (let i = 0; i < n; i += 1) {\n            const span = replaceSpanFromEditParts(curBody, editChainPartsAt(change, i, label));\n            spans[i] = span;\n            curBody = applyReplaceSpan(curBody, span);\n        }\n        return spans;\n    } catch (chainErr) {\n        try {\n            const span = replaceSpanFromEdit(body, change);\n            return [span];\n        } catch (_editErr) {\n            throw chainErr;\n        }\n    }\n}\n\n/* Raise one canonical ReplaceSpan back into the transport Edit shape. */\nexport function replaceSpanToEdit(op) {\n    const row = validateReplaceSpan(op);\n    return newEdit(row.start_line, row.start_col, row.deleted_text, row.inserted_text);\n}\n\n/* Invert one canonical ReplaceSpan exactly so rollback and ratification stay symmetric. */\nexport function invertReplaceSpan(op) {\n    const row = validateReplaceSpan(op);\n    return newReplaceSpan({\n        start_line: row.start_line,\n        start_col: row.start_col,\n        deleted_text: row.inserted_text,\n        inserted_text: row.deleted_text,\n    });\n}\n\n/* Shift one canonical ReplaceSpan by whole lines without changing its byte-column or texts. */\nexport function shiftReplaceSpanLines(op, lineDelta) {\n    const row = validateReplaceSpan(op);\n    if (!Number.isInteger(lineDelta)) {\n        throw new Error('shiftReplaceSpanLines requires an integer line delta.');\n    }\n    return newReplaceSpan({\n        ...row,\n        start_line: row.start_line + lineDelta,\n    });\n}\n\n/* Report the net logical line-count delta contributed by one canonical ReplaceSpan. */\nexport function replaceSpanLineDelta(op) {\n    const row = validateReplaceSpan(op);\n    return splitBody(row.inserted_text).length - splitBody(row.deleted_text).length;\n}\n\n/* Materialise one ordered canonical ReplaceSpan chain plus its final body against the current body frame. */\nexport function materialiseReplaceSpans(body, change, label = 'replace span change') {\n    const spans = replaceSpanChainFromChange(body, change, label);\n    let nextBody = body;\n    for (const span of spans) {\n        nextBody = applyReplaceSpan(nextBody, span);\n    }\n    return {\n        spans,\n        next_body: nextBody,\n    };\n}\n\n/* Apply one ordered canonical ReplaceSpan chain directly to one body. */\nexport function applyReplaceSpanChain(body, changeOrSpans, label = 'replace span chain') {\n    if (Array.isArray(changeOrSpans)) {\n        let nextBody = body;\n        for (const span of changeOrSpans) {\n            nextBody = applyReplaceSpan(nextBody, span);\n        }\n        return nextBody;\n    }\n    return materialiseReplaceSpans(body, changeOrSpans, label).next_body;\n}\n\n/* Apply one canonical ReplaceSpan to one body for transport-edge validation and algebra tests. */\nexport function applyReplaceSpan(body, op) {\n    const row = validateReplaceSpan(op);\n    const start = codeUnitIndexForLineByteCol(body, row.start_line, row.start_col);\n    const end = start + row.deleted_text.length;\n    const deleted = body.slice(start, end);\n    if (deleted !== row.deleted_text) {\n        throw new Error(\n            `ReplaceSpan deleted_text mismatch at ${row.start_line}:${row.start_col}; `\n            + `expected ${JSON.stringify(row.deleted_text)} got ${JSON.stringify(deleted)}.`,\n        );\n    }\n    return `${body.slice(0, start)}${row.inserted_text}${body.slice(end)}`;\n}\n\n/* Transform one remote op through the current local chain and return the predicted-space remote plus rebased locals. */\nexport function transformRemoteThroughLocalChain(localOps, remoteOp, opts = {}) {\n    const locals = Array.isArray(localOps) ? localOps.map(validateReplaceSpan) : [];\n    let q = validateReplaceSpan(remoteOp);\n    const nextLocals = [];\n    for (let i = 0; i < locals.length; i += 1) {\n        if (q === null) {\n            nextLocals.push(...locals.slice(i).map(cloneReplaceSpan));\n            break;\n        }\n        const pair = transformPair(locals[i], q, opts);\n        let chainPair = pair;\n        if (i > 0 && sameReplaceSpan(locals[i], q)) {\n            if (locals[i].deleted_text !== '') {\n                return {\n                    kind: 'conflict',\n                    local: locals[i],\n                    remote: q,\n                    reason: 'ambiguous_non_head_ack',\n                };\n            }\n            const bias = normaliseSameAnchorBias(opts?.same_anchor_bias);\n            if (bias === 'local_first') {\n                chainPair = {\n                    kind: 'ok',\n                    class: 'same_anchor_insert',\n                    q: newReplaceSpan({\n                        ...q,\n                        start_line: insertedEndPosition(locals[i]).line,\n                        start_col: insertedEndPosition(locals[i]).col,\n                    }),\n                    l2: cloneReplaceSpan(locals[i]),\n                };\n            } else {\n                chainPair = {\n                    kind: 'ok',\n                    class: 'same_anchor_insert',\n                    q: cloneReplaceSpan(q),\n                    l2: newReplaceSpan({\n                        ...locals[i],\n                        start_line: insertedEndPosition(q).line,\n                        start_col: insertedEndPosition(q).col,\n                    }),\n                };\n            }\n        }\n        if (chainPair.kind === 'conflict') {\n            return {\n                kind: 'conflict',\n                local: locals[i],\n                remote: q,\n                reason: chainPair.reason,\n            };\n        }\n        q = chainPair.q;\n        if (chainPair.l2 !== null) {\n            nextLocals.push(chainPair.l2);\n        }\n    }\n    return {\n        kind: 'ok',\n        q,\n        local_ops: nextLocals,\n    };\n}\n\n/* Rebase one local span through one authoritative remote-span chain, or report ack/conflict. */\nexport function rebaseLocalSpanOverRemoteChain(localOp, remoteOps, opts = {}) {\n    const remotes = Array.isArray(remoteOps) ? remoteOps.map(validateReplaceSpan) : [];\n    let cur = validateReplaceSpan(localOp);\n    for (const remote of remotes) {\n        const pair = transformPair(cur, remote, opts);\n        if (pair.kind === 'conflict') {\n            return { kind: 'conflict' };\n        }\n        if (pair.class === 'ack') {\n            return { kind: 'ack' };\n        }\n        if (pair.l2 === null) {\n            throw new Error(`transformPair(${pair.class ?? 'unknown'}) returned null l2.`);\n        }\n        cur = pair.l2;\n    }\n    return {\n        kind: 'ok',\n        span: cur,\n    };\n}\n\n/* Rebase one sequential local chain through one sequential remote chain. */\nexport function rebaseLocalSpanChainOverRemoteChain(localOps, remoteOps, opts = {}) {\n    let locals = Array.isArray(localOps) ? localOps.map(validateReplaceSpan) : [];\n    const remotes = Array.isArray(remoteOps) ? remoteOps.map(validateReplaceSpan) : [];\n    for (let i = 0; i < remotes.length; i += 1) {\n        const transformed = transformRemoteThroughLocalChain(locals, remotes[i], opts);\n        if (transformed.kind !== 'ok') {\n            return {\n                kind: 'conflict',\n                remote: remotes[i],\n                local: transformed.local ?? null,\n            };\n        }\n        locals = transformed.local_ops;\n    }\n    return {\n        kind: 'ok',\n        spans: locals,\n    };\n}\n\n/* Integrate one authoritative span directly into predicted-space text and local queue state. */\nexport function integrateAuthoritativeSpan(predictedBody, localOps, authoritativeOp, opts = {}) {\n    if (typeof predictedBody !== 'string') {\n        throw new Error('integrateAuthoritativeSpan requires a predicted body string.');\n    }\n    const authoritative = validateReplaceSpan(authoritativeOp);\n    const locals = Array.isArray(localOps) ? localOps.map(validateReplaceSpan) : [];\n    const transformed = transformRemoteThroughLocalChain(locals, authoritative, opts);\n    if (transformed.kind === 'ok') {\n        const predictedSpans = transformed.q === null ? [] : [cloneReplaceSpan(transformed.q)];\n        let nextBody = predictedBody;\n        for (const span of predictedSpans) {\n            nextBody = applyReplaceSpan(nextBody, span);\n        }\n        return {\n            predicted_body: nextBody,\n            local_ops: transformed.local_ops,\n            predicted_spans: predictedSpans,\n            dropped_locals: [],\n        };\n    }\n    const projected = [];\n    const survivors = [];\n    const visible = [];\n    const dropped = [];\n    const head = firstReplaceSpan(locals);\n    if (head !== null && sameReplaceSpan(head, authoritative)) {\n        return {\n            predicted_body: predictedBody,\n            local_ops: locals.slice(1).map(cloneReplaceSpan),\n            predicted_spans: projected,\n            dropped_locals: dropped,\n        };\n    }\n    for (const local of locals) {\n        const rebased = rebaseLocalSpanOverRemoteChain(local, [authoritative], opts);\n        switch (rebased.kind) {\n        case 'ack':\n            visible.push(local);\n            break;\n        case 'conflict':\n            dropped.push(local);\n            break;\n        case 'ok':\n            survivors.push(rebased.span);\n            visible.push(local);\n            break;\n        default:\n            throw new Error(`Unknown rebaseLocalSpanOverRemoteChain kind ${JSON.stringify(rebased?.kind)}.`);\n        }\n    }\n    projected.push(...projectDroppedLocalInverseSpans(locals, dropped, opts));\n    const remoteProjected = projectSpanThroughVisibleLocals(authoritative, visible, {\n        ...opts,\n        label: 'authoritative remote span',\n    });\n    if (remoteProjected !== null) {\n        projected.push(remoteProjected);\n    }\n    let nextBody = predictedBody;\n    for (let i = 0; i < projected.length; i += 1) {\n        nextBody = applyReplaceSpan(nextBody, projected[i]);\n    }\n    return {\n        predicted_body: nextBody,\n        local_ops: survivors,\n        predicted_spans: projected,\n        dropped_locals: dropped,\n    };\n}\n\n/* Compute the canonical pair (Q, L2) for one local op and one incoming authoritative remote op. */\nexport function transformPair(localOp, remoteOp, opts = {}) {\n    const local = validateReplaceSpan(localOp);\n    const remote = validateReplaceSpan(remoteOp);\n    const sameAnchorBias = normaliseSameAnchorBias(opts.same_anchor_bias);\n    if (sameReplaceSpan(local, remote)) {\n        return {\n            kind: 'ok',\n            class: 'ack',\n            q: null,\n            l2: null,\n        };\n    }\n    if (isInsert(local) && isInsert(remote) && sameStart(local, remote)) {\n        if (sameAnchorBias === 'local_first') {\n            return {\n                kind: 'ok',\n                class: 'same_anchor_insert',\n                q: shiftReplaceSpan(remote, insertedEndPosition(local)),\n                l2: cloneReplaceSpan(local),\n            };\n        }\n        return {\n            kind: 'ok',\n            class: 'same_anchor_insert',\n            q: cloneReplaceSpan(remote),\n            l2: shiftReplaceSpan(local, insertedEndPosition(remote)),\n        };\n    }\n    if (isInsert(local) && pointInsideDeletedRange(positionOf(local), remote)) {\n        return {\n            kind: 'conflict',\n            reason: 'overlap_conflict',\n        };\n    }\n    if (isInsert(remote) && pointInsideDeletedRange(positionOf(remote), local)) {\n        return {\n            kind: 'conflict',\n            reason: 'overlap_conflict',\n        };\n    }\n    const relation = classifyRelation(local, remote);\n    switch (relation) {\n    case 'local_before_remote':\n        return {\n            kind: 'ok',\n            class: relation,\n            q: shiftReplaceSpan(remote, transformPointThroughReplaceSpan(positionOf(remote), local)),\n            l2: cloneReplaceSpan(local),\n        };\n    case 'remote_before_local':\n        return {\n            kind: 'ok',\n            class: relation,\n            q: cloneReplaceSpan(remote),\n            l2: shiftReplaceSpan(local, transformPointThroughReplaceSpan(positionOf(local), remote)),\n        };\n    default:\n        return {\n            kind: 'conflict',\n            reason: relation,\n        };\n    }\n}\n\n/* Compare two canonical ReplaceSpan ops by semantic value. */\nexport function sameReplaceSpan(a, b) {\n    const left = validateReplaceSpan(a);\n    const right = validateReplaceSpan(b);\n    return left.start_line === right.start_line\n        && left.start_col === right.start_col\n        && left.deleted_text === right.deleted_text\n        && left.inserted_text === right.inserted_text;\n}\n\n/* Validate one ReplaceSpan and return the canonical object. */\nexport function validateReplaceSpan(op, label = 'Canonical text op') {\n    if (!op || typeof op !== 'object' || op.kind !== 'replace_span') {\n        throw new Error(`${label} must be a replace_span.`);\n    }\n    return newReplaceSpan(op);\n}\n\n/* Report whether one canonical op is a pure insertion. */\nexport function isInsert(op) {\n    return validateReplaceSpan(op).deleted_text === '';\n}\n\n/* Report the end position of the deleted span in the op's own coordinate frame. */\nexport function endPosition(op) {\n    const row = validateReplaceSpan(op);\n    return advancePosition(positionOf(row), row.deleted_text);\n}\n\n/* Report the end position of the inserted span in the op's own coordinate frame. */\nexport function insertedEndPosition(op) {\n    const row = validateReplaceSpan(op);\n    return advancePosition(positionOf(row), row.inserted_text);\n}\n\n/* Classify the pair relation so transform callers can distinguish mechanical commute from overlap conflict. */\nexport function classifyRelation(localOp, remoteOp) {\n    const local = validateReplaceSpan(localOp);\n    const remote = validateReplaceSpan(remoteOp);\n    const localStart = positionOf(local);\n    const localEnd = endPosition(local);\n    const remoteStart = positionOf(remote);\n    const remoteEnd = endPosition(remote);\n    if (isInsert(local) && isInsert(remote) && samePosition(localStart, remoteStart)) {\n        return 'same_anchor_insert';\n    }\n    if (!rangesOverlap(localStart, localEnd, remoteStart, remoteEnd)) {\n        return comparePosition(localEnd, remoteStart) <= 0\n            ? 'local_before_remote'\n            : 'remote_before_local';\n    }\n    return 'overlap_conflict';\n}\n\n/* Shift one canonical op to a new start position while preserving the exact span texts. */\nexport function shiftReplaceSpan(op, nextStart) {\n    const row = validateReplaceSpan(op);\n    return newReplaceSpan({\n        ...row,\n        start_line: nextStart.line,\n        start_col: nextStart.col,\n    });\n}\n\n/* Report one op's start position. */\nexport function positionOf(op) {\n    const row = validateReplaceSpan(op);\n    return {\n        line: row.start_line,\n        col: row.start_col,\n    };\n}\n\n/* Rebase one sticky line/column position through one canonical ReplaceSpan. */\nexport function transformStickyPositionThroughReplaceSpan(point, op) {\n    const row = validateReplaceSpan(op);\n    const start = positionOf(row);\n    const deletedEnd = endPosition(row);\n    const insertedEnd = insertedEndPosition(row);\n    if (comparePosition(point, start) < 0) {\n        return point;\n    }\n    if (comparePosition(point, deletedEnd) < 0) {\n        return insertedEnd;\n    }\n    if (point.line > deletedEnd.line) {\n        return {\n            line: point.line + (insertedEnd.line - deletedEnd.line),\n            col: point.col,\n        };\n    }\n    if (point.line === deletedEnd.line && point.col >= deletedEnd.col) {\n        if (insertedEnd.line === deletedEnd.line) {\n            return {\n                line: point.line,\n                col: point.col + (insertedEnd.col - deletedEnd.col),\n            };\n        }\n        return {\n            line: insertedEnd.line,\n            col: insertedEnd.col + (point.col - deletedEnd.col),\n        };\n    }\n    return point;\n}\n\n/* Rebase one sticky line/column position through one whole local-op chain. */\nexport function transformStickyPositionThroughReplaceSpanChain(point, ops) {\n    let cur = point;\n    for (const op of ops ?? []) {\n        cur = transformStickyPositionThroughReplaceSpan(cur, op);\n    }\n    return cur;\n}\n\n/* Advance one byte-column position through one multiline text payload. */\nexport function advancePosition(start, text) {\n    if (!start || !Number.isInteger(start.line) || !Number.isInteger(start.col) || start.line < 0 || start.col < 0) {\n        throw new Error('advancePosition requires a non-negative line/col position.');\n    }\n    if (typeof text !== 'string') {\n        throw new Error('advancePosition requires text.');\n    }\n    const parts = splitBody(text);\n    if (parts.length === 1) {\n        return {\n            line: start.line,\n            col: start.col + utf8Length(parts[0]),\n        };\n    }\n    return {\n        line: start.line + parts.length - 1,\n        col: utf8Length(parts.at(-1)),\n    };\n}\n\nfunction cloneReplaceSpan(op) {\n    return newReplaceSpan(validateReplaceSpan(op));\n}\n\nfunction firstReplaceSpan(ops) {\n    return Array.isArray(ops) && ops.length > 0 ? cloneReplaceSpan(ops[0]) : null;\n}\n\nfunction sameStart(a, b) {\n    return a.start_line === b.start_line && a.start_col === b.start_col;\n}\n\nfunction projectDroppedLocalInverseSpans(localOps, droppedLocalOps, opts = {}) {\n    if (!Array.isArray(droppedLocalOps) || droppedLocalOps.length === 0) {\n        return [];\n    }\n    const visible = Array.isArray(localOps) ? localOps.map(cloneReplaceSpan) : [];\n    const edits = [];\n    for (let i = visible.length - 1; i >= 0; i -= 1) {\n        const op = visible[i];\n        if (!droppedLocalOps.some((dropped) => sameReplaceSpan(dropped, op))) {\n            continue;\n        }\n        const moved = projectSpanThroughVisibleLocals(invertReplaceSpan(op), visible.slice(i + 1), {\n            ...opts,\n            label: 'dropped local inverse',\n        });\n        if (moved === null) {\n            throw new Error('Dropped local inverse unexpectedly acknowledged against the visible suffix.');\n        }\n        edits.push(moved);\n        visible.splice(i, 1);\n    }\n    return edits;\n}\n\nfunction projectSpanThroughVisibleLocals(span, visibleLocalOps, opts = {}) {\n    const label = typeof opts.label === 'string' && opts.label !== ''\n        ? opts.label\n        : 'projected span';\n    let cur = cloneReplaceSpan(span);\n    for (const local of visibleLocalOps ?? []) {\n        const pair = transformPair(local, cur, opts);\n        if (pair.kind === 'conflict') {\n            throw new Error(`${label} cannot overlap the retained local visible chain.`);\n        }\n        cur = pair.q;\n        if (cur === null) {\n            return null;\n        }\n    }\n    return cur;\n}\n\nfunction samePosition(a, b) {\n    return a.line === b.line && a.col === b.col;\n}\n\nfunction comparePosition(a, b) {\n    if (a.line !== b.line) {\n        return a.line < b.line ? -1 : 1;\n    }\n    if (a.col !== b.col) {\n        return a.col < b.col ? -1 : 1;\n    }\n    return 0;\n}\n\nfunction rangesOverlap(aStart, aEnd, bStart, bEnd) {\n    const aEmpty = samePosition(aStart, aEnd);\n    const bEmpty = samePosition(bStart, bEnd);\n    if (aEmpty || bEmpty) {\n        return false;\n    }\n    return comparePosition(aStart, bEnd) < 0 && comparePosition(bStart, aEnd) < 0;\n}\n\nfunction transformPointThroughReplaceSpan(point, op) {\n    const row = validateReplaceSpan(op);\n    const start = positionOf(row);\n    const deletedEnd = endPosition(row);\n    const insertedEnd = insertedEndPosition(row);\n    if (comparePosition(point, start) < 0) {\n        return point;\n    }\n    if (comparePosition(point, deletedEnd) < 0) {\n        throw new Error('Cannot transform a point that lies inside an overlapping deleted span.');\n    }\n    if (point.line > deletedEnd.line) {\n        return {\n            line: point.line + (insertedEnd.line - deletedEnd.line),\n            col: point.col,\n        };\n    }\n    if (point.line === deletedEnd.line && point.col >= deletedEnd.col) {\n        if (insertedEnd.line === deletedEnd.line) {\n            return {\n                line: point.line,\n                col: point.col + (insertedEnd.col - deletedEnd.col),\n            };\n        }\n        return {\n            line: insertedEnd.line,\n            col: insertedEnd.col + (point.col - deletedEnd.col),\n        };\n    }\n    return point;\n}\n\nfunction pointInsideDeletedRange(point, op) {\n    const row = validateReplaceSpan(op);\n    const start = positionOf(row);\n    const deletedEnd = endPosition(row);\n    if (samePosition(start, deletedEnd)) {\n        return false;\n    }\n    return comparePosition(point, start) >= 0 && comparePosition(point, deletedEnd) < 0;\n}\n\nfunction normaliseSameAnchorBias(bias) {\n    const text = `${bias ?? 'local_first'}`.trim();\n    switch (text) {\n    case 'local_first':\n    case 'remote_first':\n        return text;\n    default:\n        throw new Error(`Unknown same-anchor bias ${JSON.stringify(bias)}.`);\n    }\n}\n\nfunction mustNonNegativeInt(value, label) {\n    if (!Number.isInteger(value) || value < 0) {\n        throw new Error(`${label} must be a non-negative integer.`);\n    }\n    return value;\n}\n\nfunction codeUnitIndexForLineByteCol(body, line, col) {\n    const lines = splitBody(body);\n    if (line < 0 || line > lines.length) {\n        throw new Error(`Line ${line} out of range for ${lines.length} lines.`);\n    }\n    if (line === lines.length) {\n        if (col === 0) {\n            return body.length;\n        }\n        throw new Error(`Line ${line} out of range for ${lines.length} lines.`);\n    }\n    let bodyIndex = 0;\n    for (let i = 0; i < line; i += 1) {\n        bodyIndex += lines[i].length + 1;\n    }\n    return bodyIndex + codeUnitIndexForByteOffset(lines[line], col);\n}\n\nfunction codeUnitIndexForByteOffset(text, byteOffset) {\n    let bytes = 0;\n    let i = 0;\n    while (i < text.length && bytes < byteOffset) {\n        const cp = text.codePointAt(i);\n        const step = cp > 0xFFFF ? 2 : 1;\n        bytes += utf8ByteWidth(cp);\n        if (bytes > byteOffset) {\n            throw new Error(`UTF-8 byte offset ${byteOffset} splits one code point.`);\n        }\n        i += step;\n    }\n    if (bytes !== byteOffset) {\n        throw new Error(`UTF-8 byte offset ${byteOffset} out of range.`);\n    }\n    return i;\n}\n\nfunction advanceCodeUnitIndexByUtf8Bytes(text, startIndex, byteLen) {\n    let bytes = 0;\n    let i = startIndex;\n    while (i < text.length && bytes < byteLen) {\n        const cp = text.codePointAt(i);\n        const step = cp > 0xFFFF ? 2 : 1;\n        bytes += utf8ByteWidth(cp);\n        if (bytes > byteLen) {\n            throw new Error(`UTF-8 byte span ${byteLen} splits one code point.`);\n        }\n        i += step;\n    }\n    if (bytes !== byteLen) {\n        throw new Error(`UTF-8 byte span ${byteLen} out of range.`);\n    }\n    return i;\n}\n\nfunction utf8Length(text) {\n    return new TextEncoder().encode(text).length;\n}\n\nfunction utf8ByteWidth(cp) {\n    if (!Number.isInteger(cp) || cp < 0) {\n        throw new Error(`Invalid code point ${cp}.`);\n    }\n    if (cp <= 0x7F) {\n        return 1;\n    }\n    if (cp <= 0x7FF) {\n        return 2;\n    }\n    if (cp <= 0xFFFF) {\n        return 3;\n    }\n    if (cp <= 0x10FFFF) {\n        return 4;\n    }\n    throw new Error(`Code point ${cp} exceeds UTF-8 range.`);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport {\n    editCol,\n    editLine,\n    editNewText,\n    editOldText,\n    splitBody,\n} from './puffbook-editchain.mjs';\nimport {\n    applyReplaceSpan,\n    replaceSpanChainFromChange,\n    validateReplaceSpan,\n} from './puffbook-replacespan.mjs';\n\nconst textEncoder = new TextEncoder();\n\n/* Build one UTF-8 line-offset index for rebasing output-line metadata locally. */\nexport function buildLineOffsetIndex(body) {\n    const lines = splitBody(body);\n    const starts = new Array(lines.length);\n    const ends = new Array(lines.length);\n    let off = 0;\n    for (let i = 0; i < lines.length; i++) {\n        starts[i] = off;\n        off += utf8Length(lines[i]);\n        ends[i] = off;\n        off += 1;\n    }\n    return {\n        body,\n        starts,\n        ends,\n        maxOffset: ends.length > 0 ? ends[ends.length - 1] : 0,\n    };\n}\n\n/* Anchor one canonical output line at the start of its physical input line. */\nexport function lineAnchorOffsetFromIndex(index, line) {\n    const asNumber = Number.isFinite(line) ? line : Number(line);\n    if (!Number.isFinite(asNumber)) {\n        return index.ends.length === 0 ? 0 : index.maxOffset;\n    }\n    const safeLine = Math.max(0, Math.floor(asNumber));\n    if (index.ends.length === 0) {\n        return 0;\n    }\n    if (safeLine >= index.ends.length) {\n        return index.maxOffset;\n    }\n    return index.starts[safeLine];\n}\n\n/* Anchor one canonical output line using a fresh UTF-8 index over the body. */\nexport function lineAnchorOffset(body, line) {\n    return lineAnchorOffsetFromIndex(buildLineOffsetIndex(body), line);\n}\n\n/* Resolve one UTF-8 byte offset back to a zero-based display line. */\nexport function lineForOffsetFromIndex(index, want) {\n    if (!Number.isInteger(want) || want < 0 || want > index.maxOffset) {\n        throw new Error(`Offset ${want} out of range.`);\n    }\n    let lo = 0;\n    let hi = index.starts.length - 1;\n    let line = 0;\n    while (lo <= hi) {\n        const mid = (lo + hi) >> 1;\n        if (index.starts[mid] <= want) {\n            line = mid;\n            lo = mid + 1;\n            continue;\n        }\n        hi = mid - 1;\n    }\n    return line;\n}\n\n/* Rebase one sticky byte offset through one predicted edit. */\nexport function rebaseStickyOffsetWithIndex(index, off, edit) {\n    const start = byteOffsetForLineColWithIndex(index, editLine(edit), editCol(edit));\n    const oldBytes = utf8Length(editOldText(edit));\n    const end = start + oldBytes;\n    const delta = utf8Length(editNewText(edit)) - oldBytes;\n    if (off < start) {\n        return off;\n    }\n    if (off > end) {\n        return off + delta;\n    }\n    return start + utf8Length(editNewText(edit));\n}\n\n/* Rebase one sticky byte offset through one predicted edit using the source body. */\nexport function rebaseStickyOffset(body, off, edit) {\n    return rebaseStickyOffsetWithIndex(buildLineOffsetIndex(body), off, edit);\n}\n\n/* Convert one validated line/column pair into its UTF-8 offset. */\nexport function byteOffsetForLineColWithIndex(index, line, col) {\n    if (!index || !Array.isArray(index.starts) || !Array.isArray(index.ends) || index.starts.length === 0) {\n        throw new Error('Line/column conversion requires a non-empty body index.');\n    }\n    if (!Number.isInteger(line) || line < 0 || line >= index.starts.length) {\n        throw new Error(`Line/column conversion line is outside the body: line=${JSON.stringify(line)} lines=${index.starts.length}.`);\n    }\n    const lineLength = index.ends[line] - index.starts[line];\n    if (!Number.isInteger(col) || col < 0 || col > lineLength) {\n        throw new Error(`Line/column conversion column is outside the line: line=${line} col=${JSON.stringify(col)} line_bytes=${lineLength}.`);\n    }\n    return index.starts[line] + col;\n}\n\n/* Project authoritative output lines through the current local predicted edits. */\nexport function projectOutputLines(outputLines, body, edits) {\n    let curBody = body;\n    let curRows = uniqueSortedOutputLines(outputLines);\n    for (const change of edits) {\n        if (change === null) {\n            continue;\n        }\n        for (const span of changeSpans(curBody, change)) {\n            const step = outputLineRebaseStep(span);\n            const nextBody = applyReplaceSpan(curBody, span);\n            curRows = uniqueSortedOutputLines(curRows.flatMap((line) => {\n                const nextLine = rebaseOutputLine(line, step);\n                return nextLine === null ? [] : [nextLine];\n            }));\n            curBody = nextBody;\n        }\n    }\n    return curRows;\n}\n\n/* Rebase one canonical output row through one sequential change, or drop it if the row is wholly deleted. */\nexport function rebaseOutputLineThroughChange(outputLine, body, change) {\n    if (!Number.isInteger(outputLine) || outputLine < 0) {\n        return null;\n    }\n    let curBody = body;\n    let curLine = outputLine;\n    for (const span of changeSpans(curBody, change)) {\n        const step = outputLineRebaseStep(span);\n        curLine = rebaseOutputLine(curLine, step);\n        if (curLine === null) {\n            return null;\n        }\n        curBody = applyReplaceSpan(curBody, span);\n    }\n    return curLine;\n}\n\n/* Map one display line onto the canonical output line for its containing top. */\nexport function outputLineForDisplayLine(displayLine, outputLines) {\n    if (!Number.isInteger(displayLine) || displayLine < 0) {\n        return null;\n    }\n    const rows = uniqueSortedOutputLines(outputLines);\n    for (const row of rows) {\n        if (row >= displayLine) {\n            return row;\n        }\n    }\n    return displayLine;\n}\n\n/* Derive one local canonical output line from the current multiline-top syntax. */\nexport function localCanonicalOutputLine(body, displayLine) {\n    return localSourceRangeForOutputLine(body, displayLine)?.end ?? null;\n}\n\n/*\n * Resolve the delimiter-balanced source block whose authoritative output is\n * exactly `outputLine`. Unlike display-line continuation lookup, this walks\n * backward from the output anchor, so an earlier malformed top cannot consume\n * the rest of the document.\n */\nexport function localSourceRangeEndingAtOutputLine(body, outputLine) {\n    if (!Number.isInteger(outputLine) || outputLine < 0) return null;\n    const lines = splitBody(body);\n    if (outputLine >= lines.length) return null;\n    let depth = 0;\n    for (let start = outputLine; start >= 0; start -= 1) {\n        depth += delimiterDelta(lines[start]);\n        if (depth === 0) return { start, end: outputLine };\n    }\n    return { start: outputLine, end: outputLine };\n}\n\n/* Resolve the complete delimiter-balanced source block ending at one output row. */\nexport function localSourceRangeForOutputLine(body, displayLine) {\n    if (!Number.isInteger(displayLine) || displayLine < 0) {\n        return null;\n    }\n    const lines = splitBody(body);\n    if (lines.length === 0) {\n        return null;\n    }\n    if (displayLine >= lines.length) {\n        return null;\n    }\n    const want = displayLine;\n    let top = 0;\n    while (top < lines.length) {\n        let end = top;\n        let depth = delimiterDelta(lines[top]);\n        if (depth > 0) {\n            while (end + 1 < lines.length && depth > 0) {\n                end++;\n                depth += delimiterDelta(lines[end]);\n            }\n        }\n        if (want >= top && want <= end) {\n            return { start: top, end };\n        }\n        top = end + 1;\n    }\n    return { start: want, end: want };\n}\n\nfunction uniqueSortedOutputLines(outputLines) {\n    const out = [];\n    const seen = new Set();\n    for (const raw of outputLines ?? []) {\n        if (!Number.isInteger(raw) || raw < 0 || seen.has(raw)) {\n            continue;\n        }\n        seen.add(raw);\n        out.push(raw);\n    }\n    out.sort((a, b) => a - b);\n    return out;\n}\n\nfunction utf8Length(text) {\n    return textEncoder.encode(text).length;\n}\n\nfunction delimiterDelta(text) {\n    let delta = 0;\n    for (const ch of `${text ?? ''}`) {\n        switch (ch) {\n        case '(':\n        case '[':\n        case '{':\n            delta++;\n            break;\n        case ')':\n        case ']':\n        case '}':\n            delta--;\n            break;\n        }\n    }\n    return delta;\n}\n\n/* Reduce one edit to the line-only output rebase rule shared with the backend contract. */\nfunction outputLineRebaseStep(span) {\n    const deletedLineCount = splitBody(span.deleted_text).length - 1;\n    const insertedLineCount = splitBody(span.inserted_text).length - 1;\n    return {\n        start_line: span.start_line,\n        start_col: span.start_col,\n        deleted_end_line: span.start_line + deletedLineCount,\n        delta_lines: insertedLineCount - deletedLineCount,\n    };\n}\n\n/* Rebase one line-keyed output anchor with only the boundary column deciding same-line retention. */\nfunction rebaseOutputLine(line, step) {\n    if (!Number.isInteger(line) || line < 0) {\n        return null;\n    }\n    if (line < step.start_line) {\n        return line;\n    }\n    if (step.deleted_end_line > step.start_line && line < step.deleted_end_line) {\n        return null;\n    }\n    if (step.deleted_end_line > step.start_line) {\n        return line + step.delta_lines;\n    }\n    if (step.delta_lines > 0 && step.start_col === 0) {\n        return line + step.delta_lines;\n    }\n    if (line === step.start_line) {\n        return line;\n    }\n    return line + step.delta_lines;\n}\n\n/* Lower one projected local change onto canonical spans against the current body frame. */\nfunction changeSpans(body, change) {\n    try {\n        return [validateReplaceSpan(change)];\n    } catch (_spanErr) {\n        return replaceSpanChainFromChange(body, change, 'output-line rebase change');\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Palette } from './lib/evilui/evil_palette.mjs';\n\nexport const LINE_STATUS_RECOMPUTE = 'recompute';\nexport const LINE_STATUS_PARTIAL = 'partial';\nexport const LINE_STATUS_PAYLOAD_REF = 'payload_ref';\nexport const LINE_STATUS_SUCCESS = 'success';\nexport const LINE_STATUS_ERROR = 'error';\n\nconst VALID_LINE_STATUSES = Object.freeze([\n    LINE_STATUS_RECOMPUTE,\n    LINE_STATUS_PARTIAL,\n    LINE_STATUS_PAYLOAD_REF,\n    LINE_STATUS_SUCCESS,\n    LINE_STATUS_ERROR,\n]);\n\n/* Close one maybe-empty status string onto the shared line-status enum. */\nexport function normaliseLineStatus(status) {\n    if (status === null || status === undefined || status === '') {\n        return null;\n    }\n    if (typeof status !== 'string' || !VALID_LINE_STATUSES.includes(status)) {\n        throw new Error(`Unknown puff line status '${status}'.`);\n    }\n    return status;\n}\n\n/* Project one semantic line status onto the current tooltip copy. */\nexport function tooltipTextForLineStatus(status) {\n    switch (normaliseLineStatus(status)) {\n    case LINE_STATUS_RECOMPUTE:\n        return 'Recomputing output.';\n    case LINE_STATUS_PARTIAL:\n        return 'Partial result.';\n    case LINE_STATUS_PAYLOAD_REF:\n        return 'Execution completed; waiting for output to load.';\n    case LINE_STATUS_SUCCESS:\n        return 'Execution succeeded.';\n    case LINE_STATUS_ERROR:\n        return 'Execution failed.';\n    default:\n        return '';\n    }\n}\n\n/* Project one semantic line status onto the badge chrome shown beside the input row. */\nexport function badgeSpecForLineStatus(status) {\n    switch (normaliseLineStatus(status)) {\n    case LINE_STATUS_RECOMPUTE:\n        return {\n            kind: LINE_STATUS_RECOMPUTE,\n            iconID: 24,\n            iconColor: Palette.white,\n            iconAnimation: {\n                type: 'spin',\n                period_s: 1.6,\n            },\n            tooltipText: tooltipTextForLineStatus(status),\n        };\n    case LINE_STATUS_PARTIAL:\n        return {\n            kind: LINE_STATUS_PARTIAL,\n            iconID: 6,\n            iconColor: Palette.yellow,\n            tooltipText: tooltipTextForLineStatus(status),\n        };\n    case LINE_STATUS_PAYLOAD_REF:\n        return {\n            kind: LINE_STATUS_PAYLOAD_REF,\n            iconID: 24,\n            iconColor: Palette.white,\n            iconAnimation: {\n                type: 'spin',\n                period_s: 1.6,\n            },\n            tooltipText: tooltipTextForLineStatus(status),\n        };\n    case LINE_STATUS_SUCCESS:\n        return {\n            kind: LINE_STATUS_SUCCESS,\n            iconID: 23,\n            iconColor: Palette.darkgreen,\n            tooltipText: tooltipTextForLineStatus(status),\n        };\n    case LINE_STATUS_ERROR:\n        return {\n            kind: LINE_STATUS_ERROR,\n            iconID: 7,\n            iconColor: Palette.darkred,\n            tooltipText: tooltipTextForLineStatus(status),\n        };\n    default:\n        return null;\n    }\n}\n\n/* Project the unacknowledged client edit overlay without claiming a native lifecycle transition. */\nexport function badgeSpecForLocalWaiting() {\n    return {\n        kind: 'local_waiting',\n        iconID: 24,\n        iconColor: Palette.white,\n        iconAnimation: {\n            type: 'spin',\n            period_s: 1.6,\n        },\n        tooltipText: 'Waiting for server update.',\n    };\n}\n", "import { previousCodepointIndex } from './text-utils.mjs';\n// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const SPACE_TAB_TEXT = '    ';\n\nexport function isSpaceTabKey(event) {\n    return event.key === 'Tab' && !event.shiftKey && !event.ctrlKey && !event.metaKey && !event.altKey;\n}\n\n/* Count only the space run directly before the caret, within the editable source range. */\nexport function spaceTabBackspaceStart(text, cursor, floor = 0) {\n    if (cursor <= floor) return cursor;\n    let start = cursor;\n    while (start > floor && text[start - 1] === ' ') start -= 1;\n    const spaces = cursor - start;\n    return spaces > 0 && spaces % SPACE_TAB_TEXT.length === 0\n        ? cursor - SPACE_TAB_TEXT.length : previousCodepointIndex(text, cursor);\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const MAX_PASTE_BYTES = 16 * 1024;\n\n/* Project browser clipboard carriers into one plain string so all paste paths share the same boundary checks. */\nexport function clipboardText(clipboardData) {\n    if (!clipboardData) {\n        return '';\n    }\n    if (typeof clipboardData === 'string') {\n        return clipboardData;\n    }\n    if (typeof clipboardData.getData === 'function') {\n        return clipboardData.getData('text') || '';\n    }\n    return `${clipboardData}`;\n}\n\n/* Enforce one UTF-8 byte ceiling for pasted text before any editor-specific normalisation happens. */\nexport function assertPasteWithinLimit(text) {\n    const bytes = new TextEncoder().encode(text).length;\n    if (bytes > MAX_PASTE_BYTES) {\n        throw new Error(`Paste payload exceeds ${MAX_PASTE_BYTES} bytes (got ${bytes}).`);\n    }\n}\n\n/* Normalise pasted text for multiline or single-line editors while sharing one size boundary. */\nexport function normalizePasteText(clipboardData, { multiline = true } = {}) {\n    const text = clipboardText(clipboardData);\n    if (!text) {\n        return '';\n    }\n    assertPasteWithinLimit(text);\n    const lines = text.replace(/\\r\\n?/g, '\\n');\n    return multiline ? lines : lines.replace(/[\\r\\n]+/g, ' ');\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { newReplaceSpan, applyReplaceSpan } from './puffbook-replacespan.mjs';\nimport { normalizePasteText } from './lib/evilui/clipboard-text.mjs';\nimport { moveCursorByWord } from './lib/evilui/text-utils.mjs';\nimport { SPACE_TAB_TEXT, spaceTabBackspaceStart } from './lib/evilui/space-tabs.mjs';\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nexport const comparePosition = (a, b) => a.line - b.line || a.col - b.col;\nexport const orderedRange = range => comparePosition(range.anchor, range.focus) <= 0\n    ? [range.anchor, range.focus] : [range.focus, range.anchor];\nexport const rangeIsEmpty = range => comparePosition(range.anchor, range.focus) === 0;\nexport const caretRange = point => ({ anchor: { ...point }, focus: { ...point } });\n\nexport function cloneSelection(selection) {\n    return selection === null ? null : {\n        ranges: selection.ranges.map(r => ({ anchor: { ...r.anchor }, focus: { ...r.focus } })),\n        primaryIndex: selection.primaryIndex,\n        verticalColumn: selection.verticalColumn ?? null,\n    };\n}\n\nexport function selectionAt(point) {\n    return { ranges: [caretRange(point)], primaryIndex: 0, verticalColumn: null };\n}\n\nexport function primaryFocus(selection) {\n    return selection.ranges[selection.primaryIndex].focus;\n}\n\nexport function selectionWithCaret(selection, point, verticalColumn = point.col) {\n    const current = normaliseSelection(selection);\n    const ranges = current.ranges.map(range => caretRange(range.focus));\n    const found = ranges.findIndex(range => comparePosition(range.focus, point) === 0);\n    if (found < 0) ranges.push(caretRange(point));\n    return normaliseSelection({ ranges, primaryIndex: found < 0 ? ranges.length - 1 : found, verticalColumn });\n}\n\nexport function cloneSourceDrag(drag) {\n    return drag === null ? null : { ...drag, baseSelection: cloneSelection(drag.baseSelection), selection: cloneSelection(drag.selection) };\n}\n\nfunction extendCaretDrag(source, drag, evt) {\n    const { lines, startLine } = source;\n    const nextDrag = cloneSourceDrag(drag);\n    const rows = new Map(nextDrag.selection.ranges.map(range => [range.anchor.line, range]));\n    const from = primaryFocus(nextDrag.selection).line;\n    const column = nextDrag.selection.verticalColumn;\n    for (let line = Math.min(from, evt.line); line <= Math.max(from, evt.line); line++) {\n        const text = lines[line - startLine];\n        if (text === undefined) throw new SelectionSourceRequired(line);\n        if (!rows.has(line)) rows.set(line, caretRange({ line, col: columnAt(text, column) }));\n    }\n    const columns = new Map((evt.columns ?? []).map(point => [point.line, point.col]));\n    for (const [line, range] of rows) {\n        const text = lines[line - startLine];\n        if (text === undefined) throw new SelectionSourceRequired(line);\n        indexAt(source, range.anchor);\n        const col = columns.get(line) ?? evt.col;\n        if (!Number.isInteger(col) || col < 0) throw new Error(`Invalid caret drag column: ${col}`);\n        range.focus = { line, col: columnAt(text, col) };\n    }\n    const ranges = [...rows.values()].sort((a, b) => a.anchor.line - b.anchor.line);\n    nextDrag.selection = { ranges, primaryIndex: ranges.findIndex(range => range.focus.line === evt.line), verticalColumn: column };\n    const base = nextDrag.baseSelection.ranges;\n    return { handled: true, spans: [], sourceDrag: nextDrag,\n        selection: normaliseSelection({ ranges: [...base, ...ranges],\n            primaryIndex: base.length + nextDrag.selection.primaryIndex, verticalColumn: column }) };\n}\n\nfunction extendSelectionDrag(source, drag, evt) {\n    const nextDrag = cloneSourceDrag(drag);\n    const range = nextDrag.selection.ranges[0];\n    const focus = { line: evt.line, col: evt.col };\n    indexAt(source, range.anchor);\n    indexAt(source, focus);\n    range.focus = focus;\n    // Returning to the starting point restores the base without adding a caret.\n    const base = nextDrag.baseSelection;\n    const ranges = base.ranges.filter(range => !rangeIsEmpty(range));\n    const selection = rangeIsEmpty(range) ? cloneSelection(base)\n        : normaliseSelection({ ranges: [...ranges, range], primaryIndex: ranges.length, verticalColumn: null });\n    return { handled: true, spans: [], sourceDrag: nextDrag, selection };\n}\n\nexport function validateSelection(selection) {\n    if (!selection || !Array.isArray(selection.ranges) || selection.ranges.length === 0\n        || !Number.isInteger(selection.primaryIndex) || selection.primaryIndex < 0\n        || selection.primaryIndex >= selection.ranges.length\n        || (selection.verticalColumn != null && (!Number.isInteger(selection.verticalColumn) || selection.verticalColumn < 0))) {\n        throw new Error(`Invalid document selection: ${JSON.stringify(selection)}`);\n    }\n    for (const range of selection.ranges) {\n        for (const point of [range.anchor, range.focus]) {\n            if (!point || !Number.isInteger(point.line) || point.line < 0\n                || !Number.isInteger(point.col) || point.col < 0) {\n                throw new Error(`Invalid document selection endpoint: ${JSON.stringify(point)}`);\n            }\n        }\n    }\n    return selection;\n}\n\n// Operation-local indices belong to one source frame, never a retained viewport cache.\nfunction indexSource(body, startLine) {\n    const lines = body.split('\\n');\n    const offsets = [];\n    let offset = 0;\n    for (const line of lines) {\n        offsets.push(offset);\n        offset += line.length + 1;\n    }\n    return { body, startLine, lines, offsets };\n}\n\nfunction indexAt(source, point) {\n    const { lines, offsets, startLine } = source;\n    const line = point.line - startLine;\n    if (line < 0 || line >= lines.length) throw new SelectionSourceRequired(point.line);\n    if (point.col > lines[line].length) throw new Error(`Selection column outside source: ${JSON.stringify(point)}`);\n    const code = lines[line].charCodeAt(point.col);\n    if (point.col > 0 && code >= 0xdc00 && code <= 0xdfff) {\n        throw new Error(`Selection splits a Unicode character: ${JSON.stringify(point)}`);\n    }\n    return offsets[line] + point.col;\n}\n\nfunction pointAt(source, index) {\n    if (!Number.isInteger(index) || index < 0 || index > source.body.length) {\n        throw new Error(`Selection offset outside source frame: ${index} / ${source.body.length}`);\n    }\n    // Find the last line whose first character is at or before this offset.\n    let left = 0;\n    let right = source.offsets.length;\n    while (left + 1 < right) {\n        const middle = Math.floor((left + right) / 2);\n        if (source.offsets[middle] <= index) left = middle;\n        else right = middle;\n    }\n    return { line: source.startLine + left, col: index - source.offsets[left] };\n}\n\nexport class SelectionSourceRequired extends Error {\n    constructor(line) {\n        super(`Selection requires source line ${line + 1}.`);\n        this.line = line;\n    }\n}\n\nfunction previous(text, index) {\n    if (index === 0) return 0;\n    const code = text.charCodeAt(index - 1);\n    return index - (code >= 0xdc00 && code <= 0xdfff && index > 1 ? 2 : 1);\n}\nfunction next(text, index) {\n    return index >= text.length ? text.length : index + (text.codePointAt(index) > 0xffff ? 2 : 1);\n}\nfunction columnAt(text, col) {\n    const end = Math.min(col, text.length);\n    return end > 0 && end < text.length && text.charCodeAt(end) >= 0xdc00\n        && text.charCodeAt(end) <= 0xdfff ? end - 1 : end;\n}\n\nexport function selectedSource(body, selection, startLine = 0) {\n    validateSelection(selection);\n    const source = indexSource(body, startLine);\n    return selection.ranges.filter(r => !rangeIsEmpty(r))\n        .map(r => orderedRange(r)).sort(([a], [b]) => comparePosition(a, b))\n        .map(([a, b]) => body.slice(indexAt(source, a), indexAt(source, b)))\n        .join('\\n');\n}\n\nexport function requireSelectionSource(body, selection, startLine = 0) {\n    validateSelection(selection);\n    const source = indexSource(body, startLine);\n    for (const range of selection.ranges) {\n        indexAt(source, range.anchor);\n        indexAt(source, range.focus);\n    }\n}\n\n/* Absolute source coordinates survive viewport eviction; spans use window-local byte columns. */\nexport function transformSelection(body, selection, spans, startLine = 0) {\n    if (selection === null || spans.length === 0) return cloneSelection(selection);\n    let source = indexSource(body, startLine);\n    const out = cloneSelection(selection);\n    for (const span of spans) {\n        const lineText = source.lines[span.start_line];\n        const charCol = decoder.decode(encoder.encode(lineText).slice(0, span.start_col)).length;\n        const start = indexAt(source, { line: startLine + span.start_line, col: charCol });\n        const deletedLines = span.deleted_text.split('\\n');\n        const insertedLines = span.inserted_text.split('\\n');\n        const deltaLines = insertedLines.length - deletedLines.length;\n        const after = indexSource(applyReplaceSpan(source.body, span), startLine);\n        for (const range of out.ranges) {\n            for (const key of ['anchor', 'focus']) {\n                const p = range[key];\n                if (p.line < startLine) continue;\n                if (p.line >= startLine + source.lines.length) {\n                    range[key] = { line: p.line + deltaLines, col: p.col };\n                    continue;\n                }\n                const offset = indexAt(source, p);\n                const moved = offset < start ? offset : offset <= start + span.deleted_text.length\n                    ? start + span.inserted_text.length\n                    : offset + span.inserted_text.length - span.deleted_text.length;\n                range[key] = pointAt(after, moved);\n            }\n        }\n        source = after;\n    }\n    return normaliseSelection(out);\n}\n\nexport function normaliseSelection(selection) {\n    validateSelection(selection);\n    const primary = selection.ranges[selection.primaryIndex];\n    const sorted = selection.ranges.map((r, i) => ({ ...r, primary: i === selection.primaryIndex }))\n        .sort((a, b) => comparePosition(orderedRange(a)[0], orderedRange(b)[0]));\n    const ranges = [];\n    let primaryIndex = 0;\n    for (const item of sorted) {\n        const [start, end] = orderedRange(item);\n        const last = ranges.at(-1);\n        if (last && comparePosition(start, orderedRange(last)[1]) <= 0) {\n            const [oldStart, oldEnd] = orderedRange(last);\n            const mergedEnd = comparePosition(end, oldEnd) > 0 ? end : oldEnd;\n            const reverse = item.primary ? comparePosition(primary.anchor, primary.focus) > 0\n                : rangeIsEmpty(last) ? comparePosition(item.anchor, item.focus) > 0\n                    : comparePosition(last.anchor, last.focus) > 0;\n            ranges[ranges.length - 1] = reverse\n                ? { anchor: { ...mergedEnd }, focus: { ...oldStart } }\n                : { anchor: { ...oldStart }, focus: { ...mergedEnd } };\n            if (item.primary) primaryIndex = ranges.length - 1;\n        } else {\n            ranges.push({ anchor: { ...item.anchor }, focus: { ...item.focus } });\n            if (item.primary) primaryIndex = ranges.length - 1;\n        }\n    }\n    return { ranges, primaryIndex, verticalColumn: selection.verticalColumn ?? null };\n}\n\nexport function rowSelection(selection, line, length) {\n    const segments = [];\n    const carets = [];\n    if (selection === null) return { segments, carets };\n    for (const range of selection.ranges) {\n        const [start, end] = orderedRange(range);\n        if (range.focus.line === line) carets.push(range.focus.col);\n        if (rangeIsEmpty(range) || line < start.line || line > end.line) continue;\n        const from = line === start.line ? start.col : 0;\n        const to = line === end.line ? end.col : length;\n        if (to > from || line < end.line) segments.push({ start: from, end: to, newline: line < end.line });\n    }\n    return { segments, carets };\n}\n\nexport function selectionCommand(body, selection, evt, { startLine = 0, totalLines, sourceDrag = null } = {}) {\n    const current = normaliseSelection(selection);\n    const source = indexSource(body, startLine);\n    const { lines } = source;\n    if (totalLines === undefined) totalLines = lines.length;\n    const chord = evt.ctrlKey || evt.metaKey;\n    const key = evt.key;\n    if (key === 'extend_source_drag') {\n        if (!sourceDrag) throw new Error('Source selection drag requires its document-owned starting state.');\n        if (!Number.isInteger(evt.line) || evt.line < 0 || evt.line >= totalLines\n            || !Number.isInteger(evt.col) || evt.col < 0) throw new Error(`Invalid source drag endpoint: ${JSON.stringify(evt)}`);\n        if (sourceDrag.kind === 'selection') return extendSelectionDrag(source, sourceDrag, evt);\n        if (sourceDrag.kind === 'carets') return extendCaretDrag(source, sourceDrag, evt);\n        throw new Error(`Unknown source drag kind: ${sourceDrag.kind}`);\n    }\n    if (evt.ctrlKey && !evt.metaKey && !evt.altKey && !evt.shiftKey && !evt.isComposing\n        && key?.toLowerCase() === 'd') {\n        const ranges = current.ranges.filter(range => !rangeIsEmpty(range));\n        if (ranges.length === 0) return { handled: true, spans: [], selection: current };\n        const text = selectedSource(body, current, startLine);\n        const [start, end] = orderedRange(ranges.at(-1));\n        // A selection ending at column zero already includes its line separator.\n        const includesNewline = end.line > start.line && end.col === 0;\n        const point = includesNewline ? end : { line: end.line, col: lines[end.line - startLine].length };\n        const offset = indexAt(source, point);\n        const inserted = includesNewline ? text : '\\n' + text;\n        const span = newReplaceSpan({ start_line: point.line - startLine,\n            start_col: encoder.encode(lines[point.line - startLine].slice(0, point.col)).length,\n            deleted_text: '', inserted_text: inserted });\n        const after = indexSource(applyReplaceSpan(body, span), startLine);\n        const copyStart = offset + (includesNewline ? 0 : 1);\n        return { handled: true, spans: [span], selection: {\n            ranges: [{ anchor: pointAt(after, copyStart), focus: pointAt(after, copyStart + text.length) }],\n            primaryIndex: 0, verticalColumn: null,\n        } };\n    }\n    if (chord && key?.toLowerCase() === 'a') {\n        if (startLine !== 0 || lines.length !== totalLines) throw new SelectionSourceRequired(0);\n        return { handled: true, spans: [], selection: { ranges: [{ anchor: { line: 0, col: 0 }, focus: pointAt(source, body.length) }], primaryIndex: 0, verticalColumn: null } };\n    }\n    if (key === 'Escape') return { handled: true, spans: [], selection: selectionAt(primaryFocus(current)) };\n    if (evt.altKey && !chord && ['ArrowUp', 'ArrowDown'].includes(key)) {\n        const focus = primaryFocus(current);\n        const target = focus.line + (key === 'ArrowUp' ? -1 : 1);\n        if (target < 0 || target >= totalLines) return { handled: true, spans: [], selection: current };\n        const text = lines[target - startLine];\n        if (text === undefined) throw new SelectionSourceRequired(target);\n        const col = current.verticalColumn ?? focus.col;\n        const point = { line: target, col: columnAt(text, col) };\n        return { handled: true, spans: [], selection: selectionWithCaret(current, point, col) };\n    }\n    if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {\n        const preferred = ['ArrowUp', 'ArrowDown'].includes(key) ? current.verticalColumn : null;\n        const ranges = current.ranges.map(range => {\n            const p = range.focus;\n            const offset = indexAt(source, p);\n            const text = lines[p.line - startLine];\n            let focus;\n            if (!evt.shiftKey && !rangeIsEmpty(range) && ['ArrowLeft', 'ArrowRight'].includes(key)) {\n                focus = orderedRange(range)[key === 'ArrowLeft' ? 0 : 1];\n            } else if ((key === 'Home' || key === 'End') && chord) {\n                if (startLine !== 0 || lines.length !== totalLines) throw new SelectionSourceRequired(key === 'Home' ? 0 : totalLines - 1);\n                focus = pointAt(source, key === 'Home' ? 0 : body.length);\n            } else if (key === 'Home' || key === 'End') {\n                focus = { line: p.line, col: key === 'Home' ? 0 : text.length };\n            } else if (key === 'ArrowUp' || key === 'ArrowDown') {\n                const target = Math.max(0, Math.min(totalLines - 1, p.line + (key === 'ArrowUp' ? -1 : 1)));\n                if (lines[target - startLine] === undefined) throw new SelectionSourceRequired(target);\n                focus = { line: target, col: columnAt(lines[target - startLine], preferred ?? p.col) };\n            } else if (evt.altKey || chord) {\n                focus = { line: p.line, col: moveCursorByWord(text, p.col, key === 'ArrowLeft' ? 'left' : 'right') };\n            } else {\n                if ((key === 'ArrowLeft' && offset === 0 && startLine > 0)\n                    || (key === 'ArrowRight' && offset === body.length && startLine + lines.length < totalLines)) {\n                    throw new SelectionSourceRequired(key === 'ArrowLeft' ? startLine - 1 : startLine + lines.length);\n                }\n                focus = pointAt(source, key === 'ArrowLeft' ? previous(body, offset) : next(body, offset));\n            }\n            return { anchor: { ...(evt.shiftKey ? range.anchor : focus) }, focus: { ...focus } };\n        });\n        return { handled: true, spans: [], selection: normaliseSelection({ ranges, primaryIndex: current.primaryIndex, verticalColumn: ['ArrowUp', 'ArrowDown'].includes(key) ? preferred ?? primaryFocus(current).col : null }) };\n    }\n    const printable = typeof key === 'string' && Array.from(key).length === 1\n        && (!chord || (evt.altGraphKey ?? evt.getModifierState?.('AltGraph')));\n    if (!['Backspace', 'Delete', 'Enter', 'paste', 'cut', 'Tab'].includes(key) && !printable) return { handled: false, spans: [], selection: current };\n    if (chord && !['paste', 'cut', 'Backspace', 'Enter', 'Tab'].includes(key) && !printable) return { handled: false, spans: [], selection: current };\n    if (key === 'Tab' && (evt.shiftKey || current.ranges.some(r => r.anchor.line !== r.focus.line))) {\n        const selectedLines = new Set();\n        for (const range of current.ranges) {\n            const [start, end] = orderedRange(range);\n            const last = end.line > start.line && end.col === 0 ? end.line - 1 : end.line;\n            for (let line = start.line; line <= last; line++) selectedLines.add(line);\n        }\n        let frame = body;\n        const spans = [];\n        for (const line of [...selectedLines].sort((a, b) => b - a)) {\n            const text = lines[line - startLine];\n            if (text === undefined) throw new SelectionSourceRequired(line);\n            const deleted = evt.shiftKey ? text.startsWith('\\t') ? '\\t' : text.match(/^ {0,4}/)[0] : '';\n            const inserted = evt.shiftKey ? '' : SPACE_TAB_TEXT;\n            if (deleted === inserted) continue;\n            const span = newReplaceSpan({ start_line: line - startLine, start_col: 0,\n                deleted_text: deleted, inserted_text: inserted });\n            frame = applyReplaceSpan(frame, span);\n            spans.push(span);\n        }\n        const transformed = transformSelection(body, current, spans, startLine);\n        transformed.verticalColumn = null;\n        return { handled: true, spans, selection: transformed };\n    }\n    const inserted = key === 'paste' ? normalizePasteText(evt.clipboardData, { multiline: true })\n        : key === 'Enter' ? '\\n' : key === 'Tab' ? SPACE_TAB_TEXT : printable ? key : '';\n    let replacements = current.ranges.map((range, i) => {\n        const [a, b] = orderedRange(range);\n        let start = indexAt(source, a);\n        let end = indexAt(source, b);\n        if (start === end) {\n            if (key === 'Backspace') {\n                const text = lines[a.line - startLine];\n                start = a.col === 0 ? previous(body, start)\n                    : start - a.col + ((evt.ctrlKey || evt.metaKey || evt.altKey)\n                        ? previous(text, a.col) : spaceTabBackspaceStart(text, a.col));\n                if (start === end && a.col === 0 && startLine > 0) throw new SelectionSourceRequired(startLine - 1);\n            }\n            if (key === 'Delete') {\n                end = next(body, end);\n                if (end === start && startLine + lines.length < totalLines) throw new SelectionSourceRequired(startLine + lines.length);\n            }\n            if (key === 'Enter' && evt.shiftKey) start = end = indexAt(source, { line: a.line, col: lines[a.line - startLine].length });\n        }\n        return { start, end, inserted, primary: i === current.primaryIndex };\n    });\n    replacements.sort((a, b) => a.start - b.start);\n    const merged = [];\n    for (const replacement of replacements) {\n        const last = merged.at(-1);\n        if (last && replacement.start <= last.end) {\n            last.end = Math.max(last.end, replacement.end);\n            last.primary ||= replacement.primary;\n        } else merged.push({ ...replacement });\n    }\n    let frame = body;\n    const spans = [];\n    const targets = [];\n    let primaryIndex = 0;\n    let delta = 0;\n    for (const replacement of merged) {\n        targets.push(replacement.start + delta + replacement.inserted.length);\n        if (replacement.primary) primaryIndex = targets.length - 1;\n        delta += replacement.inserted.length - (replacement.end - replacement.start);\n    }\n    let frameSource = source;\n    for (const replacement of merged.toReversed()) {\n        const deleted = body.slice(replacement.start, replacement.end);\n        if (deleted === replacement.inserted) continue;\n        const point = pointAt(frameSource, replacement.start);\n        const line = point.line - startLine;\n        const span = newReplaceSpan({ start_line: line,\n            start_col: encoder.encode(frameSource.lines[line].slice(0, point.col)).length,\n            deleted_text: deleted, inserted_text: replacement.inserted });\n        frame = applyReplaceSpan(frame, span);\n        frameSource = indexSource(frame, startLine);\n        spans.push(span);\n    }\n    return { handled: true, spans, selection: normaliseSelection({ ranges: targets.map(offset => caretRange(pointAt(frameSource, offset))), primaryIndex, verticalColumn: null }) };\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as twgl from 'twgl';\nimport { OutputMetadataPanel } from './output-metadata-panel.mjs';\nimport { Anchor, Node, Placeholder } from './base.mjs';\nimport { Tile } from './tile.mjs';\nimport { Document } from './document.mjs';\nimport * as ui from './evilui.mjs'\nimport { Demon } from './demon.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Button } from './button.mjs';\nimport * as textutils from './text-utils.mjs';\nimport { CommanderBus } from '../commander.mjs';\nimport { currentEvil } from '../eviltime.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport {\n    currentFocusContainer,\n    currentFocusedInputCell,\n    replaceTopFocusEntry,\n} from './focus-manager.mjs';\nimport { blockIdentity, canRetargetBlock } from './linear-space.mjs';\nimport {\n    inferPreviewTableLayout,\n    previewCell,\n    previewRowCount,\n    tableViewData,\n} from './tableview-helpers.mjs';\nimport {\n    countBlockPerf,\n    countBlockTransitionPerf,\n    outputCellBoxColor,\n    tableviewBoxColor,\n} from './documentview-utils.mjs';\nimport { appendClickTraceEvent } from './click-trace.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { pushTestingPortalTimingTrace, pushTestingTableviewTrace, withPortalTimingScope } from './testing-trace.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\nimport { createVisualizationPlugin } from './visualization-plugin-registry.mjs';\nimport { splitBody } from '../../puffbook-editchain.mjs';\nimport { localSourceRangeEndingAtOutputLine } from '../../puffbook-output-lines.mjs';\nimport { badgeSpecForLineStatus, badgeSpecForLocalWaiting } from '../../puffbook-line-status.mjs';\nimport { applyReplaceSpan, replaceSpanChainFromChange } from '../../puffbook-replacespan.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { inputRouteLoggingEnabled } from './input-route-log.mjs';\nimport { isSpaceTabKey } from './space-tabs.mjs';\nimport { rowSelection, primaryFocus, selectionAt } from '../../puffbook-selection.mjs';\n\nconst TABLEVIEWS_ENABLED = true;\nconst OUTPUT_TRANSITION_DURATION_S = 0.3;\nconst OUTPUT_TABLEVIEW_TRANSITION_DURATION_S = 0.4;\nconst OUTPUT_PLOT_TRANSITION_DURATION_S = 0.5;\nconst OUTPUT_TRANSITION_EASE = 'easeInOutSine';\nconst DOCUMENT_ROW_LEFT_MARGIN_W = 100;\nconst TABLE_PREVIEW_META_X = 8;\nconst TABLE_PREVIEW_META_Y_PAD = 4;\nconst TABLE_PREVIEW_META_FONT_SIZE = 12;\nconst TABLE_PREVIEW_META_COLOR = [1.0, 0.9411, 0.8745, 0.58];\nconst TABLE_PREVIEW_META_NUMBER_COLOR = [1.0, 0.9411, 0.8745, 0.82];\nconst DOCUMENT_ROW_TEXT_Y = 2;\nconst OUTPUT_ROW_TEXT_Y = 0;\nconst DOCUMENT_ROW_BADGE_Y = 4;\nconst TITLE_ROW_TEXT_Y = 5;\nconst TITLE_ROW_TEXT_X = 6;\nconst TITLE_ROW_DISPLAY_TEXT_Y = 2;\nconst TITLE_ROW_FONT_SIZE = 36;\nconst TITLE_ROW_FONT_COLOR = [1.0, 0.6, 0.1, 1.0];\nconst PENDING_LOCAL_INPUT_FONT_COLOR = [1.0, 0.18, 0.18, 1.0];\nconst PENDING_SENT_INPUT_FONT_COLOR = [1.0, 0.58, 0.12, 1.0];\nconst DOCUMENT_ROW_FONT_SIZE = 20;\nconst DOCUMENT_WHEEL_STEP = 28;\nconst DOCUMENT_WHEEL_BOOST = 3.0;\nconst DOCUMENT_SHIFT_WHEEL_CARRY = 0.08;\nconst DOCUMENT_SHIFT_WHEEL_DRAG = 0.58;\nconst DOCUMENT_THROW_DECAY_PER_SECOND = -60.0 * Math.log(0.95);\nconst DOCUMENT_THROW_STOP_PX_PER_SECOND = 4.0;\nconst EMPTY_SEARCH_RANGES = Object.freeze([]);\nconst DOCUMENT_SEARCH_SCROLL_DURATION_S = 0.45;\nconst DOCUMENT_SEARCH_SCROLL_DECAY_PER_SECOND = 20;\nconst DOCUMENT_VIEWPORT_SCOPE_REBASE_THRESHOLD_VIEWPORTS = 1.0;\nconst PASSIVE_PREVIEW_RETAIN_MARGIN_PX = 600;\nconst PASSIVE_PREVIEW_RECYCLE_DELAY_MS = 1000;\nconst OUTPUT_PREVIEW_RESIDENCY = Object.freeze({\n    ABSENT: 'absent',\n    ENSURING: 'ensuring',\n    RETAINED: 'retained',\n    RECYCLE_PENDING: 'recycle_pending',\n});\nconst OUTPUT_PREVIEW_BAND = Object.freeze({\n    VISIBLE: 'visible',\n    WARM: 'warm',\n    OUT_OF_BAND: 'out_of_band',\n});\nconst PORTAL_DEV_HUD_VISIBILITY_EVENT = 'portal:dev-hud-visibility';\n\n/* Summarise one document-edit batch so typing-path instrumentation stays compact. */\nfunction summariseDocEdits(edits) {\n    const summary = {\n        edit_count: Array.isArray(edits) ? edits.length : 0,\n        by_kind: {},\n        min_line: null,\n        max_line: null,\n        touched_lines_sample: [],\n        has_reset: false,\n    };\n    if (!Array.isArray(edits)) {\n        return summary;\n    }\n    for (const edit of edits) {\n        const kind = edit?.kind ?? 'unknown';\n        summary.by_kind[kind] = (summary.by_kind[kind] ?? 0) + 1;\n        if (kind === 'reset') {\n            summary.has_reset = true;\n        }\n        const line = edit?.line;\n        if (!Number.isInteger(line) || line < 0) {\n            continue;\n        }\n        summary.min_line = summary.min_line === null ? line : Math.min(summary.min_line, line);\n        summary.max_line = summary.max_line === null ? line : Math.max(summary.max_line, line);\n        if (summary.touched_lines_sample.length < 12 && !summary.touched_lines_sample.includes(line)) {\n            summary.touched_lines_sample.push(line);\n        }\n    }\n    return summary;\n}\n\n/* Compare the value fields a reusable mounted block must still receive. */\nfunction sameBlockProjection(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (!a || !b || blockIdentity(a) !== blockIdentity(b)) {\n        return false;\n    }\n    return a.text === b.text\n        && a.state === b.state\n        && a.status === b.status\n        && a.read_only === b.read_only\n        && a.local_waiting === b.local_waiting\n        && a.refreshing === b.refreshing\n        && a.server_state_kind === b.server_state_kind\n        && a.payload_ref === b.payload_ref\n        && a.preview_kind === b.preview_kind\n        && a.preview_hints === b.preview_hints\n        && sameBlockInputSyncSpans(a.input_sync_spans, b.input_sync_spans);\n}\n\nfunction sameBlockInputSyncSpans(a, b) {\n    const left = Array.isArray(a) ? a : [];\n    const right = Array.isArray(b) ? b : [];\n    return left.length === right.length && left.every((span, index) =>\n        span?.start_col === right[index]?.start_col\n        && span?.end_col === right[index]?.end_col\n        && span?.phase === right[index]?.phase);\n}\n\n/* Summarise one mounted preview-bearing output cell so churn can be diagnosed from the backdoor without renderer introspection. */\nfunction describePreviewCell(cell, block = null) {\n    if (!cell) {\n        return null;\n    }\n    const viewport = cell.testingViewport ?? null;\n    const tableview = cell.testingTableView ?? null;\n    return {\n        line: cell.testingPuffbookLine ?? null,\n        block_type: block?.block_type ?? null,\n        visual_kind: cell.outputVisualKind ?? 'none',\n        cell_height: Number.isFinite(cell.height) ? cell.height : null,\n        cell_y: cell.localPosition?.()?.[1] ?? null,\n        preview_height: Number.isFinite(cell.outputPreviewHeight) ? cell.outputPreviewHeight : null,\n        viewport_name: viewport?.state?.name ?? null,\n        viewport_visible: viewport?.visible ?? null,\n        viewport_height: Number.isFinite(viewport?.state?.height) ? viewport.state.height : null,\n        tableview_name: tableview?.state?.name ?? null,\n    };\n}\nconst TABLE_PREVIEW_META_NUMBER = new Intl.NumberFormat('en-US');\nconst OUTPUT_METADATA_BUTTON_SIZE = 22;\nconst OUTPUT_METADATA_ICON_ID = 31;\nconst OUTPUT_METADATA_SIDE_GAP = 64;\nconst OUTPUT_METADATA_SIDE_WIDTH = 420;\nconst OUTPUT_METADATA_SIDE_PAD = 10;\nconst OUTPUT_METADATA_SIDE_ROW_H = 18;\nconst OUTPUT_METADATA_SIDE_FONT_SIZE = 12;\nconst OUTPUT_METADATA_SIDE_MAX_HEIGHT = 420;\nconst OUTPUT_TEXT_CHROME_RESERVED_W = 72;\n\nfunction hasWheelInput(events) {\n    return !!events\n        && (\n            events.has?.('SCROLL_DOWN')\n            || events.has?.('SCROLL_UP')\n            || events.has?.('SCROLL_LEFT')\n            || events.has?.('SCROLL_RIGHT')\n            || events.has?.('SCROLL_DOWN_PIXEL')\n            || events.has?.('SCROLL_UP_PIXEL')\n            || events.has?.('SCROLL_LEFT_PIXEL')\n            || events.has?.('SCROLL_RIGHT_PIXEL')\n            || (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && ((events.wheelDeltaX ?? 0) !== 0 || (events.wheelDeltaY ?? 0) !== 0))\n        );\n}\n\nfunction hasBackgroundScrollInput(events) {\n    return !!events\n        && (\n            hasWheelInput(events)\n            || events.has?.('L_MOUSE_DOWN_HOLD')\n            || events.has?.('L_MOUSE_UP')\n        );\n}\n\nfunction hasHorizontalWheelInput(events) {\n    return !!events\n        && (\n            events.has?.('SCROLL_LEFT')\n            || events.has?.('SCROLL_RIGHT')\n            || events.has?.('SCROLL_LEFT_PIXEL')\n            || events.has?.('SCROLL_RIGHT_PIXEL')\n            || (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && (events.wheelDeltaX ?? 0) !== 0)\n        );\n}\n\nfunction filterHorizontalWheelInput(events) {\n    if (!hasHorizontalWheelInput(events)) {\n        return null;\n    }\n    const filtered = new Set();\n    for (const event of events ?? []) {\n        if (\n            event === 'SCROLL_LEFT'\n            || event === 'SCROLL_RIGHT'\n            || event === 'SCROLL_LEFT_PIXEL'\n            || event === 'SCROLL_RIGHT_PIXEL'\n            || event === 'SHIFT_KEY'\n            || event === 'CTRL_KEY'\n        ) {\n            filtered.add(event);\n        }\n    }\n    filtered.frameDeltaTime = events?.frameDeltaTime;\n    filtered.wheelDeltaMode = events?.wheelDeltaMode;\n    filtered.wheelDeltaX = events?.wheelDeltaX ?? 0;\n    filtered.wheelDeltaY = 0;\n    return filtered;\n}\n\nfunction filterPrimaryDragInput(events) {\n    if (!(events?.has?.('L_MOUSE_DOWN_HOLD') || events?.has?.('L_MOUSE_UP'))) {\n        return null;\n    }\n    const filtered = new Set();\n    if (events.has?.('L_MOUSE_DOWN_HOLD')) {\n        filtered.add('L_MOUSE_DOWN_HOLD');\n    }\n    if (events.has?.('L_MOUSE_UP')) {\n        filtered.add('L_MOUSE_UP');\n    }\n    filtered.frameDeltaTime = events?.frameDeltaTime;\n    return filtered;\n}\n\nfunction formatDocumentLineNumber(lineNum) {\n    let text = `${lineNum}`;\n    return ' '.repeat(Math.max(0, 4 - text.length)) + text;\n}\n\nfunction easeInOutSine(t) {\n    return -(Math.cos(Math.PI * t) - 1) / 2;\n}\n\n/* Format one whole-number count with stable thousands separators for preview chrome. */\nfunction formatPreviewMetaCount(value) {\n    const n = Number.isFinite(value) ? Math.max(0, Math.round(value)) : 0;\n    return TABLE_PREVIEW_META_NUMBER.format(n);\n}\n\n/* Round one byte count onto the nearest SI unit so preview chrome stays short and legible. */\nfunction formatPreviewMetaBytes(bytes) {\n    const units = ['B', 'kB', 'MB', 'GB', 'TB'];\n    let value = Number.isFinite(bytes) ? Math.max(0, bytes) : 0;\n    let unit = 0;\n    while (value >= 999.5 && unit < units.length - 1) {\n        value /= 1000;\n        unit += 1;\n    }\n    return `${TABLE_PREVIEW_META_NUMBER.format(Math.round(value))} ${units[unit]}`;\n}\n\n/* Derive one stable rows/cols/bytes summary from the table payload rather than from viewport state. */\nfunction tablePreviewMeta(struct) {\n    const table = tableViewData(struct);\n    const names = table?.fieldNames?.() ?? [];\n    let rows = typeof table?.length === 'function' ? Number(table.length()) : NaN;\n    if (!Number.isFinite(rows) || rows < 0) {\n        rows = 0;\n        for (const name of names) {\n            rows = Math.max(rows, previewRowCount(table.field(name)));\n        }\n    }\n    return {\n        rows: Math.max(0, Math.round(rows)),\n        cols: names.length,\n        bytes: struct?._builder?.buffer?.byteLength ?? 0,\n    };\n}\n\n/* Collapse one table summary into one footer line so wide row counts stay inside the preview width. */\nfunction tablePreviewMetaText(struct) {\n    const meta = tablePreviewMeta(struct);\n    return `${formatPreviewMetaCount(meta.rows)} rows, ${formatPreviewMetaCount(meta.cols)} cols, ${formatPreviewMetaBytes(meta.bytes)}`;\n}\n\n/* Split one table summary into bright numeric spans plus dim labels/units for easier scanning. */\nfunction tablePreviewMetaSegments(struct) {\n    const meta = tablePreviewMeta(struct);\n    const size = formatPreviewMetaBytes(meta.bytes);\n    const cut = size.indexOf(' ');\n    const sizeNumber = cut >= 0 ? size.slice(0, cut) : size;\n    const sizeUnit = cut >= 0 ? size.slice(cut) : '';\n    return [\n        { text: formatPreviewMetaCount(meta.rows), color: TABLE_PREVIEW_META_NUMBER_COLOR },\n        { text: ' rows, ', color: TABLE_PREVIEW_META_COLOR },\n        { text: formatPreviewMetaCount(meta.cols), color: TABLE_PREVIEW_META_NUMBER_COLOR },\n        { text: ' cols, ', color: TABLE_PREVIEW_META_COLOR },\n        { text: sizeNumber, color: TABLE_PREVIEW_META_NUMBER_COLOR },\n        { text: sizeUnit, color: TABLE_PREVIEW_META_COLOR },\n    ];\n}\n\n/* Estimate one preview header height with the same magic multiplier TableView currently uses for passive preview headers. */\nfunction estimatedTablePreviewHeaderHeight(fontSize) {\n    return fontSize * 3.0;\n}\n\n/* Reuse TableView's passive preview row-height maths so absent preview shells still reserve nearly-correct layout. */\nfunction estimatedTablePreviewRowHeight(font, fontSize, previewHints) {\n    const lineHeight = font?.fontData?.lineHeight;\n    const cellPadding = 12;\n    const resolvedLineHeight = Number.isFinite(lineHeight) && lineHeight > 0\n        ? lineHeight * fontSize\n        : fontSize * 1.325;\n    const inferred = inferPreviewTableLayout(previewHints, { rowHeightPercentile: 0.9 });\n    if (Number.isInteger(inferred.rowHeight) && inferred.rowHeight > 0) {\n        return inferred.rowHeight * resolvedLineHeight + cellPadding;\n    }\n    return resolvedLineHeight + cellPadding;\n}\n\n/* Resolve whether one output block is showing a retained stale value while backend recompute is still in flight. */\nfunction blockIsRefreshing(block) {\n    return block?.disposition === 'out'\n        && (block?.refreshing === true || block?.local_waiting === true);\n}\n\n/* Decide whether one hidden output update should retain the stale visible shell because the server is still pending. */\nfunction blockRetainsVisibleOutput(block) {\n    return block?.disposition === 'out'\n        && block?.block_type === 'hidden'\n        &&  (block?.server_state_kind === 'terminal_pending' || block?.refreshing === true || (typeof block?.payload_ref === 'string' && block.payload_ref !== ''));\n}\n\n/* Return one closed transition result so output sync helpers do not need scratch flags on the cell. */\nfunction outputTransitionResult({ opened = false, retained = false } = {}) {\n    return {\n        opened: opened === true,\n        retained: retained === true,\n    };\n}\n\n/* Compare two RGBA arrays by value so output-shell recolours do not depend on array identity. */\nfunction sameColor(a, b) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n        return false;\n    }\n    return a.every((value, i) => value === b[i]);\n}\n\n/* Compare projected input sync spans by value so partial ratification recolours only the changed glyph ranges. */\nfunction sameInputSyncSpans(a, b) {\n    const left = Array.isArray(a) ? a : [];\n    const right = Array.isArray(b) ? b : [];\n    if (left.length !== right.length) {\n        return false;\n    }\n    for (let i = 0; i < left.length; i += 1) {\n        if (left[i]?.start_col !== right[i]?.start_col\n            || left[i]?.end_col !== right[i]?.end_col\n            || left[i]?.phase !== right[i]?.phase) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Compare one mounted/projected input block at the display seam, including pure style-state changes. */\nfunction sameProjectedInputDisplayBlock(a, b) {\n    return !!a\n        && !!b\n        && a.block_type === b.block_type\n        && (a.text ?? '') === (b.text ?? '')\n        && (a.read_only === true) === (b.read_only === true)\n        && sameInputSyncSpans(a.input_sync_spans, b.input_sync_spans)\n        && (a.status ?? null) === (b.status ?? null)\n        && (a.local_waiting === true) === (b.local_waiting === true);\n}\n\n/* Keep the steady authoritative input colour separate from per-span pending overlays. */\nfunction inputBlockFontColor(_block) {\n    return Palette.white;\n}\n\n/* Title rows hide the markdown heading leader while keeping source indices in raw puffbook coordinates. */\nfunction projectTitleInput(text) {\n    if (typeof text !== 'string' || !text.startsWith('## ')) {\n        return {\n            sourcePrefixChars: 0,\n            displayText: text ?? '',\n        };\n    }\n    return {\n        sourcePrefixChars: 3,\n        displayText: text.substring(3),\n    };\n}\n\n/* Keep per-row read-only enforcement at the document boundary, including delegated InputCell events. */\nfunction isDocumentMutationKey(evt) {\n    const key = evt?.key;\n    if (['Backspace', 'Delete', 'Enter', 'Tab', 'paste', 'cut'].includes(key)) {\n        return true;\n    }\n    if ((evt?.ctrlKey || evt?.metaKey) && typeof key === 'string' && key.toLowerCase() === 'z') {\n        return true;\n    }\n    return !(evt?.ctrlKey || evt?.metaKey) && typeof key === 'string' && key.length === 1;\n}\n\n/* Translate browser text-input intent into the existing authoritative document command vocabulary. */\nfunction documentKeyEventFromBeforeInput(evt) {\n    if (!evt || typeof evt.inputType !== 'string') {\n        return null;\n    }\n    const base = {\n        ctrlKey: false,\n        metaKey: false,\n        shiftKey: false,\n        altKey: false,\n    };\n    switch (evt.inputType) {\n        case 'deleteContentBackward':\n            return { ...base, key: 'Backspace' };\n        case 'deleteContentForward':\n            return { ...base, key: 'Delete' };\n        case 'insertText':\n        case 'insertCompositionText':\n        case 'insertFromComposition':\n        case 'insertFromPaste': {\n            const text = typeof evt.data === 'string'\n                ? evt.data\n                : evt.dataTransfer ?? evt.clipboardData ?? '';\n            return typeof text === 'string' && text.length === 1\n                ? { ...base, key: text }\n                : { ...base, key: 'paste', clipboardData: text };\n        }\n        default:\n            return null;\n    }\n}\n\n\n/**\n    Renders a document as a large rectangular area, which is typically much\n    bigger than the screen. It is the job of parent elements to cull/crop/clip\n    it to fit in the viewport.\n\n    This is about rendering the UI. The document prep and editing itself is in\n    the Document and Puffbook classes. The DocumentView owns the cursor, since\n    if (hypothetically) we had several DocumentViews on the same document, they\n    could legitimately have separate cursor positions.\n*/\nexport class DocumentView extends Node {\n    focusContainerKind = 'DocumentView'\n\n    constructor(state) {\n        const width = Number.isFinite(state?.width) ? state.width : 1100;\n        if (!state.font) {\n            throw new Error(`font resource not set on DocumentView. This is mandatory. Call await evilfont.createMSDFFont(fontName) to create one.`);\n        } else if (!state.doc || !(state.doc instanceof Document)) {\n            throw new Error(`DocumentView({doc: ${state.doc} ${state.doc?.constructor?.name}}): wrong type for 'doc', expected ui.Document.`);\n        }\n\n        super({\n            doc: null, // Should derive from ui.Document\n            font: null,\n            cursor: [0, 0],\n            ...state,\n            width,\n        });\n        //this.#slab = new Tile({width: this.state.width, height: 100, depth: 1, z: 5, color: [0.5, 0.5, 0.5, 1.0]});\n        //this.appendChild(this.#slab);\n\n        this.#cells = [];\n        this.#blocks = [];\n        this.#tableInspectOwnerToken = {};\n        this.#expandedInspectSessions = new Map();\n        this.#imagePreviewLoadSeq = 0;\n\n        this.tableviewFont = state.tableviewFont || state.font;\n        this.tableviewHeaderFont = state.tableviewHeaderFont || state.font;\n        this.#lineScrollOffsets = new WeakMap();\n        this.#lineScrollOffsetsByIndex = new Map();\n        this.lineOfCurrentTableview = -1\n        this.loaderPreviewReadyLine = -1;\n        this.loaderRecomputeFinishedLine = -1;\n        this.#documentFocusActive = false;\n        this.#initialFocusPending = true;\n        this.#viewportModel = {\n            scroll_y: 0,\n            viewport_h: 0,\n            anchor_mode: 'top',\n            anchor_offset_y: 0,\n        };\n        this.#scrollY = 0;\n        this.#throwVelocityY = 0;\n        this.#currentThrowVelocityY = 0;\n        this.#viewportScrollInitialised = false;\n        this.#viewportScopeBaseDocY = 0;\n\n        // We use this for all content that gets recycled regularly as the\n        // document is rebuilt, objects that are longer lived should be outside\n        // this layer (as above).\n        this._viewportScopeRoot = new Anchor({\n            name: ui.uniqueName(`${this.state.name ?? 'documentview'}.viewport_scope`),\n            textBatchScopeKey: `${this.state.name ?? 'documentview'}.viewport.text`,\n        });\n        this.appendChild(this._viewportScopeRoot);\n        this._blockRoot = new Placeholder({});\n        this._viewportScopeRoot.appendChild(this._blockRoot);\n        this._contentChromeRoot = new Placeholder({});\n        this._viewportScopeRoot.appendChild(this._contentChromeRoot);\n        this.#refreshPending = false;\n        this.ownLoaderScreen = null;\n        this.ownOnLeftTableviewWKey = null;\n        this.ownOnApplyAmendToDoc = null;\n        this.ownOnAmendRecomputeFinished = null;\n        this.ownOnDocChange = null;\n        this.#documentBinding = null;\n        this.ownWorkThink = null;\n        this.#docWorkPending = false;\n        this.#applyingExpandedProjection = false;\n        this.#lastWorkThinkS = null;\n        this.#projectionRestorePending = true;\n        this.#pendingLineReveal = null;\n        this.sourceDragMode = null;\n        this.ownSourceDragThink = null;\n\n        this.#setupSignals()\n        // TODO: Codex pointed out TableView code assumes this.scene is non-null, which is not generally true at this point.\n        this.refresh();\n    }\n\n    #setupSignals() {\n        this.ownOnLeftTableviewWKey = () => {\n            pushTestingTableviewTrace('documentview_left_tableview_signal', {\n                line_of_current_tableview: this.lineOfCurrentTableview ?? -1,\n            });\n            this.lineOfCurrentTableview = -1;\n            this.loaderPreviewReadyLine = -1;\n            this.loaderRecomputeFinishedLine = -1;\n        };\n        CommanderBus.on(\"LEFT_TABLEVIEW_W_KEY\", this.ownOnLeftTableviewWKey);\n\n        this.ownOnApplyAmendToDoc = () => {\n            if (this.ownLoaderScreen?.parentNode) {\n                this.ownLoaderScreen.parentNode.removeChild(this.ownLoaderScreen);\n            }\n            this.ownLoaderScreen = null;\n            this.loaderPreviewReadyLine = -1;\n            this.loaderRecomputeFinishedLine = -1;\n        };\n        CommanderBus.on(\"APPLY_AMEND_TO_DOC\", this.ownOnApplyAmendToDoc);\n\n        this.ownOnAmendRecomputeFinished = (data) => {\n            const lineNum = data?.lineNum;\n            if (!Number.isInteger(lineNum)) {\n                return;\n            }\n            this.loaderRecomputeFinishedLine = lineNum;\n            this.#tryFinishCurrentTableviewLoad(lineNum);\n        };\n        CommanderBus.on(\"AMEND_RECOMPUTE_FINISHED\", this.ownOnAmendRecomputeFinished);\n    }\n\n    /* Resolve one output cell for a line, preferring the canonical output-slot index before fallback scan. */\n    #testingOutputCellForLine(lineNum) {\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        const idx = lineNum * 2 + 1;\n        const direct = this.#cells[idx] ?? null;\n        if (direct?.testingPuffbookLine === lineNum) {\n            return direct;\n        }\n        for (const cell of this.#cells) {\n            if (cell.testingPuffbookLine === lineNum) {\n                return cell;\n            }\n        }\n        return null;\n    }\n\n    /* Snapshot a few mounted preview rows so live doc-edit traces can report whether untouched previews moved, hid, or remounted. */\n    #tracePreviewRows(lines) {\n        if (!Array.isArray(lines) || lines.length === 0) {\n            return [];\n        }\n        const out = [];\n        for (const lineNum of lines) {\n            if (!Number.isInteger(lineNum) || lineNum < 0) {\n                continue;\n            }\n            const idx = lineNum * 2 + 1;\n            out.push(describePreviewCell(\n                this.#cells[idx] ?? this.#testingOutputCellForLine(lineNum),\n                this.#blocks[idx] ?? null,\n            ));\n            if (out.length >= 8) {\n                break;\n            }\n        }\n        return out.filter(Boolean);\n    }\n\n    testingTableHeadersForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const tableview = cell?.testingTableView ?? null;\n        if (tableview && typeof tableview.testingHeaderColumns === 'function') {\n            return tableview.testingHeaderColumns();\n        }\n        return null;\n    }\n\n    testingTableViewportForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const viewport = cell?.testingViewport ?? null;\n        if (viewport && typeof viewport.testingCanvasPoint === 'function') {\n            return viewport.testingCanvasPoint();\n        }\n        return null;\n    }\n\n    testingTableControlsForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const tableview = cell?.testingTableView ?? null;\n        if (tableview && typeof tableview.testingControls === 'function') {\n            return tableview.testingControls();\n        }\n        return null;\n    }\n\n    /* Expose one puff status badge node so focused tests can trigger the same affordance path as the live row chrome. */\n    testingStatusBadgeForLine(lineNum) {\n        return this.#cells[lineNum * 2]?.statusBadge ?? null;\n    }\n\n    /* Activate one tableview chrome command for a line through its owning TableView. */\n    testingActivateTableControlForLine(lineNum, control) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const tableview = cell?.testingTableView ?? null;\n        if (tableview && typeof tableview.testingActivateControl === 'function') {\n            return tableview.testingActivateControl(control) === true;\n        }\n        return false;\n    }\n\n    /* Force one tableview row to leave interactive mode through its owned TableView for deterministic test teardown. */\n    testingLeaveTableForLine(lineNum, sendLeaveSignal = true) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const tableview = cell?.testingTableView ?? null;\n        if (!tableview || typeof tableview.leaveTableview !== 'function') {\n            return false;\n        }\n        tableview.leaveTableview(sendLeaveSignal !== false);\n        return true;\n    }\n\n    testingTableViewForLine(lineNum) {\n        return this.#testingOutputCellForLine(lineNum)?.testingTableView ?? null;\n    }\n\n    /* Report one table preview gutter summary so tests can verify the chrome without renderer introspection. */\n    testingTablePreviewMetadataForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        return cell?.tablePreviewMetaSegments?.map((node) => node?.state?.text ?? '').join('') ?? null;\n    }\n\n    /* Click the result metadata toggle for one output line during tests. */\n    testingToggleOutputMetadataForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const button = cell?.outputMetadataButton ?? null;\n        if (!button || button.enabled !== true) {\n            return false;\n        }\n        button.onInput?.('L_MOUSE_UP');\n        return true;\n    }\n\n    /* Report the result metadata panel state without reaching into private cells. */\n    testingOutputMetadataStateForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        if (!cell) {\n            return null;\n        }\n        return {\n            open: cell.outputMetadataWindow?.parentNode != null,\n            visible: cell.outputMetadataWindow?.visible === true || cell.outputMetadataWindow?.state?.visible === true,\n            enabled: cell.outputMetadataButton?.enabled === true,\n            pinned: false,\n        };\n    }\n\n    /* Return rendered result metadata lines for focused preview ordering tests. */\n    testingOutputMetadataRowsForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        return cell?.outputMetadataWindow?.panel.rows ?? null;\n    }\n\n    testingPreviewResidencyForLine(lineNum) {\n        const cell = this.#cells[lineNum * 2 + 1] ?? null;\n        if (!cell) {\n            return null;\n        }\n        return {\n            residency: cell.outputPreviewResidency ?? OUTPUT_PREVIEW_RESIDENCY.ABSENT,\n            band: cell.outputPreviewBand ?? OUTPUT_PREVIEW_BAND.OUT_OF_BAND,\n            has_viewport: !!cell.testingViewport,\n            has_tableview: !!cell.testingTableView,\n        };\n    }\n\n    /* Expose one output shell snapshot so focused tests can verify row chrome without renderer spelunking. */\n    testingOutputShellForLine(lineNum) {\n        const cell = this.#cells[lineNum * 2 + 1] ?? this.#testingOutputCellForLine(lineNum);\n        return cell ? {\n            backing_color: Array.isArray(cell.textBacking?.state?.color) ? [...cell.textBacking.state.color] : null,\n            height: Number.isFinite(cell.height) ? cell.height : null,\n            output_text_height: Number.isFinite(cell.outputTextHeight) ? cell.outputTextHeight : null,\n            has_layout_anim: !!cell.outputLayoutAnim,\n            last_open_transition: cell.outputLastOpenTransition === true,\n            visual_kind: cell.outputVisualKind ?? 'none',\n        } : null;\n    }\n\n    /* Report the current user-viewport projection as explicit DocumentView state so later local-scroll work has a stable contract. */\n    testingViewportState() {\n        this.#applyViewportNow();\n        const viewport = this.#syncViewportModel();\n        return {\n            scroll_y: viewport.scroll_y,\n            viewport_h: viewport.viewport_h,\n            anchor_mode: viewport.anchor_mode,\n            anchor_offset_y: viewport.anchor_offset_y,\n            visible_top_y: viewport.scroll_y,\n            visible_bottom_y: viewport.scroll_y + viewport.viewport_h,\n        };\n    }\n\n    recordingViewState() {\n        const viewport = this.testingViewportState();\n        return {\n            kind: 'document_view',\n            version: 1,\n            file_ref: this.state?.doc?.fileRef ? { ...this.state.doc.fileRef } : null,\n            scroll_y: viewport.scroll_y,\n        };\n    }\n\n    restoreRecordingViewState(state) {\n        if (!state || state.version !== 1 || !Number.isFinite(state.scroll_y)) {\n            throw new Error('DocumentView replay state requires a finite version-1 scroll_y.');\n        }\n        const expected = state.file_ref;\n        const actual = this.state?.doc?.fileRef;\n        if (expected && (!actual || expected.lake !== actual.lake || expected.path !== actual.path)) {\n            throw new Error(`DocumentView replay file mismatch: expected ${expected.path}, got ${actual?.path ?? 'none'}.`);\n        }\n        this.cancelExponentialDecay('document_scroll_y');\n        this.#setScrollY(this.#clampedScrollY(state.scroll_y));\n        this.#applyViewportNow();\n        this.#updateCursor();\n        return this.recordingViewState();\n    }\n\n    /* Expose the current viewport-scope rebase state so tests can assert that large jumps stop pinning content to document origin. */\n    testingViewportScopeState() {\n        this.#applyViewportNow();\n        return {\n            base_doc_y: this.#viewportScopeBaseDocY,\n            scope_root_y: this._viewportScopeRoot?.localPosition?.()?.[1] ?? null,\n            block_root_y: this._blockRoot?.localPosition?.()?.[1] ?? null,\n            chrome_root_y: this._contentChromeRoot?.localPosition?.()?.[1] ?? null,\n        };\n    }\n\n    /* Summarise the current visible and warm line bands from the already-synchronised viewport model. */\n    #viewportBandsFromModel() {\n        const viewport = this.#syncViewportModel();\n        const visibleTopY = viewport.scroll_y;\n        const visibleBottomY = viewport.scroll_y + viewport.viewport_h;\n        const warmPadY = viewport.viewport_h;\n        const warmTopY = visibleTopY - warmPadY;\n        const warmBottomY = visibleBottomY + warmPadY;\n        const firstVisibleLocalLine = this.#firstLineForDocY(visibleTopY);\n        const visibleLineCount = this.#conservativeViewportLineCount(viewport.viewport_h);\n        const firstVisibleLine = this.#displayLineNumber(firstVisibleLocalLine);\n        const firstWarmLine = Math.max(0, firstVisibleLine - visibleLineCount);\n        const lastVisibleLine = firstVisibleLine + visibleLineCount - 1;\n        const lastWarmLine = firstWarmLine + visibleLineCount * 3 - 1;\n        return {\n            visible_top_y: visibleTopY,\n            visible_bottom_y: visibleBottomY,\n            warm_top_y: warmTopY,\n            warm_bottom_y: warmBottomY,\n            first_visible_line: firstVisibleLine,\n            last_visible_line: lastVisibleLine,\n            first_warm_line: firstWarmLine,\n            last_warm_line: lastWarmLine,\n        };\n    }\n\n    /* Report the current visible and warm document bands so future scheduling can key off the viewport seam directly. */\n    testingViewportBands() {\n        this.#applyViewportNow();\n        return this.#viewportBandsFromModel();\n    }\n\n    /* Let focused tests seed one explicit visible-top state without reaching into private viewport ownership internals. */\n    testingSetViewportScrollY(scrollY) {\n        this.cancelExponentialDecay('document_scroll_y');\n        this.#setScrollY(this.#clampedScrollY(scrollY));\n        this.#applyViewportNow();\n        this.#updateCursor();\n        return this.testingViewportState();\n    }\n\n    /* Report one retained output/document shell summary so leak probes can separate row-cell state from preview payloads. */\n    testingRetentionSummary() {\n        const totals = {\n            cells: this.#cells.length,\n            blocks: this.#blocks.length,\n            tableview_cells: 0,\n            viewport_cells: 0,\n            damon_cells: 0,\n            gl_text_cells: 0,\n            input_cells: 0,\n            line_number_texts: 0,\n            status_badges: 0,\n            text_backings: 0,\n            text_click_areas: 0,\n            text_copy_icons: 0,\n            output_image_previews: 0,\n            output_image_preview_loading: 0,\n            output_layout_anims: 0,\n            output_visual_preview: 0,\n            output_visual_text: 0,\n            output_visual_none: 0,\n            output_preview_height_total: 0,\n            cell_height_total: 0,\n        };\n        const byVisualKind = {};\n        const topCells = [];\n        for (const cell of this.#cells) {\n            const visualKind = cell.outputVisualKind ?? 'none';\n            byVisualKind[visualKind] = (byVisualKind[visualKind] ?? 0) + 1;\n            totals.tableview_cells += cell.testingTableView ? 1 : 0;\n            totals.viewport_cells += cell.testingViewport ? 1 : 0;\n            totals.damon_cells += cell.testingDamon ? 1 : 0;\n            totals.gl_text_cells += cell.glText ? 1 : 0;\n            totals.input_cells += cell.inputCell ? 1 : 0;\n            totals.line_number_texts += cell.lineNumberText ? 1 : 0;\n            totals.status_badges += cell.statusBadge ? 1 : 0;\n            totals.text_backings += cell.textBacking ? 1 : 0;\n            totals.text_click_areas += cell.textClickArea ? 1 : 0;\n            totals.text_copy_icons += cell.textCopyIcon ? 1 : 0;\n            totals.output_image_previews += cell.testingViewport?.testingImagePreview ? 1 : 0;\n            totals.output_image_preview_loading += cell.testingViewport?.testingImagePreviewLoading ? 1 : 0;\n            totals.output_layout_anims += cell.outputLayoutAnim ? 1 : 0;\n            totals.output_visual_preview += visualKind === 'preview' ? 1 : 0;\n            totals.output_visual_text += visualKind === 'text' ? 1 : 0;\n            totals.output_visual_none += visualKind === 'none' ? 1 : 0;\n            totals.output_preview_height_total += Number.isFinite(cell.outputPreviewHeight) ? cell.outputPreviewHeight : 0;\n            totals.cell_height_total += Number.isFinite(cell.height) ? cell.height : 0;\n            topCells.push({\n                line: cell.testingPuffbookLine ?? null,\n                visual_kind: visualKind,\n                height: Number.isFinite(cell.height) ? cell.height : 0,\n                output_preview_height: Number.isFinite(cell.outputPreviewHeight) ? cell.outputPreviewHeight : 0,\n                has_tableview: !!cell.testingTableView,\n                has_viewport: !!cell.testingViewport,\n                has_gl_text: !!cell.glText,\n                has_input_cell: !!cell.inputCell,\n                has_image_preview: !!cell.testingViewport?.testingImagePreview,\n                has_image_preview_loading: !!cell.testingViewport?.testingImagePreviewLoading,\n            });\n        }\n        topCells.sort((a, b) => b.height - a.height || (a.line ?? 0) - (b.line ?? 0));\n        return {\n            totals,\n            by_visual_kind: Object.fromEntries(Object.entries(byVisualKind).sort(([a], [b]) => a.localeCompare(b))),\n            top_cells: topCells.slice(0, 24),\n            scroll_offset_cache: {\n                weak_line_offsets_known: this.#lineScrollOffsetsByIndex.size,\n            },\n        };\n    }\n\n    /* Expose the authoritative current-coordinate row ledger to focused tests. */\n    testingLineLedger() {\n        const entries = [];\n        for (let lineNum = 0; lineNum * 2 < this.#blocks.length; lineNum += 1) {\n            entries.push([lineNum, this.#mountedLineRecord(lineNum)]);\n        }\n        return entries;\n    }\n\n    syncPreviewViewportHeight(viewport) {\n        if (!viewport) {\n            return false;\n        }\n        for (let i = 0; i < this.#cells.length; i++) {\n            const cell = this.#cells[i];\n            if (cell?.testingViewport !== viewport) {\n                continue;\n            }\n            const block = this.#blocks[i] ?? null;\n            if (viewport.expanded && viewport.testingTableView && block?.block_type === 'tableview') {\n                this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                return true;\n            }\n            let nextHeight = viewport.state?.height ?? cell.height;\n            if (viewport.testingTableView && block?.block_type === 'tableview') {\n                const previewHeight = this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                this.#syncTablePreviewMetadata(cell, block.ptrless, previewHeight);\n                nextHeight = previewHeight + this.#tablePreviewMetadataHeight();\n                nextHeight += this.#syncOutputMetadataChrome(cell, block.ptrless, Math.floor(i / 2), nextHeight, previewHeight + 1);\n            } else if (viewport.testingScatterPlot && block?.block_type === 'tableview') {\n                nextHeight = this.#syncRectRendererViewport(viewport, viewport.testingScatterPlot, block.state, 512, 'scatterplot', blockIsRefreshing(block));\n            } else if (viewport.testingDamon && block?.block_type === 'tableview') {\n                nextHeight = this.#syncDamonViewport(viewport, viewport.testingDamon, block.state, blockIsRefreshing(block));\n            }\n            if (cell.outputPreviewSyncSuspended === true) {\n                cell.outputPreviewHeight = nextHeight;\n                return true;\n            }\n            if (cell.height !== nextHeight) {\n                if (cell.outputVisualKind === 'preview') {\n                    cell.outputPreviewHeight = nextHeight;\n                }\n                cell.height = nextHeight;\n                this.#reflowOutputVerticalPositions(i);\n                this.#updateCursor();\n            }\n            this.#syncTablePreviewCull();\n            return true;\n        }\n        return false;\n    }\n\n    /* Keep mounted preview shells visible; preview lifetime is now driven by output/block reconciliation rather than per-frame scroll-band culling. */\n    #syncTablePreviewCull() {\n        for (let i = 0; i < this.#cells.length; i += 1) {\n            const cell = this.#cells[i];\n            const viewport = cell?.testingViewport ?? null;\n            const block = this.#blocks[i] ?? null;\n            if (block?.block_type !== 'tableview') {\n                this.#cancelOutputPreviewRecycle(cell);\n                continue;\n            }\n            this.#cancelOutputPreviewRecycle(cell);\n            cell.outputPreviewBand = OUTPUT_PREVIEW_BAND.VISIBLE;\n            if (viewport) {\n                viewport.setVisibility(true);\n                cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RETAINED;\n            }\n        }\n    }\n\n    testingLineGeometry(lineNum) {\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        const inIndex = lineNum * 2;\n        const outIndex = inIndex + 1;\n        const describeCell = (cell, block) => cell ? {\n            y: cell.localPosition?.()?.[1] ?? null,\n            height: cell.height ?? null,\n            block_type: block?.block_type ?? null,\n            world_y: cell.worldPosition?.()?.[1] ?? null,\n        } : null;\n        const inCell = this.#cells[inIndex] ?? null;\n        const outCell = this.#cells[outIndex] ?? null;\n        return {\n            line: lineNum,\n            input: describeCell(inCell, this.#blocks[inIndex] ?? null),\n            output: describeCell(outCell, this.#blocks[outIndex] ?? null),\n        };\n    }\n\n    /* Expose one rendered gutter label so viewport-reslice tests can assert absolute line numbering. */\n    testingLineNumberText(lineNum) {\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        const cell = this.#cells[lineNum * 2] ?? null;\n        const node = cell?.lineNumberText ?? null;\n        if (!node) {\n            return null;\n        }\n        return typeof node.state?.text === 'string' ? node.state.text : null;\n    }\n\n    /* Expose one mounted input cell so viewport-reslice tests can assert row-shell reuse. */\n    testingInputCellForLine(lineNum) {\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        return this.#cells[lineNum * 2]?.inputCell ?? null;\n    }\n\n    /* Expose one mounted output host cell so viewport-reslice tests can assert shell reuse. */\n    testingOutputHostForLine(lineNum) {\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        return this.#cells[lineNum * 2 + 1] ?? null;\n    }\n\n    testingExpandTableForLine(lineNum) {\n        const cell = this.#testingOutputCellForLine(lineNum);\n        const viewport = cell?.testingViewport ?? null;\n        if (viewport && typeof viewport.expand === 'function') {\n            pushTestingTableviewTrace('documentview_testing_expand_line', {\n                line: lineNum,\n                viewport_expanded: !!viewport.expanded,\n                has_tableview: !!viewport.testingTableView,\n            });\n            viewport.expand();\n            return true;\n        }\n        return false;\n    }\n\n\n    /**\n        Not used for mutation of the document, that is handled by the related\n        ui.Document instance, this refers just to the container.\n    */\n    mutate(newState, { projectInputCells = true } = {}) {\n        super.mutate(newState);\n        // Cursor changes often reuse the existing row DOM. Project only when\n        // authoritative document state must replace InputCell-local state.\n        if (projectInputCells) {\n            this.#syncInputFocus(new Set());\n        }\n        this.#updateCursor({ allowInputCellSync: projectInputCells });\n        this.#clampCameraVertical();\n        this.#reportProjectionFocus();\n    }\n\n    /**\n        Return height of the document in wpix.\n    */\n    height() {\n        if (this.#cells.length === 0) {\n            return 0;\n        }\n\n        const last = this.#cells[this.#cells.length - 1];\n        return last.localPosition()[1] + last.height;\n    }\n\n    refresh() {\n        const blocks = this.state.doc.render();\n        this.#applyAuthoritativeProjection(blocks);\n        this.#syncViewportModel();\n        this.#syncTablePreviewCull();\n        if (this.#maybeClaimInitialFocus()) {\n            this.#updateCursor();\n        }\n        this.#applyPendingLineReveal();\n        this.#syncSearchPresentation();\n        // A full reconcile already reflects the document's current authoritative\n        // state, so any queued incremental edits are now stale and must not be\n        // replayed on the next frame.\n        this.#consumeDocumentUpdate();\n        this.#syncWorkThink();\n    }\n\n    /* Mount one long-lived chrome node on the scrolling chrome root so it follows document-local viewport motion without joining row reconciliation. */\n    mountContentChrome(node) {\n        if (!(node instanceof Node)) {\n            throw new Error(`DocumentView.mountContentChrome(${node}): expected a Node.`);\n        }\n        this._contentChromeRoot.appendChild(node);\n        return node;\n    }\n\n    /* Mount one dialog above document-local preview surfaces by targeting the enclosing viewport container instead of scrolling row chrome. */\n    #mountWindow(state) {\n        const mountParent = state.mountParent ?? this.parentNode ?? this;\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!mountParent || !cam) {\n            return null;\n        }\n        const anchor = state.anchor ?? 'center';\n        let x = state.x ?? null;\n        let y = state.y ?? null;\n        if (!Number.isFinite(x) || !Number.isFinite(y)) {\n            const centreWorld = cam.getWorldCameraCenter?.()\n                ?? cam.localPosition?.()\n                ?? [0, 0, 0];\n            const centreScene = this.scene?.worldToPresentationPoint\n                ? this.scene.worldToPresentationPoint([centreWorld[0], centreWorld[1], 0])\n                : [centreWorld[0], centreWorld[1], 0];\n            const centreLocal = twgl.m4.transformPoint(\n                twgl.m4.inverse(mountParent.localToWorld()),\n                centreScene,\n            );\n            x = centreLocal[0];\n            y = centreLocal[1];\n        }\n        return ui.UIWindow.mount(this, {\n            ...state,\n            mountParent,\n            anchor,\n            x,\n            y,\n        });\n    }\n\n    /* Run only the document work that is actually pending, instead of polling the whole view every frame. */\n    #runWorkLoop() {\n        this.#advanceOutputLayoutAnimations();\n        const hasSelectionHighlight = this.#hasActiveSelectionHighlight();\n        if (this.#docWorkPending) {\n            this.#docWorkPending = false;\n            const updateStartedMS = performance.now();\n            const update = withPortalTimingScope('documentview.doc_update', {\n                blocked_by_selection: hasSelectionHighlight,\n            }, () => this.#consumeDocumentUpdate());\n            const updateDurationMS = performance.now() - updateStartedMS;\n            const edits = update?.edits ?? [];\n\n            if (edits.length > 0) {\n                if (hasSelectionHighlight) {\n                    pushTestingPortalTimingTrace('documentview_workloop_update', {\n                        ...summariseDocEdits(edits),\n                        doc_update_ms: Number(updateDurationMS.toFixed(3)),\n                        apply_doc_update_ms: 0,\n                        blocked_by_selection: true,\n                    });\n                    this.#refreshPending = true;\n                    this.#updateCursor();\n                    this.#clampCameraVertical();\n                    return;\n                }\n                this.#refreshPending = false;\n                const applyStartedMS = performance.now();\n                withPortalTimingScope('documentview.apply_doc_update', {\n                    edit_count: edits.length,\n                }, () => this.#applyDocUpdate(update));\n                pushTestingPortalTimingTrace('documentview_workloop_update', {\n                    ...summariseDocEdits(edits),\n                    doc_update_ms: Number(updateDurationMS.toFixed(3)),\n                    apply_doc_update_ms: Number((performance.now() - applyStartedMS).toFixed(3)),\n                    blocked_by_selection: false,\n                });\n                this.#updateCursor();\n                this.#clampCameraVertical();\n                return;\n            }\n            pushTestingPortalTimingTrace('documentview_workloop_update', {\n                ...summariseDocEdits(edits),\n                doc_update_ms: Number(updateDurationMS.toFixed(3)),\n                apply_doc_update_ms: 0,\n                blocked_by_selection: false,\n            });\n        }\n\n        if (this.#refreshPending && !hasSelectionHighlight) {\n            this.#refreshPending = false;\n            this.refresh();\n        }\n\n        this.#updateCursor();\n        this.#clampCameraVertical();\n    }\n\n    _onAttachNode(shared) {\n        this.#projectionRestorePending = true;\n        this.#attachDocumentBinding();\n        this.refresh();\n        if (!this.ownOnDevHudVisibility && typeof globalThis?.addEventListener === 'function') {\n            this.ownOnDevHudVisibility = () => this.#refreshMountedInputCellDisplayStyles();\n            globalThis.addEventListener(PORTAL_DEV_HUD_VISIBILITY_EVENT, this.ownOnDevHudVisibility);\n        }\n        if (!this.#documentBinding && !this.ownOnDocChange) {\n            this.ownOnDocChange = () => this.#scheduleDocumentWork();\n            this.state.doc.onChange?.(this.ownOnDocChange);\n        }\n        if (this.#maybeClaimInitialFocus()) {\n            this.#updateCursor();\n        }\n        this.#syncViewportModel();\n        this.#initialiseViewportScrollFromPresentation();\n        this.#restoreProjectedViewport();\n        this.#applyViewportNow();\n        this.#restoreProjectedFocus();\n        this.#applyPendingLineReveal();\n        this.#projectionRestorePending = false;\n        this.#reportProjectionFocus();\n        this.#reportProjectionViewport();\n    }\n\n    _onDetachNode(shared) {\n        this.#endSourceDrag(true);\n        for (const cell of this.#cells) {\n            this.#cancelOutputPreviewRecycle(cell);\n        }\n        if (this.ownOnLeftTableviewWKey) {\n            CommanderBus.off(\"LEFT_TABLEVIEW_W_KEY\", this.ownOnLeftTableviewWKey);\n            this.ownOnLeftTableviewWKey = null;\n        }\n        if (this.ownOnApplyAmendToDoc) {\n            CommanderBus.off(\"APPLY_AMEND_TO_DOC\", this.ownOnApplyAmendToDoc);\n            this.ownOnApplyAmendToDoc = null;\n        }\n        if (this.ownOnAmendRecomputeFinished) {\n            CommanderBus.off(\"AMEND_RECOMPUTE_FINISHED\", this.ownOnAmendRecomputeFinished);\n            this.ownOnAmendRecomputeFinished = null;\n        }\n        if (this.ownOnDocChange) {\n            this.state.doc.offChange?.(this.ownOnDocChange);\n            this.ownOnDocChange = null;\n        }\n        if (this.#documentBinding) {\n            this.#documentBinding.detach();\n            this.#documentBinding = null;\n        }\n        if (this.ownOnDevHudVisibility && typeof globalThis?.removeEventListener === 'function') {\n            globalThis.removeEventListener(PORTAL_DEV_HUD_VISIBILITY_EVENT, this.ownOnDevHudVisibility);\n            this.ownOnDevHudVisibility = null;\n        }\n        this.#clearWorkThink();\n        if (this.ownLoaderScreen?.parentNode) {\n            this.ownLoaderScreen.parentNode.removeChild(this.ownLoaderScreen);\n        }\n        this.ownLoaderScreen = null;\n        this.loaderPreviewReadyLine = -1;\n        this.loaderRecomputeFinishedLine = -1;\n        this.clearRenderedFocus();\n        this.#setDocumentFocusActive(false);\n        this.cancelExponentialDecay('document_scroll_y');\n        this.#projectionRestorePending = true;\n        super._onDetachNode(shared);\n    }\n\n    #refreshMountedInputCellDisplayStyles() {\n        for (const cell of this.#cells) {\n            cell?.inputCell?.refreshDisplayStyle?.();\n        }\n    }\n\n    onKeyDownCapture(evt) {\n        if (!(evt.ctrlKey || evt.metaKey) || evt.altKey || evt.shiftKey || evt.key?.toLowerCase() !== 'f'\n            || evt.isComposing) return false;\n        return this.openFindDialog({ repeat: evt.repeat });\n    }\n\n    /* Find belongs to the open document, even when no document input owns focus. */\n    openFindDialog({ repeat = false } = {}) {\n        const stage = this.scene?.stage;\n        if (typeof this.state.onFind !== 'function'\n            || !stage || stage.activeScene !== this.scene || stage.activeScene === stage.fullscreenScene\n            || this.scene.activeViewport?.expanded === true || this.state.doc.isClosed()) {\n            return false;\n        }\n        if (!repeat) this.state.onFind(this);\n        return true;\n    }\n\n    onKeyDown(evt) {\n        if (this.state.doc.sourceSelectionState) return this.#handleSourceKeyDown(evt);\n        // The focus manager normally reaches the InputCell first. Keep this\n        // container entry point for focus recovery, but derive the exact same\n        // command context from the owned leaf when one is available.\n        const inputCell = this.#ownedFocusedInputCell();\n        if (this.#ownsLiveInputCell(inputCell)) {\n            return this.#handleFocusedInputKeyDown(evt, inputCell);\n        }\n        return this.#processDocumentKeyDown(evt, {\n            cursor: this.state.cursor,\n        });\n    }\n\n    /* Keep IME and browser-generated edits on the same document mutation path as keyboard commands. */\n    onBeforeInput(evt) {\n        if (this.state.doc.sourceSelectionState && this.state.doc.applySourceBeforeInput) {\n            const result = this.state.doc.applySourceBeforeInput(evt);\n            if (result) this.#restoreProjectedFocus();\n            return result;\n        }\n        const command = documentKeyEventFromBeforeInput(evt);\n        if (command === null) {\n            return false;\n        }\n        const inputCell = this.#ownedFocusedInputCell();\n        if (!this.#ownsLiveInputCell(inputCell)) {\n            return false;\n        }\n        this.#handleFocusedInputKeyDown(command, inputCell);\n        // Recognised browser input must never fall through to InputCell's\n        // presentation-only fallback, including no-op and read-only commands.\n        return true;\n    }\n\n    onCompositionEvent(evt) {\n        if (evt.type === 'compositionend' && this.state.doc.finishSourceComposition) {\n            this.state.doc.finishSourceComposition(evt.data ?? '');\n            this.#restoreProjectedFocus();\n        }\n    }\n\n    /* Refresh the derived viewport snapshot after one scene resize so later local viewport ownership has current dimensions. */\n    onViewportResized(_gl) {\n        this.#syncViewportModel();\n        this.#applyViewportNow();\n        this.#applyPendingLineReveal();\n    }\n\n    /* Keep control-wheel reserved for camera zoom, while ordinary vertical puffbook pan/throw stays document-local. */\n    onPointerInput(events) {\n        if (this.sourceDragMode !== null) {\n            // Native double-click can share the release frame; triple-click\n            // arrives on the next press. End selection capture before routing\n            // either batch to the picked input cell's word/line handler.\n            if (this.sourceDragMode === 'selection'\n                && (events.has('DOUBLE_CLICK') || events.has('TRIPLE_CLICK'))\n                && !['L_MOUSE_CANCEL', 'POINTER_CANCEL', 'WINDOW_BLUR'].some(key => events.has(key))) {\n                this.#endSourceDrag();\n                return this.scene.propagatePointerInput(events);\n            }\n            if (['L_MOUSE_UP', 'L_MOUSE_CANCEL', 'POINTER_CANCEL', 'WINDOW_BLUR'].some(key => events.has(key))) {\n                if (events.has('L_MOUSE_UP')) this.#extendSourceDrag();\n                this.#endSourceDrag(!events.has('L_MOUSE_UP'));\n                return true;\n            }\n            if (events.has('L_MOUSE_DOWN_HOLD')) {\n                this.#extendSourceDrag();\n                return true;\n            }\n        }\n        if (!hasBackgroundScrollInput(events)) {\n            return false;\n        }\n        if (this.scene?.dragCapture !== null && filterPrimaryDragInput(events)) {\n            return false;\n        }\n        const hostCam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (shouldYieldWheelToCamera(events)) {\n            return hostCam?.onPointerInput?.(events) === true;\n        }\n        let hostConsumed = false;\n        if (hasHorizontalWheelInput(events) && typeof hostCam?.onPointerInput === 'function') {\n            hostConsumed = hostCam.onPointerInput(filterHorizontalWheelInput(events)) === true;\n        }\n        let deltaY = 0.0;\n        let consumed = false;\n        const wheelScale = events?.has?.('SHIFT_KEY') ? DOCUMENT_WHEEL_BOOST : 1.0;\n        const nowS = this.sceneNowS();\n        for (const event of events) {\n            if (event === 'SCROLL_DOWN') {\n                deltaY += DOCUMENT_WHEEL_STEP * wheelScale;\n                continue;\n            }\n            if (event === 'SCROLL_UP') {\n                deltaY -= DOCUMENT_WHEEL_STEP * wheelScale;\n                continue;\n            }\n            if (event === 'L_MOUSE_DOWN_HOLD') {\n                hostConsumed = this.#forwardHorizontalDragToHostCamera(hostCam, events) || hostConsumed;\n                this.#viewportModel.anchor_mode = 'pointer';\n                this.#viewportModel.anchor_offset_y = this.#pointerViewportOffsetY();\n                if (!Mouse.movedSinceButtonDown(0)) {\n                    consumed = true;\n                    continue;\n                }\n                const dt = this.#inputFrameDeltatime(events);\n                const [_, viewportHeight] = this.#viewportSize();\n                const dragDY = -(Mouse.y - Mouse.lastY) * viewportHeight;\n                if (dragDY === 0.0) {\n                    consumed = true;\n                    continue;\n                }\n                this.#stopHostCameraMotion();\n                this.#commitLiveScroll();\n                if (this.#throwVelocityY !== 0.0 && Math.sign(this.#throwVelocityY) !== Math.sign(dragDY)) {\n                    this.#throwVelocityY = 0.0;\n                }\n                this.#currentThrowVelocityY = dragDY / dt;\n                this.cancelExponentialDecay('document_scroll_y');\n                this.#setScrollY(this.#clampedScrollY(this.#scrollY + dragDY));\n                this.#applyViewportNow();\n                this.#updateCursor();\n                consumed = true;\n                continue;\n            }\n            if (event === 'L_MOUSE_UP') {\n                hostConsumed = this.#forwardHorizontalDragToHostCamera(hostCam, events) || hostConsumed;\n                this.#stopHostCameraMotion();\n                this.#commitLiveScroll();\n                this.#throwVelocityY += this.#currentThrowVelocityY;\n                this.#currentThrowVelocityY = 0.0;\n                this.#viewportModel.anchor_mode = 'top';\n                this.#viewportModel.anchor_offset_y = 0;\n                this.#startScrollDecay();\n                consumed = true;\n            }\n        }\n        if (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && (events.wheelDeltaY ?? 0) !== 0) {\n            deltaY += this.#pixelWheelAmount(events.wheelDeltaY) * DOCUMENT_WHEEL_STEP * wheelScale * Math.sign(events.wheelDeltaY);\n        }\n        if (deltaY === 0.0) {\n            return consumed || hostConsumed;\n        }\n        hostCam?.retainWheelGesture?.(nowS);\n        this.#stopHostCameraMotion();\n        this.#commitLiveScroll();\n        this.cancelExponentialDecay('document_scroll_y');\n        const prevY = this.#scrollY;\n        this.#setScrollY(this.#clampedScrollY(this.#scrollY + deltaY));\n        this.#viewportModel.anchor_mode = 'top';\n        this.#viewportModel.anchor_offset_y = 0;\n        this.#applyViewportNow();\n        this.#updateCursor();\n        const moved = Math.abs(this.#scrollY - prevY) > 0.01;\n        if (moved && events?.has?.('SHIFT_KEY')) {\n            this.#applyShiftWheelCarry(deltaY, events);\n        }\n        return consumed || moved || hostConsumed;\n    }\n\n    /* Restore document focus from the live top-of-stack cell rather than from a parallel semantic snapshot. */\n    restoreFocusState(inputCell = this.#ownedFocusedInputCell()) {\n        if (!inputCell || inputCell.ownerDocumentView !== this || !this.scene) {\n            return;\n        }\n        if (!Number.isInteger(inputCell.cellID) || inputCell.cellID < 0\n            || !Number.isInteger(inputCell.cursorIndex) || inputCell.cursorIndex < 0) {\n            throw new Error(`DocumentView focus cell has invalid coordinates (line=${JSON.stringify(inputCell.cellID)} col=${JSON.stringify(inputCell.cursorIndex)}).`);\n        }\n        const line = inputCell.cellID;\n        const col = inputCell.cursorIndex;\n        this.#documentFocusActive = true;\n        inputCell.pinCaretVisible?.();\n        this.mutate({ cursor: [line, col] });\n        this.#syncInputFocus(new Set([line]));\n        this.#updateCursor();\n    }\n\n    /* Sole owner of pointer-driven input focus/cursor commits; InputCell only detects the hit and delegates here. */\n    activateInputCell(inputCell, col = inputCell?.cursorIndex ?? 0) {\n        if (this.usesDocumentSelection(inputCell)) this.state.doc.setSourceSelection(selectionAt({ line: this.#displayLineNumber(inputCell.cellID), col }));\n        if (!inputCell || inputCell.ownerDocumentView !== this || !Number.isInteger(inputCell.cellID) || inputCell.cellID < 0) {\n            return false;\n        }\n        if (!Number.isInteger(col) || col < 0) {\n            throw new Error(`DocumentView pointer focus has invalid column (line=${inputCell.cellID} col=${JSON.stringify(col)}).`);\n        }\n        const nextCol = col;\n        if (!this.#activateFocusEntry(inputCell)) {\n            return false;\n        }\n        this.#documentFocusActive = true;\n        this.#initialFocusPending = false;\n        // Pointer activation commits the cell-local cursor; it must not re-project\n        // document state into the cell before the drag/selection state is applied.\n        this.mutate({ cursor: [inputCell.cellID, nextCol] }, {\n            projectInputCells: false,\n        });\n        inputCell.updateCaret(nextCol);\n        this.#updateCursor({ allowInputCellSync: false });\n        return true;\n    }\n\n    /* Allow initial document focus to supersede bare or prior document content without bypassing modal stack ownership. */\n    #activateFocusEntry(inputCell) {\n        return ui.focusContentInputCell(this, inputCell);\n    }\n\n    /* Treat one non-transferring pointer click as caret activity so retained focus stays visibly present. */\n    noteRetainedPointerActivity() {\n        if (!this.#wantsDocumentFocus()) {\n            return false;\n        }\n        const inputCell = this.#ownedFocusedInputCell();\n        if (!inputCell) {\n            return false;\n        }\n        appendClickTraceEvent('focus-render', {\n            action: 'retained_pointer_activity',\n            owner: this.focusContainerKind,\n            name: this.state?.name ?? 'unnamed',\n            cursor: Array.isArray(this.state.cursor) ? [...this.state.cursor] : null,\n            cell_line: inputCell.cellID ?? null,\n            cell_cursor: inputCell.cursorIndex,\n        });\n        inputCell.pinCaretVisible?.();\n        this.#updateCursor();\n        return true;\n    }\n\n    /* Clear one rendered caret projection when the document loses top-of-stack status or detaches. */\n    clearRenderedFocus() {\n        appendClickTraceEvent('focus-render', {\n            action: 'clear_rendered_focus',\n            owner: this.focusContainerKind,\n            name: this.state?.name ?? 'unnamed',\n            cause: 'scene_hidden_or_detach',\n            cursor: Array.isArray(this.state.cursor) ? [...this.state.cursor] : null,\n        });\n        const inputCell = this.#ownedFocusedInputCell();\n        inputCell?.syncFocusVisual?.(false, 'scene_hidden');\n        this.scene?.stage?.syncFocusCaret?.();\n    }\n\n    /* Expose the current document-owned input leaf so shared focus utilities do not need a global leaf registry. */\n    currentFocusedInputCell() {\n        return this.#ownedFocusedInputCell();\n    }\n\n    /* Reassert document-owned caret focus after incidental leaf blur unless ownership explicitly moved away. */\n    _onOwnedInputCellBlur(inputCell, reason = null) {\n        appendClickTraceEvent('focus-render', {\n            action: 'owned_input_blur',\n            owner: this.focusContainerKind,\n            name: this.state?.name ?? 'unnamed',\n            cause: reason ?? null,\n            document_focus_active: this.#documentFocusActive,\n            top_of_stack: currentFocusContainer()?.focusContainerKind ?? null,\n            cell_line: inputCell?.cellID ?? null,\n            cursor: Array.isArray(this.state.cursor) ? [...this.state.cursor] : null,\n        });\n        if (!inputCell || inputCell.ownerDocumentView !== this) {\n            return;\n        }\n        if (!this.#documentFocusActive || currentFocusContainer() !== this) {\n            return;\n        }\n        if (reason === 'pointer_handoff'\n            || reason === 'focus_handoff'\n            || reason === 'tab_focus_move'\n            || reason === 'document_cursor_retarget'\n            || reason === 'document_detach'\n            || reason === 'scene_hidden'\n            || reason === 'stale_foreign_focus') {\n            return;\n        }\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : null;\n        const row = cursor?.[0] ?? -1;\n        const col = cursor?.[1] ?? 0;\n        if (!Number.isInteger(row) || row < 0) {\n            return;\n        }\n        const current = this.#cells[row * 2]?.inputCell ?? null;\n        if (!current || current.ownerDocumentView !== this) {\n            return;\n        }\n        const block = this.#blocks[row * 2] || null;\n        this.#syncInputCellFromDocument(current, block?.text ?? current.textInput, Number.isInteger(col) ? col : current.cursorIndex);\n        if (!current.inFocus) {\n            appendClickTraceEvent('focus-render', {\n                action: 'document_restore',\n                owner: this.focusContainerKind,\n                name: this.state?.name ?? 'unnamed',\n                cause: reason ?? null,\n                cell_line: current.cellID ?? null,\n                cursor: [row, col],\n            });\n            current.syncFocusVisual(true, 'document_restore');\n        }\n        this.#updateCursor();\n    }\n\n    // private:\n    #documentFocusActive;\n    #initialFocusPending;\n    #viewportModel;\n    #scrollY;\n    #throwVelocityY;\n    #currentThrowVelocityY;\n    #viewportScrollInitialised;\n    #viewportScopeBaseDocY;\n    #cells;\n    #searchMatches = new Map();\n    #searchResults = null;\n    #searchActiveIndex = -1;\n    #searchToken = null;\n    #searchReveal = null;\n    #searchPresentation = new WeakMap();\n\n    setSearchMatches(matches, token = null, activeIndex = -1) {\n        if (matches === this.#searchResults && token === this.#searchToken\n            && activeIndex === this.#searchActiveIndex) return;\n        if (matches !== this.#searchResults || token !== this.#searchToken) {\n            this.#searchMatches = new Map();\n            for (const [matchIndex, { line, index, span }] of matches.entries()) {\n                if (!this.#searchMatches.has(line)) {\n                    this.#searchMatches.set(line, { ranges: [], activeIndex: -1, firstMatchIndex: matchIndex });\n                }\n                this.#searchMatches.get(line).ranges.push({ index, span });\n            }\n        } else {\n            const previous = matches[this.#searchActiveIndex];\n            if (previous) this.#searchMatches.get(previous.line).activeIndex = -1;\n        }\n        // Matcher results are ordered by source position, so each line occupies\n        // one contiguous run. Navigation only changes the old and new active row.\n        const active = matches[activeIndex];\n        if (active) {\n            const row = this.#searchMatches.get(active.line);\n            row.activeIndex = activeIndex - row.firstMatchIndex;\n        }\n        this.#searchResults = matches;\n        this.#searchActiveIndex = activeIndex;\n        this.#searchToken = token;\n        this.#cancelSearchReveal();\n        if (token === null || matches.length === 0) {\n            for (let row = 0; row * 2 < this.#cells.length; row++) {\n                this.#setSearchCellHighlights(this.#cells[row * 2]?.inputCell);\n            }\n            return;\n        }\n        this.#syncSearchPresentation();\n    }\n\n    #cancelSearchReveal() {\n        this.#searchReveal = null;\n        this.state.doc.setSearchSourceDemand(null);\n        if (this.exponentialDecayPlan('document_scroll_y')?.stop_reason === 'target') {\n            this.#commitLiveScroll();\n            this.cancelExponentialDecay('document_scroll_y');\n            this.#throwVelocityY = 0;\n            this.#currentThrowVelocityY = 0;\n            this.#applyViewportNow();\n        }\n    }\n\n    revealSearchMatch(match, token) {\n        if (token !== this.#searchToken || token !== this.state.doc.sourceTextToken()) return;\n        this.#cancelSearchReveal();\n        this.#searchReveal = { ...match, token };\n        const row = this.state.doc.windowLineForDisplayLine(match.line);\n        this.state.doc.setSearchSourceDemand(row < 0 ? match.line : null);\n        this.#syncSearchPresentation();\n    }\n\n    #setSearchCellHighlights(cell, highlights = null) {\n        if (!cell) return;\n        const ranges = highlights?.ranges ?? EMPTY_SEARCH_RANGES;\n        const activeIndex = highlights?.activeIndex ?? -1;\n        const applied = this.#searchPresentation.get(cell);\n        if (applied?.ranges === ranges && applied.activeIndex === activeIndex\n            && applied.cellRanges === cell.visualHighlights\n            && cell.activeVisualHighlightIndex === activeIndex) return;\n        cell.setVisualHighlights(ranges, activeIndex);\n        // A text refresh can clear a reused cell's ranges. Track its owned copy\n        // as well so that the next projection restores highlights in that case.\n        this.#searchPresentation.set(cell, { ranges, activeIndex, cellRanges: cell.visualHighlights });\n    }\n\n    #syncSearchPresentation() {\n        if (this.#searchToken === null) return;\n        const current = this.#searchToken === this.state.doc.sourceTextToken();\n        for (let row = 0; row * 2 < this.#cells.length; row++) {\n            const highlights = current ? this.#searchMatches.get(this.#displayLineNumber(row)) : null;\n            this.#setSearchCellHighlights(this.#cells[row * 2]?.inputCell, highlights);\n        }\n        if (!current) {\n            this.#cancelSearchReveal();\n            return;\n        }\n        const reveal = this.#searchReveal;\n        if (!reveal) return;\n        const row = this.state.doc.windowLineForDisplayLine(reveal.line);\n        const cell = row >= 0 ? this.#cells[row * 2]?.inputCell : null;\n        if (!cell) return;\n        this.#searchReveal = null;\n        cell.revealVisualRange(reveal.index, reveal.span);\n        this.#setScrollOffset(row, this.#blocks[row * 2]?.ptrless ?? null, cell.displayOffset);\n        // Search owns this absolute target until geometry is ready. Never put a\n        // window-local search row into the editor's deferred focus-reveal queue.\n        // Clear before applying because applying a reveal updates the cursor.\n        if (this.#applyLineReveal({ lineNum: row, scroll: 'middle', smooth: true })) {\n            this.state.doc.setSearchSourceDemand(null);\n        } else this.#searchReveal = reveal;\n    }\n    #blocks;\n    #lineScrollOffsets;\n    #lineScrollOffsetsByIndex;\n    #refreshPending;\n    #imagePreviewLoadSeq;\n    #docWorkPending;\n    #applyingExpandedProjection;\n    #lastWorkThinkS;\n    #pendingLineReveal;\n    #projectionRestorePending;\n    #documentBinding;\n    #tableInspectOwnerToken;\n    #expandedInspectSessions;\n\n    /* Consume the legacy no-view queue only; attached views receive programmes directly. */\n    #consumeDocumentUpdate() {\n        const update = this.state.doc.update();\n        if (!update || !Array.isArray(update.edits)) {\n            throw new Error('DocumentView document update must return { edits: [] }.');\n        }\n        return update;\n    }\n\n    /* Report whether this DocumentView owns a TableView currently remounted into the active fullscreen scene. */\n    #hasExpandedTableview() {\n        return this.#cells.some((cell) => cell?.testingViewport?.expanded === true && !!cell.testingTableView);\n    }\n\n    /* Apply queued projection edits immediately while their DocumentView scene is inactive behind fullscreen presentation. */\n    #applyExpandedTableProjectionNow() {\n        if (this.#applyingExpandedProjection || !this.#hasExpandedTableview()) {\n            return false;\n        }\n        this.#applyingExpandedProjection = true;\n        try {\n            const update = this.#consumeDocumentUpdate();\n            const edits = this.#normalisedDocEdits(update?.edits ?? []);\n            if (edits.length === 0) {\n                return false;\n            }\n            this.#refreshPending = false;\n            this.#applyDocUpdate({ edits });\n            this.#updateCursor();\n            this.#clampCameraVertical();\n            pushTestingPortalTimingTrace('documentview_expanded_projection_applied', summariseDocEdits(edits));\n            return true;\n        } finally {\n            this.#applyingExpandedProjection = false;\n        }\n    }\n\n    /* Apply one reducer-committed programme directly; blocked selection work\n       is reconciled from the authoritative document instead of being queued. */\n    #receiveDocumentUpdate(update) {\n        const edits = this.#normalisedDocEdits(update?.edits ?? []);\n        if (edits.length === 0) {\n            if (this.state.doc.sourceSelectionState && this.scene) this.#restoreProjectedFocus();\n            return;\n        }\n        if (this.#hasActiveSelectionHighlight()) {\n            this.#refreshPending = true;\n            this.#updateCursor();\n            this.#clampCameraVertical();\n            return;\n        }\n        const projectedFocus = this.state.doc.projectionFocusState?.() ?? null;\n        if (Number.isInteger(projectedFocus?.cursor_line) && Number.isInteger(projectedFocus?.cursor_col)) {\n            this.state.cursor = [projectedFocus.cursor_line, projectedFocus.cursor_col];\n        }\n        this.#refreshPending = false;\n        this.#applyDocUpdate({ edits });\n        this.#updateCursor();\n        this.#clampCameraVertical();\n    }\n\n    /* Schedule projection work for either a scoped binding or the legacy document listener. */\n    #scheduleDocumentWork() {\n        if (this.#applyExpandedTableProjectionNow()) {\n            return;\n        }\n        this.#docWorkPending = true;\n        this.#syncWorkThink();\n    }\n\n    /* Attach one view-scoped projection consumer when the document exposes the new contract. */\n    #attachDocumentBinding() {\n        if (this.#documentBinding || typeof this.state.doc.attachView !== 'function') {\n            return false;\n        }\n        const binding = this.state.doc.attachView({\n            onProjection: (update) => this.#receiveDocumentUpdate(update),\n        });\n        if (!binding || typeof binding.detach !== 'function') {\n            throw new Error('DocumentView attachView() must return a binding with detach().');\n        }\n        this.#documentBinding = binding;\n        return true;\n    }\n\n    /* Cancel one pending document follow-up when the view detaches or work settles. */\n    #clearWorkThink() {\n        if (this.ownWorkThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownWorkThink);\n        this.ownWorkThink = null;\n    }\n\n    /* Report whether local document work still needs another scheduled frame. */\n    #needsWorkThink() {\n        if (this.#docWorkPending) {\n            return true;\n        }\n        if (this.#refreshPending && this.#hasActiveSelectionHighlight()) {\n            return true;\n        }\n        if (this.exponentialDecayPlan('document_scroll_y')) {\n            return true;\n        }\n        for (const cell of this.#cells) {\n            if (cell?.outputLayoutAnim) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /* Rearm one sparse document follow-up only while real queued edits or layout tweens remain live. */\n    #syncWorkThink() {\n        if (!this.scene || !this.#needsWorkThink()) {\n            this.#clearWorkThink();\n            return;\n        }\n        if (this.#docWorkPending && this.ownWorkThink !== null) {\n            this.cancelThinkAt(this.ownWorkThink);\n            this.ownWorkThink = null;\n        }\n        if (this.ownWorkThink !== null) {\n            return;\n        }\n        const immediate = this.#docWorkPending;\n        const atS = immediate\n            ? this.sceneNowS()\n            : this.sceneNowS() + this.sceneFrameStepS();\n        this.ownWorkThink = this.thinkAt(atS, ({ now_s }) => {\n            this.ownWorkThink = null;\n            this.#lastWorkThinkS = now_s;\n            this.#runWorkLoop();\n            this.#syncWorkThink();\n        }, { reason: immediate ? 'documentview_doc_work' : 'documentview_followup_work' });\n        // Immediate doc edits must wake a frame even in hot mode; otherwise\n        // sparse-think timer races can strand queued repaint patches until the next input event.\n        if (immediate) {\n            requestFrame('documentview_doc_work');\n        }\n    }\n\n    /* Treat text focus as document-owned state only after the focus stack accepts this document as a live owner. */\n    #setDocumentFocusActive(active) {\n        if (active !== true) {\n            this.#documentFocusActive = false;\n            return false;\n        }\n        const row = Number.isInteger(this.state.cursor?.[0]) ? this.state.cursor[0] : 0;\n        const inputCell = this.#cells[row * 2]?.inputCell ?? null;\n        if (inputCell && !this.#activateFocusEntry(inputCell)) {\n            this.#documentFocusActive = false;\n            return false;\n        }\n        this.#documentFocusActive = true;\n        this.#initialFocusPending = false;\n        return true;\n    }\n\n    /* Claim one deferred initial caret focus once the first real puff row exists and nothing live owns text focus elsewhere. */\n    #maybeClaimInitialFocus() {\n        if (!this.#initialFocusPending) {\n            return false;\n        }\n        if (this.state.doc.read_only === true) {\n            this.#initialFocusPending = false;\n            return false;\n        }\n        if (!this.scene || !this.scene.stage) {\n            return false;\n        }\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : [0, 0];\n        const row = Number.isInteger(cursor[0]) && cursor[0] >= 0 ? cursor[0] : 0;\n        const inputCell = this.#cells[row * 2]?.inputCell ?? null;\n        if (!inputCell) {\n            return false;\n        }\n        this.#syncInputCellFromDocument(inputCell, inputCell.textInput, 0);\n        if (!this.#setDocumentFocusActive(true)) {\n            return false;\n        }\n        this.#syncInputFocus(new Set([row]));\n        return true;\n    }\n\n    /* Treat focus-stack ownership as live only once this view is attached beneath a staged scene. */\n    #hasLiveFocusStack() {\n        return !!this.scene?.stage;\n    }\n\n    /* Accept only InputCells that are still mounted in this view's authoritative row array. */\n    #ownsLiveInputCell(inputCell) {\n        if (!inputCell || inputCell.ownerDocumentView !== this) {\n            return false;\n        }\n        if (!Number.isInteger(inputCell.cellID) || inputCell.cellID < 0) {\n            return false;\n        }\n        const cell = this.#cells[inputCell.cellID * 2] ?? null;\n        return cell?.inputCell === inputCell && cell?.parentNode === this._blockRoot;\n    }\n\n    /* Resolve the focused InputCell only when it concretely belongs to this DocumentView. */\n    #ownedFocusedInputCell() {\n        if (!this.#hasLiveFocusStack()) {\n            return null;\n        }\n        if (currentFocusContainer() !== this) {\n            return null;\n        }\n        const inputCell = currentFocusedInputCell();\n        return this.#ownsLiveInputCell(inputCell) ? inputCell : null;\n    }\n\n    /* Keep logical focus unless another input or modal window has taken ownership. */\n    #wantsDocumentFocus() {\n        if (!this.#hasLiveFocusStack()) {\n            return false;\n        }\n        if (!this.#documentFocusActive) {\n            return false;\n        }\n        return currentFocusContainer() === this;\n    }\n\n    /* Trace caret projection state through the focus/render seam when click tracing is active. */\n    #logCaret(action, detail = {}) {\n        const caret = this.scene?.stage?.ownCaret ?? null;\n        appendClickTraceEvent('caret', {\n            action,\n            cursor: Array.isArray(this.state.cursor) ? [...this.state.cursor] : null,\n            document_focus_active: this.#documentFocusActive,\n            wants_document_focus: this.#wantsDocumentFocus(),\n            top_of_stack: currentFocusContainer()?.focusContainerKind ?? null,\n            caret_visible: caret?.visible === true,\n            caret_parent: caret?.parentNode?.constructor?.name ?? null,\n            ...detail,\n        });\n    }\n\n    /* Publish document scroll bounds without letting ordinary relayout eagerly drive vertical camera jumps. */\n    #clampCameraVertical() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            this.#syncViewportModel();\n            return;\n        }\n        const [viewportWidth, viewportHeight] = cam.getViewportSize();\n        if (!Number.isFinite(viewportWidth) || viewportWidth <= 0) {\n            this.#syncViewportModel(this.#currentScrollY());\n            return;\n        }\n        if (!Number.isFinite(viewportHeight) || viewportHeight <= 0) {\n            this.#syncViewportModel(this.#currentScrollY());\n            return;\n        }\n        const [left, top] = this.worldPosition();\n        const docHeight = this.height();\n        if (!Number.isFinite(left) || !Number.isFinite(top) || !Number.isFinite(docHeight) || docHeight < 0) {\n            this.#syncViewportModel(this.#currentScrollY());\n            return;\n        }\n        const right = left + this.state.width;\n        const bottom = top + docHeight;\n        if (!Number.isFinite(right) || !Number.isFinite(bottom)) {\n            this.#syncViewportModel(this.#currentScrollY());\n            return;\n        }\n        const minOverlapX = viewportWidth * 0.25;\n        const clampedDocHeight = Math.max(0, bottom - top);\n        // For tall puffbooks, keep the overlap rule viewport-relative rather\n        // than document-relative. Otherwise the top clamp drifts downward as\n        // output cells load below the fold, which makes the camera auto-scroll\n        // and can strand the user away from the true top.\n        const minVisibleY = Math.min(clampedDocHeight / 3.0, viewportHeight / 3.0);\n        const minX = left - viewportWidth * 0.5 + minOverlapX;\n        const maxX = right + viewportWidth * 0.5 - minOverlapX;\n        let minY = top + minVisibleY - viewportHeight * 0.5;\n        let maxY = bottom - minVisibleY + viewportHeight * 0.5;\n        if (minY > maxY) {\n            const midY = (minY + maxY) * 0.5;\n            minY = midY;\n            maxY = midY;\n        }\n        cam.setHorizontalBounds(minX, maxX);\n        cam.setVerticalBounds(minY, maxY);\n        cam.clampHorizontal(minX, maxX);\n        this.#syncViewportModel(this.#currentScrollY());\n    }\n\n    /* Derive one explicit viewport snapshot from the local scroll owner plus the current presented viewport dimensions. */\n    #syncViewportModel(scrollY = this.#currentScrollY()) {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            return this.#viewportModel;\n        }\n        const [_, viewportHeight] = cam.getViewportSize?.() ?? [Number.NaN, Number.NaN];\n        if (!Number.isFinite(viewportHeight)) {\n            return this.#viewportModel;\n        }\n        if (!this.#viewportScrollInitialised) {\n            this.#initialiseViewportScrollFromPresentation();\n            scrollY = this.#currentScrollY();\n        }\n        this.#normalizeViewportAnchorMode();\n        this.#viewportModel = {\n            scroll_y: scrollY,\n            viewport_h: viewportHeight,\n            anchor_mode: this.#viewportModel.anchor_mode,\n            anchor_offset_y: this.#viewportModel.anchor_offset_y,\n        };\n        return this.#viewportModel;\n    }\n\n    /* Resolve the document-local coordinate that currently sits at the top of the presented viewport when content itself has zero scroll offset. */\n    #shellVisibleTopY() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            return Number.NaN;\n        }\n        const visibleTopWorld = this.#cameraVisibleTopWorldY(cam);\n        const docTop = this.worldPosition?.()?.[1] ?? Number.NaN;\n        if (!Number.isFinite(visibleTopWorld) || !Number.isFinite(docTop)) {\n            return Number.NaN;\n        }\n        return visibleTopWorld - docTop;\n    }\n\n    /* Seed the new local viewport owner from the presentation camera once so phase 2 begins from the exact current visible band. */\n    #initialiseViewportScrollFromPresentation() {\n        if (this.#viewportScrollInitialised) {\n            return false;\n        }\n        const topY = this.#shellVisibleTopY();\n        if (!Number.isFinite(topY)) {\n            return false;\n        }\n        this.#scrollY = topY;\n        this.#viewportScrollInitialised = true;\n        return true;\n    }\n\n    /* Keep one explicit list of document-owned viewport scope children so rebase math stays localised to the scroll shell. */\n    #viewportScopeRoots() {\n        return [this._blockRoot ?? null, this._contentChromeRoot ?? null];\n    }\n\n    /* Rebase the viewport scope against the current visible band only when the user has moved far enough to justify one new local origin. */\n    #maybeRebaseViewportScope(nowS = this.sceneNowS()) {\n        const anchorDocY = this.#currentScrollY(nowS) + this.#viewportAnchorOffsetY();\n        const [_, viewportHeight] = this.#viewportSize();\n        if (!Number.isFinite(anchorDocY) || !Number.isFinite(viewportHeight) || viewportHeight <= 0) {\n            return false;\n        }\n        const threshold = Math.max(1, viewportHeight * DOCUMENT_VIEWPORT_SCOPE_REBASE_THRESHOLD_VIEWPORTS);\n        if (Math.abs(anchorDocY - this.#viewportScopeBaseDocY) <= threshold) {\n            return false;\n        }\n        this.#viewportScopeBaseDocY = anchorDocY;\n        const childY = -this.#viewportScopeBaseDocY;\n        for (const root of this.#viewportScopeRoots()) {\n            if (!root) {\n                continue;\n            }\n            const pos = root.localPosition?.() ?? [0, 0, 0];\n            if (Math.abs((pos[1] ?? 0) - childY) > 0.01) {\n                root.setLocalPosition([pos[0], childY, pos[2]]);\n            }\n        }\n        return true;\n    }\n\n    /* Sample the authoritative local document scroll, including any live inertial decay. */\n    #currentScrollY(nowS = this.sceneNowS()) {\n        const sample = this.sampleExponentialDecay('document_scroll_y', nowS);\n        return sample ? sample.position : this.#scrollY;\n    }\n\n    /* Persist one committed document scroll baseline. */\n    #setScrollY(nextY) {\n        if (!Number.isFinite(nextY)) {\n            throw new Error(`DocumentView expected finite scroll_y, got ${nextY}.`);\n        }\n        this.#scrollY = nextY;\n    }\n\n    /* Resolve one viewport size for local scroll input and visible-band derivation. */\n    #viewportSize() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        return cam?.getViewportSize?.() ?? [0, 0];\n    }\n\n    /* Clamp document-local visible-top scroll to the same relaxed overlap bounds previously enforced through the camera. */\n    #clampedScrollY(nextY) {\n        const [_, viewportHeight] = this.#viewportSize();\n        const docHeight = this.height();\n        if (!Number.isFinite(nextY) || !Number.isFinite(viewportHeight) || viewportHeight <= 0 || !Number.isFinite(docHeight) || docHeight < 0) {\n            return nextY;\n        }\n        const minVisibleY = Math.min(docHeight / 3.0, viewportHeight / 3.0);\n        let minY = minVisibleY - viewportHeight;\n        let maxY = docHeight - minVisibleY;\n        if (minY > maxY) {\n            const midY = (minY + maxY) * 0.5;\n            minY = midY;\n            maxY = midY;\n        }\n        return Math.max(minY, Math.min(maxY, nextY));\n    }\n\n    /* Resolve the source line whose plain input row currently occupies one document-local y position. */\n    #firstLineForDocY(docY) {\n        if (!Number.isFinite(docY)) {\n            return 0;\n        }\n        for (let lineNum = 0; lineNum * 2 < this.#cells.length; lineNum++) {\n            const inputCell = this.#cells[lineNum * 2] ?? null;\n            if (!inputCell) {\n                continue;\n            }\n            const cellTop = inputCell.localPosition()[1];\n            const cellBottom = cellTop + inputCell.height;\n            if (docY >= cellBottom) {\n                continue;\n            }\n            return lineNum;\n        }\n        return Math.max(0, Math.floor(this.#cells.length / 2) - 1);\n    }\n\n    /* Estimate how many plain source rows fit in the current viewport, ignoring output expansion. */\n    #conservativeViewportLineCount(viewportHeight) {\n        if (!Number.isFinite(viewportHeight) || viewportHeight <= 0) {\n            return 1;\n        }\n        const linePitch = this.#conservativeViewportLinePitch();\n        return Math.max(1, Math.ceil(viewportHeight / linePitch));\n    }\n\n    /* Derive one conservative no-output source-row pitch from the current font contract. */\n    #conservativeViewportLinePitch() {\n        const font = this.state.font ?? null;\n        const lineHeight = font?.fontData?.lineHeight;\n        if (Number.isFinite(lineHeight) && lineHeight > 0) {\n            return lineHeight * DOCUMENT_ROW_FONT_SIZE;\n        }\n        return evilfont.MSDFText.measureFromState({\n            font,\n            fontSize: DOCUMENT_ROW_FONT_SIZE,\n            text: 'Ag',\n        });\n    }\n\n    /* Apply the live document scroll to the content subtree rather than to the presentation camera. */\n    #applyViewportNow(nowS = this.sceneNowS()) {\n        this.#initialiseViewportScrollFromPresentation();\n        this.#maybeRebaseViewportScope(nowS);\n        const shellTopY = this.#shellVisibleTopY();\n        const scrollY = this.#currentScrollY(nowS);\n        if (Number.isFinite(shellTopY) && Number.isFinite(scrollY)) {\n            const nextY = shellTopY - scrollY + this.#viewportScopeBaseDocY;\n            const root = this._viewportScopeRoot ?? null;\n            if (root) {\n                const pos = root.localPosition?.() ?? [0, 0, 0];\n                if (Math.abs((pos[1] ?? 0) - nextY) > 0.01) {\n                    root.setLocalPosition([pos[0], nextY, pos[2]]);\n                }\n            }\n        }\n        this.#syncViewportModel(scrollY);\n        this.#syncTablePreviewCull();\n        this.#reportProjectionViewport();\n    }\n\n    /* Reseed or reapply the viewport owner after an external host layout move repositions the whole DocumentView. */\n    syncViewportAfterHostLayout({ reseedFromPresentation = false } = {}) {\n        if (reseedFromPresentation) {\n            this.cancelExponentialDecay('document_scroll_y');\n            this.#throwVelocityY = 0.0;\n            this.#currentThrowVelocityY = 0.0;\n            this.#viewportScrollInitialised = false;\n        }\n        this.#applyViewportNow();\n    }\n\n    /* Convert one pixel-wheel delta into a bounded local scroll step. */\n    #pixelWheelAmount(raw) {\n        if (!Number.isFinite(raw)) {\n            return 0.0;\n        }\n        return Math.abs(Math.tanh(raw / 52.0));\n    }\n\n    /* Puffbook drag momentum requires one explicit positive frame delta from the input envelope. */\n    #inputFrameDeltatime(events) {\n        const dt = events?.frameDeltaTime;\n        if (!Number.isFinite(dt) || dt <= 0) {\n            throw new Error(`DocumentView momentum input requires a positive events.frameDeltaTime, got ${dt}.`);\n        }\n        return dt;\n    }\n\n    /* Resolve one wheel-frame dt, falling back to the scene cadence when the input envelope has no explicit frame delta. */\n    #wheelFrameDeltatime(events) {\n        const dt = events?.frameDeltaTime;\n        if (Number.isFinite(dt) && dt > 0) {\n            return dt;\n        }\n        return this.sceneFrameStepS();\n    }\n\n    /* Keep one inertial local scroll tail on the document so vertical viewport state remains self-owned during passive motion. */\n    #startScrollDecay(position = this.#scrollY, decayPerS = DOCUMENT_THROW_DECAY_PER_SECOND, target = null) {\n        this.startExponentialDecay('document_scroll_y', {\n            position,\n            velocity: this.#throwVelocityY,\n            decay_per_s: decayPerS,\n            epsilon: target ? 0 : DOCUMENT_THROW_STOP_PX_PER_SECOND,\n            predict_stop: target ? ({ start_s }) => ({\n                stop_s: start_s + target.duration_s,\n                position: target.position, velocity: 0, reason: 'target',\n            }) : null,\n            clamp: ({ position: nextY, velocity }) => {\n                const clampedY = this.#clampedScrollY(nextY);\n                const stop = clampedY !== nextY || (!target && Math.abs(velocity) <= DOCUMENT_THROW_STOP_PX_PER_SECOND);\n                return {\n                    position: clampedY,\n                    velocity: stop ? 0.0 : velocity,\n                    stop,\n                    reason: clampedY !== nextY ? 'clamped' : 'settled',\n                };\n            },\n            apply: ({ now_s, position, velocity }) => {\n                this.#scrollY = position;\n                this.#throwVelocityY = velocity;\n                this.#applyViewportNow(now_s);\n                this.#updateCursor();\n            },\n            onFinish: ({ position }) => {\n                this.#scrollY = position;\n                this.#throwVelocityY = 0.0;\n                this.#applyViewportNow();\n                this.#updateCursor();\n            },\n            onStop: target ? () => { this.#throwVelocityY = 0; } : null,\n        });\n    }\n\n    /* Integrate a strongly damped velocity to reach the target at a fixed\n       deadline, with zero remaining momentum at the end. */\n    #scrollTo(targetY, durationS = DOCUMENT_SEARCH_SCROLL_DURATION_S) {\n        const position = this.#commitLiveScroll();\n        this.cancelExponentialDecay('document_scroll_y');\n        this.#throwVelocityY = 0;\n        this.#currentThrowVelocityY = 0;\n        const target = this.#clampedScrollY(targetY);\n        const distance = target - position;\n        if (durationS <= 0 || Math.abs(distance) < 0.01) {\n            this.#setScrollY(target);\n            this.#applyViewportNow();\n            return;\n        }\n        const decay = DOCUMENT_SEARCH_SCROLL_DECAY_PER_SECOND;\n        this.#throwVelocityY = distance * decay / -Math.expm1(-decay * durationS);\n        this.#startScrollDecay(position, decay, { position: target, duration_s: durationS });\n        this.#syncWorkThink();\n        requestFrame('document_search_scroll');\n    }\n\n    /* Persist the current live scroll sample into the committed document state when interaction edges need a stable base. */\n    #commitLiveScroll(nowS = this.sceneNowS()) {\n        const sample = this.sampleExponentialDecay('document_scroll_y', nowS);\n        if (!sample) {\n            return this.#scrollY;\n        }\n        this.#scrollY = sample.position;\n        this.#throwVelocityY = sample.velocity;\n        return this.#scrollY;\n    }\n\n    /* Add a small local tail for shifted wheel frames so boosted gestures keep inertia after the browser stops emitting deltas. */\n    #applyShiftWheelCarry(deltaY, events) {\n        const dt = this.#wheelFrameDeltatime(events);\n        const carryVY = (deltaY * DOCUMENT_SHIFT_WHEEL_CARRY) / dt;\n        if (Math.abs(carryVY) <= 0.01) {\n            return;\n        }\n        if (carryVY !== 0 && this.#throwVelocityY !== 0 && Math.sign(carryVY) !== Math.sign(this.#throwVelocityY)) {\n            this.#throwVelocityY = 0.0;\n        }\n        this.#throwVelocityY += carryVY;\n        this.#startScrollDecay(this.#scrollY, -Math.log(DOCUMENT_SHIFT_WHEEL_DRAG) / this.sceneFrameStepS());\n    }\n\n    /* Stop only stale host-camera vertical motion so local document scrolling becomes the sole Y owner without killing horizontal wheel state. */\n    #stopHostCameraMotion() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (typeof cam?.stopVerticalMotion === 'function') {\n            cam.stopVerticalMotion();\n            return;\n        }\n        cam?.stopMotion?.();\n    }\n\n    /* Forward background drag ownership to the host camera for horizontal motion only, masking vertical deltas so puffbook remains the sole Y-scroll owner. */\n    #forwardHorizontalDragToHostCamera(cam, events) {\n        if (typeof cam?.onPointerInput !== 'function') {\n            return false;\n        }\n        const forwarded = filterPrimaryDragInput(events);\n        if (!forwarded) {\n            return false;\n        }\n        const prevLastY = Mouse.lastY;\n        try {\n            Mouse.lastY = Mouse.y;\n            return cam.onPointerInput(forwarded) === true;\n        } finally {\n            Mouse.lastY = prevLastY;\n        }\n    }\n\n    /* Read the visible top from the live camera viewport, or derive it when tests use a lighter stub. */\n    #cameraVisibleTopWorldY(cam) {\n        if (Number.isFinite(cam?.vpBounds?.minY)) {\n            return cam.vpBounds.minY;\n        }\n        const [_, viewportHeight] = cam?.getViewportSize?.() ?? [Number.NaN, Number.NaN];\n        const pos = cam?.localPosition?.() ?? [Number.NaN, Number.NaN, Number.NaN];\n        if (!Number.isFinite(viewportHeight) || !Number.isFinite(pos[1])) {\n            return Number.NaN;\n        }\n        return pos[1] - viewportHeight * 0.5;\n    }\n\n    /* Resolve the current viewport anchor offset within the visible band: top by default, pointer y while drag-hold owns the viewport. */\n    #viewportAnchorOffsetY() {\n        if (this.#hasLivePointerViewportAnchor()) {\n            return this.#viewportModel.anchor_offset_y;\n        }\n        return 0;\n    }\n\n    /* Keep cached viewport-anchor state honest so async output work cannot inherit a dead pointer owner. */\n    #normalizeViewportAnchorMode() {\n        if (this.#viewportModel.anchor_mode !== 'pointer') {\n            return;\n        }\n        if (Mouse.leftDown === true) {\n            return;\n        }\n        this.#viewportModel.anchor_mode = 'top';\n        this.#viewportModel.anchor_offset_y = 0;\n    }\n\n    /* Treat pointer anchoring as live only while the primary button is still down; stale cached pointer anchors must not steer async output reflow. */\n    #hasLivePointerViewportAnchor() {\n        this.#normalizeViewportAnchorMode();\n        return this.#viewportModel.anchor_mode === 'pointer';\n    }\n\n    /* Sample the local pointer y used by the active viewport anchor, clamped to the current visible band. */\n    #pointerViewportOffsetY() {\n        const raw = this.getLocalMousePosition?.()?.[1] ?? 0;\n        const height = this.#viewportModel.viewport_h;\n        if (!Number.isFinite(raw)) {\n            return 0;\n        }\n        if (!Number.isFinite(height) || height <= 0) {\n            return Math.max(0, raw);\n        }\n        return Math.max(0, Math.min(height, raw));\n    }\n\n    /* Capture the current viewport-anchored document point only for output-height changes that can move visible rows. */\n    #captureOutputViewportTopAnchor(startIndex, nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        if (!Number.isInteger(startIndex) || startIndex < 0) {\n            throw new Error(`DocumentView expected non-negative integer output-anchor start index, got ${startIndex}.`);\n        }\n        const anchorDocY = this.#currentScrollY(nowS) + this.#viewportAnchorOffsetY();\n        if (!Number.isFinite(anchorDocY)) {\n            return null;\n        }\n        for (let i = 0; i < this.#cells.length; i++) {\n            const cell = this.#cells[i];\n            const cellTop = cell.localPosition()[1];\n            const cellBottom = cellTop + cell.height;\n            if (cellBottom <= anchorDocY) {\n                continue;\n            }\n            if (i < startIndex) {\n                return null;\n            }\n            return {\n                index: i,\n                offsetY: anchorDocY - cellTop,\n            };\n        }\n        return null;\n    }\n\n    /* Restore the captured viewport-anchored document point after output rows animate or asynchronously resize. */\n    #restoreOutputViewportTopAnchor(anchor) {\n        if (!anchor) {\n            return;\n        }\n        const cell = this.#cells[anchor.index] ?? null;\n        if (!cell) {\n            return;\n        }\n        const desiredAnchorDocY = cell.localPosition()[1] + anchor.offsetY;\n        const currentAnchorDocY = this.#currentScrollY() + this.#viewportAnchorOffsetY();\n        const deltaY = desiredAnchorDocY - currentAnchorDocY;\n        if (!Number.isFinite(deltaY) || Math.abs(deltaY) <= 0.01) {\n            return;\n        }\n        this.#commitLiveScroll();\n        const plan = this.exponentialDecayPlan('document_scroll_y');\n        if (plan) {\n            this.cancelExponentialDecay('document_scroll_y');\n            this.#scrollY = this.#clampedScrollY(this.#scrollY + deltaY);\n            if (plan.stop_reason === 'target') {\n                this.#scrollTo(plan.stop_position + deltaY, plan.stop_s - this.sceneNowS());\n            } else this.#startScrollDecay(this.#scrollY, plan.decay_per_s);\n            this.#applyViewportNow();\n        } else {\n            this.#setScrollY(this.#clampedScrollY(this.#scrollY + deltaY));\n            this.#applyViewportNow();\n        }\n        this.#updateCursor();\n    }\n\n    /* Capture the current absolute viewport anchor so full viewport reslices can preserve the same visible row. */\n    #captureViewportDisplayAnchor(nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        const anchorDocY = this.#currentScrollY(nowS) + this.#viewportAnchorOffsetY();\n        if (!Number.isFinite(anchorDocY)) {\n            return null;\n        }\n        for (let i = 0; i < this.#cells.length; i += 1) {\n            const cell = this.#cells[i] ?? null;\n            if (!cell) {\n                continue;\n            }\n            const cellTop = cell.localPosition?.()?.[1] ?? Number.NaN;\n            const cellHeight = Number(cell.height);\n            const cellBottom = cellTop + cellHeight;\n            if (!Number.isFinite(cellTop) || !Number.isFinite(cellHeight) || cellBottom <= anchorDocY) {\n                continue;\n            }\n            const displayLine = cell.displayLineNumber;\n            if (!Number.isInteger(displayLine) || displayLine < 0) {\n                return null;\n            }\n            return {\n                displayLine,\n                disposition: this.#blocks[i]?.disposition ?? null,\n                offsetY: anchorDocY - cellTop,\n            };\n        }\n        return null;\n    }\n\n    /* Restore one captured absolute viewport anchor after a full row-stack replacement. */\n    #restoreViewportDisplayAnchor(anchor) {\n        if (!anchor) {\n            return;\n        }\n        const absLine = anchor.displayLine;\n        const lineNum = typeof this.state.doc.windowLineForDisplayLine === 'function'\n            ? this.state.doc.windowLineForDisplayLine(absLine)\n            : absLine;\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return;\n        }\n        const disposition = anchor.disposition === 'out' ? 'out' : 'in';\n        const cellIndex = lineNum * 2 + (disposition === 'out' ? 1 : 0);\n        const cell = this.#cells[cellIndex] ?? null;\n        if (!cell) {\n            return;\n        }\n        const desiredAnchorDocY = (cell.localPosition?.()?.[1] ?? Number.NaN) + anchor.offsetY;\n        const currentAnchorDocY = this.#currentScrollY() + this.#viewportAnchorOffsetY();\n        const deltaY = desiredAnchorDocY - currentAnchorDocY;\n        if (!Number.isFinite(deltaY) || Math.abs(deltaY) <= 0.01) {\n            return;\n        }\n        this.#commitLiveScroll();\n        const plan = this.exponentialDecayPlan('document_scroll_y');\n        if (plan) {\n            this.cancelExponentialDecay('document_scroll_y');\n            this.#scrollY = this.#clampedScrollY(this.#scrollY + deltaY);\n            if (plan.stop_reason === 'target') {\n                this.#scrollTo(plan.stop_position + deltaY, plan.stop_s - this.sceneNowS());\n            } else this.#startScrollDecay(this.#scrollY, plan.decay_per_s);\n            this.#applyViewportNow();\n        } else {\n            this.#setScrollY(this.#clampedScrollY(this.#scrollY + deltaY));\n            this.#applyViewportNow();\n        }\n        this.#updateCursor();\n    }\n\n    /* Reflow one output suffix and keep the viewport top visually stable unless active camera input owns scrolling. */\n    #reflowOutputVerticalPositions(startIndex, nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        const anchor = this.#captureOutputViewportTopAnchor(startIndex, nowS);\n        const startLine = Math.floor(Math.max(0, startIndex) / 2);\n        const previewLines = [];\n        for (let i = 1; i < this.#blocks.length; i += 2) {\n            if (this.#blocks[i]?.block_type === 'tableview') {\n                previewLines.push((i - 1) / 2);\n            }\n        }\n        const sampledPreviewLines = previewLines.filter((lineNum) => lineNum < startLine).slice(-3);\n        this.#updateVerticalPositions(startIndex);\n        this.#restoreOutputViewportTopAnchor(anchor);\n        this.#clampCameraVertical();\n        if (sampledPreviewLines.length > 0) {\n            pushTestingPortalTimingTrace('documentview_reflow_output_suffix', {\n                start_line: startLine,\n                sampled_preview_lines: sampledPreviewLines,\n                preview_rows: this.#tracePreviewRows(sampledPreviewLines),\n            });\n        }\n    }\n  \n    \n    /*\n     * The sole document-editor command boundary.\n     *\n     * `cursor` and `selectionRange` are a snapshot of the focused InputCell;\n     * Puffbook is the reducer, while this view projects its result back into\n     * the rendered cells, focus stack, and external caret.\n     */\n    #processDocumentKeyDown(evt, { cursor = this.state.cursor, selectionRange = null } = {}) {\n        return withPortalTimingScope('documentview.process_keydown', {\n            key: evt?.key ?? null,\n            cursor_line: Number.isInteger(cursor?.[0]) ? cursor[0] : this.state.cursor?.[0] ?? null,\n        }, () => {\n            const startedMS = performance.now();\n            if (!cursor || currentFocusContainer() !== this) {\n                return false;\n            }\n\n            if(!this.state.doc || !cursor) { return }\n            let commandCursor = cursor;\n            // A websocket viewport replacement can update the document reducer\n            // between browser frames. Consume its queued projection programme\n            // before interpreting the next key, otherwise that key uses the\n            // old window-local cursor and is only rebased afterwards.\n            const queuedUpdate = this.#consumeDocumentUpdate();\n            const queuedEdits = this.#normalisedDocEdits(queuedUpdate?.edits ?? []);\n            if (queuedEdits.length > 0) {\n                const movesMountedRows = queuedEdits.some((edit) =>\n                    edit?.kind === 'line_insert' || edit?.kind === 'line_remove');\n                this.#applyDocUpdate({ edits: queuedEdits });\n                if (movesMountedRows && Array.isArray(this.state.cursor)) {\n                    commandCursor = this.state.cursor;\n                }\n            }\n\n            this.state.cursor = commandCursor;\n            const lineNum = commandCursor[0];\n            const inputBlock = Number.isInteger(lineNum) && lineNum >= 0\n                ? this.#blocks[lineNum * 2] ?? null\n                : null;\n            if (inputBlock?.read_only === true && isDocumentMutationKey(evt)) {\n                return true;\n            }\n            const replacesSelection = selectionRange !== null\n                && (['Backspace', 'Delete', 'Enter', 'paste', 'cut'].includes(evt.key)\n                    || isSpaceTabKey(evt)\n                    || (!(evt.ctrlKey || evt.metaKey) && typeof evt.key === 'string' && evt.key.length === 1));\n            if (replacesSelection) {\n                // The command owns the captured range now. Retire its visual\n                // highlight before the reducer publishes synchronously: a live\n                // highlight blocks projection and focus restore would otherwise\n                // overwrite the post-edit cursor with the cell's old cursor.\n                this.#ownedFocusedInputCell()?.removeHighlight();\n            }\n            const applyStartedMS = performance.now();\n            const [edited, newCursor] = this.state.doc.applyKeyDown(evt, commandCursor, selectionRange, { source: 'view' });\n            const applyDurationMS = performance.now() - applyStartedMS;\n            let consumed = edited;\n            let cursorChanged = (newCursor !== null) && (newCursor[0] != commandCursor[0] || newCursor[1] != commandCursor[1]);\n            let updateDurationMS = 0;\n            let applyUpdateDurationMS = 0;\n            let updateSummary = null;\n            let localInputCellNavigation = false;\n\n            if (cursorChanged) {\n                if (edited) {\n                    this.state.cursor = newCursor;\n                } else {\n                    consumed = true;\n                    localInputCellNavigation = newCursor[0] === commandCursor[0]\n                        && this.#canMoveInputCellCaretLocally(newCursor);\n                    this.mutate({ cursor: newCursor }, {\n                        projectInputCells: !localInputCellNavigation,\n                    });\n                    if (localInputCellNavigation) {\n                        this.#moveInputCellCaretLocally(newCursor);\n                    }\n                }\n            }\n\n            if (edited) {\n                const updateStartedMS = performance.now();\n                const update = this.#consumeDocumentUpdate();\n                updateDurationMS = performance.now() - updateStartedMS;\n                updateSummary = summariseDocEdits(update?.edits ?? []);\n                const applyUpdateStartedMS = performance.now();\n                this.#applyDocUpdate(update);\n                applyUpdateDurationMS = performance.now() - applyUpdateStartedMS;\n            }\n\n            const row = Number.isInteger(this.state.cursor?.[0]) ? this.state.cursor[0] : -1;\n            const inputCell = row >= 0 ? (this.#cells[row * 2]?.inputCell ?? null) : null;\n            if (this.#ownsLiveInputCell(inputCell) && currentFocusContainer() === this) {\n                replaceTopFocusEntry(this, inputCell);\n            } else if (currentFocusContainer() === this) {\n                // A structural edit can advance the logical cursor before the\n                // destination row has a mounted InputCell. Drop the old leaf\n                // immediately so a following key routes through this\n                // container and its authoritative cursor instead of being\n                // consumed by the stale pre-edit row.\n                replaceTopFocusEntry(this, null);\n            }\n\n            pushTestingPortalTimingTrace('documentview_keydown', {\n                key: evt?.key ?? null,\n                edited,\n                consumed,\n                cursor_changed: cursorChanged,\n                local_input_cell_navigation: localInputCellNavigation,\n                cursor_line: Number.isInteger(this.state.cursor?.[0]) ? this.state.cursor[0] : null,\n                apply_keydown_ms: Number(applyDurationMS.toFixed(3)),\n                doc_update_ms: Number(updateDurationMS.toFixed(3)),\n                apply_doc_update_ms: Number(applyUpdateDurationMS.toFixed(3)),\n                total_ms: Number((performance.now() - startedMS).toFixed(3)),\n                update_summary: updateSummary,\n            });\n\n            return consumed || cursorChanged;\n        });\n    }\n\n    /* Apply one fullscreen TableView source-editor key through the sole document reducer. */\n    applyTableInspectKeyDown(tableview, event, inputCell) {\n        if (!tableview || !inputCell || inputCell.focusContainerOwner !== tableview) {\n            throw new Error('DocumentView.applyTableInspectKeyDown requires the live TableView inspect input.');\n        }\n        const doc = this.state.doc;\n        this.#applyDocUpdate(this.#consumeDocumentUpdate());\n        const outputLine = tableview.getLineOnPuffbook();\n        const range = tableview.getInspectSourceRange();\n        const editorRow = tableview.inspectEditorRow(inputCell);\n        const scope = this.#expandedInspectSessions.get(tableview);\n        if (!range || editorRow < 0 || scope === undefined\n            || !this.#canApplyTableAmend(tableview, outputLine, { requireTableOutput: false })) return true;\n        // The inspector edits only its source range. Boundary navigation must\n        // not escape into another Puffbook expression or join it with Backspace.\n        if ((editorRow === 0 && (event.key === 'ArrowUp'\n                || (event.key === 'Backspace' && inputCell.cursorIndex === 0\n                    && inputCell.selectionRange[0] === inputCell.selectionRange[1])))\n            || (editorRow === range.end - range.start && event.key === 'ArrowDown')) return true;\n        const cursor = [range.start + editorRow, inputCell.cursorIndex];\n        const selectionRange = [...inputCell.selectionRange];\n        const beforeLineCount = doc.getWholePuffbookContent().split('\\n').length;\n        const [edited, nextCursor, restoredFocus] = doc.applyKeyDown(event, cursor, selectionRange, { undoScope: scope });\n        if (!edited) {\n            if (Array.isArray(nextCursor)) {\n                tableview.moveInspectCaret(nextCursor[0] - range.start, nextCursor[1]);\n            }\n            return true;\n        }\n        tableview.setInspectState('STALE');\n        const lineDelta = doc.getWholePuffbookContent().split('\\n').length - beforeLineCount;\n        const nextRange = { start: range.start, end: range.end + lineDelta };\n        tableview.acceptInspectCommitRange(nextRange);\n        this.#applyDocUpdate(this.#consumeDocumentUpdate());\n        const lines = [];\n        for (let line = nextRange.start; line <= nextRange.end; line += 1) lines.push(doc.renderLine(line)[0].text);\n        tableview.syncInspectSource(lines, nextRange, [nextCursor[0] - nextRange.start, nextCursor[1]]);\n        if (restoredFocus) tableview.syncInspectSelection(restoredFocus);\n        return true;\n    }\n\n    /* Apply Save/Discard replacements through the same predicted document edits. */\n    applyTableInspectReplacement(text, tableview) {\n        const outputLine = tableview?.getLineOnPuffbook?.();\n        const body = this.state.doc.getWholePuffbookContent?.()\n            ?? this.#blocks.filter((_, index) => index % 2 === 0).map((block) => block?.text ?? '').join('\\n');\n        const range = tableview?.getInspectSourceRange?.()\n            ?? localSourceRangeEndingAtOutputLine(body, outputLine);\n        if (typeof text !== 'string' || !range\n            || !this.#canApplyTableAmend(tableview, outputLine, { requireTableOutput: false })\n            || typeof this.state.doc.replaceSourceRange !== 'function') return false;\n        const draftLines = text.split('\\n');\n        const [replaced] = this.state.doc.replaceSourceRange(range, text);\n        if (!replaced) return false;\n        const nextRange = { start: range.start, end: range.start + draftLines.length - 1 };\n        tableview.acceptInspectCommitRange?.(nextRange);\n        this.#applyDocUpdate(this.#consumeDocumentUpdate());\n        return true;\n    }\n\n    #applyDocUpdate(update) {\n        return withPortalTimingScope('documentview.apply_doc_update_inner', {}, () => {\n            const edits = this.#normalisedDocEdits(update?.edits ?? []);\n            const startedMS = performance.now();\n            // Structural delta edits change display coordinates, not the\n            // document row the reader is looking at. Preserve that document\n            // anchor across suffix reflow; restoring a raw camera coordinate\n            // would compound drift on repeated inserts above the viewport.\n            const viewportAnchor = this.#captureViewportDisplayAnchor();\n            const movesMountedRows = edits.some((edit) =>\n                edit?.kind === 'line_insert' || edit?.kind === 'line_remove');\n            const projectionCursorAnchor = movesMountedRows\n                ? this.#captureCursorDisplayAnchor()\n                : null;\n            const summary = summariseDocEdits(edits);\n            const priorTableviewLines = new Set();\n            const touchedTableviewLines = new Set();\n            for (let i = 1; i < this.#blocks.length; i += 2) {\n                if (this.#blocks[i]?.block_type === 'tableview') {\n                    priorTableviewLines.add((i - 1) / 2);\n                }\n            }\n            if (edits.length === 0) {\n                // Trace-only Puffbook updates intentionally have no document\n                // edits, but an open IC visualisation must still ingest them.\n                this.#syncWorkThink();\n                pushTestingPortalTimingTrace('documentview_apply_doc_update', {\n                    ...summary,\n                    touched_tableview_lines: [],\n                    duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n                });\n                return;\n            }\n            let needsLayout = false;\n            let layoutFrom = this.#cells.length;\n            const focusLines = new Set();\n            const refreshedTableviewLines = new Set();\n            let retargetFromLine = null;\n            for (const edit of edits) {\n                const lineNum = edit.line;\n                if (edit.kind === 'reset') {\n                    const blocks = this.state.doc.render();\n                    this.#replaceBlocksFully(blocks);\n                    pushTestingPortalTimingTrace('documentview_apply_doc_update', {\n                        ...summary,\n                        touched_tableview_lines: Array.from(priorTableviewLines).sort((a, b) => a - b).slice(0, 12),\n                        duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n                    });\n                    return;\n                }\n                if (!Number.isInteger(lineNum) || lineNum < 0) {\n                    throw new Error(`DocumentView expected non-negative integer line in doc edit, got ${lineNum}.`);\n                }\n                if (priorTableviewLines.has(lineNum)) {\n                    touchedTableviewLines.add(lineNum);\n                }\n                if (edit.kind !== 'line_insert' && lineNum * 2 >= this.#cells.length) {\n                    this.refresh();\n                    pushTestingPortalTimingTrace('documentview_apply_doc_update', {\n                        ...summary,\n                        touched_tableview_lines: Array.from(touchedTableviewLines).sort((a, b) => a - b),\n                        bailed_to_refresh: true,\n                        duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n                    });\n                    return;\n                }\n                switch (edit.kind) {\n                case 'line_insert':\n                    {\n                        const [inBlock, outBlock] = this.#lineBlocksForEdit(edit, lineNum);\n                        this.#insertBlockAt(lineNum * 2, inBlock, lineNum);\n                        this.#insertBlockAt(lineNum * 2 + 1, outBlock, lineNum);\n                        this.#rebaseLineScrollOffsetIndices(lineNum, 1);\n                    }\n                    needsLayout = true;\n                    layoutFrom = Math.min(layoutFrom, lineNum * 2);\n                    focusLines.add(lineNum);\n                    retargetFromLine = retargetFromLine === null ? lineNum + 1 : Math.min(retargetFromLine, lineNum + 1);\n                    this.#shiftCurrentTableviewLine(lineNum, 1);\n                    break;\n                case 'line_remove':\n                    this.#removeLineBlocks(lineNum);\n                    this.#rebaseLineScrollOffsetIndices(lineNum, -1);\n                    needsLayout = true;\n                    layoutFrom = Math.min(layoutFrom, lineNum * 2);\n                    focusLines.add(lineNum);\n                    retargetFromLine = retargetFromLine === null ? lineNum : Math.min(retargetFromLine, lineNum);\n                    this.#shiftCurrentTableviewLine(lineNum, -1);\n                    break;\n                case 'line_input': {\n                    const block = this.#inputBlockForEdit(edit, lineNum);\n                    this.#applyBlockAt(lineNum * 2, block, lineNum);\n                    needsLayout = true;\n                    layoutFrom = Math.min(layoutFrom, lineNum * 2);\n                    focusLines.add(lineNum);\n                    break;\n                }\n                case 'line_replace':\n                    {\n                        const blocks = this.#lineBlocksForEdit(edit, lineNum);\n                        this.#applyBlockAt(lineNum * 2, blocks[0], lineNum);\n                        if (blocks[1]?.block_type === 'hidden') {\n                            this.#applyBlockAt(lineNum * 2 + 1, blocks[1], lineNum, { animateOutput: this.#outputAnimationsEnabled() });\n                        }\n                    }\n                    if (this.#blocks[lineNum * 2 + 1]?.block_type === 'tableview') {\n                        refreshedTableviewLines.add(lineNum);\n                    }\n                    needsLayout = true;\n                    layoutFrom = Math.min(layoutFrom, lineNum * 2);\n                    focusLines.add(lineNum);\n                    break;\n                case 'line_output': {\n                    const block = this.#outputBlockForEdit(edit, lineNum);\n                    this.#applyBlockAt(lineNum * 2 + 1, block, lineNum, { animateOutput: this.#outputAnimationsEnabled() });\n                    if (block?.block_type === 'tableview') {\n                        refreshedTableviewLines.add(lineNum);\n                    }\n                    needsLayout = true;\n                    layoutFrom = Math.min(layoutFrom, lineNum * 2 + 1);\n                    break;\n                }\n                default:\n                    throw new Error(`DocumentView does not support doc edit kind='${edit.kind}'.`);\n                }\n            }\n\n            if (needsLayout) {\n                if (retargetFromLine !== null) {\n                    const sampledPreviewLines = Array.from(priorTableviewLines)\n                        .filter((lineNum) => lineNum < retargetFromLine)\n                        .sort((a, b) => a - b)\n                        .slice(-3);\n                    if (sampledPreviewLines.length > 0) {\n                        pushTestingPortalTimingTrace('documentview_retarget_suffix_start', {\n                            start_line: retargetFromLine,\n                            sampled_preview_lines: sampledPreviewLines,\n                            preview_rows: this.#tracePreviewRows(sampledPreviewLines),\n                        });\n                    }\n                    this.#rebaseSuffixMounts(retargetFromLine);\n                    layoutFrom = Math.min(layoutFrom, retargetFromLine * 2);\n                    if (sampledPreviewLines.length > 0) {\n                        pushTestingPortalTimingTrace('documentview_retarget_suffix_done', {\n                            start_line: retargetFromLine,\n                            sampled_preview_lines: sampledPreviewLines,\n                            preview_rows: this.#tracePreviewRows(sampledPreviewLines),\n                        });\n                    }\n                }\n                this.#updateVerticalPositions(layoutFrom);\n                this.#restoreViewportDisplayAnchor(viewportAnchor);\n                const restoredProjectionCursor = this.#restoreCursorDisplayAnchor(projectionCursorAnchor);\n                if (!restoredProjectionCursor) {\n                    this.#maybeClaimInitialFocus();\n                }\n                this.#syncInputFocus(restoredProjectionCursor\n                    ? new Set([this.state.cursor?.[0]])\n                    : focusLines);\n                this.#updateCursor();\n                if (refreshedTableviewLines.has(this.lineOfCurrentTableview)) {\n                    this.currentTableviewRefreshed(this.lineOfCurrentTableview);\n                }\n            }\n            this.#clampCameraVertical();\n            this.#syncWorkThink();\n            pushTestingPortalTimingTrace('documentview_apply_doc_update', {\n                ...summary,\n                touched_tableview_lines: Array.from(touchedTableviewLines).sort((a, b) => a - b),\n                needs_layout: needsLayout,\n                layout_from: needsLayout ? layoutFrom / 2 : null,\n                duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n            });\n        });\n    }\n\n    /* Apply structural row edits before output/status projection so dependent cells never target unmateralised rows. */\n    #normalisedDocEdits(edits) {\n        if (!Array.isArray(edits) || edits.length === 0) {\n            return [];\n        }\n        if (edits.some((edit) => edit?.kind === 'reset')) {\n            return [{ kind: 'reset' }];\n        }\n        const expanded = [];\n        for (const edit of edits) {\n            if (edit?.kind === 'apply_text_edits') {\n                expanded.push(...this.#lowerApplyTextEditsBundle(edit));\n                continue;\n            }\n            expanded.push(edit);\n        }\n        const supported = new Set(['line_insert', 'line_remove', 'line_input', 'line_replace', 'line_output']);\n        if (expanded.some((edit) => !supported.has(edit?.kind))) {\n            throw new Error(`DocumentView received unsupported doc edit kinds: ${JSON.stringify(expanded.map((edit) => edit?.kind ?? null))}`);\n        }\n        // Edit batches are sequential programmes. In particular, viewport\n        // projection deltas remove, insert, then patch current coordinates;\n        // regrouping by kind would reinterpret those coordinates.\n        return expanded;\n    }\n\n    /* Lower one websocket-shaped apply_text_edits bundle into local structural/input/output row patches. */\n    #lowerApplyTextEditsBundle(edit) {\n        const sourceSpans = Array.isArray(edit?.source_spans) ? edit.source_spans : null;\n        const outputLines = Array.isArray(edit?.output_lines) ? edit.output_lines : [];\n        if (sourceSpans === null) {\n            throw new Error('DocumentView apply_text_edits bundle requires source_spans.');\n        }\n        const prevTexts = this.#mountedInputTexts();\n        let nextBody = prevTexts.join('\\n');\n        for (const span of replaceSpanChainFromChange(nextBody, sourceSpans, 'DocumentView apply_text_edits source_spans')) {\n            nextBody = applyReplaceSpan(nextBody, span);\n        }\n        const nextTexts = splitBody(nextBody);\n        const structural = [];\n        const lineInputs = new Map();\n        const lineOutputs = new Map();\n        const inserted = new Set();\n        const { prefix, suffix } = this.#sharedInputTextSpans(prevTexts, nextTexts);\n        const prevMiddleLength = prevTexts.length - prefix - suffix;\n        const nextMiddleLength = nextTexts.length - prefix - suffix;\n        const sharedMiddleLength = Math.min(prevMiddleLength, nextMiddleLength);\n        for (let i = 0; i < sharedMiddleLength; i += 1) {\n            const line = prefix + i;\n            const nextInputBlock = this.#docLineBlocks(line)[0];\n            const prevInputBlock = this.#blocks[line * 2] ?? null;\n            if (prevTexts[line] === nextTexts[line] && sameProjectedInputDisplayBlock(prevInputBlock, nextInputBlock)) {\n                continue;\n            }\n            lineInputs.set(line, {\n                kind: 'line_input',\n                line,\n                input_block: nextInputBlock,\n            });\n        }\n        if (nextMiddleLength > prevMiddleLength) {\n            for (let i = sharedMiddleLength; i < nextMiddleLength; i += 1) {\n                const line = prefix + i;\n                const [inputBlock, outputBlock] = this.#docLineBlocks(line);\n                structural.push({\n                    kind: 'line_insert',\n                    line,\n                    input_block: inputBlock,\n                    output_block: outputBlock,\n                });\n                inserted.add(line);\n            }\n        } else if (prevMiddleLength > nextMiddleLength) {\n            for (let i = sharedMiddleLength; i < prevMiddleLength; i += 1) {\n                structural.push({ kind: 'line_remove', line: prefix + sharedMiddleLength });\n            }\n        }\n        for (const line of outputLines) {\n            if (!Number.isInteger(line) || line < 0 || inserted.has(line)) {\n                continue;\n            }\n            const [inputBlock, outputBlock] = this.#docLineBlocks(line);\n            lineInputs.set(line, {\n                kind: 'line_input',\n                line,\n                input_block: inputBlock,\n            });\n            lineOutputs.set(line, {\n                kind: 'line_output',\n                line,\n                output_block: outputBlock,\n            });\n        }\n        return [\n            ...structural,\n            ...Array.from(lineInputs.keys()).sort((a, b) => a - b).map((line) => lineInputs.get(line)),\n            ...Array.from(lineOutputs.keys()).sort((a, b) => a - b).map((line) => lineOutputs.get(line)),\n        ];\n    }\n\n    /* Read the currently mounted input texts so source deltas can be lowered against the visible document state. */\n    #mountedInputTexts() {\n        const out = [];\n        for (let i = 0; i < this.#blocks.length; i += 2) {\n            const block = this.#blocks[i] ?? null;\n            if (!block) {\n                throw new Error(`DocumentView missing mounted input block at index ${i}.`);\n            }\n            out.push(`${block.text ?? ''}`);\n        }\n        return out.length > 0 ? out : [''];\n    }\n\n    /* Resolve one final projected line pair from the current document after puffbook has absorbed the authoritative delta. */\n    #docLineBlocks(lineNum) {\n        const blocks = this.state.doc.renderLine(lineNum);\n        if (!Array.isArray(blocks) || blocks.length !== 2) {\n            throw new Error(`DocumentView expected renderLine(${lineNum}) to return [input, output].`);\n        }\n        return blocks;\n    }\n\n    /* Find the unchanged prefix/suffix span between the mounted input texts and the source-delta result. */\n    #sharedInputTextSpans(prevTexts, nextTexts) {\n        const minLength = Math.min(prevTexts.length, nextTexts.length);\n        let prefix = 0;\n        while (prefix < minLength && prevTexts[prefix] === nextTexts[prefix]) {\n            prefix += 1;\n        }\n        let suffix = 0;\n        while (suffix + prefix < minLength) {\n            const prevIdx = prevTexts.length - suffix - 1;\n            const nextIdx = nextTexts.length - suffix - 1;\n            if (prevTexts[prevIdx] !== nextTexts[nextIdx]) {\n                break;\n            }\n            suffix += 1;\n        }\n        return { prefix, suffix };\n    }\n\n    #getScrollOffset(lineNum, lineRef) {\n        if (lineRef && this.#lineScrollOffsets.has(lineRef)) {\n            return this.#lineScrollOffsets.get(lineRef);\n        }\n        const stored = this.#lineScrollOffsetsByIndex.get(lineNum);\n        return stored ?? 0;\n    }\n\n    #setScrollOffset(lineNum, lineRef, offset) {\n        if (lineRef) {\n            this.#lineScrollOffsets.set(lineRef, offset);\n        }\n        if (lineNum !== undefined && lineNum !== null) {\n            this.#lineScrollOffsetsByIndex.set(lineNum, offset);\n        }\n    }\n\n    /* Forward the index-keyed input viewport state through the same structural edit as the line ledger. */\n    #rebaseLineScrollOffsetIndices(lineNum, delta) {\n        if (!Number.isInteger(lineNum) || lineNum < 0 || (delta !== 1 && delta !== -1)) {\n            throw new Error(`DocumentView expected one structural scroll-offset rebase, got line=${lineNum} delta=${delta}.`);\n        }\n        const next = new Map();\n        for (const [currentLine, offset] of this.#lineScrollOffsetsByIndex) {\n            if (delta < 0 && currentLine === lineNum) {\n                continue;\n            }\n            next.set(currentLine >= lineNum && delta > 0\n                ? currentLine + 1\n                : currentLine > lineNum && delta < 0\n                    ? currentLine - 1\n                    : currentLine, offset);\n        }\n        this.#lineScrollOffsetsByIndex = next;\n    }\n\n    #pruneScrollOffsets(totalLines) {\n        for (let key of [...this.#lineScrollOffsetsByIndex.keys()]) {\n            if (key >= totalLines) {\n                this.#lineScrollOffsetsByIndex.delete(key);\n            }\n        }\n    }\n\n    usesDocumentSelection(inputCell) {\n        return typeof this.state.doc.sourceSelectionState === 'function'\n            && this.#ownsLiveInputCell(inputCell);\n    }\n\n    sourceCellHasSelection(cell) {\n        return rowSelection(this.state.doc.sourceSelectionState(), this.#displayLineNumber(cell.cellID), cell.textInput.length).segments.length > 0;\n    }\n\n    #projectSourceSelection() {\n        if (!this.state.doc.sourceSelectionState) return;\n        const selection = this.state.doc.sourceSelectionState();\n        const primary = primaryFocus(selection);\n        const focused = this.#ownedFocusedInputCell();\n        const visible = this.#wantsDocumentFocus() && (focused?.hasVisibleCaret() ?? true);\n        for (let line = 0; line * 2 < this.#cells.length; line++) {\n            const cell = this.#cells[line * 2]?.inputCell;\n            if (!cell) continue;\n            const absoluteLine = this.#displayLineNumber(line);\n            cell.syncDocumentSelection(rowSelection(selection, absoluteLine, cell.textInput.length),\n                absoluteLine === primary.line ? primary.col : null, visible);\n        }\n    }\n\n    #handleSourceKeyDown(evt) {\n        if (currentFocusContainer() !== this) return false;\n        if (evt.key === 'copy' || evt.key === 'cut') {\n            this.state.doc.copySourceSelection(evt);\n            this.#restoreProjectedFocus();\n            return true;\n        }\n        return this.#applySourceKey(evt);\n    }\n\n    #applySourceKey(evt) {\n        const cursor = this.state.cursor ?? [0, 0];\n        const [edited, nextCursor] = this.state.doc.applyKeyDown(evt, cursor, null, { source: 'view' });\n        if (nextCursor === null && !edited) return false;\n        const update = this.#consumeDocumentUpdate();\n        if (update.edits.length) this.#applyDocUpdate(update);\n        if (nextCursor) this.state.cursor = nextCursor;\n        this.#restoreProjectedFocus();\n        this.#projectSourceSelection();\n        this.#clampCameraVertical();\n        return true;\n    }\n\n    beginSourceSelection(inputCell, col, shift = false) {\n        if (!this.usesDocumentSelection(inputCell) || !this.#activateFocusEntry(inputCell)) return false;\n        this.#documentFocusActive = true;\n        const selection = this.state.doc.sourceSelectionState();\n        const point = { line: this.#displayLineNumber(inputCell.cellID), col };\n        const anchor = shift ? selection.ranges[selection.primaryIndex].anchor : point;\n        this.state.doc.setSourceSelection({ ranges: [{ anchor: { ...anchor }, focus: point }], primaryIndex: 0, verticalColumn: null });\n        this.#startSourceDrag('selection');\n        this.#restoreProjectedFocus();\n        return true;\n    }\n\n    addSourceCaret(inputCell, col) {\n        if (!this.usesDocumentSelection(inputCell) || !this.#activateFocusEntry(inputCell)) return false;\n        this.#endSourceDrag();\n        this.#documentFocusActive = true;\n        this.state.doc.addSourceCaret({ line: this.#displayLineNumber(inputCell.cellID), col });\n        this.#startSourceDrag('carets');\n        this.#restoreProjectedFocus();\n        return true;\n    }\n\n    beginAddSourceSelection(inputCell, col) {\n        if (!this.usesDocumentSelection(inputCell) || !this.#activateFocusEntry(inputCell)) return false;\n        this.#endSourceDrag();\n        this.#documentFocusActive = true;\n        this.state.doc.beginSourceSelectionDrag({ line: this.#displayLineNumber(inputCell.cellID), col });\n        this.#startSourceDrag('add_selection');\n        this.#restoreProjectedFocus();\n        return true;\n    }\n\n    selectSourceCellRange(inputCell, start, end) {\n        this.#endSourceDrag();\n        if (!this.usesDocumentSelection(inputCell) || !this.#activateFocusEntry(inputCell)) return false;\n        const line = this.#displayLineNumber(inputCell.cellID);\n        this.state.doc.setSourceSelection({ ranges: [{ anchor: { line, col: start }, focus: { line, col: end } }], primaryIndex: 0, verticalColumn: null });\n        this.#restoreProjectedFocus();\n        return true;\n    }\n\n    #hasActiveSourceDrag() {\n        if (!this.scene || this.sourceDragMode === null) return false;\n        if (this.sourceDragMode !== 'selection' && !this.state.doc.hasSourceDrag()) {\n            this.#endSourceDrag();\n            return false;\n        }\n        return true;\n    }\n\n    #sourceDragColumn(cell, mouseX, column, delta) {\n        if (delta <= 0 || (mouseX >= 0 && mouseX <= cell.width)) return column;\n        const direction = mouseX < 0 ? -1 : 1;\n        const overshoot = direction < 0 ? -mouseX : mouseX - cell.width;\n        const steps = Math.max(1, Math.floor(Math.max(60, overshoot * 0.5) * delta));\n        for (let step = 0; step < steps; step++) column = direction < 0\n            ? textutils.previousCodepointIndex(cell.textInput, column)\n            : textutils.nextCodepointIndex(cell.textInput, column);\n        return column;\n    }\n\n    #extendSourceDrag(delta = 0) {\n        if (!this.#hasActiveSourceDrag()) return;\n        const caretDrag = this.sourceDragMode === 'carets';\n        const addSelection = this.sourceDragMode === 'add_selection';\n        const columns = [];\n        let nearest = null;\n        let distance = Infinity;\n        // Sample each mounted row once: nearest-row hit testing and horizontal\n        // per-row selection use the same mouse position and source coordinates.\n        for (let line = 0; line * 2 < this.#cells.length; line++) {\n            const cell = this.#cells[line * 2]?.inputCell;\n            if (!cell) continue;\n            const local = cell.getLocalMousePosition();\n            const absoluteLine = this.#displayLineNumber(cell.cellID);\n            const point = caretDrag\n                ? { line: absoluteLine, col: cell.localPointToCursor(local[0], cell.height * 0.5).col } : null;\n            if (point !== null) columns.push(point);\n            const d = local[1] < 0 ? -local[1] : local[1] > cell.height ? local[1] - cell.height : 0;\n            if (d < distance) { nearest = { cell, local, absoluteLine, point }; distance = d; }\n        }\n        if (nearest === null) return;\n        const { cell, local, absoluteLine } = nearest;\n        const selection = this.state.doc.sourceSelectionState();\n        const focus = addSelection ? this.state.doc.sourceDragFocus() : primaryFocus(selection);\n        if (caretDrag) {\n            const point = nearest.point;\n            if (delta > 0 && (local[0] < 0 || local[0] > cell.width)) {\n                point.col = this.#sourceDragColumn(cell, local[0],\n                    focus.line === absoluteLine ? focus.col : point.col, delta);\n            }\n            this.state.doc.extendSourceDrag(point, columns);\n        } else {\n            const point = local[1] < 0 ? { col: 0 } : local[1] > cell.height ? { col: cell.textInput.length }\n                : cell.localPointToCursor(local[0], local[1]);\n            if (delta > 0 && local[1] >= 0 && local[1] <= cell.height\n                && (local[0] < 0 || local[0] > cell.width)) {\n                point.col = this.#sourceDragColumn(cell, local[0],\n                    focus.line === absoluteLine ? focus.col : point.col, delta);\n            }\n            const endpoint = { line: absoluteLine, col: point.col };\n            if (addSelection) this.state.doc.extendSourceDrag(endpoint);\n            else {\n                selection.ranges[selection.primaryIndex].focus = endpoint;\n                this.state.doc.setSourceSelection(selection);\n            }\n        }\n        this.#restoreProjectedFocus();\n    }\n\n    #startSourceDrag(mode) {\n        this.sourceDragMode = mode;\n        this.scene.pointerCaptureOwner = this;\n        this.scene.dragCapture = 'document_selection';\n        this.#scheduleSourceDrag();\n    }\n\n    #scheduleSourceDrag() {\n        if (!this.scene || this.sourceDragMode === null || this.ownSourceDragThink !== null) return;\n        this.ownSourceDragThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), ({ now_s }) => {\n            this.ownSourceDragThink = null;\n            if (!Mouse.leftDown) { this.#endSourceDrag(); return; }\n            if (!this.#hasActiveSourceDrag()) return;\n            const height = this.#viewportSize()[1];\n            const y = Mouse.y * height;\n            const speed = y < 40 ? -Math.min(700, (40 - y) * 12)\n                : y > height - 40 ? Math.min(700, (y - height + 40) * 12) : 0;\n            if (speed !== 0) {\n                this.#setScrollY(this.#clampedScrollY(this.#scrollY + speed * this.sceneFrameStepS()));\n                this.#applyViewportNow(now_s);\n            }\n            this.#extendSourceDrag(this.sceneFrameStepS());\n            this.#scheduleSourceDrag();\n        });\n    }\n\n    #endSourceDrag(cancelPending = false) {\n        if (this.sourceDragMode === 'carets' || this.sourceDragMode === 'add_selection') this.state.doc.finishSourceDrag(cancelPending);\n        this.sourceDragMode = null;\n        if (this.ownSourceDragThink !== null) {\n            this.cancelThinkAt(this.ownSourceDragThink);\n            this.ownSourceDragThink = null;\n        }\n        if (this.scene?.pointerCaptureOwner === this) {\n            this.scene.pointerCaptureOwner = null;\n            this.scene.dragCapture = null;\n        }\n    }\n\n    /* Adapt the focused InputCell presentation state into one document command. */\n    #handleFocusedInputKeyDown(evt, inputCell) {\n        if (this.usesDocumentSelection(inputCell)) return this.#handleSourceKeyDown(evt);\n        if (!this.#ownsLiveInputCell(inputCell)) {\n            return false;\n        }\n        this.#setDocumentFocusActive(true);\n\n        const lineNum = inputCell.cellID;\n        const block = this.#blocks[lineNum * 2] || null;\n        this.#setScrollOffset(lineNum, block?.ptrless ?? null, inputCell.displayOffset);\n\n        const stateCursor = Array.isArray(this.state.cursor) ? this.state.cursor : null;\n        const cursorCol = stateCursor && stateCursor[0] === lineNum && Number.isInteger(stateCursor[1])\n            ? stateCursor[1]\n            : inputCell.cursorIndex;\n        const cursor = [lineNum, cursorCol];\n        let selectionRange = null;\n        if (inputCell.selectionRange && inputCell.selectionRange.length === 2) {\n            const [start, end] = inputCell.selectionRange;\n            if (typeof start === 'number' && typeof end === 'number' && start !== end) {\n                selectionRange = [Math.min(start, end), Math.max(start, end)];\n            }\n        }\n        return this.#processDocumentKeyDown(evt, { cursor, selectionRange });\n    }\n\n    /* Persist the moving focus end of a live pointer selection. */\n    #onOwnedInputCellSelectionChange(inputCell) {\n        if (!this.#ownsLiveInputCell(inputCell) || !inputCell.isSelecting || currentFocusContainer() !== this) {\n            this.#reportProjectionFocus();\n            return;\n        }\n        const line = inputCell.cellID;\n        const col = Math.max(0, Math.min(inputCell.cursorIndex, inputCell.textInput.length));\n        const cursor = this.state.cursor;\n        if (!Array.isArray(cursor) || cursor[0] !== line || cursor[1] !== col) {\n            this.state.cursor = [line, col];\n        }\n        this.#setScrollOffset(line, this.#blocks[line * 2]?.ptrless ?? null, inputCell.displayOffset);\n        this.#reportProjectionFocus();\n    }\n\n    /* Let only the currently owned focused leaf drive external-caret blink updates. */\n    #onOwnedInputCellBlinkPhaseChange(inputCell) {\n        if (!inputCell || inputCell.ownerDocumentView !== this) {\n            return;\n        }\n        if (this.#ownedFocusedInputCell() !== inputCell) {\n            return;\n        }\n        // Blink changes only caret visibility. Stage reads geometry from the focused InputCell,\n        // so this must not reconcile document cursor state into that local selection cursor.\n        this.scene?.stage?.syncFocusCaret?.();\n        this.#projectSourceSelection();\n    }\n\n    #canMoveInputCellCaretLocally(cursor) {\n        const lineNum = Number.isInteger(cursor?.[0]) ? cursor[0] : -1;\n        const inputCell = lineNum >= 0 ? this.#cells[lineNum * 2]?.inputCell ?? null : null;\n        const block = lineNum >= 0 ? this.#blocks[lineNum * 2] ?? null : null;\n        return this.#ownsLiveInputCell(inputCell)\n            && inputCell.textInput === (block?.text ?? inputCell.textInput);\n    }\n\n    /* Move a live focused cell cursor without re-projecting document text or selection. */\n    #moveInputCellCaretLocally(cursor) {\n        const lineNum = Number.isInteger(cursor?.[0]) ? cursor[0] : -1;\n        const col = Number.isInteger(cursor?.[1]) ? cursor[1] : null;\n        const inputCell = lineNum >= 0 ? this.#cells[lineNum * 2]?.inputCell ?? null : null;\n        if (!this.#canMoveInputCellCaretLocally(cursor) || !Number.isInteger(col)) {\n            return false;\n        }\n        inputCell.updateCaret(col);\n        return true;\n    }\n\n    #syncInputCellFromDocument(inputCell, text, cursor, options = undefined) {\n        const noProjectionChange = options === undefined\n            && inputCell?.textInput === text\n            && inputCell?.cursorIndex === cursor;\n        if (noProjectionChange) {\n            return false;\n        }\n        if (inputRouteLoggingEnabled()) {\n            console.debug('[document-input-sync]', {\n                line: Number.isInteger(inputCell?.cellID) ? inputCell.cellID : null,\n                text_changed: inputCell?.textInput !== text,\n                cursor_before: Number.isInteger(inputCell?.cursorIndex) ? inputCell.cursorIndex : null,\n                cursor_after: Number.isInteger(cursor) ? cursor : null,\n            });\n        }\n        inputCell.syncFromDocument(text, cursor, options);\n        this.#syncExpandedTableInspectFromSource(inputCell?.cellID, text);\n        return true;\n    }\n\n    /* Synchronize every live fullscreen session, even if its old inline host was replaced. */\n    #syncExpandedTableInspectFromSource(lineNum, text) {\n        if (!Number.isInteger(lineNum) || lineNum < 0 || typeof text !== 'string') return;\n        const sessions = new Set(this.#expandedInspectSessions.keys());\n        for (let outputLine = 0; outputLine * 2 + 1 < this.#cells.length; outputLine += 1) {\n            const outputCell = this.#cells[outputLine * 2 + 1] ?? null;\n            const viewport = outputCell?.testingViewport ?? null;\n            const tableview = viewport?.testingTableView ?? null;\n            if (viewport?.expanded === true && tableview?.syncInspectSource) sessions.add(tableview);\n        }\n        for (const tableview of sessions) {\n            const outputLine = tableview.getLineOnPuffbook?.();\n            const range = tableview.getInspectSourceRange?.()\n                ?? localSourceRangeEndingAtOutputLine(this.state.doc.getWholePuffbookContent(), outputLine);\n            if (!range || lineNum < range.start || lineNum > range.end) continue;\n            const lines = [];\n            for (let sourceLine = range.start; sourceLine <= range.end; sourceLine += 1) {\n                lines.push(this.state.doc.renderLine(sourceLine)?.[0]?.text ?? '');\n            }\n            tableview.syncInspectSource(lines, range);\n        }\n    }\n\n    /* Open a fresh undo scope and project the current source into the retained inspector. */\n    #beginExpandedInspectSession(tableview) {\n        this.#expandedInspectSessions.set(tableview, {});\n        const line = tableview.getLineOnPuffbook();\n        if (!this.#canApplyTableAmend(tableview, line, { requireTableOutput: false })) return;\n        // A retained preview can outlive source edits made while it was collapsed.\n        this.#syncExpandedTableInspectFromSource(line, this.state.doc.renderLine(line)[0].text);\n    }\n\n    /* Remove an obsolete inline host after its expanded session moved to another output row. */\n    #endExpandedInspectSession(tableview) {\n        this.#expandedInspectSessions.delete(tableview);\n        const activeLine = tableview?.getLineOnPuffbook?.();\n        let layoutFrom = null;\n        for (let lineNum = 0; lineNum * 2 + 1 < this.#cells.length; lineNum += 1) {\n            const blockIndex = lineNum * 2 + 1;\n            const cell = this.#cells[blockIndex] ?? null;\n            if (cell?.testingTableView !== tableview) continue;\n            const isActiveLine = lineNum === activeLine;\n            const viewportMountedInline = cell.testingViewport?.parentNode === cell;\n            if (isActiveLine && viewportMountedInline) continue;\n            if (isActiveLine) {\n                // The destination row can still point at the fullscreen object\n                // after it has been retired. Clear that detached handle and\n                // rebuild the current destination projection in its inline host.\n                const block = this.#blocks[blockIndex] ?? null;\n                this.#dropOutputPreview(cell);\n                if (block) this.#applyBlockAt(blockIndex, block, lineNum, { animateOutput: false });\n                layoutFrom = layoutFrom === null ? blockIndex : Math.min(layoutFrom, blockIndex);\n                continue;\n            }\n            const hiddenBlock = {\n                disposition: 'out',\n                block_type: 'hidden',\n                state: 'none',\n                text: '',\n                ptrless: null,\n                preview_kind: null,\n                preview_hints: null,\n                payload_ref: null,\n                refreshing: false,\n                server_state_kind: null,\n            };\n            this.#applyBlockAt(blockIndex, hiddenBlock, lineNum, { animateOutput: false });\n            layoutFrom = layoutFrom === null ? blockIndex : Math.min(layoutFrom, blockIndex);\n        }\n        if (layoutFrom !== null) {\n            this.#updateVerticalPositions(layoutFrom);\n            this.#clampCameraVertical();\n            this.#syncWorkThink();\n        }\n    }\n\n\n    #syncInputFocus(lines = null) {\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : [0, 0];\n        const row = Number.isInteger(cursor[0]) ? cursor[0] : -1;\n        const col = Number.isInteger(cursor[1]) ? cursor[1] : 0;\n        const focused = this.#ownedFocusedInputCell();\n        const focusedLine = focused?.cellID ?? -1;\n        const wantsFocus = this.#wantsDocumentFocus();\n\n        let targets = null;\n        if (lines !== null) {\n            targets = new Set();\n            for (const lineIndex of lines) {\n                if (Number.isInteger(lineIndex) && lineIndex >= 0 && lineIndex * 2 < this.#cells.length) {\n                    targets.add(lineIndex);\n                }\n            }\n            if (row >= 0) {\n                targets.add(row);\n            }\n            if (focusedLine >= 0) {\n                targets.add(focusedLine);\n            }\n            for (let i = 0; i < this.#cells.length; i += 2) {\n                const inputCell = this.#cells[i]?.inputCell ?? null;\n                if (inputCell?.inFocus === true) {\n                    targets.add(i / 2);\n                }\n            }\n        }\n\n        const visitLine = (lineIndex) => {\n            const cellIndex = lineIndex * 2;\n            const inputCell = this.#cells[cellIndex]?.inputCell;\n            const block = this.#blocks[cellIndex] || null;\n            if (!inputCell) {\n                return;\n            }\n\n            const targetText = block?.text ?? inputCell.textInput;\n            const lineRef = block?.ptrless ?? null;\n\n            if (lineIndex === row) {\n                this.#syncInputCellFromDocument(inputCell, targetText, col);\n                this.#setScrollOffset(lineIndex, lineRef, inputCell.displayOffset);\n                if (wantsFocus && !inputCell.inFocus) {\n                    inputCell.syncFocusVisual(true, 'document_sync_focus');\n                }\n                return;\n            }\n\n            if (inputCell.inFocus) {\n                inputCell.syncFocusVisual(false, 'document_cursor_retarget');\n                this.#syncInputCellFromDocument(inputCell, targetText, inputCell.cursorIndex);\n                this.#setScrollOffset(lineIndex, lineRef, inputCell.displayOffset);\n                return;\n            }\n\n            if (targetText !== inputCell.textInput) {\n                this.#syncInputCellFromDocument(inputCell, targetText, inputCell.cursorIndex);\n                this.#setScrollOffset(lineIndex, lineRef, inputCell.displayOffset);\n            }\n        };\n\n        if (targets === null) {\n            for (let i = 0; i < this.#cells.length; i += 2) {\n                visitLine(i / 2);\n            }\n            return;\n        }\n\n        for (const lineIndex of targets) {\n            visitLine(lineIndex);\n        }\n    }\n\n    // Move cursor Tile to correct pixel position corresponding to latest cursor position\n    #updateCursor({ allowInputCellSync = true } = {}) {\n        this.#syncSearchPresentation();\n        if (!this.#hasLiveFocusStack()) {\n            return;\n        }\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : [0, 0];\n        const lineNum = Number.isInteger(cursor[0]) ? cursor[0] : -1;\n        const col = Number.isInteger(cursor[1]) ? cursor[1] : 0;\n        const top = currentFocusContainer();\n        const focused = this.#ownedFocusedInputCell();\n        const stackLeaf = currentFocusedInputCell();\n        if (stackLeaf === null && top !== this) {\n            this.#logCaret('hide:no_focused_input', {\n                line: lineNum,\n                col,\n            });\n            this.scene?.stage?.syncFocusCaret?.();\n            return;\n        }\n        if (top !== this) {\n            this.#logCaret('skip:not_top_of_stack', {\n                line: lineNum,\n                col,\n                top_of_stack: top?.focusContainerKind ?? top?.constructor?.name ?? null,\n            });\n            return;\n        }\n        if (this.state.doc.sourceSelectionState && (lineNum < 0 || lineNum * 2 >= this.#cells.length)) {\n            replaceTopFocusEntry(this, null);\n            this.#projectSourceSelection();\n            return;\n        }\n        if (lineNum < 0) {\n            throw new Error(`DocumentView.#updateCursor(): top-of-stack document has invalid cursor line ${JSON.stringify(this.testingFocusState())}`);\n        }\n        let b = lineNum;\n        const cell = this.#cells[b * 2] || null;\n        const inputCell = cell?.inputCell || null;\n        if (!cell) {\n        this.#logCaret('skip:no_cell', {\n            line: lineNum,\n            col,\n        });\n            return;\n        }\n        if (!inputCell) {\n            throw new Error(`DocumentView.#updateCursor(): focused line ${lineNum} is missing its InputCell.`);\n        }\n        const block = this.#blocks[b * 2] || null;\n        const targetText = block?.text ?? inputCell.textInput;\n        if (inputCell.textInput !== targetText || inputCell.cursorIndex !== col) {\n            if (!allowInputCellSync) {\n                return;\n            }\n            this.#syncInputCellFromDocument(inputCell, targetText, col);\n        }\n        if (currentFocusedInputCell() !== inputCell && this.#ownsLiveInputCell(inputCell)) {\n            replaceTopFocusEntry(this, inputCell);\n        }\n        if (!focused || focused !== inputCell || !inputCell.inFocus) {\n            inputCell.syncFocusVisual(true, 'document_cursor_sync');\n        }\n        this.#logCaret('show:input_cell', {\n            line: lineNum,\n            col,\n            input_focus: inputCell.inFocus,\n            visible: true,\n            caret_x: inputCell.getCaretX(),\n            caret_y: inputCell.getCaretY(),\n            caret_h: inputCell.getCaretHeight(),\n        });\n        this.scene?.stage?.syncFocusCaret?.();\n        this.#projectSourceSelection();\n        this.#reportProjectionFocus();\n    }\n\n    testingFocusState() {\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : [0, 0];\n        const row = Number.isInteger(cursor[0]) ? cursor[0] : -1;\n        const col = Number.isInteger(cursor[1]) ? cursor[1] : 0;\n        const focused = this.#ownedFocusedInputCell();\n        const focusedLine = focused?.cellID ?? -1;\n        const selectionRange = focused && Array.isArray(focused.selectionRange) && focused.selectionRange.length === 2\n            ? [focused.selectionRange[0], focused.selectionRange[1]]\n            : null;\n        return {\n            cursor_line: row,\n            cursor_col: col,\n            focused_line: focusedLine,\n            focused_col: focused && Number.isInteger(focused.cursorIndex) ? focused.cursorIndex : null,\n            has_selection: !!(focused && typeof focused.hasSelection === 'function' && focused.hasSelection()),\n            selection_range: selectionRange,\n            source_selection: this.state.doc.sourceSelectionState?.() ?? null,\n        };\n    }\n\n    /* Report the latest cursor/selection seam back to the document owner unless one restore pass still owns projection state. */\n    #reportProjectionFocus() {\n        if (this.state.doc.sourceSelectionState) return;\n        if (this.#projectionRestorePending) {\n            return;\n        }\n        this.state.doc.observeProjectionFocus?.(this.testingFocusState());\n    }\n\n    /* Report the latest visible-band seam back to the document owner unless one restore pass still owns projection state. */\n    #reportProjectionViewport() {\n        if (this.#projectionRestorePending) {\n            return;\n        }\n        this.state.doc.observeProjectionViewport?.(this.#viewportBandsFromModel());\n    }\n\n    /* Recording coordinates must survive projection-window replacement. */\n    recordingLineNumber(lineNum) {\n        return this.#displayLineNumber(lineNum);\n    }\n\n    /* Resolve one gutter label from the owning document, falling back to local row numbering for non-puffbook docs. */\n    #displayLineNumber(lineNum) {\n        const mapped = this.state.doc.displayLineNumber?.(lineNum);\n        return Number.isInteger(mapped) ? mapped : lineNum;\n    }\n\n    /* Restore one document-owned cursor and selection snapshot into the live input row without replaying user input. */\n    #restoreProjectedFocus() {\n        const snap = this.state.doc.projectionFocusState?.() ?? null;\n        if (!snap) {\n            return false;\n        }\n        const lineNum = Number.isInteger(snap.cursor_line) ? snap.cursor_line : 0;\n        const col = Number.isInteger(snap.cursor_col) ? snap.cursor_col : 0;\n        const inputCell = this.#cells[lineNum * 2]?.inputCell ?? null;\n        const block = this.#blocks[lineNum * 2] || null;\n        if (!inputCell) {\n            if (this.state.doc.sourceSelectionState) {\n                this.state.cursor = [lineNum, col];\n                this.#updateCursor();\n                this.#projectSourceSelection();\n            }\n            return false;\n        }\n        this.#setDocumentFocusActive(true);\n        this.mutate({ cursor: [lineNum, col] });\n        this.#syncInputCellFromDocument(inputCell, block?.text ?? inputCell.textInput, col);\n        if (this.state.doc.sourceSelectionState) {\n            this.#projectSourceSelection();\n        } else if (snap.has_selection === true && snap.selection_line === lineNum) {\n            inputCell.syncSelectionRange(snap.selection_start, snap.selection_end);\n        } else {\n            inputCell.syncSelectionRange(col, col);\n        }\n        if (!inputCell.inFocus) {\n            inputCell.syncFocusVisual(true, 'document_projection_restore');\n        }\n        this.#syncInputFocus(new Set([lineNum]));\n        this.#updateCursor();\n        return true;\n    }\n\n    /* Restore one document-owned half-open viewport range by anchoring its start line back to the top of the local scroll owner. */\n    #restoreProjectedViewport() {\n        const band = this.state.doc.projectionViewportBand?.() ?? null;\n        if (!band) {\n            return false;\n        }\n        const absLine = Number.isInteger(band.start_line) ? band.start_line : -1;\n        const lineNum = typeof this.state.doc.windowLineForDisplayLine === 'function'\n            ? this.state.doc.windowLineForDisplayLine(absLine)\n            : absLine;\n        const cell = this.#cells[lineNum * 2] ?? null;\n        if (!cell) {\n            return false;\n        }\n        const lineTop = cell.localPosition?.()?.[1] ?? Number.NaN;\n        if (!Number.isFinite(lineTop)) {\n            return false;\n        }\n        this.cancelExponentialDecay('document_scroll_y');\n        this.#throwVelocityY = 0.0;\n        this.#currentThrowVelocityY = 0.0;\n        this.#setScrollY(this.#clampedScrollY(lineTop));\n        this.#viewportModel.anchor_mode = 'top';\n        this.#viewportModel.anchor_offset_y = 0;\n        return true;\n    }\n\n    testingCaretState() {\n        const caret = this.scene?.stage?.ownCaret ?? null;\n        return {\n            visible: caret?.visible === true,\n            parent_class: caret?.parentNode?.constructor?.name ?? null,\n            local: caret?.localPosition?.() ?? null,\n            width: caret?.state?.width ?? null,\n            height: caret?.state?.height ?? null,\n        };\n    }\n\n    testingFocusedInputCell() {\n        return this.#ownedFocusedInputCell();\n    }\n\n    /* Focus one document line and optionally place it at a stable viewport target for navigation jumps. */\n    focusLine(lineNum = 0, col = 0, opts = {}) {\n        // Focus is a document command, not merely a presentation update.  The\n        // next key must start from this position even while local edits remain\n        // pending and the rendered row has not refreshed yet.\n        if (this.state.doc.sourceSelectionState) {\n            this.state.doc.setSourceSelection(selectionAt({ line: this.#displayLineNumber(lineNum), col }));\n        }\n        this.mutate({\n            cursor: [lineNum, col],\n        });\n        const cellIndex = lineNum * 2;\n        const inputCell = this.#cells[cellIndex]?.inputCell ?? null;\n        const block = this.#blocks[cellIndex] || null;\n        if (!inputCell) {\n            return false;\n        }\n        const targetText = block?.text ?? inputCell.textInput;\n        const lineRef = block?.ptrless ?? null;\n        this.#setDocumentFocusActive(true);\n        inputCell.removeHighlight();\n        this.#syncInputCellFromDocument(inputCell, targetText, col);\n        this.#setScrollOffset(lineNum, lineRef, inputCell.displayOffset);\n        if (!inputCell.inFocus) {\n            inputCell.syncFocusVisual(true, 'document_focus_line');\n        }\n        this.#requestLineReveal(lineNum, opts);\n        return true;\n    }\n\n    testingFocus(lineNum = 0, col = 0) {\n        if (this.state.doc.sourceSelectionState) this.state.doc.setSourceSelection(selectionAt({ line: this.#displayLineNumber(lineNum), col }));\n        this.mutate({\n            cursor: [lineNum, col],\n        });\n        const cellIndex = lineNum * 2;\n        const inputCell = this.#cells[cellIndex]?.inputCell ?? null;\n        const block = this.#blocks[cellIndex] || null;\n        if (!inputCell) {\n            return false;\n        }\n        const targetText = block?.text ?? inputCell.textInput;\n        const lineRef = block?.ptrless ?? null;\n        this.#setDocumentFocusActive(true);\n        inputCell.removeHighlight();\n        this.#syncInputCellFromDocument(inputCell, targetText, col);\n        this.#setScrollOffset(lineNum, lineRef, inputCell.displayOffset);\n        if (!inputCell.inFocus) {\n            inputCell.syncFocusVisual(true, 'document_testing_focus');\n        }\n        return true;\n    }\n\n    /* Normalise one requested line reveal so callers can either preserve scroll or centre the target line. */\n    #requestLineReveal(lineNum, opts = {}) {\n        const scroll = opts?.scroll ?? 'preserve';\n        if (scroll === 'preserve') {\n            this.#pendingLineReveal = null;\n            return true;\n        }\n        const req = { lineNum, scroll, smooth: opts.smooth === true };\n        if (this.#applyLineReveal(req)) {\n            this.#pendingLineReveal = null;\n            return true;\n        }\n        this.#pendingLineReveal = req;\n        return false;\n    }\n\n    /* Replay one deferred reveal once both the target row and viewport geometry are live. */\n    #applyPendingLineReveal() {\n        if (!this.#pendingLineReveal) {\n            return false;\n        }\n        if (!this.#applyLineReveal(this.#pendingLineReveal)) {\n            return false;\n        }\n        this.#pendingLineReveal = null;\n        return true;\n    }\n\n    /* Move the document-local scroll owner so the focused line lands where the caller requested. */\n    #applyLineReveal(req) {\n        if (!req || !Number.isInteger(req.lineNum) || req.lineNum < 0) {\n            return false;\n        }\n        const cell = this.#cells[req.lineNum * 2] ?? null;\n        if (!cell) {\n            return false;\n        }\n        const [_, viewportHeight] = this.#viewportSize();\n        if (!Number.isFinite(viewportHeight) || viewportHeight <= 0) {\n            return false;\n        }\n        const lineTop = cell.localPosition?.()?.[1] ?? Number.NaN;\n        const lineHeight = Number(cell.height);\n        if (!Number.isFinite(lineTop) || !Number.isFinite(lineHeight) || lineHeight <= 0) {\n            return false;\n        }\n        let targetScrollY = this.#currentScrollY();\n        switch (req.scroll) {\n        case 'middle':\n            targetScrollY = lineTop + lineHeight * 0.5 - viewportHeight * 0.5;\n            break;\n        default:\n            throw new Error(`DocumentView.#applyLineReveal(): unknown scroll mode '${req.scroll}'.`);\n        }\n        if (req.smooth) this.#scrollTo(targetScrollY);\n        else {\n            this.cancelExponentialDecay('document_scroll_y');\n            this.#throwVelocityY = 0.0;\n            this.#currentThrowVelocityY = 0.0;\n            this.#setScrollY(this.#clampedScrollY(targetScrollY));\n        }\n        this.#viewportModel.anchor_mode = 'top';\n        this.#viewportModel.anchor_offset_y = 0;\n        this.#applyViewportNow();\n        this.#updateCursor();\n        return true;\n    }\n\n    #hasActiveSelectionHighlight() {\n        if (this.state.doc.sourceSelectionState) return false;\n        const inputCell = this.#ownedFocusedInputCell();\n        if (!inputCell || inputCell.cellID < 0) {\n            return false;\n        }\n        return this.#cells[inputCell.cellID * 2]?.inputCell === inputCell && inputCell.hasSelection();\n    }\n\n    #truncateForDisplay(text, limit = 120) {\n        if (!text) {\n            return '';\n        }\n        if (text.length <= limit) {\n            return text;\n        }\n        return text.substring(0, limit - 3) + '...';\n    }\n\n    #buildTableViewError(struct, err) {\n        const width = this.state.width;\n        const title = new evilfont.MSDFText({\n            x: 12,\n            y: 10,\n            font: this.state.font,\n            fontSize: 18,\n            fontColor: [1.0, 0.92, 0.88, 1.0],\n            text: 'Cannot preview table.',\n        });\n        const detail = new evilfont.MSDFText({\n            x: 12,\n            y: 38,\n            font: this.state.font,\n            fontSize: 14,\n            fontColor: [1.0, 0.82, 0.78, 1.0],\n            text: this.#truncateForDisplay(err?.message || String(err), 160),\n        });\n        const dataLine = new evilfont.MSDFText({\n            x: 12,\n            y: 62,\n            font: this.state.font,\n            fontSize: 14,\n            fontColor: [0.96, 0.72, 0.60, 1.0],\n            text: this.#truncateForDisplay(`data: ${struct?.toString?.() ?? String(struct)}`, 160),\n        });\n\n        const height = dataLine.state.y + dataLine.height() + 12;\n        const panel = new ui.Placeholder({\n            width,\n            height,\n        });\n        panel.appendChild(new Tile({\n            x: 0,\n            y: 0,\n            z: 1,\n            width,\n            height,\n            color: [0.29, 0.08, 0.08, 1.0],\n        }));\n        panel.appendChild(title);\n        panel.appendChild(detail);\n        panel.appendChild(dataLine);\n        return panel;\n    }\n\n    #layoutWidth() {\n        // Preview viewports must stay finite even if later layout state loses its width.\n        return Number.isFinite(this.state?.width) ? this.state.width : 1100;\n    }\n\n    #syncTableViewport(viewport, tableview, state = 'ptrless', refreshing = false) {\n        if (!viewport || !tableview) {\n            throw new Error('DocumentView expected live viewport and tableview when syncing table preview.');\n        }\n        viewport.mutate({ color: tableviewBoxColor(state, { refreshing }) });\n        tableview.setRefreshState?.(refreshing);\n        if (viewport.expanded) {\n            // The fullscreen viewport owns camera-sized bounds. Its source-row\n            // preview geometry must not leak into the active fullscreen scene.\n            tableview.syncViewportLayout?.();\n            return tableview.preferredPreviewHeight(256);\n        }\n        const width = this.#layoutWidth();\n        const viewportHeight = tableview.preferredPreviewHeight(256);\n        viewport.setViewportBounds(width, viewportHeight);\n        tableview.syncViewportLayout?.();\n        return viewportHeight;\n    }\n\n    /* Host one visualisation plugin inside an output-cell viewport using the plugin's own sizing contract. */\n    #syncRectRendererViewport(viewport, renderer, state = 'ptrless', maxHeight = 512, kind = 'visualisation plugin', refreshing = false) {\n        if (!viewport || !renderer) {\n            throw new Error(`DocumentView expected live viewport and ${kind} when syncing visualisation preview.`);\n        }\n        viewport.mutate({ color: tableviewBoxColor(state, { refreshing }) });\n        const width = this.#layoutWidth();\n        const viewportHeight = renderer.preferredPreviewHeight(maxHeight);\n        viewport.setViewportBounds(width, viewportHeight);\n        renderer.syncViewportLayout?.();\n        return viewportHeight;\n    }\n\n    #damonViewportHeight() {\n        return 576;\n    }\n\n    #damonLocalToParent(width, height) {\n        const pad = 18;\n        const innerWidth = Math.max(32, width - 2 * pad);\n        const innerHeight = Math.max(32, height - 2 * pad);\n        const centreX = pad + 0.5 * innerWidth;\n        const centreY = pad + 0.5 * innerHeight;\n        const scale = 0.5 * Math.min(innerWidth, innerHeight);\n        return twgl.m4.scale(\n            twgl.m4.translation([centreX, centreY, -0.2]),\n            [scale, scale, 1.0]\n        );\n    }\n\n    #syncDamonViewport(viewport, damon, state = 'ptrless', refreshing = false) {\n        if (!viewport || !damon) {\n            throw new Error('DocumentView expected live viewport and Damon preview when syncing damon_sdf preview.');\n        }\n        viewport.mutate({ color: tableviewBoxColor(state, { refreshing }) });\n        const width = this.#layoutWidth();\n        const viewportHeight = this.#damonViewportHeight();\n        viewport.setViewportBounds(width, viewportHeight);\n        damon.setLocalToParent(this.#damonLocalToParent(width, viewportHeight));\n        return viewportHeight;\n    }\n\n    #buildTableViewDisabled(struct, lineNum, state = 'ptrless', refreshing = false) {\n        const width = this.#layoutWidth();\n        const height = 132;\n        const viewport = new ui.Viewport({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            width,\n            height,\n            y: 0,\n            z: -1.0,\n            color: tableviewBoxColor(state, { refreshing }),\n            drawSurface: false,\n            allowExpand: true,\n        });\n        const columns = [\n            { x: 12, width: 220, text: 'column_a', type: 'F64', units: 'ms' },\n            { x: 232, width: 220, text: 'column_b', type: 'Str', units: null },\n            { x: 452, width: Math.max(180, width - 464), text: 'column_c', type: 'Bool', units: null },\n        ];\n        for (const column of columns) {\n            viewport.appendChild(new Tile({\n                x: column.x,\n                y: 44,\n                z: -0.1,\n                width: column.width,\n                height: 40,\n                color: [0.824, 0.396, 0.255, 1.0],\n            }));\n            viewport.appendChild(new evilfont.MSDFText({\n                x: column.x + 10,\n                y: 50,\n                z: -0.2,\n                font: this.tableviewHeaderFont,\n                fontSize: 15,\n                fontColor: [1.0, 1.0, 1.0, 1.0],\n                text: column.text,\n            }));\n            if (column.type) {\n                viewport.appendChild(new evilfont.MSDFText({\n                    x: column.x + 10,\n                    y: 66,\n                    z: -0.2,\n                    font: this.tableviewFont,\n                    fontSize: 9,\n                    fontColor: [1.0, 1.0, 1.0, 1.0],\n                    text: column.type,\n                }));\n            }\n            if (column.units) {\n                viewport.appendChild(new evilfont.MSDFText({\n                    x: column.x + column.width - 26,\n                    y: 66,\n                    z: -0.2,\n                    font: this.tableviewFont,\n                    fontSize: 9,\n                    fontColor: [1.0, 1.0, 1.0, 1.0],\n                    text: column.units,\n                }));\n            }\n        }\n        viewport.appendChild(new Tile({\n            x: 12,\n            y: 88,\n            z: -0.1,\n            width: width - 24,\n            height: 16,\n            color: [0.1843, 0.2078, 0.2314, 1.0],\n        }));\n        viewport.appendChild(new Tile({\n            x: 12,\n            y: 104,\n            z: -0.1,\n            width: width - 24,\n            height: 16,\n            color: [0.10, 0.10, 0.12, 1.0],\n        }));\n        viewport.appendChild(new evilfont.MSDFText({\n            x: 12,\n            y: 12,\n            z: -0.2,\n            font: this.state.font,\n            fontSize: 16,\n            fontColor: [1.0, 0.92, 0.88, 1.0],\n            text: 'Table viewport chrome placeholder',\n        }));\n        viewport.testingTableView = null;\n        if (lineNum === this.lineOfCurrentTableview) {\n            this.lineOfCurrentTableview = -1;\n            this.loaderPreviewReadyLine = lineNum;\n            this.#tryFinishCurrentTableviewLoad(lineNum);\n        }\n        return viewport;\n    }\n\n    #buildScatterPlot(struct, _lineNum, state = 'ptrless', plotKind = 'scatterplot', refreshing = false) {\n        const width = this.state.width;\n        const height = 512;\n        const viewport = new ui.Viewport({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            width,\n            height,\n            y: 0,\n            z: -1.0,\n            color: tableviewBoxColor(state, { refreshing }),\n            drawSurface: false,\n            allowExpand: true,\n        });\n        const plot = createVisualizationPlugin('scatterplot', {\n            struct,\n            plotKind,\n            font: this.tableviewFont,\n            titleFont: this.tableviewHeaderFont,\n            unitFont: this.tableviewFont,\n            width,\n            height,\n            z: -1.0,\n        });\n        viewport.appendChild(plot);\n        viewport.testingTableView = null;\n        viewport.testingScatterPlot = plot;\n        this.#syncRectRendererViewport(viewport, plot, state, 512, 'scatterplot', refreshing);\n        return viewport;\n    }\n\n    #buildDamonViewport(_obj, _lineNum, state = 'ptrless', refreshing = false) {\n        const width = this.state.width;\n        const height = this.#damonViewportHeight();\n        const viewport = new ui.Viewport({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            width,\n            height,\n            y: 0,\n            z: -1.0,\n            color: tableviewBoxColor(state, { refreshing }),\n            drawSurface: false,\n            allowExpand: true,\n        });\n        const damon = new Demon({\n            localToParent: this.#damonLocalToParent(width, height),\n        });\n        viewport.appendChild(damon);\n        viewport.testingTableView = null;\n        viewport.testingScatterPlot = null;\n        viewport.testingDamon = damon;\n        this.#syncDamonViewport(viewport, damon, state, refreshing);\n        return viewport;\n    }\n\n    #imageAssetPath(struct) {\n        const field = typeof struct?.field === 'function' ? struct.field('asset_path') : null;\n        if (!field) {\n            return null;\n        }\n        try {\n            const path = typeof field.toText === 'function' ? field.toText() : previewCell(field, 0);\n            return typeof path === 'string' && path.length > 0 ? path : null;\n        } catch (_err) {\n            return null;\n        }\n    }\n\n    #buildImageViewport(_struct, _lineNum, state = 'ptrless', refreshing = false) {\n        const width = this.state.width;\n        const height = Math.max(120, Math.round(width * 0.5625));\n        const viewport = new ui.Viewport({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            width,\n            height,\n            y: 0,\n            z: -1.0,\n            color: tableviewBoxColor(state, { refreshing }),\n            drawSurface: false,\n            allowExpand: true,\n        });\n        viewport.testingTableView = null;\n        viewport.testingScatterPlot = null;\n        viewport.testingDamon = null;\n        viewport.testingImagePreview = null;\n        viewport.testingImagePreviewLoading = null;\n        viewport.testingImagePreviewPath = null;\n        return viewport;\n    }\n\n    #syncImageViewport(cell, viewport, struct, state = 'ptrless', refreshing = false) {\n        const path = this.#imageAssetPath(struct);\n        const width = this.state.width;\n        const height = Math.max(120, Math.round(width * 0.5625));\n        viewport.mutate({ width, height, color: tableviewBoxColor(state, { refreshing }) });\n        if (!path) {\n            return height;\n        }\n        if (viewport.testingImagePreviewPath === path && viewport.testingImagePreview) {\n            viewport.testingImagePreview.fitWithin?.(width, height);\n            return height;\n        }\n        if (viewport.testingImagePreviewLoading?.path === path) {\n            return height;\n        }\n        if (viewport.testingImagePreview?.parentNode === viewport) {\n            viewport.removeChild(viewport.testingImagePreview);\n        }\n        viewport.testingImagePreview = null;\n        viewport.testingImagePreviewPath = path;\n        const token = ++this.#imagePreviewLoadSeq;\n        viewport.testingImagePreviewLoading = { path, token };\n        void this.#loadImageViewport(cell, viewport, path, token, width, height);\n        return height;\n    }\n\n    async #loadImageViewport(cell, viewport, path, token, width, height) {\n        const docRef = this.state?.doc?.fileRef;\n        const imageBlob = await this.#fetchDocImageBlob({ path, lake: docRef?.lake, branch: docRef?.branch });\n        if (!imageBlob || !cell?.parentNode || viewport?.parentNode !== cell || viewport.testingImagePreviewLoading?.token !== token) {\n            return;\n        }\n        const tile = new ui.TextureTile({ x: 0, y: 0, z: 0.1, width, height, imageBlob, keepAspectRatio: true });\n        viewport.appendChild(tile);\n        viewport.testingImagePreview = tile;\n        viewport.testingImagePreviewLoading = null;\n    }\n\n    #buildPuffCell(cell, block, lineNum) {\n        const isConvo = block.block_type === 'convo';\n        const accentColor = isConvo\n            ? [0.094, 0.427, 0.447, 1.0]\n            : [0.824, 0.396, 0.255, 1.0];\n        const marginColor = isConvo\n            ? [0.2, 0.28, 0.29, 1.0]\n            : [0.2549, 0.2549, 0.2549, 1.0];\n        const backingColor = isConvo\n            ? [0.16, 0.18, 0.2, 1.0]\n            : [0.2, 0.2, 0.2, 1.0];\n\n        let txt = new evilfont.MSDFText({\n            x: 0,\n            y: DOCUMENT_ROW_TEXT_Y,\n            font: this.state.font,\n            fontSize: 20,\n            fontColor: [1.0, 0.9411, 0.8745, 1.0],\n            text: block.text,\n        });\n        cell.glText = txt;\n   \n        const height = txt.height();\n\n        \n        const [, cursorX] = this.state.cursor;\n        const inputCell = new ui.InputCell({\n            font: this.state.font,\n            fontSize: 14,\n            width: this.state.width,\n            height: height,\n            textYOffset: DOCUMENT_ROW_TEXT_Y,\n            textInput: block.text,\n            readOnly: this.state.doc.read_only === true || block.read_only === true,\n            caretColor: this.state.doc.read_only === true ? Palette.grey : Palette.orange,\n            cellID: lineNum, \n            cursorIndex: cursorX,\n            useExternalCaret: true,\n            onBlinkPhaseChange: (cell) => this.#onOwnedInputCellBlinkPhaseChange(cell),\n            displayOffset: this.#getScrollOffset(lineNum, block.ptrless ?? null),\n            keyDelegate: (evt, cell) => this.#handleFocusedInputKeyDown(evt, cell),\n            onHoverColor: [0.124, 0.124, 0.124, 1.0],\n            displayFontColor: inputBlockFontColor(block),\n            displaySyncSpans: block.input_sync_spans ?? [],\n            focusContainerOwner: this,\n\n        })\n        inputCell.ownerDocumentView = this;\n        inputCell.onSelectionChange = (cell) => this.#onOwnedInputCellSelectionChange(cell);\n\n        cell.inputCell = inputCell;\n        cell.appendChild(inputCell)\n        this.#ensurePuffBadge(cell);\n        this.#syncPuffBadge(cell, block, lineNum);\n\n        const accentX = -DOCUMENT_ROW_LEFT_MARGIN_W + 18;\n        const accentWidth = 18;\n        let iconMargin = new Tile({ x: accentX, y: 0, z: 2, width: accentWidth, height, color: accentColor });\n        cell.appendChild(iconMargin);\n\n        const lineMarginX = accentX + accentWidth;\n        const lineMarginWidth = Math.max(0, -lineMarginX);\n        let lineMargin = new Tile({ x: lineMarginX, y: 0, z: 2, width: lineMarginWidth, height, color: marginColor });\n        cell.appendChild(lineMargin);\n\n       \n        const lineNumText = formatDocumentLineNumber(this.#displayLineNumber(lineNum));\n        let lineNumber = new evilfont.MSDFText({\n            x: -67,\n            y: DOCUMENT_ROW_TEXT_Y,\n            text: lineNumText,\n            font: this.state.font,\n            fontSize: 16,\n            fontColor: [1.0, 0.9411, 0.8745, 1.0],\n        });\n        cell.lineNumberText = lineNumber;\n        cell.appendChild(lineNumber);\n\n        let backing = new Tile({ x: 0, y: 0, z: 1, width: this.state.width, height, color: backingColor });\n        cell.appendChild(backing);\n\n        return txt.height();\n    }\n\n    #formatTextBlock(text) {\n        return textutils.formatCellValue(text, this.state.width, {\n            font: this.state.font,\n            fontSize: 12,\n            maxCellHeight: 100,\n        });\n    }\n\n    #rebuildCell(cell, block, lineNum, opts = {}) {\n        const common = {\n            font: this.state.font,\n            fontSize: 12,\n            x: 0,\n            y: OUTPUT_ROW_TEXT_Y,\n        };\n\n        this.#cancelOutputPreviewRecycle(cell);\n\n        cell.glText = null;\n        cell.displayLineNumber = Number.isInteger(lineNum) && lineNum >= 0\n            ? this.#displayLineNumber(lineNum)\n            : null;\n        cell.testingPuffbookLine = null;\n        cell.testingTableView = null;\n        cell.testingViewport = null;\n        cell.testingDamon = null;\n        cell.lineNumberText = null;\n        cell.statusBadge = null;\n        cell.textBacking = null;\n        cell.textClickArea = null;\n        cell.textCopyClickArea = null;\n        cell.textCopyIcon = null;\n        cell.copyText = null;\n        cell.outputVisualKind = 'none';\n        cell.outputPreviewHeight = 0;\n        cell.outputPreviewKind = null;\n        cell.outputPreviewFadeToken = 0;\n        cell.outputPreviewSyncSuspended = false;\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n        cell.outputPreviewBand = OUTPUT_PREVIEW_BAND.OUT_OF_BAND;\n        cell.outputPreviewRecycleTimer = null;\n        if (cell.outputMetadataViewport?.parentNode) {\n            cell.outputMetadataViewport.parentNode.removeChild(cell.outputMetadataViewport);\n        }\n        cell.outputMetadataIconHover = false;\n        cell.outputMetadataPanelHover = false;\n        cell.outputMetadataObj = null;\n        cell.outputMetadataViewport = null;\n        this.#dropOutputMetadataWindow(cell);\n        cell.outputMetadataButton = null;\n\n        let height = 0;\n        switch (block.block_type) {\n        case 'puff':\n        case 'convo':\n            height += this.#buildPuffCell(cell, block, lineNum);\n            break;\n\n        case 'text':\n            this.#ensureOutputTextCell(cell, common);\n            this.#syncOutputCell(cell, block, lineNum, opts);\n            height += cell.height;\n            break;\n\n        case 'title':\n            {\n                const inputCell = new ui.InputCell({\n                    font: this.state.font,\n                    fontSize: TITLE_ROW_FONT_SIZE,\n                    width: this.state.width,\n                    height: TITLE_ROW_FONT_SIZE + TITLE_ROW_TEXT_Y + 3,\n                    textYOffset: TITLE_ROW_TEXT_Y,\n                    textInput: block.text,\n                    readOnly: this.state.doc.read_only === true || block.read_only === true,\n                    caretColor: this.state.doc.read_only === true ? Palette.grey : Palette.orange,\n                    cellID: lineNum,\n                    cursorIndex: this.state.cursor?.[1] ?? 0,\n                    useExternalCaret: true,\n                    onBlinkPhaseChange: (cell) => this.#onOwnedInputCellBlinkPhaseChange(cell),\n                    displayOffset: this.#getScrollOffset(lineNum, block.ptrless ?? null),\n                    keyDelegate: (evt, innerCell) => this.#handleFocusedInputKeyDown(evt, innerCell),\n                    displayTransform: projectTitleInput,\n                    displayFontSize: TITLE_ROW_FONT_SIZE,\n                    displayTextXOffset: TITLE_ROW_TEXT_X,\n                    displayTextYOffset: TITLE_ROW_DISPLAY_TEXT_Y,\n                    displayFontColor: TITLE_ROW_FONT_COLOR,\n                    displaySyncSpans: block.input_sync_spans ?? [],\n                    color: Palette.clear,\n                    focusContainerOwner: this,\n                });\n                inputCell.ownerDocumentView = this;\n                inputCell.onSelectionChange = (cell) => this.#onOwnedInputCellSelectionChange(cell);\n                cell.inputCell = inputCell;\n                cell.appendChild(inputCell);\n                this.#syncInputCellFromDocument(inputCell, block.text ?? '', this.state.cursor?.[1] ?? 0, {\n                    displayFontColor: TITLE_ROW_FONT_COLOR,\n                    displaySyncSpans: block.input_sync_spans ?? [],\n                });\n                height += inputCell.height;\n            }\n            break;\n\n        case 'hidden':\n            if (block.disposition === 'out') {\n                this.#ensureOutputTextCell(cell, common);\n                this.#syncOutputCell(cell, block, lineNum, opts);\n                height += cell.height;\n                break;\n            }\n            break;\n\n        case 'tableview':\n            this.#ensureOutputTextCell(cell, common);\n            this.#syncOutputCell(cell, block, lineNum, opts);\n            height += cell.height;\n            break;\n\n            default:\n                throw new Error(`Unrecognised block_type='${block.block_type}'.`);\n            }\n\n        // Output sync may have installed a live open/close tween.  Preserve\n        // its current height; assigning the final height here would collapse\n        // the transition into an instantaneous closed-to-open jump.\n        if (!cell.outputLayoutAnim) {\n            cell.height = height;\n        }\n    }\n\n    #retargetCell(cell, block, lineNum, opts = {}) {\n        if (!cell || !block) {\n            return;\n        }\n        cell.displayLineNumber = Number.isInteger(lineNum) && lineNum >= 0\n            ? this.#displayLineNumber(lineNum)\n            : null;\n        switch (block.block_type) {\n        case 'puff':\n        case 'convo': {\n            const inputCell = cell.inputCell;\n            if (!inputCell) {\n                return;\n            }\n            inputCell.ownerDocumentView = this;\n            inputCell.onSelectionChange = (cell) => this.#onOwnedInputCellSelectionChange(cell);\n            inputCell.cellID = lineNum;\n            inputCell.keyDelegate = (evt, innerCell) => this.#handleFocusedInputKeyDown(evt, innerCell);\n            // A live pointer selection owns its text viewport. Reusing the row\n            // shell must not restore an older (often zero) cached offset mid-drag.\n            if (!inputCell.isSelecting) {\n                inputCell.restoreDisplayOffset(this.#getScrollOffset(lineNum, block.ptrless ?? null));\n                this.#setScrollOffset(lineNum, block.ptrless ?? null, inputCell.displayOffset);\n            }\n            const stateCursor = Array.isArray(this.state.cursor) ? this.state.cursor : null;\n            const cursorCol = stateCursor && stateCursor[0] === lineNum && Number.isInteger(stateCursor[1])\n                ? stateCursor[1]\n                : inputCell.cursorIndex;\n            this.#syncInputCellFromDocument(inputCell, block.text ?? '', cursorCol, {\n                displayFontColor: inputBlockFontColor(block),\n                displaySyncSpans: block.input_sync_spans ?? [],\n            });\n            this.#syncPuffBadge(cell, block, lineNum);\n            if (cell.lineNumberText) {\n                cell.lineNumberText.setText(formatDocumentLineNumber(this.#displayLineNumber(lineNum)));\n            }\n            return;\n        }\n\n        case 'text':\n        case 'hidden': {\n            if (block.disposition !== 'out') {\n                return;\n            }\n            this.#syncOutputCell(cell, block, lineNum, opts);\n            return;\n        }\n\n        case 'title': {\n            const inputCell = cell.inputCell;\n            if (!inputCell) {\n                return;\n            }\n            inputCell.ownerDocumentView = this;\n            inputCell.onSelectionChange = (cell) => this.#onOwnedInputCellSelectionChange(cell);\n            inputCell.cellID = lineNum;\n            inputCell.keyDelegate = (evt, innerCell) => this.#handleFocusedInputKeyDown(evt, innerCell);\n            if (!inputCell.isSelecting) {\n                inputCell.restoreDisplayOffset(this.#getScrollOffset(lineNum, block.ptrless ?? null));\n                this.#setScrollOffset(lineNum, block.ptrless ?? null, inputCell.displayOffset);\n            }\n            const stateCursor = Array.isArray(this.state.cursor) ? this.state.cursor : null;\n            const cursorCol = stateCursor && stateCursor[0] === lineNum && Number.isInteger(stateCursor[1])\n                ? stateCursor[1]\n                : inputCell.cursorIndex;\n            this.#syncInputCellFromDocument(inputCell, block.text ?? '', cursorCol, {\n                displayFontColor: TITLE_ROW_FONT_COLOR,\n                displaySyncSpans: block.input_sync_spans ?? [],\n            });\n            cell.height = inputCell.height;\n            return;\n        }\n\n        case 'tableview':\n            this.#syncOutputCell(cell, block, lineNum, opts);\n            return;\n        }\n    }\n\n    #ensureOutputTextCell(cell, common) {\n        if (cell.glText && cell.textBacking && cell.textClickArea && cell.textCopyClickArea && cell.textCopyIcon) {\n            return;\n        }\n\n        const txt = new evilfont.MSDFText({\n            ...common,\n            text: '',\n            fontColor: [1.0, 0.9411, 0.8745, 1.0],\n            fontSize: 12,\n        });\n        const backing = new Tile({\n            x: 0,\n            y: 0,\n            z: 1,\n            width: this.state.width,\n            height: 0,\n            color: outputCellBoxColor('none'),\n        });\n        const clickArea = new ui.ClickArea({\n            x: 0,\n            y: 0,\n            z: -0.5,\n            width: this.state.width,\n            height: cell.height,\n        });\n        const copyOutputText = () => {\n            const textToCopy = cell.copyText ?? '';\n            if (!document.hasFocus()) {\n                return;\n            }\n            navigator.clipboard.writeText(textToCopy).then(() => {\n                const stage = cell.scene?.stage ?? null;\n                const mountRoot = stage?.hudMountRoot?.('toast')\n                    ?? cell.scene?.toastMountRoot?.()\n                    ?? cell;\n                const placement = stage?.projectNodePointToHud?.(cell, [this.state.width, 0, 0], mountRoot)\n                    ?? [this.state.width, 0, 0];\n                const toastMount = new ui.Placeholder({ x: placement[0], y: placement[1], z: 0 });\n                const popUp = new ui.Toast({\n                    z: -4,\n                    text: 'Text copied to clipboard!',\n                    font: this.state.font,\n                    fontSize: 16\n                });\n                toastMount.appendChild(popUp);\n                mountRoot.appendChild(toastMount);\n            }).catch(err => {\n                console.error('Failed to copy text: ', err);\n            });\n        };\n        clickArea.onInput = (evt) => {\n            if (evt === \"L_MOUSE_UP\") {\n                copyOutputText();\n                return true;\n            }\n            return false;\n        };\n        const copyClickArea = new Button({\n            hideTile: true, accessibleName: 'Copy output text',\n            x: this.state.width - 32,\n            y: 0,\n            z: -0.4,\n            width: 32,\n            height: cell.height,\n        });\n        copyClickArea.onInput = (evt) => {\n            if (isActivationEvent(evt)) {\n                copyOutputText();\n                return true;\n            }\n            return false;\n        };\n        const copyIcon = new ui.Icon({\n            x: this.state.width - 28,\n            y: OUTPUT_ROW_TEXT_Y,\n            z: -0.01,\n            width: 20,\n            height: 20,\n            iconID: 19,\n            color: [1., 1., 1., 1.0],\n        });\n        backing.appendChild(copyIcon);\n        cell.glText = txt;\n        cell.textBacking = backing;\n        cell.textClickArea = clickArea;\n        cell.textCopyClickArea = copyClickArea;\n        cell.textCopyIcon = copyIcon;\n        cell.outputFadeToken = 0;\n        cell.outputPreviewFadeToken = 0;\n        cell.outputTextHeight = 0;\n        cell.outputTextVisible = false;\n        cell.outputVisualKind = 'none';\n        cell.outputPreviewHeight = 0;\n        cell.outputPreviewKind = null;\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n        cell.outputPreviewBand = OUTPUT_PREVIEW_BAND.OUT_OF_BAND;\n        cell.outputPreviewRecycleTimer = null;\n        cell.outputLayoutAnim = null;\n        cell.outputMetadataIconHover = false;\n        cell.outputMetadataPanelHover = false;\n        cell.outputMetadataObj = null;\n        cell.outputMetadataViewport = null;\n        this.#dropOutputMetadataWindow(cell);\n        cell.outputMetadataButton = null;\n        cell.appendChild(backing);\n        cell.appendChild(clickArea);\n        cell.appendChild(copyClickArea);\n        cell.appendChild(txt);\n    }\n\n    /* Mount the shared footer text nodes used by passive table previews. */\n    #ensureTablePreviewMetadataChrome(cell) {\n        if (cell.tablePreviewMetaSegments) {\n            return cell.tablePreviewMetaSegments;\n        }\n        const lines = Array.from({ length: 6 }, () => {\n            const line = new evilfont.MSDFText({\n                x: TABLE_PREVIEW_META_X,\n                y: 0,\n                z: -1.2,\n                font: this.state.font,\n                fontSize: TABLE_PREVIEW_META_FONT_SIZE,\n                fontColor: TABLE_PREVIEW_META_COLOR,\n                text: '',\n            });\n            line.setVisibility(false);\n            cell.appendChild(line);\n            return line;\n        });\n        cell.tablePreviewMetaSegments = lines;\n        return lines;\n    }\n\n    /* Hide the table summary whenever the cell is not showing a table preview. */\n    #hideTablePreviewMetadata(cell) {\n        for (const line of cell?.tablePreviewMetaSegments ?? []) {\n            line.setVisibility(false);\n        }\n    }\n\n    /* Position one table summary footer immediately under the preview so it contributes to row height. */\n    #syncTablePreviewMetadata(cell, struct, previewHeight) {\n        const lines = this.#ensureTablePreviewMetadataChrome(cell);\n        const segs = tablePreviewMetaSegments(struct);\n        let x = TABLE_PREVIEW_META_X;\n        const y = Math.max(0, previewHeight) + TABLE_PREVIEW_META_Y_PAD;\n        for (let i = 0; i < lines.length; i += 1) {\n            const node = lines[i];\n            const seg = segs[i] ?? { text: '', color: TABLE_PREVIEW_META_COLOR };\n            node.setText(seg.text);\n            node.mutate({ fontColor: seg.color });\n            node.setLocalPosition(x, y, -1.2);\n            node.setVisibility(seg.text !== '');\n            x += node.width();\n        }\n    }\n\n    /* Resolve the ptrless metadata object for an output row, if the browser reader exposes one. */\n    #outputMetadataObj(obj) {\n        if (!obj || typeof obj.meta !== 'function') {\n            return null;\n        }\n        try {\n            return obj.meta() ?? null;\n        } catch (_err) {\n            return null;\n        }\n    }\n\n    /* Mount the small per-output metadata toggle next to the visible result chrome. */\n    #ensureOutputMetadataButton(cell) {\n        if (cell.outputMetadataButton) {\n            return cell.outputMetadataButton;\n        }\n        const button = new Button({\n            font: this.state.font,\n            fontSize: 12,\n            width: OUTPUT_METADATA_BUTTON_SIZE,\n            height: OUTPUT_METADATA_BUTTON_SIZE,\n            iconSize: [18, 18],\n            iconID: OUTPUT_METADATA_ICON_ID,\n            z: -0.2,\n            color: Palette.clear,\n            onHoverColor: Palette.clear,\n            iconColor: TABLE_PREVIEW_META_COLOR,\n            onHoverIconColor: Palette.teal,\n            tooltipEnabled: true,\n            tooltipText: 'Show result metadata',\n            toastEnabled: false,\n        });\n        button.onHoverEnter = () => {\n            cell.outputMetadataIconHover = true;\n            this.#showOutputMetadataForHover(cell);\n        };\n        button.onHoverExit = () => {\n            cell.outputMetadataIconHover = false;\n            this.#syncOutputMetadataPanelVisibility(cell);\n        };\n        button.onInput = (event) => {\n            if (isActivationEvent(event)) {\n                this.#openOutputMetadataWindow(cell);\n            cell.outputMetadataIconHover = false;\n                cell.outputMetadataPanelHover = false;\n                this.#syncOutputMetadataPanelVisibility(cell);\n                return true;\n            }\n            return false;\n        };\n        button.setVisibility(false);\n        button.setEnabled(false);\n        cell.outputMetadataButton = button;\n        cell.appendChild(button);\n        return button;\n    }\n\n    /* Dispose a dialog before its owning output cell is replaced or removed. */\n    #dropOutputMetadataWindow(cell) {\n        const win = cell?.outputMetadataWindow ?? null;\n        cell.outputMetadataWindow = null;\n        win?.closeFocusContainer?.();\n    }\n\n    /* Open one draggable dialog containing the current output metadata rows. */\n    #openOutputMetadataWindow(cell) {\n        const current = cell.outputMetadataWindow ?? null;\n        if (current?.parentNode && current.ownMount?.parentNode) {\n            current.pullForward?.();\n            return current;\n        }\n        const meta = this.#outputMetadataObj(cell.outputMetadataObj);\n        if (!meta) {\n            return null;\n        }\n        const rows = this.#outputMetadataListRows(meta);\n        const win = this.#mountWindow({\n            font: this.state.font,\n            fontSize: 12,\n            panel: new OutputMetadataPanel({\n                font: this.state.font,\n                fontSize: 12,\n                rows,\n            }),\n            anchorPositioned: false,\n            modal: false,\n            mountParent: cell,\n            anchor: 'top_left',\n            x: this.#layoutWidth() + OUTPUT_METADATA_SIDE_GAP,\n            y: 0,\n            windowTitle: 'Result Metadata',\n        });\n        cell.outputMetadataWindow = win;\n        return win;\n    }\n\n    /* Hide or detach the metadata preview chrome when the current output cannot expose metadata. */\n    #hideOutputMetadata(cell, { dropPreview = false } = {}) {\n        this.#dropOutputMetadataWindow(cell);\n        cell.outputMetadataObj = null;\n        cell.outputMetadataButton?.setVisibility(false);\n        cell.outputMetadataButton?.setEnabled(false);\n        if (dropPreview && cell.outputMetadataViewport?.parentNode) {\n            cell.outputMetadataViewport.parentNode.removeChild(cell.outputMetadataViewport);\n            cell.outputMetadataViewport = null;\n            return;\n        }\n        cell.outputMetadataViewport?.setVisibility(false);\n    }\n\n    /* Format one metadata field into a compact single-line list value. */\n    #outputMetadataListValue(field) {\n        const value = previewCell(field, 0);\n        if (value === null || value === undefined) {\n            return 'null';\n        }\n        return `${value}`;\n    }\n\n    /* Keep populated metadata rows before null or empty rows while preserving relative order. */\n    #sortOutputMetadataEntries(entries) {\n        const valued = [];\n        const empty = [];\n        for (const entry of entries) {\n            const value = entry?.value;\n            if (value === null || value === undefined || value === '' || value === 'null') {\n                empty.push(entry);\n            } else {\n                valued.push(entry);\n            }\n        }\n        return [...valued, ...empty];\n    }\n\n    /* Read string values from ptrless scalar/list fields without treating preview quotes as data. */\n    #outputMetadataScalarText(obj) {\n        if (!obj || (typeof obj.valid === 'function' && !obj.valid())) {\n            return null;\n        }\n        if (typeof obj.toText === 'function') {\n            return obj.toText();\n        }\n        if (typeof obj.toString === 'function') {\n            const text = obj.toString();\n            return text.length >= 2 && text.startsWith(\"'\") && text.endsWith(\"'\")\n                ? text.slice(1, -1)\n                : text;\n        }\n        return null;\n    }\n\n    /* Return the concrete field names described by a metadata object, if present. */\n    #outputMetadataDescribedFieldNames(meta) {\n        let field = null;\n        try {\n            field = meta?.field?.('field_names') ?? null;\n        } catch (_err) {\n            return [];\n        }\n        if (!field || typeof field.length !== 'function' || typeof field.at !== 'function') {\n            return [];\n        }\n        const names = [];\n        for (let i = 0; i < field.length(); i += 1) {\n            names.push(this.#outputMetadataScalarText(field.at(i)) ?? `field${i}`);\n        }\n        return names;\n    }\n\n    /* Append per-column metadata for table-like outputs from field_metatypes. */\n    #appendOutputColumnMetadataRows(rows, meta) {\n        const names = this.#outputMetadataDescribedFieldNames(meta);\n        if (names.length === 0) {\n            return;\n        }\n        let tuple = null;\n        try {\n            tuple = meta.field('field_metatypes');\n        } catch (_err) {\n            return;\n        }\n        if (!tuple || typeof tuple.storageAt !== 'function') {\n            return;\n        }\n        rows.push('');\n        rows.push('columns');\n        for (let i = 0; i < names.length; i += 1) {\n            if (i > 0) {\n                rows.push('');\n            }\n            let fieldMeta = null;\n            try {\n                fieldMeta = tuple.storageAt(i);\n            } catch (_err) {\n                rows.push(`  ${names[i]}: <metadata error>`);\n                continue;\n            }\n            rows.push(`  ${names[i]}`);\n            const entries = [];\n            for (const key of ['logical', 'physical', 'flags', 'unit', 'title', 'pii']) {\n                try {\n                    entries.push({\n                        name: key,\n                        value: this.#outputMetadataListValue(fieldMeta.field(key)),\n                    });\n                } catch (_err) {\n                    continue;\n                }\n            }\n            for (const entry of this.#sortOutputMetadataEntries(entries)) {\n                rows.push(`    ${entry.name}: ${entry.value}`);\n            }\n        }\n    }\n\n    /* Build metadata rows, reserving the table header only for metadata with named fields. */\n    #outputMetadataListRows(meta) {\n        const names = typeof meta?.fieldNames === 'function' ? meta.fieldNames() : [];\n        const isTable = this.#outputMetadataDescribedFieldNames(meta).length > 0;\n        const rows = isTable ? ['table'] : [];\n        const prefix = isTable ? '  ' : '';\n        const entries = [];\n        for (const name of names) {\n            let value = '<error>';\n            try {\n                value = this.#outputMetadataListValue(meta.field(name));\n            } catch (err) {\n                value = `<${err?.message ?? 'error'}>`;\n            }\n            entries.push({ name, value });\n        }\n        for (const entry of this.#sortOutputMetadataEntries(entries)) {\n            rows.push(`${prefix}${entry.name}: ${entry.value}`);\n        }\n        this.#appendOutputColumnMetadataRows(rows, meta);\n        return rows;\n    }\n\n    /* Create the retained side panel used to show result metadata as a list. */\n    #ensureOutputMetadataPanel(cell) {\n        if (cell.outputMetadataViewport) {\n            return cell.outputMetadataViewport;\n        }\n        const panel = new Placeholder({});\n        panel.outputMetadataBacking = new Tile({\n            width: OUTPUT_METADATA_SIDE_WIDTH,\n            height: 1,\n            z: 0.2,\n            color: [0.09, 0.10, 0.12, 0.94],\n        });\n        panel.appendChild(panel.outputMetadataBacking);\n        const scroll = new ui.ScrollBox({\n            width: OUTPUT_METADATA_SIDE_WIDTH,\n            height: 1,\n            x: 0,\n            y: 0,\n            z: -0.2,\n            mouseSpace: 'view',\n        });\n        scroll.onContentHoverEnter = () => {\n            cell.outputMetadataPanelHover = true;\n            this.#syncOutputMetadataPanelVisibility(cell);\n        };\n        scroll.onContentHoverExit = () => {\n            cell.outputMetadataPanelHover = false;\n            this.#syncOutputMetadataPanelVisibility(cell);\n        };\n        panel.appendChild(scroll);\n        panel.outputMetadataScrollBox = scroll;\n        panel.outputMetadataRows = [];\n        cell.outputMetadataViewport = panel;\n        this._contentChromeRoot.appendChild(panel);\n        return panel;\n    }\n\n    /* Build or reuse the side list that displays the output object's metadata. */\n    #syncOutputMetadataPreview(cell, meta, _lineNum) {\n        const panel = this.#ensureOutputMetadataPanel(cell);\n        const rows = this.#outputMetadataListRows(meta);\n        const contentHeight = Math.max(\n            OUTPUT_METADATA_SIDE_ROW_H + 2 * OUTPUT_METADATA_SIDE_PAD,\n            rows.length * OUTPUT_METADATA_SIDE_ROW_H + 2 * OUTPUT_METADATA_SIDE_PAD,\n        );\n        const height = Math.min(contentHeight, OUTPUT_METADATA_SIDE_MAX_HEIGHT);\n        panel.outputMetadataBacking.mutate({\n            width: OUTPUT_METADATA_SIDE_WIDTH,\n            height,\n        });\n        panel.outputMetadataScrollBox.mutate({\n            width: OUTPUT_METADATA_SIDE_WIDTH,\n            height,\n        });\n        while (panel.outputMetadataRows.length > rows.length) {\n            const row = panel.outputMetadataRows.pop();\n            if (row?.parentNode) {\n                row.parentNode.removeChild(row);\n            }\n        }\n        while (panel.outputMetadataRows.length < rows.length) {\n            const row = new evilfont.MSDFText({\n                x: OUTPUT_METADATA_SIDE_PAD,\n                y: 0,\n                z: -0.1,\n                width: OUTPUT_METADATA_SIDE_WIDTH - 2 * OUTPUT_METADATA_SIDE_PAD,\n                height: OUTPUT_METADATA_SIDE_ROW_H,\n                font: this.state.font,\n                fontSize: OUTPUT_METADATA_SIDE_FONT_SIZE,\n                fontColor: [1.0, 0.9411, 0.8745, 0.9],\n                text: '',\n            });\n            panel.outputMetadataRows.push(row);\n            panel.outputMetadataScrollBox.appendChild(row);\n        }\n        for (let i = 0; i < panel.outputMetadataRows.length; i += 1) {\n            const row = panel.outputMetadataRows[i];\n            const text = rows[i] ?? '';\n            row.setText(textutils.formatCellValue(text, OUTPUT_METADATA_SIDE_WIDTH - 2 * OUTPUT_METADATA_SIDE_PAD, {\n                font: this.state.font,\n                fontSize: OUTPUT_METADATA_SIDE_FONT_SIZE,\n                maxCellHeight: OUTPUT_METADATA_SIDE_ROW_H,\n            }, 1));\n            row.setLocalPosition(OUTPUT_METADATA_SIDE_PAD, OUTPUT_METADATA_SIDE_PAD + i * OUTPUT_METADATA_SIDE_ROW_H, -0.1);\n            row.setVisibility(text !== '');\n        }\n        panel.outputMetadataScrollBox.syncContentLayout();\n        const x = this.#layoutWidth() + OUTPUT_METADATA_SIDE_GAP;\n        const y = cell.localPosition?.()?.[1] ?? 0;\n        panel.setLocalPosition(x, y, -1.0);\n        this.#syncOutputMetadataPanelVisibility(cell);\n        return height;\n    }\n\n    /* Keep the metadata side panel visible while its icon or panel body is hovered. */\n    #syncOutputMetadataPanelVisibility(cell) {\n        const visible = cell.outputMetadataIconHover === true\n            || cell.outputMetadataPanelHover === true;\n        cell.outputMetadataViewport?.setVisibility(visible);\n        cell.outputMetadataButton?.setIconColor(visible ? Palette.teal : TABLE_PREVIEW_META_COLOR);\n        if (cell.outputMetadataButton) {\n            cell.outputMetadataButton.tooltipText = 'Show result metadata';\n        }\n    }\n\n    /* Show metadata immediately from the current output block when the icon gains hover. */\n    #showOutputMetadataForHover(cell) {\n        const i = this.#cells.indexOf(cell);\n        if (i < 0) {\n            this.#syncOutputMetadataPanelVisibility(cell);\n            return;\n        }\n        const block = this.#blocks[i] ?? null;\n        const meta = this.#outputMetadataObj(block?.ptrless ?? null);\n        if (!meta) {\n            this.#syncOutputMetadataPanelVisibility(cell);\n            return;\n        }\n        this.#syncOutputMetadataPreview(cell, meta, Math.floor(i / 2));\n    }\n\n    /* Sync the metadata icon and hover-only side metadata list without changing output row height. */\n    #syncOutputMetadataChrome(cell, obj, lineNum, anchorY, buttonY = anchorY) {\n        const meta = this.#outputMetadataObj(obj);\n        if (!meta) {\n                cell.outputMetadataIconHover = false;\n            cell.outputMetadataPanelHover = false;\n            this.#hideOutputMetadata(cell, { dropPreview: true });\n            return 0;\n        }\n        cell.outputMetadataObj = obj;\n        const button = this.#ensureOutputMetadataButton(cell);\n        const buttonX = Math.max(TABLE_PREVIEW_META_X, this.#layoutWidth() - OUTPUT_METADATA_BUTTON_SIZE - 32);\n        button.setLocalPosition(buttonX, Math.max(0, buttonY), -0.2);\n        button.mutate({ width: OUTPUT_METADATA_BUTTON_SIZE, height: OUTPUT_METADATA_BUTTON_SIZE });\n        button.tooltipText = 'Show result metadata';\n        button.setIconColor(TABLE_PREVIEW_META_COLOR);\n        button.setVisibility(true);\n        button.setEnabled(true);\n\n        if (cell.outputMetadataIconHover === true || cell.outputMetadataPanelHover === true) {\n            this.#syncOutputMetadataPreview(cell, meta, lineNum);\n        } else {\n            this.#syncOutputMetadataPanelVisibility(cell);\n        }\n        return 0;\n    }\n\n    /* Classify one output block into the stable text/preview shell families. */\n    #outputCellKind(block) {\n        if (block?.disposition !== 'out') {\n            return 'other';\n        }\n        if (block.block_type === 'tableview') {\n            return 'preview';\n        }\n        if (block.block_type === 'text' || block.block_type === 'hidden') {\n            return 'text';\n        }\n        return 'other';\n    }\n\n    /* Preserve output enter/exit animation semantics even when one refresh/rebuild path bypasses granular line_output edits. */\n    #rebuildOutputSyncOpts(oldBlock, newBlock) {\n        if (oldBlock?.disposition !== 'out' || newBlock?.disposition !== 'out') {\n            return {};\n        }\n        const oldKind = oldBlock.block_type === 'tableview'\n            ? 'preview'\n            : oldBlock.block_type === 'text'\n                ? 'text'\n                : 'none';\n        const newKind = newBlock.block_type === 'tableview'\n            ? 'preview'\n            : newBlock.block_type === 'text'\n                ? 'text'\n                : 'none';\n        if (oldKind === 'none' && newKind === 'none') {\n            return {};\n        }\n        if (oldKind !== newKind || oldKind === 'none' || newKind === 'none') {\n            return { animateOutput: this.#outputAnimationsEnabled() };\n        }\n        return {};\n    }\n\n    /* Hidden documents may stop receiving frames, so an output transition must settle synchronously there. */\n    #outputAnimationsEnabled() {\n        return typeof document === 'undefined' || document.visibilityState !== 'hidden';\n    }\n\n\n    /* Snap the text-mode shell fully off when another output mode takes over this cell. */\n    #hideOutputTextImmediately(cell) {\n        if (!cell) {\n            return;\n        }\n        this.#hideTablePreviewMetadata(cell);\n        this.#hideOutputMetadata(cell, { dropPreview: true });\n        this.#stopOutputForegroundAnimation(cell);\n        this.#setOutputForegroundOpacity(cell, 1.0);\n        this.#setOutputForegroundVisibility(cell, false);\n        cell.textBacking?.mutate({ height: 0 });\n        cell.textClickArea?.mutate({ height: 0 });\n        cell.textClickArea?.setEnabled(false);\n        cell.textCopyClickArea?.mutate({ height: 0 });\n        cell.textCopyClickArea?.setEnabled(false);\n        cell.copyText = '';\n        cell.outputTextVisible = false;\n        cell.outputTextHeight = 0;\n    }\n\n    /* Fade the text-mode shell out while another output mode takes over the same cell. */\n    #crossfadeOutOutputText(cell) {\n        if (!cell) {\n            return;\n        }\n        this.#hideTablePreviewMetadata(cell);\n        this.#hideOutputMetadata(cell, { dropPreview: true });\n        cell.copyText = '';\n        cell.outputTextVisible = false;\n        cell.outputTextHeight = 0;\n        cell.textClickArea?.mutate({ height: 0 });\n        cell.textClickArea?.setEnabled(false);\n        cell.textCopyClickArea?.mutate({ height: 0 });\n        cell.textCopyClickArea?.setEnabled(false);\n        this.#stopOutputForegroundAnimation(cell);\n        this.#setOutputForegroundVisibility(cell, true);\n        this.#setOutputForegroundOpacity(cell, 1.0);\n        this.#animateOutputForeground(cell, 0.0, { hideAfter: true });\n    }\n\n    /* Passive screenshot table previews are the only preview shells currently eligible for lazy ensure/recycle. */\n    #isPassiveTablePreviewBlock(block) {\n        return block?.block_type === 'tableview'\n            && (block?.preview_kind ?? 'tableview') === 'tableview';\n    }\n\n    /* Read one mounted preview shell's passive-table contract without trusting broader preview kinds. */\n    #isPassiveTablePreviewViewport(viewport) {\n        const tableview = viewport?.testingTableView ?? null;\n        return !!tableview\n            && tableview.isScreenshot === true\n            && tableview.inlineInputEnabled === false;\n    }\n\n    /* Classify one preview row against the current visible and warm bands owned by DocumentView. */\n    #outputPreviewBandForCellBounds(cellTop, cellBottom, visibleTopY, visibleBottomY) {\n        if (!Number.isFinite(cellTop) || !Number.isFinite(cellBottom)) {\n            return OUTPUT_PREVIEW_BAND.OUT_OF_BAND;\n        }\n        if (cellBottom > visibleTopY && cellTop < visibleBottomY) {\n            return OUTPUT_PREVIEW_BAND.VISIBLE;\n        }\n        const warmTopY = visibleTopY - PASSIVE_PREVIEW_RETAIN_MARGIN_PX;\n        const warmBottomY = visibleBottomY + PASSIVE_PREVIEW_RETAIN_MARGIN_PX;\n        if (cellBottom > warmTopY && cellTop < warmBottomY) {\n            return OUTPUT_PREVIEW_BAND.WARM;\n        }\n        return OUTPUT_PREVIEW_BAND.OUT_OF_BAND;\n    }\n\n    /* Estimate one passive table preview height while its preview shell is absent so layout can stay stable without mounting batchers. */\n    #estimatePassiveTablePreviewHeight(block) {\n        const table = tableViewData(block?.ptrless ?? null);\n        const names = table?.fieldNames?.() ?? [];\n        let rows = 0;\n        for (const name of names) {\n            rows = Math.max(rows, previewRowCount(table.field(name)));\n        }\n        const fontSize = this.state.fontSize || 20;\n        const headerHeight = estimatedTablePreviewHeaderHeight(fontSize);\n        const rowHeight = estimatedTablePreviewRowHeight(this.tableviewFont, fontSize, block?.preview_hints ?? null);\n        return Math.min(256, headerHeight + rows * rowHeight) + this.#tablePreviewMetadataHeight();\n    }\n\n    /* Reserve one footer line under table previews so summary metadata participates in row layout. */\n    #tablePreviewMetadataHeight() {\n        const lineHeight = evilfont.MSDFText.measureFromState({\n            font: this.state.font,\n            fontSize: TABLE_PREVIEW_META_FONT_SIZE,\n            text: '0 rows, 0 cols, 0 B',\n        }).height;\n        return Math.ceil(lineHeight + 2 * TABLE_PREVIEW_META_Y_PAD);\n    }\n\n    /* Cancel one pending preview-shell recycle once the preview becomes warm/visible again or leaves the passive path. */\n    #cancelOutputPreviewRecycle(cell) {\n        if (!cell?.outputPreviewRecycleTimer) {\n            return;\n        }\n        clearTimeout(cell.outputPreviewRecycleTimer);\n        cell.outputPreviewRecycleTimer = null;\n        if (cell.outputPreviewResidency === OUTPUT_PREVIEW_RESIDENCY.RECYCLE_PENDING) {\n            cell.outputPreviewResidency = cell.testingViewport\n                ? OUTPUT_PREVIEW_RESIDENCY.RETAINED\n                : OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n        }\n    }\n\n    /* Arm one idle recycle for an out-of-band passive preview shell so offscreen tables eventually release their batchers. */\n    #scheduleOutputPreviewRecycle(cell) {\n        if (!cell?.testingViewport) {\n            cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n            return;\n        }\n        if (cell.outputPreviewRecycleTimer) {\n            return;\n        }\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RECYCLE_PENDING;\n        cell.outputPreviewRecycleTimer = setTimeout(() => {\n            cell.outputPreviewRecycleTimer = null;\n            if (cell.outputPreviewBand !== OUTPUT_PREVIEW_BAND.OUT_OF_BAND) {\n                cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RETAINED;\n                return;\n            }\n            this.#dropOutputPreview(cell, { preserveHeight: true, preserveKind: true });\n        }, PASSIVE_PREVIEW_RECYCLE_DELAY_MS);\n    }\n\n    /* Materialise one passive preview shell only when the owning row enters the visible or warm band. */\n    #ensurePassiveOutputPreview(cell, block, lineNum) {\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ENSURING;\n        const viewport = this.#ensureOutputPreview(cell, block, lineNum);\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RETAINED;\n        return viewport;\n    }\n\n    /* Reconcile one passive screenshot table preview against the document-owned band classification. */\n    #syncPassiveTablePreviewResidency(cell, block, lineNum, blockIndex, band) {\n        if (band === OUTPUT_PREVIEW_BAND.OUT_OF_BAND) {\n            if (cell.testingViewport) {\n                cell.testingViewport.setVisibility(false);\n                this.#scheduleOutputPreviewRecycle(cell);\n            } else {\n                cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n            }\n            return;\n        }\n        this.#cancelOutputPreviewRecycle(cell);\n        if (!cell.testingViewport) {\n            const viewport = this.#ensurePassiveOutputPreview(cell, block, lineNum);\n            viewport.testingScatterPlot?.setStruct?.(block.ptrless);\n            viewport.testingTableView?.setStruct?.(block.ptrless);\n            viewport.testingTableView?.setPreviewHints?.(block.preview_hints ?? null);\n            viewport.testingTableView?.setLineOnPuffbook?.(lineNum, this.#displayLineNumber(lineNum));\n            if (viewport.testingTableView) {\n                const prevHeight = cell.height;\n                const previewHeight = this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                this.#syncTablePreviewMetadata(cell, block.ptrless, previewHeight);\n                cell.outputPreviewHeight = previewHeight + this.#tablePreviewMetadataHeight();\n                cell.height = cell.outputPreviewHeight;\n                if (Math.abs((prevHeight ?? 0) - cell.height) > 0.01) {\n                    this.#reflowOutputVerticalPositions(blockIndex);\n                    this.#updateCursor();\n                }\n            }\n        }\n        cell.testingViewport?.setVisibility(true);\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RETAINED;\n    }\n\n    /* Remove the current preview viewport shell and clear its testing handles. */\n    #dropOutputPreview(cell, { preserveHeight = false, preserveKind = false } = {}) {\n        this.#cancelOutputPreviewRecycle(cell);\n        const viewport = cell.testingViewport ?? null;\n        if (viewport?.parentNode === cell) {\n            cell.removeChild(viewport);\n        }\n        if (!preserveKind || cell.outputPreviewKind !== 'tableview') {\n            this.#hideTablePreviewMetadata(cell);\n        }\n        cell.testingPuffbookLine = null;\n        cell.testingTableView = null;\n        cell.testingViewport = null;\n        cell.testingDamon = null;\n        if (!preserveHeight) {\n            cell.outputPreviewHeight = 0;\n        }\n        if (!preserveKind) {\n            cell.outputPreviewKind = null;\n        }\n        cell.outputPreviewSyncSuspended = false;\n        cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.ABSENT;\n    }\n\n    /* Resolve the preview-kind label used to decide whether one preview shell can be reused. */\n    #outputPreviewKind(block) {\n        return block?.preview_kind ?? 'tableview';\n    }\n\n    /* Resolve the transition duration for one preview kind. */\n    #outputPreviewDurationS(kind) {\n        if (kind === 'scatterplot' || kind === 'lineplot') {\n            return OUTPUT_PLOT_TRANSITION_DURATION_S;\n        }\n        return OUTPUT_TABLEVIEW_TRANSITION_DURATION_S;\n    }\n\n    /* Build or reuse the preview viewport hosted by one output cell. */\n    #ensureOutputPreview(cell, block, lineNum) {\n        const wantKind = this.#outputPreviewKind(block);\n        if (!cell.testingViewport || cell.outputPreviewKind !== wantKind) {\n            this.#dropOutputPreview(cell);\n            const viewport = (wantKind === 'scatterplot' || wantKind === 'lineplot')\n                ? this.#buildScatterPlot(block.ptrless, lineNum, block.state, wantKind, blockIsRefreshing(block))\n                : wantKind === 'damon_sdf'\n                    ? this.#buildDamonViewport(block.ptrless, lineNum, block.state, blockIsRefreshing(block))\n                    : wantKind === 'image'\n                        ? this.#buildImageViewport(block.ptrless, lineNum, block.state, blockIsRefreshing(block))\n                    : this.#buildTableView(block.ptrless, lineNum, block.state, block.preview_hints ?? null, blockIsRefreshing(block));\n            cell.appendChild(viewport);\n            cell.testingViewport = viewport;\n            cell.testingTableView = viewport.testingTableView ?? null;\n            cell.testingDamon = viewport.testingDamon ?? null;\n            cell.outputPreviewKind = wantKind;\n        }\n        cell.testingPuffbookLine = lineNum;\n        return cell.testingViewport;\n    }\n\n    /* Return the preview shell node whose opacity participates in preview transitions. */\n    #outputPreviewNode(cell) {\n        return cell?.testingViewport ?? null;\n    }\n\n    /* Stop any preview alpha tween and invalidate stale preview fade callbacks. */\n    #stopOutputPreviewAnimation(cell) {\n        cell.outputPreviewFadeToken = (cell.outputPreviewFadeToken ?? 0) + 1;\n        this.#outputPreviewNode(cell)?.stopAnimation('opacity');\n    }\n\n    /* Snap the preview shell to one shared opacity. */\n    #setOutputPreviewOpacity(cell, opacity) {\n        const node = this.#outputPreviewNode(cell);\n        if (node) {\n            node.opacity = opacity;\n        }\n    }\n\n    /* Hide or show the preview shell as one visual unit. */\n    #setOutputPreviewVisibility(cell, visible) {\n        const node = this.#outputPreviewNode(cell);\n        if (node) {\n            node.setVisibility(visible);\n        }\n    }\n\n    /* Fade the preview shell and optionally hide it once the fade completes normally. */\n    #animateOutputPreview(cell, targetOpacity, { hideAfter = false, duration_s = OUTPUT_TABLEVIEW_TRANSITION_DURATION_S } = {}) {\n        const node = this.#outputPreviewNode(cell);\n        if (!node) {\n            return;\n        }\n        const fadeToken = (cell.outputPreviewFadeToken ?? 0) + 1;\n        cell.outputPreviewFadeToken = fadeToken;\n        node.stopAnimation('opacity');\n        node.animateTo({\n            opacity: targetOpacity,\n            duration_s,\n            ease: OUTPUT_TRANSITION_EASE,\n            onFinish: hideAfter ? () => {\n                if (cell.outputPreviewFadeToken !== fadeToken || cell.outputVisualKind === 'preview') {\n                    return;\n                }\n                this.#setOutputPreviewVisibility(cell, false);\n                this.#setOutputPreviewOpacity(cell, 1.0);\n            } : null,\n        });\n    }\n\n    /* Sync one preview output payload inside a stable output cell. */\n    #syncOutputPreviewCell(cell, block, lineNum, opts = {}) {\n        const animateOutput = opts.animateOutput === true;\n        const prevHeight = Number.isFinite(cell.outputPreviewHeight) ? cell.outputPreviewHeight : 0;\n        const previewKind = block.block_type === 'hidden'\n            ? (cell.outputPreviewKind ?? 'tableview')\n            : this.#outputPreviewKind(block);\n        const previewDurationS = this.#outputPreviewDurationS(previewKind);\n        const layoutAnim = cell.outputLayoutAnim ?? null;\n        const alreadyHiding = cell.outputVisualKind === 'none'\n            && layoutAnim\n            && Math.abs((layoutAnim.to ?? 0) - 0) <= 0.01;\n        const crossfadeFromText = cell.outputVisualKind === 'text';\n        if (block.block_type === 'hidden') {\n            if (blockRetainsVisibleOutput(block) && cell.outputVisualKind === 'preview' && prevHeight > 0) {\n                const viewport = cell.testingViewport ?? null;\n                if (viewport?.testingTableView && viewport.expanded) {\n                    viewport.mutate({ color: tableviewBoxColor(block.state, { refreshing: true }) });\n                    viewport.testingTableView.setRefreshState(true);\n                    pushTestingTableviewTrace('documentview_expanded_table_refresh_pending', { line: lineNum });\n                }\n                cell.outputLastOpenTransition = false;\n                return outputTransitionResult({ retained: true });\n            }\n            this.#hideTablePreviewMetadata(cell);\n            this.#hideOutputMetadata(cell, { dropPreview: true });\n            if (animateOutput && alreadyHiding) {\n                return outputTransitionResult();\n            }\n            if (cell.outputVisualKind !== 'preview' || prevHeight <= 0) {\n                this.#stopOutputPreviewAnimation(cell);\n                this.#setOutputPreviewOpacity(cell, 1.0);\n                this.#setOutputPreviewVisibility(cell, false);\n                cell.outputLayoutAnim = null;\n                cell.outputLastOpenTransition = false;\n                cell.outputPreviewHeight = 0;\n                cell.height = 0;\n                return outputTransitionResult();\n            }\n            cell.outputVisualKind = 'none';\n            cell.outputLastOpenTransition = false;\n            cell.outputPreviewHeight = 0;\n            this.#stopOutputPreviewAnimation(cell);\n            if (animateOutput) {\n                this.#animateOutputLayoutHeight(cell, 0, previewDurationS);\n                this.#setOutputPreviewVisibility(cell, true);\n                this.#setOutputPreviewOpacity(cell, 1.0);\n                this.#animateOutputPreview(cell, 0.0, { hideAfter: true, duration_s: previewDurationS });\n                return outputTransitionResult();\n            }\n            cell.outputLayoutAnim = null;\n            cell.height = 0;\n            this.#setOutputPreviewOpacity(cell, 1.0);\n            this.#setOutputPreviewVisibility(cell, false);\n            return outputTransitionResult();\n        }\n\n        const baseHeight = Number.isFinite(cell.height) ? cell.height : 0;\n        let nextHeight = cell.outputPreviewHeight;\n        let previewHeight = cell.outputPreviewHeight;\n        if (this.#isPassiveTablePreviewBlock(block) && cell.testingViewport?.expanded !== true) {\n            const viewport = this.#ensureOutputPreview(cell, block, lineNum);\n            cell.outputPreviewSyncSuspended = true;\n            try {\n                viewport.testingTableView?.setStruct?.(block.ptrless);\n                viewport.testingTableView?.setPreviewHints?.(block.preview_hints ?? null);\n                viewport.testingTableView?.setLineOnPuffbook?.(lineNum, this.#displayLineNumber(lineNum));\n                if (viewport.testingTableView) {\n                    previewHeight = this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                    nextHeight = previewHeight + this.#tablePreviewMetadataHeight();\n                }\n            } finally {\n                cell.outputPreviewSyncSuspended = false;\n            }\n            this.#cancelOutputPreviewRecycle(cell);\n            cell.outputPreviewResidency = OUTPUT_PREVIEW_RESIDENCY.RETAINED;\n        } else {\n            const viewport = this.#ensureOutputPreview(cell, block, lineNum);\n            cell.outputPreviewSyncSuspended = true;\n            try {\n                viewport.testingScatterPlot?.setStruct?.(block.ptrless);\n                viewport.testingTableView?.setStruct?.(block.ptrless);\n                viewport.testingTableView?.setPreviewHints?.(block.preview_hints ?? null);\n                viewport.testingTableView?.setLineOnPuffbook?.(lineNum, this.#displayLineNumber(lineNum));\n                if (viewport && viewport.testingTableView) {\n                    previewHeight = this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                    nextHeight = previewHeight + this.#tablePreviewMetadataHeight();\n                } else if (viewport?.testingScatterPlot) {\n                    nextHeight = this.#syncRectRendererViewport(viewport, viewport.testingScatterPlot, block.state, 512, 'scatterplot', blockIsRefreshing(block));\n                    previewHeight = nextHeight;\n                } else if (viewport?.testingDamon) {\n                    nextHeight = this.#syncDamonViewport(viewport, viewport.testingDamon, block.state, blockIsRefreshing(block));\n                    previewHeight = nextHeight;\n                } else if (viewport && Object.hasOwn(viewport, 'testingImagePreview')) {\n                    nextHeight = this.#syncImageViewport(cell, viewport, block.ptrless, block.state, blockIsRefreshing(block));\n                    previewHeight = nextHeight;\n                } else {\n                    viewport?.mutate?.({ color: tableviewBoxColor(block.state, { refreshing: blockIsRefreshing(block) }) });\n                }\n            } finally {\n                cell.outputPreviewSyncSuspended = false;\n            }\n            if (viewport?.testingTableView && viewport.expanded) {\n                // Keep fullscreen geometry and source-row layout independent.\n                cell.outputVisualKind = 'preview';\n                cell.outputLastOpenTransition = false;\n                pushTestingTableviewTrace('documentview_expanded_table_refresh_applied', {\n                    line: lineNum,\n                    refreshing: blockIsRefreshing(block),\n                });\n                return outputTransitionResult({ retained: true });\n            }\n        }\n        const didOpen = this.#isOpeningOutputRow(cell, nextHeight);\n        if (crossfadeFromText && animateOutput && didOpen) {\n            this.#crossfadeOutOutputText(cell);\n        } else {\n            this.#hideOutputTextImmediately(cell);\n        }\n        if (previewKind !== 'tableview') {\n            this.#hideTablePreviewMetadata(cell);\n        }\n        if (previewKind === 'tableview') {\n            this.#syncTablePreviewMetadata(cell, block.ptrless, previewHeight);\n        }\n        const metadataButtonY = previewKind === 'tableview'\n            ? previewHeight + 1\n            : Math.max(0, previewHeight - OUTPUT_METADATA_BUTTON_SIZE - 6);\n        nextHeight += this.#syncOutputMetadataChrome(cell, block.ptrless, lineNum, nextHeight, metadataButtonY);\n        cell.outputVisualKind = 'preview';\n        cell.outputPreviewHeight = nextHeight;\n        this.#stopOutputPreviewAnimation(cell);\n        this.#setOutputPreviewVisibility(cell, true);\n        if (animateOutput && didOpen && Math.abs(baseHeight - nextHeight) > 0.5) {\n            cell.height = baseHeight;\n            this.#animateOutputLayoutHeight(cell, nextHeight, previewDurationS);\n        } else {\n            cell.outputLayoutAnim = null;\n            cell.height = nextHeight;\n        }\n        this.#syncTablePreviewCull();\n        cell.outputLastOpenTransition = didOpen;\n        if (animateOutput && didOpen) {\n            this.#setOutputPreviewOpacity(cell, 0.0);\n            this.#animateOutputPreview(cell, 1.0, { duration_s: previewDurationS });\n            return outputTransitionResult({ opened: true });\n        }\n        this.#setOutputPreviewOpacity(cell, 1.0);\n        return outputTransitionResult({ opened: didOpen });\n    }\n\n    /* Route one output block through the stable output-cell shell regardless of whether it currently hosts text or a preview. */\n    #syncOutputCell(cell, block, lineNum, opts = {}) {\n        const kind = this.#outputCellKind(block);\n        const expandedTable = cell.testingViewport?.testingTableView ?? null;\n        const retainInspectStale = expandedTable?.shouldRetainInspectStaleForBlock?.(block) === true;\n        if (expandedTable && cell.testingViewport.expanded && kind !== 'preview' && retainInspectStale) {\n            // The inspect editor owns stale/error presentation. Do not let an\n            // interim hidden/error document projection remove its fullscreen host.\n            if (block?.server_state_kind === 'terminal_failure') {\n                expandedTable.notifyInspectTerminalFailure?.();\n            }\n            return;\n        }\n        if (expandedTable && cell.testingViewport.expanded && kind !== 'preview' && !blockRetainsVisibleOutput(block)) {\n            pushTestingTableviewTrace('documentview_expanded_table_terminal_replaced', {\n                line: lineNum,\n                replacement_kind: block?.block_type ?? null,\n            });\n            expandedTable.leaveTableview(false, true);\n        }\n        if (kind === 'preview') {\n            this.#syncOutputPreviewCell(cell, block, lineNum, opts);\n            return;\n        }\n        if (kind !== 'text') {\n            throw new Error(`DocumentView expected output text/preview block, got '${block?.block_type}'.`);\n        }\n        const previewHiding = block.block_type === 'hidden'\n            && cell.testingViewport\n            && cell.outputVisualKind === 'none'\n            && Math.abs((cell.outputLayoutAnim?.to ?? Number.NaN) - 0) <= 0.01;\n        if (previewHiding) {\n            this.#syncOutputPreviewCell(cell, block, lineNum, opts);\n            return;\n        }\n        const crossfadeFromPreview = cell.outputVisualKind === 'preview' && block.block_type !== 'hidden';\n        if (cell.outputVisualKind === 'preview' && block.block_type === 'hidden') {\n            this.#syncOutputPreviewCell(cell, block, lineNum, opts);\n            return;\n        }\n        const transition = this.#syncOutputTextCell(cell, block, lineNum, opts);\n        if (transition.retained) {\n            return;\n        }\n        if (crossfadeFromPreview && opts.animateOutput === true && transition.opened) {\n            this.#stopOutputPreviewAnimation(cell);\n            this.#setOutputPreviewVisibility(cell, true);\n            this.#setOutputPreviewOpacity(cell, 1.0);\n            this.#animateOutputPreview(cell, 0.0, {\n                hideAfter: true,\n                duration_s: this.#outputPreviewDurationS(cell.outputPreviewKind ?? 'tableview'),\n            });\n        } else if (crossfadeFromPreview) {\n            this.#stopOutputPreviewAnimation(cell);\n            this.#dropOutputPreview(cell);\n        }\n        if (block.block_type !== 'hidden') {\n            cell.outputVisualKind = 'text';\n            return;\n        }\n        cell.outputVisualKind = 'none';\n    }\n\n    /* Treat one output transition as an open-row animation only when visible height grows from zero. */\n    #isOpeningOutputRow(cell, nextHeight) {\n        const prevHeight = Number.isFinite(cell?.height) ? Math.max(0, cell.height) : 0;\n        const to = Number.isFinite(nextHeight) ? Math.max(0, nextHeight) : 0;\n        return prevHeight <= 0.5 && to > 0.5;\n    }\n\n    /* Start or replace one output row layout-height tween so following rows derive their y from the same animated source. */\n    #animateOutputLayoutHeight(cell, targetHeight, durationS = OUTPUT_TRANSITION_DURATION_S) {\n        const to = Number.isFinite(targetHeight) ? Math.max(0, targetHeight) : 0;\n        const from = Number.isFinite(cell.height) ? Math.max(0, cell.height) : 0;\n        cell.outputLayoutAnim = null;\n        if (Math.abs(from - to) <= 0.01) {\n            cell.height = to;\n            return false;\n        }\n        const start_s = this.scene?.stage?.frameNowS ?? currentEvil();\n        cell.outputLayoutAnim = {\n            from,\n            to,\n            start_s,\n            stop_s: start_s + durationS,\n        };\n        this.#syncWorkThink();\n        return true;\n    }\n\n    /* Advance live output row layout tweens and reflow the earliest dirty suffix from the animated heights. */\n    #advanceOutputLayoutAnimations() {\n        const nowS = this.scene?.stage?.frameNowS ?? currentEvil();\n        let dirtyFrom = null;\n        for (let i = 0; i < this.#cells.length; i++) {\n            const cell = this.#cells[i];\n            const anim = cell?.outputLayoutAnim ?? null;\n            if (!anim) {\n                continue;\n            }\n            const span = anim.stop_s - anim.start_s;\n            const raw = span <= 0 ? 1 : (nowS - anim.start_s) / span;\n            const t = Math.max(0, Math.min(1, raw));\n            const eased = easeInOutSine(t);\n            const nextHeight = anim.from + ((anim.to - anim.from) * eased);\n            if (Math.abs((cell.height ?? 0) - nextHeight) > 0.01) {\n                cell.height = nextHeight;\n                dirtyFrom = dirtyFrom === null ? i : Math.min(dirtyFrom, i);\n            }\n            if (t >= 1) {\n                cell.height = anim.to;\n                cell.outputLayoutAnim = null;\n                dirtyFrom = dirtyFrom === null ? i : Math.min(dirtyFrom, i);\n            }\n        }\n        if (dirtyFrom !== null) {\n            this.#reflowOutputVerticalPositions(dirtyFrom, nowS);\n        }\n    }\n\n    /* Return the visible output chrome nodes whose opacity participates in row transitions. */\n    #outputForegroundNodes(cell) {\n        return [\n            cell?.textBacking ?? null,\n            cell?.glText ?? null,\n            cell?.textCopyIcon ?? null,\n        ].filter(Boolean);\n    }\n\n    /* Stop any foreground alpha tween and invalidate stale finish callbacks for this output cell. */\n    #stopOutputForegroundAnimation(cell) {\n        cell.outputFadeToken = (cell.outputFadeToken ?? 0) + 1;\n        for (const node of this.#outputForegroundNodes(cell)) {\n            node.stopAnimation('opacity');\n        }\n    }\n\n    /* Snap the visible output chrome nodes to one shared opacity. */\n    #setOutputForegroundOpacity(cell, opacity) {\n        for (const node of this.#outputForegroundNodes(cell)) {\n            node.opacity = opacity;\n        }\n    }\n\n    /* Hide or show the visible output chrome nodes together so text, backing, and icon stay in lock-step. */\n    #setOutputForegroundVisibility(cell, visible) {\n        for (const node of this.#outputForegroundNodes(cell)) {\n            node.setVisibility(visible);\n        }\n    }\n\n    /* Fade the visible output chrome nodes and optionally hide them once the fade completes normally. */\n    #animateOutputForeground(cell, targetOpacity, { hideAfter = false } = {}) {\n        const nodes = this.#outputForegroundNodes(cell);\n        if (nodes.length === 0) {\n            return;\n        }\n        const fadeToken = (cell.outputFadeToken ?? 0) + 1;\n        cell.outputFadeToken = fadeToken;\n        const anchor = nodes[0];\n        for (const node of nodes) {\n            node.stopAnimation('opacity');\n            node.animateTo({\n                opacity: targetOpacity,\n                duration_s: OUTPUT_TRANSITION_DURATION_S,\n                ease: OUTPUT_TRANSITION_EASE,\n                onFinish: hideAfter && node === anchor ? () => {\n                    if (cell.outputFadeToken !== fadeToken || cell.outputTextVisible) {\n                        return;\n                    }\n                    this.#setOutputForegroundVisibility(cell, false);\n                    this.#setOutputForegroundOpacity(cell, 1.0);\n                    cell.textBacking?.mutate({ height: 0 });\n                } : null,\n            });\n        }\n    }\n\n    /* Apply the stable output row state immediately, and optionally animate the foreground visibility edge for incremental output updates. */\n    #syncOutputTextCell(cell, block, lineNum = null, opts = {}) {\n        const glText = cell.glText;\n        const backing = cell.textBacking;\n        const clickArea = cell.textClickArea;\n        const copyClickArea = cell.textCopyClickArea;\n        const copyIcon = cell.textCopyIcon;\n        if (!glText || !backing || !clickArea || !copyClickArea || !copyIcon) {\n            return;\n        }\n        const animateOutput = opts.animateOutput === true;\n        const wasVisible = cell.outputTextVisible === true;\n        const prevHeight = Number.isFinite(cell.outputTextHeight) ? cell.outputTextHeight : 0;\n        const layoutAnim = cell.outputLayoutAnim ?? null;\n        const alreadyHiding = !wasVisible\n            && layoutAnim\n            && Math.abs((layoutAnim.to ?? 0) - 0) <= 0.01;\n        const nextBackingColor = outputCellBoxColor(block.state, { refreshing: blockIsRefreshing(block) });\n\n        if (block.block_type === 'hidden') {\n            if (blockRetainsVisibleOutput(block) && wasVisible && prevHeight > 0) {\n                if (blockIsRefreshing(block) && !sameColor(backing.state?.color, nextBackingColor)) {\n                    backing.mutate({ color: nextBackingColor });\n                }\n                cell.outputLastOpenTransition = false;\n                return outputTransitionResult({ retained: true });\n            }\n            cell.copyText = '';\n            this.#hideOutputMetadata(cell, { dropPreview: true });\n            if (animateOutput && alreadyHiding) {\n                clickArea.mutate({ height: 0 });\n                clickArea.setEnabled(false);\n                copyClickArea.mutate({ height: 0 });\n                copyClickArea.setEnabled(false);\n                return outputTransitionResult();\n            }\n            cell.outputTextVisible = false;\n            cell.outputLastOpenTransition = false;\n            cell.outputTextHeight = 0;\n            clickArea.mutate({ height: 0 });\n            clickArea.setEnabled(false);\n            copyClickArea.mutate({ height: 0 });\n            copyClickArea.setEnabled(false);\n            this.#stopOutputForegroundAnimation(cell);\n            if (animateOutput && wasVisible && prevHeight > 0) {\n                this.#animateOutputLayoutHeight(cell, 0);\n            } else {\n                cell.outputLayoutAnim = null;\n                cell.height = 0;\n            }\n            if (!animateOutput || !wasVisible || prevHeight <= 0) {\n                backing.mutate({ height: 0 });\n                this.#setOutputForegroundOpacity(cell, 1.0);\n                this.#setOutputForegroundVisibility(cell, false);\n                return outputTransitionResult();\n            }\n            backing.mutate({ height: prevHeight });\n            this.#setOutputForegroundVisibility(cell, true);\n            this.#setOutputForegroundOpacity(cell, 1.0);\n            this.#animateOutputForeground(cell, 0.0, { hideAfter: true });\n            return outputTransitionResult();\n        }\n\n        const newText = this.#formatTextBlock(block.text);\n        const layout = glText.measure({ text: newText });\n        const textChanged = glText.state?.text !== newText;\n        const baseHeight = Math.max(layout.height, OUTPUT_METADATA_BUTTON_SIZE);\n        const metadataExtra = this.#syncOutputMetadataChrome(cell, block.ptrless ?? block.obj ?? null, lineNum, baseHeight, OUTPUT_ROW_TEXT_Y);\n        const nextHeight = baseHeight + metadataExtra;\n        const didOpen = this.#isOpeningOutputRow(cell, nextHeight);\n        const hasMetadataButton = cell.outputMetadataButton?.enabled === true;\n        const clickWidth = hasMetadataButton\n            ? Math.max(0, this.#layoutWidth() - OUTPUT_TEXT_CHROME_RESERVED_W)\n            : this.#layoutWidth();\n        const heightChanged = (backing.state?.height ?? null) !== baseHeight;\n        cell.copyText = block.text ?? '';\n        cell.outputTextVisible = true;\n        cell.outputTextHeight = layout.height;\n        if (textChanged) {\n            glText.setText(newText);\n        }\n        if (heightChanged || !sameColor(backing.state?.color, nextBackingColor)) {\n            backing.mutate({\n                height: baseHeight,\n                color: nextBackingColor,\n            });\n        }\n        clickArea.mutate({ width: clickWidth, height: baseHeight });\n        copyClickArea.setLocalPosition(this.#layoutWidth() - 34, 0, -0.4);\n        copyClickArea.mutate({ width: 34, height: baseHeight });\n        if (copyIcon.parentNode === backing) {\n            copyIcon.setLocalPosition(this.#layoutWidth() - 28, OUTPUT_ROW_TEXT_Y, -0.01);\n        }\n        clickArea.setEnabled(true);\n        copyClickArea.setEnabled(true);\n        this.#stopOutputForegroundAnimation(cell);\n        this.#setOutputForegroundVisibility(cell, true);\n        if (animateOutput && didOpen && Math.abs((cell.height ?? 0) - nextHeight) > 0.5) {\n            this.#animateOutputLayoutHeight(cell, nextHeight);\n        } else {\n            cell.outputLayoutAnim = null;\n            cell.height = nextHeight;\n        }\n        cell.outputLastOpenTransition = didOpen;\n        if (animateOutput && didOpen) {\n            this.#setOutputForegroundOpacity(cell, 0.0);\n            this.#animateOutputForeground(cell, 1.0);\n            return outputTransitionResult({ opened: true });\n        }\n        this.#setOutputForegroundOpacity(cell, 1.0);\n        return outputTransitionResult({ opened: didOpen });\n    }\n    \n    async #fetchDocImageBlob(request) {\n        const doc = this.state?.doc ?? null;\n        const api = doc?.api ?? null;\n\n        if (!api || typeof api.fileAsBuffer !== 'function') {\n            console.warn('DocumentView image preview cannot reach API to fetch image content.');\n            return null;\n        }\n\n        if (!request?.path || !request.lake || !request.branch) {\n            return null;\n        }\n\n        try {\n            const blob = await api.fileAsBlob({\n                lake: request.lake,\n                path: request.path,\n                branch: request.branch,\n            }, { method: 'GET' });\n\n            if(!blob) { return null }\n\n            return blob;\n\n        } catch (err) {\n            console.warn('DocumentView failed to fetch image blob:', err.message);\n            return null;\n        }\n    }\n   \n\n    /* Build diagnostic row records from the mounted projection on demand. */\n    #mountedLineRecord(lineNum) {\n        const inputIndex = lineNum * 2;\n        const input = this.#blocks[inputIndex];\n        const output = this.#blocks[inputIndex + 1];\n        const inputHost = this.#cells[inputIndex];\n        const outputHost = this.#cells[inputIndex + 1];\n        if (!input || !output || !inputHost || !outputHost) {\n            throw new Error(`DocumentView cannot describe mounted line ${lineNum}; every current line requires paired input/output blocks and mounted hosts.`);\n        }\n        const serverState = output.server_state_kind ?? null;\n        const lifecycle = serverState === 'terminal_pending' && output.refreshing === true\n            ? 'terminal_refreshing'\n            : serverState === 'blank'\n                || serverState === 'continuation'\n                || serverState === 'terminal_pending'\n                || serverState === 'terminal_refreshing'\n                || serverState === 'terminal_success'\n                || serverState === 'terminal_failure'\n                ? serverState\n                : output.block_type === 'hidden' && output.state === 'none'\n                    ? 'blank'\n                    : 'terminal_success';\n        return {\n            source_text: typeof input.text === 'string' ? input.text : '',\n            source_kind: input.block_type ?? 'puff',\n            input,\n            lifecycle,\n            output,\n            payload_ref: typeof output.payload_ref === 'string' && output.payload_ref !== ''\n                ? output.payload_ref\n                : null,\n            table: outputHost.testingTableView ?? null,\n            mount: {\n                input_host: inputHost,\n                output_host: outputHost,\n            },\n        };\n    }\n\n    /* Translate an explicit full-document projection into the same sequential ledger edits used at runtime. */\n    #applyAuthoritativeProjection(blocks) {\n        if (!Array.isArray(blocks) || blocks.length % 2 !== 0) {\n            throw new Error('DocumentView authoritative projection requires complete input/output block pairs.');\n        }\n        if (this.#blocks.length === 0) {\n            this.#replaceBlocksFully(blocks);\n            return;\n        }\n        const oldLines = [];\n        for (let lineNum = 0; lineNum * 2 < this.#blocks.length; lineNum += 1) {\n            oldLines.push({\n                input: this.#blocks[lineNum * 2],\n                output: this.#blocks[lineNum * 2 + 1],\n            });\n        }\n        const nextLineCount = blocks.length / 2;\n        let prefix = 0;\n        const sharedCount = Math.min(oldLines.length, nextLineCount);\n        while (prefix < sharedCount && blockIdentity(oldLines[prefix].input) === blockIdentity(blocks[prefix * 2])) {\n            prefix += 1;\n        }\n        let suffix = 0;\n        while (suffix + prefix < sharedCount\n            && blockIdentity(oldLines[oldLines.length - suffix - 1].input) === blockIdentity(blocks[blocks.length - suffix * 2 - 2])) {\n            suffix += 1;\n        }\n        const oldMiddleCount = oldLines.length - prefix - suffix;\n        const nextMiddleCount = nextLineCount - prefix - suffix;\n        const sharedMiddleCount = Math.min(oldMiddleCount, nextMiddleCount);\n        const edits = [];\n        for (let i = 0; i < oldMiddleCount - sharedMiddleCount; i += 1) {\n            edits.push({ kind: 'line_remove', line: prefix + sharedMiddleCount });\n        }\n        for (let i = 0; i < nextMiddleCount - sharedMiddleCount; i += 1) {\n            const line = prefix + sharedMiddleCount + i;\n            edits.push({\n                kind: 'line_insert',\n                line,\n                input_block: blocks[line * 2],\n                output_block: blocks[line * 2 + 1],\n            });\n        }\n        for (let line = 0; line < nextLineCount; line += 1) {\n            const current = line < oldLines.length ? oldLines[line] : null;\n            const input = blocks[line * 2];\n            const output = blocks[line * 2 + 1];\n            if (!current || !sameBlockProjection(current.input, input)) {\n                edits.push({ kind: 'line_input', line, input_block: input });\n            }\n            if (!current || !sameBlockProjection(current.output, output)) {\n                edits.push({ kind: 'line_output', line, output_block: output });\n            }\n        }\n        if (edits.length > 0) {\n            this.#applyDocUpdate({ edits });\n        }\n    }\n\n    #removeLineBlocks(lineNum) {\n        const blockIndex = lineNum * 2;\n        this.#removeBlockAt(blockIndex);\n        this.#removeBlockAt(blockIndex);\n    }\n\n    /* Resolve one delta-path row patch from the authoritative queued edit rather than re-rendering document state. */\n    #lineBlocksForEdit(edit, lineNum) {\n        return [\n            this.#inputBlockForEdit(edit, lineNum),\n            this.#outputBlockForEdit(edit, lineNum),\n        ];\n    }\n\n    /* Resolve one embedded input-side patch from the queued edit. */\n    #inputBlockForEdit(edit, lineNum) {\n        const inputBlock = edit?.input_block ?? null;\n        if (!inputBlock) {\n            throw new Error(`DocumentView delta edit kind='${edit?.kind ?? 'unknown'}' line=${lineNum} requires embedded input_block.`);\n        }\n        return inputBlock;\n    }\n\n    /* Resolve one embedded output-side patch from the queued edit. */\n    #outputBlockForEdit(edit, lineNum) {\n        const outputBlock = edit?.output_block ?? null;\n        if (!outputBlock) {\n            throw new Error(`DocumentView delta edit kind='${edit?.kind ?? 'unknown'}' line=${lineNum} requires embedded output_block.`);\n        }\n        return outputBlock;\n    }\n\n    #insertBlockAt(blockIndex, block, lineNum) {\n        if (!Number.isInteger(blockIndex) || blockIndex < 0 || blockIndex > this.#cells.length) {\n            throw new Error(`DocumentView cannot insert block at index ${blockIndex}.`);\n        }\n        countBlockPerf('insert', block);\n        const newCell = new ui.Placeholder({});\n        this.#rebuildCell(newCell, block, lineNum);\n        const beforeCell = this.#cells[blockIndex] ?? null;\n        this._blockRoot.insertChildBefore(newCell, beforeCell);\n        this.#cells.splice(blockIndex, 0, newCell);\n        this.#blocks.splice(blockIndex, 0, block);\n    }\n\n    #removeBlockAt(blockIndex) {\n        if (!Number.isInteger(blockIndex) || blockIndex < 0 || blockIndex >= this.#cells.length) {\n            throw new Error(`DocumentView cannot remove block at index ${blockIndex}.`);\n        }\n        countBlockPerf('remove', this.#blocks[blockIndex] ?? null);\n        const oldCell = this.#cells[blockIndex];\n        this.#cancelOutputPreviewRecycle(oldCell);\n        this.#dropOutputMetadataWindow(oldCell);\n        this._blockRoot.removeChild(oldCell);\n        this.#cells.splice(blockIndex, 1);\n        this.#blocks.splice(blockIndex, 1);\n    }\n\n    #applyBlockAt(blockIndex, block, lineNum, opts = {}) {\n        if (!Number.isInteger(blockIndex) || blockIndex < 0) {\n            throw new Error(`DocumentView cannot apply block at invalid index ${blockIndex}.`);\n        }\n        if (blockIndex > this.#cells.length) {\n            throw new Error(`DocumentView cannot apply block at future index ${blockIndex} with cell count ${this.#cells.length}; doc edit stream must materialise earlier blocks first.`);\n        }\n        const oldBlock = this.#blocks[blockIndex] ?? null;\n        const oldCell = this.#cells[blockIndex] ?? null;\n        const oldExpandedTable = oldCell?.testingViewport?.expanded ? oldCell.testingTableView : null;\n        const retainExpandedInspectStale = oldExpandedTable?.shouldRetainInspectStaleForBlock?.(block) === true;\n        const retainExpandedTable = !!oldExpandedTable\n            && (block?.block_type === 'tableview' || blockRetainsVisibleOutput(block) || retainExpandedInspectStale);\n        if (retainExpandedTable) {\n            /*\n                The expanded viewport has been remounted into the fullscreen scene,\n                but this cell remains its authoritative DocumentView host.  Keep that\n                host across the server's hidden terminal-pending staging block so the\n                subsequent terminal table struct is applied to the live fullscreen\n                TableView instead of a newly built, inactive preview.\n            */\n            this.#blocks[blockIndex] = block;\n            this.#retargetCell(oldCell, block, lineNum, opts);\n            pushTestingPortalTimingTrace('documentview_apply_block', {\n                action: 'retain_expanded_table_host',\n                line: lineNum,\n                block_index: blockIndex,\n                old_block_type: oldBlock?.block_type ?? null,\n                new_block_type: block?.block_type ?? null,\n                preview_row: describePreviewCell(oldCell, block),\n            });\n            return;\n        }\n        if (oldExpandedTable && block?.block_type !== 'tableview') {\n            pushTestingTableviewTrace('documentview_expanded_table_terminal_replaced', {\n                line: lineNum,\n                replacement_kind: block?.block_type ?? null,\n            });\n            oldExpandedTable.leaveTableview(false, true);\n        }\n        const traceTableviewBlock = oldBlock?.block_type === 'tableview'\n            || block?.block_type === 'tableview'\n            || !!oldCell?.testingTableView\n            || !!oldCell?.testingViewport;\n        if (!oldCell && blockIndex < this.#cells.length) {\n            throw new Error(`DocumentView found sparse cell state at block index ${blockIndex} with cell count ${this.#cells.length}; this violates the closed row-cell contract.`);\n        }\n        if (oldBlock && oldCell && blockIdentity(oldBlock) === blockIdentity(block)) {\n            countBlockPerf('apply_reuse_exact', block);\n            countBlockTransitionPerf('apply_reuse_exact_transition', oldBlock, block);\n            this.#blocks[blockIndex] = block;\n            this.#retargetCell(oldCell, block, lineNum, opts);\n            if (traceTableviewBlock) {\n                pushTestingPortalTimingTrace('documentview_apply_block', {\n                    action: 'reuse_exact',\n                    line: lineNum,\n                    block_index: blockIndex,\n                    old_block_type: oldBlock?.block_type ?? null,\n                    new_block_type: block?.block_type ?? null,\n                    preview_row: describePreviewCell(oldCell, block),\n                });\n            }\n            return;\n        }\n        if (oldBlock && oldCell && canRetargetBlock(oldBlock, block)) {\n            countBlockPerf('apply_reuse_compatible', block);\n            countBlockTransitionPerf('apply_reuse_compatible_transition', oldBlock, block);\n            this.#blocks[blockIndex] = block;\n            this.#retargetCell(oldCell, block, lineNum, opts);\n            if (traceTableviewBlock) {\n                pushTestingPortalTimingTrace('documentview_apply_block', {\n                    action: 'reuse_compatible',\n                    line: lineNum,\n                    block_index: blockIndex,\n                    old_block_type: oldBlock?.block_type ?? null,\n                    new_block_type: block?.block_type ?? null,\n                    preview_row: describePreviewCell(oldCell, block),\n                });\n            }\n            return;\n        }\n\n        const newCell = new ui.Placeholder({});\n        this.#rebuildCell(newCell, block, lineNum, opts);\n        if (oldCell) {\n            countBlockPerf('apply_replace', block);\n            countBlockTransitionPerf('apply_replace_transition', oldBlock, block);\n            this.#cancelOutputPreviewRecycle(oldCell);\n            this.#dropOutputMetadataWindow(oldCell);\n            this._blockRoot.replaceChild(oldCell, newCell);\n        } else {\n            countBlockPerf('apply_append', block);\n            this._blockRoot.appendChild(newCell);\n        }\n        this.#cells[blockIndex] = newCell;\n        this.#blocks[blockIndex] = block;\n        if (traceTableviewBlock || newCell.testingTableView || newCell.testingViewport) {\n            pushTestingPortalTimingTrace('documentview_apply_block', {\n                action: oldCell ? 'replace' : 'append',\n                line: lineNum,\n                block_index: blockIndex,\n                old_block_type: oldBlock?.block_type ?? null,\n                new_block_type: block?.block_type ?? null,\n                old_preview_row: describePreviewCell(oldCell, oldBlock),\n                new_preview_row: describePreviewCell(newCell, block),\n            });\n        }\n    }\n\n    /*\n        A structural source edit has already forwarded the canonical ledger and\n        physical host arrays. Rebind only the fields that encode a current\n        line coordinate; re-syncing unchanged text/table payloads here would\n        turn one insertion into a full suffix render.\n    */\n    #rebaseSuffixMounts(startLine) {\n        if (!Number.isInteger(startLine) || startLine < 0) {\n            throw new Error(`DocumentView expected non-negative retarget start line, got ${startLine}.`);\n        }\n        const before = [];\n        for (let lineNum = startLine; lineNum * 2 < this.#cells.length; lineNum++) {\n            const inputBlock = this.#blocks[lineNum * 2] ?? null;\n            const outputBlock = this.#blocks[lineNum * 2 + 1] ?? null;\n            before.push({\n                line: lineNum,\n                input_text: inputBlock?.text ?? null,\n                input_status: inputBlock?.status ?? null,\n                output_block_type: outputBlock?.block_type ?? null,\n                output_state: outputBlock?.state ?? null,\n                output_status: outputBlock?.status ?? null,\n                output_server_state: outputBlock?.server_state_kind ?? null,\n                output_identity: outputBlock ? blockIdentity(outputBlock) : null,\n                input_cell: this.#cells[lineNum * 2] ?? null,\n                output_cell: this.#cells[lineNum * 2 + 1] ?? null,\n            });\n        }\n        for (let lineNum = startLine; lineNum * 2 < this.#cells.length; lineNum++) {\n            const inIndex = lineNum * 2;\n            const outIndex = inIndex + 1;\n            if (this.#cells[inIndex] && this.#blocks[inIndex]) {\n                this.#rebaseMountedCellLine(this.#cells[inIndex], this.#blocks[inIndex], lineNum);\n            }\n            if (this.#cells[outIndex] && this.#blocks[outIndex]) {\n                this.#rebaseMountedCellLine(this.#cells[outIndex], this.#blocks[outIndex], lineNum);\n            }\n        }\n        pushTestingPortalTimingTrace('documentview_rebase_suffix_mounts', {\n            start_line: startLine,\n            affected_line_count: before.length,\n            rows: before.slice(0, 12).map((row) => {\n                const inputBlock = this.#blocks[row.line * 2] ?? null;\n                const outputBlock = this.#blocks[row.line * 2 + 1] ?? null;\n                return {\n                    line: row.line,\n                    input_text_before: row.input_text,\n                    input_text_after: inputBlock?.text ?? null,\n                    input_status_before: row.input_status,\n                    input_status_after: inputBlock?.status ?? null,\n                    output_block_type_before: row.output_block_type,\n                    output_block_type_after: outputBlock?.block_type ?? null,\n                    output_state_before: row.output_state,\n                    output_state_after: outputBlock?.state ?? null,\n                    output_status_before: row.output_status,\n                    output_status_after: outputBlock?.status ?? null,\n                    output_server_state_before: row.output_server_state,\n                    output_server_state_after: outputBlock?.server_state_kind ?? null,\n                    output_identity_before: row.output_identity,\n                    output_identity_after: outputBlock ? blockIdentity(outputBlock) : null,\n                    input_cell_reused: row.input_cell === (this.#cells[row.line * 2] ?? null),\n                    output_cell_reused: row.output_cell === (this.#cells[row.line * 2 + 1] ?? null),\n                };\n            }),\n        });\n    }\n\n    #rebaseMountedCellLine(cell, block, lineNum) {\n        const displayLineNumber = this.#displayLineNumber(lineNum);\n        if (cell.displayLineNumber !== displayLineNumber) {\n            cell.displayLineNumber = displayLineNumber;\n        }\n        const inputCell = cell.inputCell ?? null;\n        if (inputCell) {\n            if (inputCell.ownerDocumentView !== this) {\n                inputCell.ownerDocumentView = this;\n            }\n            if (inputCell.cellID !== lineNum) {\n                inputCell.cellID = lineNum;\n            }\n            if (cell.lineNumberText) {\n                const lineNumberText = formatDocumentLineNumber(displayLineNumber);\n                if (cell.lineNumberText.state.text !== lineNumberText) {\n                    cell.lineNumberText.setText(lineNumberText);\n                }\n            }\n            if (block.block_type === 'puff' || block.block_type === 'convo') {\n                const badge = cell.statusBadge;\n                if (!badge) {\n                    throw new Error(`DocumentView expected status badge while rebasing line ${lineNum}.`);\n                }\n                if (badge.puffbookLineNum !== lineNum) {\n                    badge.puffbookLineNum = lineNum;\n                }\n            }\n        }\n        if (cell.testingViewport) {\n            if (cell.testingPuffbookLine !== lineNum) {\n                cell.testingPuffbookLine = lineNum;\n                cell.testingTableView?.setLineOnPuffbook?.(lineNum, this.#displayLineNumber(lineNum));\n            }\n        }\n    }\n\n    #shiftCurrentTableviewLine(lineNum, delta) {\n        if (!Number.isInteger(lineNum) || !Number.isInteger(delta)) {\n            throw new Error(`DocumentView expected integer tableview line shift, got line=${lineNum} delta=${delta}.`);\n        }\n        if (this.lineOfCurrentTableview < 0) {\n            return;\n        }\n        if (delta > 0) {\n            if (lineNum <= this.lineOfCurrentTableview) {\n                this.lineOfCurrentTableview += delta;\n            }\n            return;\n        }\n        if (lineNum < this.lineOfCurrentTableview) {\n            this.lineOfCurrentTableview += delta;\n            return;\n        }\n        if (lineNum === this.lineOfCurrentTableview) {\n            this.lineOfCurrentTableview = -1;\n        }\n    }\n\n    /* Rebuild the mounted row stack only at explicit bootstrap or recovery boundaries. */\n    #replaceBlocksFully(newBlocks) {\n        if (!Array.isArray(newBlocks)) {\n            throw new Error('DocumentView full block replacement requires an array of blocks.');\n        }\n        const anchor = this.#captureViewportDisplayAnchor();\n        const cursorAnchor = this.#captureCursorDisplayAnchor();\n        const oldCells = this.#cells;\n        const oldBlocks = this.#blocks;\n        const reuseByKey = new Map();\n        for (let i = 0; i < oldCells.length; i += 1) {\n            const cell = oldCells[i] ?? null;\n            const block = oldBlocks[i] ?? null;\n            const displayLine = cell?.displayLineNumber;\n            const disposition = block?.disposition ?? null;\n            if (!cell || !block || !Number.isInteger(displayLine) || !disposition) {\n                continue;\n            }\n            reuseByKey.set(`${displayLine}|${disposition}`, {\n                cell,\n                block,\n            });\n        }\n        const reused = new Set();\n        const nextCells = new Array(newBlocks.length);\n        for (let i = 0; i < newBlocks.length; i += 1) {\n            const block = newBlocks[i] ?? null;\n            const lineNum = Math.floor(i / 2);\n            const displayLine = this.#displayLineNumber(lineNum);\n            const disposition = block?.disposition ?? null;\n            const key = `${displayLine}|${disposition}`;\n            const rec = reuseByKey.get(key) ?? null;\n            const retainExpandedInspectStale = rec?.cell?.testingViewport?.expanded === true\n                && rec.cell.testingTableView?.shouldRetainInspectStaleForBlock?.(block) === true;\n            const retainsExpandedTableHost = rec?.cell?.testingViewport?.expanded === true\n                && !!rec.cell.testingTableView\n                && (block?.block_type === 'tableview' || blockRetainsVisibleOutput(block) || retainExpandedInspectStale);\n            if (rec && (canRetargetBlock(rec.block, block) || retainsExpandedTableHost)) {\n                reused.add(rec.cell);\n                nextCells[i] = rec.cell;\n                this.#retargetCell(rec.cell, block, lineNum, this.#rebuildOutputSyncOpts(rec.block, block));\n                continue;\n            }\n            const cell = new ui.Placeholder({});\n            this.#rebuildCell(cell, block, lineNum, this.#rebuildOutputSyncOpts(rec?.block ?? null, block));\n            nextCells[i] = cell;\n        }\n        for (const cell of oldCells) {\n            if (reused.has(cell)) {\n                continue;\n            }\n            this.#cancelOutputPreviewRecycle(cell);\n            this.#dropOutputMetadataWindow(cell);\n            this._blockRoot.removeChild(cell);\n        }\n        for (let i = 0; i < newBlocks.length; i += 1) {\n            const cell = nextCells[i] ?? null;\n            if (!cell || cell.parentNode === this._blockRoot) {\n                continue;\n            }\n            const beforeChild = this._blockRoot.children[i] ?? null;\n            this._blockRoot.insertChildBefore(cell, beforeChild);\n        }\n        this.#cells = nextCells;\n        this.#blocks = newBlocks;\n        this.#pruneScrollOffsets(newBlocks.length / 2);\n        this.#updateVerticalPositions(0);\n        this.#restoreViewportDisplayAnchor(anchor);\n        const restoredCursor = this.#restoreCursorDisplayAnchor(cursorAnchor);\n        if (!restoredCursor) {\n            this.#maybeClaimInitialFocus();\n        }\n        this.#syncInputFocus(restoredCursor ? new Set([this.state.cursor?.[0]]) : null);\n        this.#updateCursor();\n        this.#clampCameraVertical();\n        this.#syncWorkThink();\n    }\n\n    /* Capture the current caret against the authoritative display-line labels so viewport reslices can preserve the same absolute row. */\n    #captureCursorDisplayAnchor(bodyStartLine = null) {\n        if (this.state.doc.sourceSelectionState) {\n            const focus = primaryFocus(this.state.doc.sourceSelectionState());\n            return { display_line: focus.line, cursor_col: focus.col, document_focus_active: this.#documentFocusActive };\n        }\n        const cursor = Array.isArray(this.state.cursor) ? this.state.cursor : null;\n        const lineNum = Number.isInteger(cursor?.[0]) ? cursor[0] : -1;\n        if (lineNum < 0) {\n            return null;\n        }\n        const cell = this.#cells[lineNum * 2] ?? null;\n        const inputCell = cell?.inputCell ?? null;\n        const displayLine = Number.isInteger(bodyStartLine)\n            ? bodyStartLine + lineNum\n            : cell?.displayLineNumber;\n        if (!Number.isInteger(displayLine) || !inputCell) {\n            return null;\n        }\n        const selectionRange = Array.isArray(inputCell.selectionRange) && inputCell.selectionRange.length === 2\n            ? [inputCell.selectionRange[0], inputCell.selectionRange[1]]\n            : null;\n        return {\n            display_line: displayLine,\n            cursor_col: Number.isInteger(cursor?.[1]) ? cursor[1] : inputCell.cursorIndex ?? 0,\n            selection_range: selectionRange,\n            document_focus_active: this.#documentFocusActive === true,\n        };\n    }\n\n    /* Reattach the caret to the same absolute display line after a full block replacement shifts the local viewport window. */\n    #restoreCursorDisplayAnchor(anchor) {\n        if (this.state.doc.sourceSelectionState) return this.#restoreProjectedFocus();\n        if (!anchor || !Number.isInteger(anchor.display_line)) {\n            return false;\n        }\n        const lineNum = typeof this.state.doc.windowLineForDisplayLine === 'function'\n            ? this.state.doc.windowLineForDisplayLine(anchor.display_line)\n            : anchor.display_line;\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return false;\n        }\n        const cell = this.#cells[lineNum * 2] ?? null;\n        const inputCell = cell?.inputCell ?? null;\n        const block = this.#blocks[lineNum * 2] ?? null;\n        if (!inputCell) {\n            return false;\n        }\n        const col = Number.isInteger(anchor.cursor_col) ? anchor.cursor_col : 0;\n        this.mutate({ cursor: [lineNum, col] });\n        if (anchor.document_focus_active && this.state.doc.read_only !== true) {\n            this.#setDocumentFocusActive(true);\n        }\n        this.#syncInputCellFromDocument(inputCell, block?.text ?? inputCell.textInput, col);\n        if (Array.isArray(anchor.selection_range) && anchor.selection_range.length === 2) {\n            inputCell.syncSelectionRange(anchor.selection_range[0], anchor.selection_range[1]);\n        } else {\n            inputCell.syncSelectionRange(col, col);\n        }\n        if (anchor.document_focus_active && !inputCell.inFocus) {\n            inputCell.syncFocusVisual(true, 'document_display_line_restore');\n        }\n        return true;\n    }\n\n    /* Reflow the linear block stack from authoritative per-cell heights. */\n    #updateVerticalPositions(startIndex = 0) {\n        const cells = this.#cells;\n        if (!Number.isInteger(startIndex) || startIndex < 0) {\n            throw new Error(`DocumentView expected non-negative integer vertical-layout start index, got ${startIndex}.`);\n        }\n        if (startIndex > cells.length) {\n            throw new Error(`DocumentView vertical-layout start index ${startIndex} exceeds cell count ${cells.length}.`);\n        }\n\n        let y = 0;\n        if (startIndex > 0) {\n            const prev = cells[startIndex - 1];\n            y = prev.localPosition()[1] + prev.height;\n        }\n        for (let i = startIndex; i < cells.length; i++) {\n            if (cells[i].localPosition()[1] != y) {\n                const pos = cells[i].localPosition();\n                cells[i].stopAnimation('y');\n                cells[i].setLocalPosition(pos[0], y, pos[2]);\n            }\n\n            y += cells[i].height;\n        }\n        //this.#slab.mutate({height: this.#height});\n    }\n\n    #buildTableView(struct, lineNum, state = 'ptrless', previewHints = null, refreshing = false) {\n        if (!TABLEVIEWS_ENABLED) {\n            return this.#buildTableViewDisabled(struct, lineNum, state, refreshing);\n        }\n        const width = this.#layoutWidth();\n        const viewport = new ui.Viewport({\n            name: ui.uniqueName(`${this.state.name}.tableview_viewport.${lineNum}`),\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            width,\n            height: 256,\n            y: 0,\n            z: -1.0,\n            color: tableviewBoxColor(state, { refreshing }),\n            drawSurface: false,\n        });\n        let ownTableview = null;\n        try {\n            const sourceBody = this.state.doc.getWholePuffbookContent?.()\n                ?? this.#blocks.filter((_, index) => index % 2 === 0).map((block) => block?.text ?? '').join('\\n');\n            const sourceRange = localSourceRangeEndingAtOutputLine(sourceBody, lineNum)\n                ?? { start: lineNum, end: lineNum };\n            const sourceLines = [];\n            for (let sourceLine = sourceRange.start; sourceLine <= sourceRange.end; sourceLine += 1) {\n                // The document reducer is authoritative. Cached display blocks can\n                // lag behind an opening/reprojection, which would otherwise give\n                // the fullscreen editor an empty or stale draft.\n                sourceLines.push(this.state.doc.renderLine(sourceLine)?.[0]?.text\n                    ?? this.#blocks[sourceLine * 2]?.text\n                    ?? '');\n            }\n            const sourceText = sourceLines.join('\\n');\n            ownTableview = new ui.TableView({\n                name: ui.uniqueName(`${this.state.name}.tableview.${lineNum}`),\n                struct,\n                font: this.tableviewFont,\n                headerFont: this.tableviewHeaderFont,\n                z: -1.0,\n                api: this.state.doc.api,\n                isScreenshot: true,\n                presentationMode: 'preview',\n                inlineInputEnabled: false,\n                readOnly: this.state.doc.read_only === true,\n                lineOnPuffbook: lineNum,\n                inspectText: sourceText,\n                inspectSourceRange: sourceRange,\n                inspectSourceLines: sourceLines,\n                inspectDisplayLineNumber: (sourceLine) => this.#displayLineNumber(sourceLine),\n                inspectOwnerToken: this.#tableInspectOwnerToken,\n                previewHints,\n                onInspectSessionStart: (tableview) => this.#beginExpandedInspectSession(tableview),\n                onCanUndoInspect: () => {\n                    const scope = this.#expandedInspectSessions.get(ownTableview);\n                    return scope !== undefined && this.state.doc.canUndo?.(scope) === true;\n                },\n                onInspectSessionEnd: (tableview) => this.#endExpandedInspectSession(tableview),\n                onApplyAmend: (body, amendLineNum) => {\n                    if (typeof this.state.doc.amendPuffbook !== 'function') {\n                        throw new Error('DocumentView table amend requires doc.amendPuffbook(body, lineNum).');\n                    }\n                    if (!this.#canApplyTableAmend(ownTableview, amendLineNum)) {\n                        return;\n                    }\n                    CommanderBus.emit(\"APPLY_AMEND_TO_DOC\");\n                    const scope = this.#expandedInspectSessions.get(ownTableview);\n                    return scope === undefined\n                        ? this.state.doc.amendPuffbook(body, amendLineNum)\n                        : this.state.doc.amendPuffbook(body, amendLineNum, {\n                            undoScope: scope,\n                        });\n                },\n                onApplyInspectKeyDown: (event, inputCell) => this.applyTableInspectKeyDown(ownTableview, event, inputCell),\n                onApplyInspectReplacement: (text, tableview) => this.applyTableInspectReplacement(text, tableview),\n            });\n            viewport.appendChild(ownTableview);\n        } catch (err) {\n            console.warn('TableView build failed.', err);\n            return this.#buildTableViewError(struct, err);\n        }\n\n        ownTableview.ownPreviewViewport = viewport;\n        viewport.testingTableView = ownTableview;\n        this.#syncTableViewport(viewport, ownTableview, state, refreshing);\n        pushTestingTableviewTrace('documentview_build_tableview_viewport', {\n            line: lineNum,\n            state,\n            viewport_expanded: !!viewport.expanded,\n        });\n\n        if (lineNum === this.lineOfCurrentTableview) {\n            pushTestingTableviewTrace('documentview_auto_expand_current_tableview', {\n                line: lineNum,\n                viewport_expanded: !!viewport.expanded,\n            });\n            viewport.expand();\n            CommanderBus.emit(\"LOAD_FINISHED\");\n        }\n        return viewport;\n    }\n\n    #canApplyTableAmend(tableview, lineNum, { requireTableOutput = true } = {}) {\n        const doc = this.state.doc;\n        if (doc.read_only === true) return false;\n        const ownedInline = this.#cells.some((cell) =>\n            cell?.testingTableView === tableview\n            && cell?.testingPuffbookLine === lineNum\n            && cell?.parentNode === this._blockRoot\n        );\n        const ownedSession = tableview?.ownedByInspectToken?.(this.#tableInspectOwnerToken) === true;\n        const owned = ownedInline || ownedSession;\n        if (!owned) {\n            console.warn('DocumentView rejected stale table amend: preview is no longer owned by this document view.', {\n                line_num: lineNum,\n            });\n            return false;\n        }\n        if (typeof doc.isClosed === 'function' && doc.isClosed()) {\n            console.warn('DocumentView rejected stale table amend: document is already closed.', {\n                line_num: lineNum,\n                file_ref: doc.fileRef ?? null,\n            });\n            return false;\n        }\n        let blocks = null;\n        try {\n            blocks = doc.renderLine(lineNum);\n        } catch (err) {\n            console.warn('DocumentView rejected stale table amend: source line_index is no longer available.', {\n                line_num: lineNum,\n                error: err?.message ?? `${err}`,\n            });\n            return false;\n        }\n        if (!Array.isArray(blocks) || blocks.length < 2) {\n            console.warn('DocumentView rejected stale table amend: source line_index no longer renders a complete input/output pair.', {\n                line_num: lineNum,\n            });\n            return false;\n        }\n        const outBlock = blocks[1] ?? null;\n        if (requireTableOutput && outBlock?.block_type !== 'tableview') {\n            console.warn('DocumentView rejected stale table amend: source line_index no longer renders a table preview.', {\n                line_num: lineNum,\n                block_type: outBlock?.block_type ?? null,\n            });\n            return false;\n        }\n        return true;\n    }\n\n    /* Sync one explicit puffbook badge spec from the current input block without local synthesis or fallback. */\n    #syncPuffBadge(cell, block, lineNum = cell?.testingPuffbookLine ?? -1) {\n        const badge = cell.statusBadge;\n        if (!badge) {\n            throw new Error('DocumentView expected puff badge to exist before sync.');\n        }\n\n        const spec = block?.local_waiting === true\n            ? badgeSpecForLocalWaiting()\n            : badgeSpecForLineStatus(block?.status ?? null);\n        badge.puffbookLineNum = lineNum;\n        badge.puffbookBlock = block;\n        badge.__puffBadgeSpec = spec;\n\n        if (!spec) {\n            // Hidden badges stay attached and reusable; sync just clears the\n            // visual state when the current input block carries no badge.\n            badge.tooltipText = '';\n            badge.tooltipEnabled = false;\n            badge.toastEnabled = false;\n            badge.onInput = () => false;\n            badge.setEnabled(false);\n            badge.setVisibility(false);\n            badge.icon?.setVisibility(false);\n            this.#syncPuffBadgeIconAnimation(badge, null);\n            badge._dirtyResources({ includePicker: false });\n            return;\n        }\n\n        badge.iconID = spec.iconID;\n        badge.tooltipText = spec.tooltipText;\n        badge.tooltipEnabled = true;\n        badge.toastEnabled = false;\n        badge.onInput = () => false;\n        badge.setEnabled(true);\n        badge.setVisibility(true);\n        if (badge.icon) {\n            badge.icon.mutate({ iconID: spec.iconID });\n            badge.icon.setVisibility(true);\n        }\n        if (typeof badge.setIconColor === 'function') {\n            badge.setIconColor(spec.iconColor);\n        } else if (badge.icon) {\n            badge.icon.color = spec.iconColor;\n        }\n        this.#syncPuffBadgeIconAnimation(badge, spec);\n        badge._dirtyResources({ includePicker: false });\n    }\n\n    #syncPuffBadgeIconAnimation(badge, spec) {\n        const spinNode = badge?.iconPivot ?? badge?.icon ?? null;\n        if (!spinNode) {\n            return;\n        }\n        const wantsSpin = spec?.iconAnimation?.type === 'spin';\n        const prevSpinNode = badge.__puffIconSpinNode ?? null;\n        badge.__puffIconSpinNode = spinNode;\n        const periodS = wantsSpin && Number.isFinite(spec.iconAnimation?.period_s)\n            ? Math.max(0.1, spec.iconAnimation.period_s)\n            : 1.6;\n        if (wantsSpin) {\n            const prevPeriod = badge.__puffIconSpinPeriod ?? null;\n            const liveSpin = spinNode.animationState('clock_s');\n            if (!liveSpin || !badge.__puffIconSpinActive || prevPeriod !== periodS || prevSpinNode !== spinNode) {\n                spinNode.stopAnimation('rotation_z');\n                spinNode.stopAnimation('clock_s');\n                badge.icon?.setGpuSpin(periodS);\n                spinNode.animateTo({\n                    clock_s: 1,\n                    duration_s: periodS,\n                    ease: 'linear',\n                    loop: 'repeat',\n                    accumulate: true,\n                });\n                badge.__puffIconSpinActive = true;\n                badge.__puffIconSpinPeriod = periodS;\n            }\n            return;\n        }\n        if (badge.__puffIconSpinActive) {\n            spinNode.stopAnimation('clock_s');\n            badge.icon?.setGpuSpin(null);\n            spinNode.setLocalRotationZ(0);\n            badge.__puffIconSpinActive = false;\n            badge.__puffIconSpinPeriod = null;\n            return;\n        }\n        if (spinNode.animationState('rotation_z')) {\n            spinNode.stopAnimation('rotation_z');\n        }\n        if (spinNode.animationState('clock_s')) {\n            spinNode.stopAnimation('clock_s');\n        }\n        badge.icon?.setGpuSpin(null);\n        const currentRotation = spinNode.state?.rotation_z ?? 0;\n        if (Math.abs(currentRotation) > 1e-6) {\n            spinNode.setLocalRotationZ(0);\n        }\n        badge.__puffIconSpinActive = false;\n        badge.__puffIconSpinPeriod = null;\n    }\n\n    #ensurePuffBadge(cell) {\n        if (cell.statusBadge) {\n            return;\n        }\n\n        const badge = new Button({\n            focusable: false,\n            font: this.state.font,\n            fontSize: 12,\n            x: -100 + 18,\n            y: DOCUMENT_ROW_BADGE_Y,\n            z: 1,\n            width: 20,\n            height: 20,\n            color: [0, 0, 0, 0],\n            iconID: 7,\n            iconColor: Palette.darkred,\n            textPadding: 0,\n            hideTile: true,\n        });\n        badge.onHoverColor = badge.defaultColor;\n        badge.toastEnabled = false;\n        badge.tooltipText = '';\n        badge.tooltipEnabled = false;\n        badge.setEnabled(false);\n        badge.setVisibility(false);\n        badge.icon?.setVisibility(false);\n        /* Button creates iconPivot only once attached.  Reconcile the desired\n           badge animation at that lifecycle edge for initially detached cells. */\n        badge.onIconCreated = () => this.#syncPuffBadgeIconAnimation(\n            badge,\n            badge.__puffBadgeSpec ?? null,\n        );\n        cell.statusBadge = badge;\n        cell.appendChild(badge);\n    }\n\n    #tryFinishCurrentTableviewLoad(lineNum) {\n        if (this.loaderPreviewReadyLine !== lineNum) {\n            return;\n        }\n        if (this.loaderRecomputeFinishedLine !== lineNum) {\n            return;\n        }\n        this.loaderPreviewReadyLine = -1;\n        this.loaderRecomputeFinishedLine = -1;\n        this.lineOfCurrentTableview = -1;\n        CommanderBus.emit(\"LOAD_FINISHED\");\n    }\n\n    currentTableviewRefreshed(lineNum) {\n        this.ownLoaderScreen = null;\n        const markPreviewReady = () => {\n            this.loaderPreviewReadyLine = lineNum;\n            this.#tryFinishCurrentTableviewLoad(lineNum);\n        };\n        const outIndex = lineNum * 2 + 1;\n        const block = this.#blocks[outIndex] ?? null;\n        for (const cell of this.#cells) {\n            if (cell.testingPuffbookLine !== lineNum) {\n                continue;\n            }\n            const viewport = cell.testingViewport ?? null;\n            if (!viewport) {\n                continue;\n            }\n            if (viewport.testingTableView && block?.block_type === 'tableview') {\n                const previewHeight = this.#syncTableViewport(viewport, viewport.testingTableView, block.state, blockIsRefreshing(block));\n                this.#syncTablePreviewMetadata(cell, block.ptrless, previewHeight);\n                let nextHeight = previewHeight + this.#tablePreviewMetadataHeight();\n                nextHeight += this.#syncOutputMetadataChrome(cell, block.ptrless, lineNum, nextHeight, previewHeight + 1);\n                if (cell.height !== nextHeight) {\n                    if (cell.outputVisualKind === 'preview') {\n                        cell.outputPreviewHeight = nextHeight;\n                    }\n                    cell.height = nextHeight;\n                    this.#updateVerticalPositions(outIndex);\n                    this.#updateCursor();\n                }\n            }\n            if (viewport.expanded) {\n                pushTestingTableviewTrace('documentview_preview_ready_expanded', {\n                    line: lineNum,\n                    viewport_expanded: !!viewport.expanded,\n                    loader_preview_ready_line: this.loaderPreviewReadyLine ?? -1,\n                    line_of_current_tableview: this.lineOfCurrentTableview ?? -1,\n                });\n                viewport.expand();\n                markPreviewReady();\n                return;\n            }\n            pushTestingTableviewTrace('documentview_preview_ready_not_expanded', {\n                line: lineNum,\n                viewport_expanded: !!viewport.expanded,\n                loader_preview_ready_line: this.loaderPreviewReadyLine ?? -1,\n                line_of_current_tableview: this.lineOfCurrentTableview ?? -1,\n            });\n            markPreviewReady();\n            return;\n        }\n        this.loaderPreviewReadyLine = lineNum;\n        this.#tryFinishCurrentTableviewLoad(lineNum);\n    }\n};\n\n\n\n/*\nyou can also pass:\n    --delayed: executes actions with intervals, this gives the\n    player time to load correctly and hit the right actions,\n    you will want to use this one most of the runs.\n    --output </another/path>: to set the recording data to a \n    custom directory path\n    --live: the recording plays as headless by dafault, we can\n    see playwright live recording with this command however it's\n    not working on our current enviormnet as of today.\n*/\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as base from './base.mjs';\nimport * as ewu from '../evil-works-utils.mjs';\n\n/**\n    A Screen is a logical arrangement of UI elements specialised to a purpose,\n    that is expected to fill the viewport. Screens adapt to changes in the viewport size by\n    moving their elements around to fill the space.\n\n    Viewports are defined with (0, 0, 0) in local coordinates to appear in the\n    middle of the browser window, with the coordinate range (-w/2, -h/2, 0) --\n    (w/2, h/2, 0) where w is the width of the browser window in CSS pixels and h is\n    its height. Implementors can override _onViewportResized to trigger this\n    action. Typically it would be animated so it doesn't happen too suddenly on a\n    resize, allowing the user's eye to track where things move to.\n\n    Screens are designed to work with a Prezi (presentation software) style zoom-in / zoom-out\n    system to reflect the parent-child relationship screens can often have with each other.\n    E.g. a file folder viewer could use this to make going up (\"..\") corresponding to zoom out,\n    and going into a specific folder as a zoom-in. When the item is small, it would appear as\n    an icon, which is animated into the full screen as it grows.\n*/\nexport class Screen extends base.Node {\n    constructor(state) {\n        super(state);\n    }\n\n    /**\n        Returns a matrix giving the location and orientation of the view from a\n        camera. This is the matrix which places the camera in the scene (which\n        is the inverse of the camera's view matrix).\n\n        The camera needs to float further above the UI plane if the viewport is larger,\n        to maintain a \"square\" geometry (altitude = min{w, h}/2). Hence the camera-plane\n        distance varies.\n    */\n    cameraHomeMatrix() {\n        // const hw = 0.5 * this.scene.viewportDimensions.width;  // half-width\n        // const hh = 0.5 * this.scene.viewportDimensions.height; // half-height\n        // let alt = Math.min(hw, hh); // How far camera from the UI plane, in wpx?\n\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (cam) {\n            const [w, h] = cam.getViewportSize();\n            let alt = Math.min(w, h);\n            return twgl.m4.translation([0, 0, -alt * 0.5 || 0])\n        }\n\n        // Basic system is right-handed with positive Z into the screen, so\n        // camera position should be ////positive. Note this is reverse to usual\n        // OpenGL world-coordinate convention around Z. This is so we can\n        // maintain a right-handed system yet have y increase down the screen.\n        return twgl.m4.identity();\n    }\n\n    /**\n        Instantly resets the camera to focus on this screen, without any transition animation.\n    */\n    teleportCamera(camera) {\n        if (camera === null) {\n            throw new Error('null camera');\n        }\n\n        //camera.remount(this);\n        \n        const home = this.cameraHomeMatrix();\n        camera.setLocalToParent(home);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Slab } from './slab.mjs';\nimport { formatTick, outwardBounds } from './cartesian-plot-baseline.mjs';\n\nconst DEFAULT_BODY_COLOR = Object.freeze([0.90, 0.49, 0.29, 0.96]);\nconst DEFAULT_STEM_COLOR = Object.freeze([0.86, 0.88, 0.92, 0.95]);\nconst DEFAULT_TICK_COLOR = Object.freeze([0.70, 0.72, 0.76, 1.0]);\nconst DEFAULT_TITLE_COLOR = Object.freeze([0.82, 0.84, 0.88, 1.0]);\nconst DEFAULT_SUBTITLE_COLOR = Object.freeze([0.60, 0.63, 0.68, 1.0]);\nconst DEFAULT_BODY_DEPTH = 14;\nconst DEFAULT_STEM_DEPTH = 10;\nconst DEFAULT_BINS = 24;\nconst MIN_BINS = 8;\nconst MAX_BINS = 48;\n\n/* Keep the public empty model explicit so callers and tests can reason about the no-data state without null branches. */\nfunction defaultViolinPlotModel() {\n    const bounds = { min: 0, max: 1, step: 0.2, majorCount: 6 };\n    return {\n        depth: '2_1d',\n        values: [],\n        body: [],\n        ticks: buildTickSpecs(bounds),\n        bounds,\n        summary: {\n            count: 0,\n            min: null,\n            max: null,\n            median: null,\n            q1: null,\n            q3: null,\n        },\n    };\n}\n\n/* Accept only finite numeric samples so downstream layout can stay fail-fast and scalar. */\nfunction numericSamples(samples) {\n    if (!Array.isArray(samples)) {\n        return [];\n    }\n    return samples\n        .filter((value) => value !== null && value !== undefined && value !== '')\n        .map((value) => Number(value))\n        .filter((value) => Number.isFinite(value))\n        .sort((a, b) => a - b);\n}\n\n/* Interpolate one quantile from the sorted sample set so binning and summaries share one numeric contract. */\nfunction quantile(sorted, q) {\n    if (!Array.isArray(sorted) || sorted.length === 0) {\n        return null;\n    }\n    if (sorted.length === 1) {\n        return sorted[0];\n    }\n    const pos = (sorted.length - 1) * q;\n    const lo = Math.floor(pos);\n    const hi = Math.ceil(pos);\n    if (lo === hi) {\n        return sorted[lo];\n    }\n    const frac = pos - lo;\n    return sorted[lo] * (1 - frac) + sorted[hi] * frac;\n}\n\n/* Use the sample spread to choose a stable bin count without letting tiny or huge sets explode the layout. */\nfunction chooseBinCount(sorted, wantBins = DEFAULT_BINS) {\n    if (!Array.isArray(sorted) || sorted.length <= 1) {\n        return MIN_BINS;\n    }\n    const q1 = quantile(sorted, 0.25);\n    const q3 = quantile(sorted, 0.75);\n    const iqr = Math.max(0, (q3 ?? 0) - (q1 ?? 0));\n    const span = Math.max(0, sorted[sorted.length - 1] - sorted[0]);\n    if (!iqr || !span) {\n        return Math.max(MIN_BINS, Math.min(MAX_BINS, Math.round(wantBins)));\n    }\n    const width = 2 * iqr / Math.cbrt(sorted.length);\n    if (!Number.isFinite(width) || width <= 0) {\n        return Math.max(MIN_BINS, Math.min(MAX_BINS, Math.round(wantBins)));\n    }\n    return Math.max(MIN_BINS, Math.min(MAX_BINS, Math.round(span / width)));\n}\n\n/* Convert one sorted sample set into a mirrored violin profile where each row owns one normalised half-width. */\nfunction buildViolinBody(sorted, bounds, wantBins = DEFAULT_BINS) {\n    const binCount = chooseBinCount(sorted, wantBins);\n    const span = Math.max(bounds.max - bounds.min, bounds.step ?? 1);\n    const binSpan = span / binCount;\n    const bins = Array.from({ length: binCount }, (_unused, i) => ({\n        index: i,\n        valueLo: bounds.min + i * binSpan,\n        valueHi: bounds.min + (i + 1) * binSpan,\n        count: 0,\n    }));\n    for (const value of sorted) {\n        const pos = span <= 0 ? 0 : (value - bounds.min) / span;\n        const index = Math.max(0, Math.min(binCount - 1, Math.floor(pos * binCount)));\n        bins[index].count += 1;\n    }\n    const maxCount = Math.max(1, ...bins.map((bin) => bin.count));\n    return bins.map((bin) => ({\n        ...bin,\n        valueMid: 0.5 * (bin.valueLo + bin.valueHi),\n        widthNorm: bin.count / maxCount,\n    }));\n}\n\n/* Build one stable value-axis tick family from the outward-rounded bounds so labels and slabs agree. */\nfunction buildTickSpecs(bounds) {\n    const count = Math.max(2, bounds.majorCount ?? 6);\n    if (count <= 1) {\n        return [{ value: bounds.min, text: formatTick(bounds.min, bounds.step ?? 1) }];\n    }\n    const step = bounds.step ?? ((bounds.max - bounds.min) / (count - 1));\n    const ticks = [];\n    for (let i = 0; i < count; i++) {\n        const value = bounds.min + step * i;\n        ticks.push({\n            value,\n            text: formatTick(value, step),\n        });\n    }\n    return ticks;\n}\n\n/* Summarise the distribution once so later overlays can reuse the same canonical quartile and median values. */\nexport function buildViolinPlotModel(samples, opts = {}) {\n    const values = numericSamples(samples);\n    if (values.length === 0) {\n        return defaultViolinPlotModel();\n    }\n    const min = values[0];\n    const max = values[values.length - 1];\n    const q1 = quantile(values, 0.25);\n    const median = quantile(values, 0.5);\n    const q3 = quantile(values, 0.75);\n    const bounds = outwardBounds(min, max);\n    const body = buildViolinBody(values, bounds, opts.bins ?? DEFAULT_BINS);\n    return {\n        depth: '2_1d',\n        values,\n        body,\n        ticks: buildTickSpecs(bounds),\n        bounds,\n        summary: {\n            count: values.length,\n            min,\n            max,\n            median,\n            q1,\n            q3,\n        },\n    };\n}\n\n/* Project one value onto the vertical plot span using the canonical bounds produced by the model builder. */\nfunction valueToY(model, value, plotTop, plotHeight) {\n    const span = model.bounds.max - model.bounds.min;\n    if (!Number.isFinite(span) || span <= 0) {\n        return plotTop + 0.5 * plotHeight;\n    }\n    const t = (value - model.bounds.min) / span;\n    return plotTop + plotHeight - t * plotHeight;\n}\n\n/* Build one compact subtitle so the first cut can communicate units and sample count without a control surface. */\nfunction subtitleText(unit, count) {\n    const unitText = unit ? `[${unit}]` : '';\n    if (!count) {\n        return unitText;\n    }\n    return unitText ? `${count} samples ${unitText}` : `${count} samples`;\n}\n\n/* Grow or shrink one child pool to the requested size while preserving existing node instances where possible. */\nfunction syncNodePool(owner, pool, wantCount, makeNode) {\n    while (pool.length < wantCount) {\n        const node = makeNode();\n        pool.push(node);\n        owner.appendChild(node);\n    }\n    while (pool.length > wantCount) {\n        const node = pool.pop();\n        owner.removeChild(node);\n    }\n}\n\nexport class ViolinPlot extends ui.Node {\n    #titleText;\n    #subtitleText;\n    #bodySlabs;\n    #tickSlabs;\n    #tickLabels;\n    #stemSlab;\n    #medianSlab;\n    #quartileSlabs;\n    #model;\n\n    /* Keep the first violin component narrowly scoped to 2.1D so later depth expansion stays explicit. */\n    static supportedDepths = Object.freeze(['2_1d']);\n\n    constructor(state = {}) {\n        super({\n            samples: [],\n            title: 'Distribution',\n            valueName: 'Value',\n            unit: '',\n            bins: DEFAULT_BINS,\n            width: 360,\n            height: 280,\n            bodyDepth: DEFAULT_BODY_DEPTH,\n            stemDepth: DEFAULT_STEM_DEPTH,\n            font: null,\n            titleFont: null,\n            subtitleFont: null,\n            depth: '2_1d',\n            ...state,\n        });\n\n        if (this.state.depth !== '2_1d') {\n            throw new Error(`ViolinPlot currently supports only depth='2_1d'. Got '${this.state.depth}'.`);\n        }\n        if (!this.state.font) {\n            throw new Error('ViolinPlot requires a font.');\n        }\n\n        this.#bodySlabs = [];\n        this.#tickSlabs = [];\n        this.#tickLabels = [];\n        this.#quartileSlabs = [];\n        this.#model = defaultViolinPlotModel();\n\n        this.#titleText = new evilfont.MSDFText({\n            font: this.state.titleFont || this.state.font,\n            fontSize: 18,\n            fontColor: DEFAULT_TITLE_COLOR,\n            text: this.state.title,\n        });\n        this.appendChild(this.#titleText);\n\n        this.#subtitleText = new evilfont.MSDFText({\n            font: this.state.subtitleFont || this.state.font,\n            fontSize: 13,\n            fontColor: DEFAULT_SUBTITLE_COLOR,\n            text: '',\n        });\n        this.appendChild(this.#subtitleText);\n\n        this.#stemSlab = new Slab({\n            width: 2,\n            height: 100,\n            depth: this.state.stemDepth,\n            color: DEFAULT_STEM_COLOR,\n        });\n        this.appendChild(this.#stemSlab);\n\n        this.#medianSlab = new Slab({\n            width: 24,\n            height: 3,\n            depth: this.state.stemDepth + 2,\n            color: [0.96, 0.97, 0.98, 0.98],\n        });\n        this.appendChild(this.#medianSlab);\n\n        this.setSamples(this.state.samples);\n    }\n\n    /* Expose the current model for tests and for the later instrumentation panel wiring. */\n    testingModel() {\n        return this.#model;\n    }\n\n    /* Rebuild the canonical distribution model and then relayout every child off that one owner-owned structure. */\n    setSamples(samples) {\n        this.state.samples = Array.isArray(samples) ? [...samples] : [];\n        this.#model = buildViolinPlotModel(this.state.samples, {\n            bins: this.state.bins,\n        });\n        this.#syncLayout();\n    }\n\n    /* Reject unsupported depth upgrades early while allowing normal state mutation for the rest of the surface. */\n    mutate(newState) {\n        if (newState.depth && newState.depth !== '2_1d') {\n            throw new Error(`ViolinPlot currently supports only depth='2_1d'. Got '${newState.depth}'.`);\n        }\n        const next = {\n            ...this.state,\n            ...newState,\n        };\n        super.mutate(newState);\n        if (newState.samples || newState.bins) {\n            this.#model = buildViolinPlotModel(next.samples, {\n                bins: next.bins,\n            });\n        }\n        this.#syncLayout();\n    }\n\n    /* Lay out the title block, slab body, and simple value axis inside one stable padded frame. */\n    #syncLayout() {\n        const width = Math.max(180, this.state.width);\n        const height = Math.max(180, this.state.height);\n        const left = 72;\n        const right = 40;\n        const top = 38;\n        const bottom = 24;\n        const plotLeft = left;\n        const plotTop = top + 26;\n        const plotWidth = Math.max(60, width - left - right);\n        const plotHeight = Math.max(80, height - plotTop - bottom);\n        const centreX = plotLeft + 0.5 * plotWidth;\n        const maxHalfWidth = Math.max(18, plotWidth * 0.40);\n\n        this.#titleText.mutate({\n            x: plotLeft,\n            y: top - 10,\n            z: 0,\n        });\n        this.#titleText.setText(this.state.title || this.state.valueName);\n        this.#subtitleText.mutate({\n            x: plotLeft,\n            y: top + 8,\n            z: 0,\n        });\n        this.#subtitleText.setText(subtitleText(this.state.unit, this.#model.summary.count));\n\n        this.#stemSlab.mutate({\n            x: centreX,\n            y: plotTop + 0.5 * plotHeight,\n            z: 0,\n            width: 2,\n            height: Math.max(10, plotHeight),\n            depth: this.state.stemDepth,\n            color: DEFAULT_STEM_COLOR,\n        });\n\n        const bodySpecs = this.#model.body.map((bin) => {\n            const y0 = valueToY(this.#model, bin.valueLo, plotTop, plotHeight);\n            const y1 = valueToY(this.#model, bin.valueHi, plotTop, plotHeight);\n            const slabHeight = Math.max(3, Math.abs(y1 - y0) * 0.86);\n            const halfWidth = Math.max(2, maxHalfWidth * bin.widthNorm);\n            return {\n                x: centreX,\n                y: 0.5 * (y0 + y1),\n                z: 0,\n                width: 2 * halfWidth,\n                height: slabHeight,\n                depth: this.state.bodyDepth,\n                color: DEFAULT_BODY_COLOR,\n            };\n        });\n\n        syncNodePool(this, this.#bodySlabs, bodySpecs.length, () => new Slab({\n            width: 10,\n            height: 10,\n            depth: this.state.bodyDepth,\n            color: DEFAULT_BODY_COLOR,\n        }));\n        for (let i = 0; i < this.#bodySlabs.length; i++) {\n            this.#bodySlabs[i].mutate(bodySpecs[i]);\n        }\n\n        const quartiles = [this.#model.summary.q1, this.#model.summary.q3]\n            .filter((value) => Number.isFinite(value))\n            .map((value) => ({\n                x: centreX,\n                y: valueToY(this.#model, value, plotTop, plotHeight),\n                z: 1,\n                width: Math.max(12, maxHalfWidth * 0.82),\n                height: 2,\n                depth: this.state.stemDepth + 1,\n                color: [0.82, 0.84, 0.88, 0.92],\n            }));\n        syncNodePool(this, this.#quartileSlabs, quartiles.length, () => new Slab({\n            width: 10,\n            height: 2,\n            depth: this.state.stemDepth + 1,\n            color: [0.82, 0.84, 0.88, 0.92],\n        }));\n        for (let i = 0; i < this.#quartileSlabs.length; i++) {\n            this.#quartileSlabs[i].mutate(quartiles[i]);\n        }\n\n        const median = this.#model.summary.median;\n        const medianY = Number.isFinite(median)\n            ? valueToY(this.#model, median, plotTop, plotHeight)\n            : plotTop + 0.5 * plotHeight;\n        this.#medianSlab.mutate({\n            x: centreX,\n            y: medianY,\n            z: 2,\n            width: Math.max(18, maxHalfWidth * 0.96),\n            height: 3,\n            depth: this.state.stemDepth + 2,\n        });\n        this.#medianSlab.setVisibility(Number.isFinite(median));\n\n        const tickSpecs = this.#model.ticks.map((tick) => ({\n            value: tick.value,\n            text: tick.text,\n            y: valueToY(this.#model, tick.value, plotTop, plotHeight),\n        }));\n        syncNodePool(this, this.#tickSlabs, tickSpecs.length, () => new Slab({\n            width: 12,\n            height: 2,\n            depth: 6,\n            color: [0.46, 0.49, 0.53, 0.94],\n        }));\n        syncNodePool(this, this.#tickLabels, tickSpecs.length, () => new evilfont.MSDFText({\n            font: this.state.font,\n            fontSize: 12,\n            fontColor: DEFAULT_TICK_COLOR,\n            text: '',\n        }));\n        for (let i = 0; i < tickSpecs.length; i++) {\n            const tick = tickSpecs[i];\n            this.#tickSlabs[i].mutate({\n                x: plotLeft + 12,\n                y: tick.y,\n                z: 0,\n                width: 12,\n                height: 2,\n                depth: 6,\n                color: [0.46, 0.49, 0.53, 0.94],\n            });\n            this.#tickLabels[i].mutate({\n                x: plotLeft - 40,\n                y: tick.y - 6,\n                z: 0,\n                fontColor: DEFAULT_TICK_COLOR,\n            });\n            this.#tickLabels[i].setText(tick.text);\n        }\n        for (const label of this.#tickLabels) {\n            if (label.parentNode !== this) {\n                this.appendChild(label);\n            }\n        }\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n/*\n    Each window may have a very difrent layout\n    with difrent porpuses, they will share the same\n    window pop up features of interaction, but the \n    \"Panel\" will be built with a custom blueprint.\n*/\nexport class SortPanel extends Placeholder {\n\n    PANEL_WIDTH = 600;\n    BUTTON_HEIGHT = 42;\n    SORT_OPTIONS = [\n        \"Ascending\",\n        \"Descending\"\n    ]\n\n    static #normaliseRule(rule) {\n        if (!Array.isArray(rule)) {\n            return [0, 0];\n        }\n        const colIdx = Number.isInteger(rule[0]) && rule[0] >= 0 ? rule[0] : 0;\n        const sortIdx = Number.isInteger(rule[1]) && rule[1] >= 0 ? rule[1] : 0;\n        return [colIdx, sortIdx];\n    }\n\n    #normaliseSettings() {\n        this.settings = this.settings\n            .filter(rule => rule !== null && rule !== undefined)\n            .map(rule => SortPanel.#normaliseRule(rule));\n        if (this.settings.length === 0) {\n            this.settings.push([0, 0]);\n        }\n    }\n\n    constructor(state) {\n        super({ name: 'sort-panel' });\n        if (!state.font) throw new Error('SortPanel requires a font.');\n        if (typeof state.onSubmit !== 'function') {\n            throw new Error('SortPanel requires state.onSubmit(formattedSettings).');\n        }\n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n        this.columnNames = Array.isArray(state.columnNames) ? state.columnNames : [];\n        this.ownOnSubmit = state.onSubmit;\n        this.selectedColumnName = state.columnData?.columnName ?? null;\n\n        /*\n            todu:\n            Request the api for sorting options and\n            load into the settings\n        */\n        this.settings = [];\n        //load the existing settings here\n        const selectedColumnIndex = this.columnNames.indexOf(this.selectedColumnName);\n        this.settings.push([Math.max(0, selectedColumnIndex), 0])\n        this.#normaliseSettings();\n        this.buttons = []\n        \n        this.sortButton = null;\n        this.addRuleButton = null;\n        this.ctxMenu = null;\n\n        this.rulesY = 0;\n        this.buttonsY = 0;\n\n        this.mutate({ height: 100 });\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.ctxMenu?.destroy();\n        this.ctxMenu = null;\n        super._onBeforeDetachNode(shared);\n    }\n\n    #destroyRules() {\n        for (const button of this.buttons) {\n            this.removeChild(button)\n        }\n        this.buttons = []\n\n        if (this.ctxMenu) {\n            this.ctxMenu.destroy();\n        }\n    }\n\n    #buildRules() {\n        this.#normaliseSettings();\n        this.#destroyRules();\n\n        const columns = this.columnNames;\n        const buttonColor = Palette.darkgrey;\n        const halfWidth = this.PANEL_WIDTH * 0.5 - this.BUTTON_HEIGHT;\n\n        let currentY = this.rulesY;\n\n        const createButton = (text, x) => new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: text,\n            width: halfWidth,\n            height: this.BUTTON_HEIGHT,\n            x: x,\n            y: currentY,\n            z: -0.2,\n            color: buttonColor,\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n            textPadding: 0\n        });\n\n        this.settings.forEach((setting, index) => {\n            const [colIdx, sortIdx] = setting;\n\n            // Calculate text layout\n            const sortByText = this.SORT_OPTIONS[sortIdx] ?? \"NULL\";\n            const columnNameText = columns[colIdx] ?? \"NULL\"\n\n            const columnButton = createButton(columnNameText, this.BUTTON_HEIGHT);\n            const sortByButton = createButton(sortByText, halfWidth + this.BUTTON_HEIGHT);\n\n            this.buttons.push(sortByButton)\n            this.buttons.push(columnButton)\n            this.appendChild(columnButton);\n            this.appendChild(sortByButton);\n\n            const sortWindow = this\n\n            sortByButton.onInput = ui.Button.onPrimaryRelease(function () {\n\n                if (sortWindow.ctxMenu) {  sortWindow.ctxMenu.destroy(); }\n                const ctxMenu = ui.ContextMenu.mount(this, {\n                    font: sortWindow.font,\n                    fontSize: sortWindow.fontSize,\n                    x: sortByButton.state.width,\n                    itemsArray: {\n                        labels: sortWindow.SORT_OPTIONS,\n                        onInput: (itemidx) => {\n                            sortWindow.settings[index][1] = itemidx\n                            sortWindow.#buildRules()\n                        }\n                    }\n\n                })\n                sortWindow.ctxMenu = ctxMenu;\n                ctxMenu.destroy = () => {\n                    if (sortWindow.ctxMenu) {\n                        const target = sortWindow.ctxMenu.ownMount ?? sortWindow.ctxMenu;\n                        target.parentNode?.removeChild(target);\n                        sortWindow.ctxMenu = null;\n                    }\n                }\n            });\n\n            columnButton.onInput = ui.Button.onPrimaryRelease(function () {\n                if (sortWindow.ctxMenu) { sortWindow.ctxMenu.destroy(); }\n                const ctxMenu = ui.ContextMenu.mount(this, {\n                    font: sortWindow.font,\n                    fontSize: sortWindow.fontSize,\n                    x: columnButton.state.width,\n                    itemsArray: {\n                        labels: columns,\n                        onInput: (itemidx) => {\n                            sortWindow.settings[index][0] = itemidx\n                            sortWindow.#buildRules()\n                        }\n                    }\n\n                })\n         \n                sortWindow.ctxMenu = ctxMenu;\n                ctxMenu.destroy = () => {\n                    if (sortWindow.ctxMenu) {\n                        const target = sortWindow.ctxMenu.ownMount ?? sortWindow.ctxMenu;\n                        target.parentNode?.removeChild(target);\n                        sortWindow.ctxMenu = null;\n                    }\n                }\n            });\n\n            //Delete Rule Button\n            const deleteRuleButton = new ui.Button({\n                width: this.BUTTON_HEIGHT * 0.5,\n                height: this.BUTTON_HEIGHT * 0.5,\n                x: this.BUTTON_HEIGHT * 0.25,\n                y: currentY + this.BUTTON_HEIGHT * 0.25,\n                z: -0.1,\n                color: Palette.clear,\n                iconColor: Palette.white,\n                iconID: 9\n\n            })\n            this.buttons.push(deleteRuleButton)\n            this.appendChild(deleteRuleButton)\n\n            deleteRuleButton.onInput = ui.Button.onPrimaryRelease(function () {\n                sortWindow.settings.splice(index, 1);\n                sortWindow.#buildRules()\n            });\n\n            //Move Up Rule Button\n            const moveUpButton = new ui.Button({\n                width: this.BUTTON_HEIGHT * 0.5,\n                height: this.BUTTON_HEIGHT * 0.5,\n                x: this.PANEL_WIDTH - this.BUTTON_HEIGHT + this.BUTTON_HEIGHT * 0.25,\n                y: currentY,\n                z: -0.1,\n                color: Palette.clear,\n                iconColor: Palette.white,\n                iconID: 10\n            })\n\n            this.buttons.push(moveUpButton)\n            this.appendChild(moveUpButton)\n\n            moveUpButton.onInput = ui.Button.onPrimaryRelease(function () {\n                if (index > 0) {\n                    // Swap current item (index) with the one above it (index - 1)\n                    [sortWindow.settings[index], sortWindow.settings[index - 1]] =\n                        [sortWindow.settings[index - 1], sortWindow.settings[index]];\n\n                    sortWindow.#buildRules();\n                }\n            });\n            //Move Down Rule Button\n            const moveDownButton = new ui.Button({\n                width: this.BUTTON_HEIGHT * 0.5,\n                height: this.BUTTON_HEIGHT * 0.5,\n                x: this.PANEL_WIDTH - this.BUTTON_HEIGHT + this.BUTTON_HEIGHT * 0.25,\n                y: currentY + this.BUTTON_HEIGHT * 0.5,\n                z: -0.1,\n                color: Palette.clear,\n                iconColor: Palette.white,\n                iconID: 11\n            })\n\n            this.buttons.push(moveDownButton)\n            this.appendChild(moveDownButton)\n\n            moveDownButton.onInput = ui.Button.onPrimaryRelease(function () {\n                if (index < sortWindow.settings.length - 1) {\n                    // Swap current item (index) with the one above it (index - 1)\n                    [sortWindow.settings[index], sortWindow.settings[index + 1]] =\n                        [sortWindow.settings[index + 1], sortWindow.settings[index]];\n\n                    sortWindow.#buildRules();\n                }\n            });\n\n            currentY += this.BUTTON_HEIGHT;\n        });\n\n        this.buttonsY = currentY;\n\n        this.#buildButtons()\n    }\n\n    #destroyButtons() {\n        if (this.addRuleButton) {\n            this.removeChild(this.addRuleButton);\n            this.addRuleButton = null;\n        }\n        if (this.sortButton) {\n            this.removeChild(this.sortButton);\n            this.sortButton = null;\n        }\n    }\n\n    #buildButtons() {\n\n        this.#destroyButtons();\n\n        const addRuleButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Add rule\",\n            color: Palette.grey,\n            defaultTextColor: Palette.white,\n            y: this.buttonsY,\n            z: -0.2,\n            width: this.PANEL_WIDTH * 0.5,\n            height: this.BUTTON_HEIGHT,\n            textHAlignment: 'MIDDLE',\n            textVAlignment: 'MIDDLE',\n            textExpand: true\n        })\n        const sortButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Sort\",\n            color: Palette.orange,\n            defaultTextColor: Palette.white,\n            x: this.PANEL_WIDTH * 0.5,\n            y: this.buttonsY,\n            z: -0.2,\n            width: this.PANEL_WIDTH * 0.5,\n            height: this.BUTTON_HEIGHT,\n            textHAlignment: 'MIDDLE',\n            textVAlignment: 'MIDDLE',\n            textExpand: true\n            \n        })\n        this.appendChild(sortButton);\n        this.appendChild(addRuleButton);\n\n        this.addRuleButton = addRuleButton;\n        this.sortButton = sortButton;\n        this.mutate({ height: this.buttonsY + this.BUTTON_HEIGHT });\n        this.window.requestLayout();\n\n        const sortWindow = this;\n        sortButton.onInput = ui.Button.onPrimaryRelease(function () {\n\n            const columns = sortWindow.columnNames;\n            if(columns == null || columns.length === 0) {\n                console.error(\"No columns found for sorting.\")\n                return;\n            }\n            sortWindow.#normaliseSettings();\n            const formatedSettings = sortWindow.settings.map(setting => {\n                const columnName = columns[setting[0]];\n                const sortOption = sortWindow.SORT_OPTIONS[setting[1]].toLowerCase();\n\n                return [columnName, sortOption];\n            });\n\n            sortWindow.ownOnSubmit(formatedSettings)\n\n            sortWindow.window.closeFocusContainer()\n        });\n        addRuleButton.onInput = ui.Button.onPrimaryRelease(function () {\n            sortWindow.settings.push([0, 0])\n            sortWindow.#buildRules();\n            sortWindow.#buildButtons();\n        });\n\n    }\n\n    #build() {\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n\n        /*\n            Standard section to build the sort window.\n        */\n        const colLayout = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Column\"\n        })\n        const sortLayout = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Sort by:\"\n        })\n        const columnText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Column\",\n            fontColor: Palette.white,\n            x: this.PANEL_WIDTH * 0.25 - colLayout.width * 0.5, // split the panel in 2 and center the text\n            y: panelY\n        })\n        const sortText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Sort by:\",\n            fontColor: Palette.white,\n            x: (this.PANEL_WIDTH * 0.25 * 3.0) - sortLayout.width * 0.5,\n            y: panelY\n\n        })\n        this.appendChild(sortText);\n        this.appendChild(columnText);\n\n        this.rulesY = panelY + Math.max(colLayout.height, sortLayout.height);\n\n        this.#buildRules();\n\n    }\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as twgl from 'twgl';\nimport * as textutils from './text-utils.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n\nexport class FilterPanel extends Placeholder {\n    PANEL_WIDTH = 550;\n    BUTTON_HEIGHT = 38;\n    PANEL_HEIGHT = this.BUTTON_HEIGHT * 4.0;\n    \n    FILTER_OPTIONS = [\n         \"equal to\",\n         \"greater than\",\n         \"less than\",\n         \"greater or equal to\",\n         \"less or equal to\",\n         \"is not\",\n         \"is null\",\n         \"contains\",\n         \"starts with\",\n         \"ends with\"\n    ]\n\n    constructor(state) {\n        super({ name: 'filter-panel' });\n        if (!state?.font) {\n            throw new Error(\"FilterPanel requires a font in state.\");\n        }\n        if (typeof state.onSubmit !== 'function') {\n            throw new Error('FilterPanel requires state.onSubmit(filterData).');\n        }\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        this.mutate({ height: this.PANEL_HEIGHT });\n\n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n        this.ownOnSubmit = state.onSubmit;\n\n        this.items = []\n        this.conditionButton = null;\n        this.valueButton = null;\n        this.ctxMenu = null;\n        this.inputCell = null\n\n        this.rulesY = 0;\n        this.buttonsY = 0;\n        this.conditionIdx = 0;\n        this.valueIdx = 0;\n        this.columnName = state.columnData?.columnName ?? \"Unknown Column\"\n        this.type = state.columnData?.columnType ?? \"Unknown Type\"\n\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.ctxMenu?.destroy();\n        this.ctxMenu = null;\n        super._onBeforeDetachNode(shared);\n    }\n\n    appendItem(node) {\n        this.appendChild(node);\n        this.items.push(node);\n    }\n\n    #destroy() {\n        for (const item of this.items) {\n            this.removeChild(item);\n        }\n        this.items = []\n\n        if(this.conditionButton){\n            this.removeChild(this.conditionButton);\n            this.conditionButton = null;\n        }\n        if(this.valueButton){\n            this.removeChild(this.valueButton);\n            this.valueButton = null;\n        }\n        if(this.inputCell){\n            this.removeChild(this.inputCell);\n            this.inputCell = null;\n        }\n        if(this.ctxMenu){\n            const target = this.ctxMenu.ownMount ?? this.ctxMenu;\n            target.parentNode.removeChild(target);\n            this.ctxMenu = null;\n        }\n    }\n\n    /*\n        Opting to rebuild this separately\n        because I want to keep the input presistent,\n        not only with the text input but also\n        the IBeam position and input cell \"camera\" position.\n    */\n    #buildConditionButton(buttonsWidth, textsWidth){\n        if (this.conditionButton) {\n            this.removeChild(this.conditionButton);\n            this.conditionButton = null;\n        }\n\n        this.ctxMenu?.destroy();\n        this.ctxMenu = null;\n\n        const filterPanel = this\n        const conditionButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            x: textsWidth,\n            height: this.BUTTON_HEIGHT,\n            width: buttonsWidth,\n            y: this.BUTTON_HEIGHT,\n            z: -0.2,\n            text: this.FILTER_OPTIONS[this.conditionIdx],\n            color: [0.1882, 0.1882, 0.1882, 1.0],\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n            textPadding : 0\n        });\n\n        conditionButton.onInput = ui.Button.onPrimaryRelease(() => {\n            if (this.ctxMenu) return; \n\n            this.ctxMenu = ui.ContextMenu.mount(conditionButton, {\n                font: this.font,\n                fontSize: this.fontSize,\n                ownerWindow: this.window,\n                x: conditionButton.state.width,\n                itemsArray: {\n                    labels: filterPanel.FILTER_OPTIONS,\n                    onInput: (i) => {\n                        filterPanel.conditionIdx = i\n                        filterPanel.#buildConditionButton(buttonsWidth, textsWidth)\n                    }\n                }\n\n            })\n            this.ctxMenu.destroy = () => {\n                if (this.ctxMenu) {\n                    const target = this.ctxMenu.ownMount ?? this.ctxMenu;\n                    target.parentNode.removeChild(target);\n                    this.ctxMenu = null;\n                }\n            }\n        });\n        this.conditionButton = conditionButton\n        this.appendChild(this.conditionButton)\n     \n    }\n\n    #enumValueOptions() {\n        if (this.type === \"List[Bool]\") {\n            return [\"true\", \"false\"];\n        }\n        if (this.type === \"List[oBool]\") {\n            return [\"true\", \"false\", \"null\"];\n        }\n        return null;\n    }\n\n    #buildValueButton(buttonsWidth, textsWidth) {\n        if (this.valueButton) {\n            this.removeChild(this.valueButton);\n            this.valueButton = null;\n        }\n\n        const opts = this.#enumValueOptions();\n        if (!opts) {\n            throw new Error(`FilterPanel enum value button requested for non-enum type='${this.type}'.`);\n        }\n\n        this.ctxMenu?.destroy();\n        this.ctxMenu = null;\n\n        const filterPanel = this;\n        const valueButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            x: textsWidth,\n            y: this.BUTTON_HEIGHT * 2.0,\n            width: buttonsWidth,\n            height: this.BUTTON_HEIGHT,\n            z: -0.2,\n            text: opts[this.valueIdx],\n            color: [0.1882, 0.1882, 0.1882, 1.0],\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n            textPadding: 0\n        });\n\n        valueButton.onInput = ui.Button.onPrimaryRelease(() => {\n            if (this.ctxMenu) {\n                return;\n            }\n\n            this.ctxMenu = ui.ContextMenu.mount(valueButton, {\n                font: this.font,\n                fontSize: this.fontSize,\n                ownerWindow: this.window,\n                x: valueButton.state.width,\n                itemsArray: {\n                    labels: opts,\n                    onInput: (i) => {\n                        filterPanel.valueIdx = i;\n                        filterPanel.#buildValueButton(buttonsWidth, textsWidth);\n                    }\n                }\n            });\n            this.ctxMenu.destroy = () => {\n                if (this.ctxMenu) {\n                    const target = this.ctxMenu.ownMount ?? this.ctxMenu;\n                    target.parentNode.removeChild(target);\n                    this.ctxMenu = null;\n                }\n            }\n        });\n\n        this.valueButton = valueButton;\n        this.appendChild(this.valueButton);\n    }\n\n    #build() {\n        this.#destroy()\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n        const padding = 8;\n\n        //Texts\n        const colText = textutils.formatCellValue(`Column: ${this.columnName} (${this.type})`, this.PANEL_WIDTH, {\n            font: this.font,\n            size: this.fontSize\n        }, 1.0)\n\n        const columnNameText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: colText,\n            x: padding,\n            y: panelY,\n            z: -0.1,\n            fontColor: [1.0, 0.9412, 0.8745, 1.0],\n        })\n\n        const conditionText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Condition:\",\n            x: padding,\n            y: panelY + this.BUTTON_HEIGHT,\n            z: -0.1,\n            fontColor: [1.0, 0.9412, 0.8745, 1.0],\n        })\n\n        const valueText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Value:\",\n            x: padding,\n            y: panelY + this.BUTTON_HEIGHT * 2.0,\n            z: -0.1,\n            fontColor: [1.0, 0.9412, 0.8745, 1.0],\n        })\n\n        this.appendItem(valueText);\n        this.appendItem(conditionText);\n        this.appendItem(columnNameText);\n\n        const textsWidth = conditionText.width() + padding * 2.0\n\n        //Buttons\n        const buttonsWidth = this.PANEL_WIDTH - textsWidth;\n        this.#buildConditionButton(buttonsWidth, textsWidth)\n        const enumValueOptions = this.#enumValueOptions();\n        if (enumValueOptions) {\n            this.#buildValueButton(buttonsWidth, textsWidth);\n        } else {\n            const inputCell = new ui.InputCell({\n                font: this.font,\n                fontSize: this.fontSize,\n                x: textsWidth,\n                width: buttonsWidth,\n                height: this.BUTTON_HEIGHT,\n                y: panelY + this.BUTTON_HEIGHT * 2.0,\n                z: -0.2,\n                focusContainerOwner: this.window,\n                material: ui.materials.beveled({ bevelType: 'inner' }),\n\n            })\n            this.appendChild(inputCell);\n            this.inputCell = inputCell\n        }\n\n        const submit = () => {\n            const filterData = {\n                column: this.columnName,\n                condition: this.FILTER_OPTIONS[this.conditionIdx],\n                value: enumValueOptions\n                    ? enumValueOptions[this.valueIdx]\n                    : this.inputCell?.textInput,\n                type: this.type,\n            };\n\n            this.ownOnSubmit(filterData);\n            this.window.closeFocusContainer();\n        };\n\n        //Filter Button\n        const buttonY = panelY + this.BUTTON_HEIGHT * 2.0;\n        const filterButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            width: 100,\n            height: this.BUTTON_HEIGHT,\n            y: buttonY + this.BUTTON_HEIGHT,\n            x: this.PANEL_WIDTH * 0.5 - 50,\n            z: -0.2,\n            text: \"Filter\",\n            textHAlignment: 'MIDDLE',\n            textVAlignment: 'MIDDLE',\n            textExpand: true,\n            color: Palette.orange\n        })\n        \n        filterButton.onInput = ui.Button.onPrimaryRelease(submit);\n        if (this.inputCell) {\n            this.inputCell.onEnterKey = submit;\n            this.window.registerInputField('value', this.inputCell);\n        }\n\n        this.appendItem(filterButton);\n\n    }\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as textutils from './text-utils.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n\nexport class FillPanel extends Placeholder {\n    PANEL_WIDTH = 400;\n    BUTTON_HEIGHT = 38;\n    PANEL_HEIGHT = this.BUTTON_HEIGHT * 3.0;\n\n    constructor(state) {\n        super({ name: 'fill-panel' });\n        if (!state?.font) {\n            throw new Error(\"FillPanel requires a font in state.\");\n        }\n        if (typeof state.onSubmit !== 'function') {\n            throw new Error('FillPanel requires state.onSubmit(fillData).');\n        }\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        this.mutate({ height: this.PANEL_HEIGHT });\n\n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n        this.ownOnSubmit = state.onSubmit;\n\n        this.items = []\n        this.ctxMenu = null;\n        this.inputCell = null\n\n        this.rulesY = 0;\n        this.buttonsY = 0;\n        this.conditionIdx = 0;\n        this.columnName = state.columnData?.columnName ?? \"Unknown Column\"\n        this.type = state.columnData?.columnType ?? \"Unknown Type\"\n\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    appendItem(node) {\n        this.appendChild(node);\n        this.items.push(node);\n    }\n\n    #destroy() {\n        for (const item of this.items) {\n            this.removeChild(item);\n        }\n        this.items = []\n\n        if(this.inputCell){\n            this.removeChild(this.inputCell);\n            this.inputCell = null;\n        }\n        if(this.ctxMenu){\n            const target = this.ctxMenu.ownMount ?? this.ctxMenu;\n            target.parentNode.removeChild(target);\n            this.ctxMenu = null;\n        }\n    }\n\n    #build() {\n        this.#destroy()\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n        const padding = 8;\n\n        //Texts\n        const colText = textutils.formatCellValue(`Fill:[${this.columnName}]`, this.PANEL_WIDTH, {\n            font: this.font,\n            size: this.fontSize\n        }, 1.0)\n\n        const columnNameText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: colText,\n            x: padding,\n            y: panelY,\n            z: -0.1,\n            fontColor: [1.0, 0.9412, 0.8745, 1.0],\n        })\n\n        const valueText = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Value:\",\n            x: padding,\n            y: panelY + this.BUTTON_HEIGHT,\n            z: -0.1,\n            fontColor: [1.0, 0.9412, 0.8745, 1.0],\n        })\n\n        this.appendItem(valueText);\n        this.appendItem(columnNameText);\n\n        const textsWidth = valueText.width() + padding * 2.0\n\n        //Buttons\n        const buttonsWidth = this.PANEL_WIDTH - textsWidth;\n\n        const inputCell = new ui.InputCell({\n            font: this.font,\n            fontSize: this.fontSize,\n            x: textsWidth,\n            width: buttonsWidth,\n            height: this.BUTTON_HEIGHT,\n            y: panelY + this.BUTTON_HEIGHT,\n            z: -0.2,\n            focusContainerOwner: this.window,\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n\n        })\n        this.appendChild(inputCell);\n        this.inputCell = inputCell\n\n        const submit = () => {\n            const fillData = {\n                column: this.columnName,\n                value: this.inputCell?.textInput,\n                type: this.type,\n            };\n\n            this.ownOnSubmit(fillData);\n            this.window.closeFocusContainer();\n        };\n\n        //Fill Button\n        const buttonY = panelY + this.BUTTON_HEIGHT;\n        const fillButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            width: 100,\n            height: this.BUTTON_HEIGHT,\n            y: buttonY + this.BUTTON_HEIGHT,\n            x: this.PANEL_WIDTH * 0.5 - 50,\n            z: -0.2,\n            text: \"Fill\",\n            color: Palette.orange,\n            textHAlignment: 'MIDDLE',\n            textVAlignment: 'MIDDLE',\n            textExpand: true\n        })\n        \n        fillButton.onInput = ui.Button.onPrimaryRelease(submit);\n        inputCell.onEnterKey = submit;\n        this.window.registerInputField('value', inputCell);\n\n        this.appendItem(fillButton);\n\n    }\n\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { formatCellValue } from './text-utils.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nconst PANEL_WIDTH = 410;\nconst PANEL_HEIGHT = 368;\nconst SECTION_HEIGHT = PANEL_HEIGHT / 2;\nconst PANEL_PADDING = 10;\nconst HEADING_HEIGHT = 18;\nconst HEADING_GAP = 6;\nconst HEADING_FONT_SIZE = 15;\nconst ENTRY_FONT_SIZE = 12;\nconst SCROLL_PADDING = 8;\nconst ENTRY_PADDING = 4;\n\n/* Show the selected column's source and artifact strings in separate scroll areas. */\nexport class DataLineagePanel extends Placeholder {\n    constructor(state) {\n        super({ name: 'data-lineage-panel', width: PANEL_WIDTH, height: PANEL_HEIGHT });\n        this.font = state.font;\n        this.columnData = state.columnData;\n    }\n\n    build(_window) {\n        this.content = new ui.Placeholder({\n            name: 'data-lineage-panel',\n            width: PANEL_WIDTH,\n            height: PANEL_HEIGHT,\n        });\n        this.appendChild(this.content);\n        this.#buildSection('Sources', this.columnData?.sources ?? [], 0);\n        this.#buildSection('Artifacts', this.columnData?.artifacts ?? [], SECTION_HEIGHT);\n    }\n\n    #buildSection(title, entries, y) {\n        const section = new ui.Placeholder({\n            name: `data-lineage-${title.toLowerCase()}`,\n            width: PANEL_WIDTH,\n            height: SECTION_HEIGHT,\n            y,\n        });\n        section.appendChild(new evilfont.MSDFText({\n            text: title,\n            font: this.font,\n            fontSize: HEADING_FONT_SIZE,\n            fontColor: Palette.white,\n            x: PANEL_PADDING,\n            y: PANEL_PADDING,\n            z: -0.1,\n        }));\n\n        const scrollY = PANEL_PADDING + HEADING_HEIGHT + HEADING_GAP;\n        const scroll = new ui.ScrollBox({\n            name: `data-lineage-${title.toLowerCase()}-scroll`,\n            width: PANEL_WIDTH - PANEL_PADDING * 2,\n            height: SECTION_HEIGHT - scrollY - PANEL_PADDING,\n            x: PANEL_PADDING,\n            y: scrollY,\n            z: -0.2,\n            mouseSpace: 'view',\n            color: Palette.charcoal,\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n            layout: 'vertical',\n            padding: SCROLL_PADDING,\n            spacing: 0,\n        });\n        section.appendChild(scroll);\n        this.content.appendChild(section);\n\n        const rowWidth = scroll.contentWidth - scroll.thumbWidth;\n        const textWidth = rowWidth - ENTRY_PADDING * 2;\n        for (const [index, entry] of entries.entries()) {\n            const prefix = `${index} - `;\n            const { width: prefixWidth } = evilfont.MSDFText.measureFromState({\n                text: prefix,\n                font: this.font,\n                fontSize: ENTRY_FONT_SIZE,\n            });\n            const text = prefix + formatCellValue(entry, textWidth - prefixWidth, {\n                font: this.font,\n                fontSize: ENTRY_FONT_SIZE,\n                maxCellHeight: Infinity,\n            });\n            const textState = {\n                text,\n                font: this.font,\n                fontSize: ENTRY_FONT_SIZE,\n            };\n            const { height } = evilfont.MSDFText.measureFromState(textState);\n            const row = new ui.Placeholder({\n                width: rowWidth,\n                height: height + ENTRY_PADDING * 2,\n            });\n            if (index % 2 === 1) {\n                row.appendChild(new ui.Tile({\n                    width: rowWidth,\n                    height: row.state.height,\n                    color: Palette.granite,\n                    z: 0,\n                }));\n            }\n            row.appendChild(new evilfont.MSDFText({\n                ...textState,\n                fontColor: Palette.white,\n                width: textWidth,\n                height,\n                x: ENTRY_PADDING,\n                y: ENTRY_PADDING,\n                z: -0.1,\n            }));\n            scroll.appendChild(row);\n        }\n        scroll.syncContentLayout();\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as textutils from './text-utils.mjs';\n\nconst PANEL_WIDTH = 410;\nconst MAX_BODY_HEIGHT = 318;\nconst PANEL_PADDING = 12;\nconst SCROLL_THUMB_WIDTH = 20;\nconst CONTENT_WIDTH = PANEL_WIDTH - PANEL_PADDING * 2 - SCROLL_THUMB_WIDTH;\nconst SEPARATOR_PADDING = 25;\nconst ENTRY_PADDING = 8;\nconst ENTRY_LABEL_WIDTH = 80;\nconst ACTION_BUTTON_SIZE = 24;\nconst VALUE_MAX_LINES = 3;\nconst ENTRY_LABEL_FONT_SIZE = 15;\nconst ENTRY_LABEL_X = -6;\nconst TEXT_COLOR = [1.0, 0.9411, 0.8745, 1.0];\nconst SEPARATOR_COLOR = [0.3647, 0.3647, 0.3647, 1.0];\n\nfunction lineHeight(font, fontSize) {\n    const configured = font?.fontData?.lineHeight;\n    return Number.isFinite(configured) && configured > 0\n        ? configured * fontSize\n        : fontSize * 1.325;\n}\n\n/* Preserve the three-line layout while making omitted column-name content explicit. */\nfunction formatColumnName(font, fontSize, columnName, width) {\n    const style = {\n        font,\n        fontSize,\n        maxCellHeight: lineHeight(font, fontSize) * VALUE_MAX_LINES,\n    };\n    const formatted = textutils.formatCellValueLayout(columnName, width, style, VALUE_MAX_LINES);\n    if (!formatted.clipped) {\n        return formatted.text;\n    }\n\n    const lines = formatted.text.split('\\n');\n    let lastLine = lines.pop() ?? '';\n    const ellipsis = '...';\n    const fits = (text) => evilfont.MSDFText.measureFromState({ font, fontSize, text }).width <= width;\n    while (lastLine.length > 0 && !fits(`${lastLine}${ellipsis}`)) {\n        lastLine = lastLine.slice(0, -1);\n    }\n    lines.push(`${lastLine.trimEnd()}${ellipsis}`);\n    return lines.join('\\n');\n}\n\n/* Display column metadata as vertically stacked entries. */\nexport class ColumnsMetadataPanel extends Placeholder {\n    constructor(state) {\n        super({ name: 'columns-metadata-panel' });\n        if (!state?.font) {\n            throw new Error('ColumnsMetadataPanel requires a font.');\n        }\n\n        this.font = state.font;\n        this.fontSize = state.fontSize;\n        this.columnName = state.columnData?.columnName ?? '[none]';\n        this.columnDescription = state.columnData?.columnDescription ?? '[none]';\n        this.columnType = state.columnData?.columnType ?? '[none]';\n        this.columnUnits = state.columnData?.columnUnits ?? '[none]';\n        this.columnNullable = state.columnData?.columnNullable ?? '[none]';\n        this.columnSorted = state.columnData?.columnSorted ?? '[none]';\n        this.columnUnique = state.columnData?.columnUnique ?? '[none]';\n        this.columnBasis = state.columnData?.columnBasis ?? '[none]';\n        this.columnPII = state.columnData?.columnPII ?? '[none]';\n    }\n\n    build(_window) {\n        this.#build();\n    }\n\n    async #copyColumnName(copyColumnNameButton) {\n        try {\n            await navigator.clipboard.writeText(this.columnName);\n            copyColumnNameButton.toastText = 'Column name copied.';\n        } catch (err) {\n            console.error('Could not copy column name', err);\n            copyColumnNameButton.toastText = 'Could not copy column name.';\n        }\n        copyColumnNameButton.displayToast();\n    }\n\n    async #copyColumnDescription(copyColumnDescriptionButton) {\n        try {\n            await navigator.clipboard.writeText(this.columnDescription);\n            copyColumnDescriptionButton.toastText = 'Column description copied.';\n        } catch (err) {\n            console.error('Could not copy column description', err);\n            copyColumnDescriptionButton.toastText = 'Could not copy column description.';\n        }\n        copyColumnDescriptionButton.displayToast();\n    }\n\n    #buildNameEntry() {\n        const labelText = 'name:';\n        const valueFontSize = Math.max(12, this.fontSize - 4);\n        const valueLineHeight = lineHeight(this.font, valueFontSize);\n        const entryHeight = Math.max(36, valueLineHeight * VALUE_MAX_LINES + ENTRY_PADDING * 2);\n        const entry = new ui.Placeholder({\n            width: CONTENT_WIDTH,\n            height: entryHeight,\n        });\n        const labelWidth = ENTRY_LABEL_WIDTH;\n        const valueWidth = entry.state.width - labelWidth - ACTION_BUTTON_SIZE - ENTRY_PADDING * 2;\n        const formattedColumnName = formatColumnName(this.font, valueFontSize, this.columnName, valueWidth);\n        const valueLineCount = Math.max(1, formattedColumnName.split('\\n').length);\n        const valueHeight = valueLineHeight * valueLineCount;\n        const label = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: ENTRY_LABEL_FONT_SIZE,\n            text: labelText,\n            x: ENTRY_LABEL_X,\n            y: (entryHeight - ENTRY_LABEL_FONT_SIZE) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        const value = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: valueFontSize,\n            text: formattedColumnName,\n            width: valueWidth,\n            height: valueLineHeight * VALUE_MAX_LINES,\n            x: labelWidth,\n            y: (entryHeight - valueHeight) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        const copyColumnNameButton = new ui.Button({\n            width: 20,\n            height: entryHeight - 6,\n            x: entry.state.width - 20,\n            y: 0,\n            z: -0.1,\n            color: [0.1882, 0.1882, 0.1882, 1.0],\n            tooltipText: 'Copy column name',\n            toastEnabled: true,\n        });\n        const copyColumnNameIcon = new ui.Icon({\n            width: 18,\n            height: 18,\n            x: (copyColumnNameButton.state.width - 18) * 0.5,\n            y: (copyColumnNameButton.state.height - 18) * 0.5,\n            z: -0.2,\n            color: TEXT_COLOR,\n            iconID: 19,\n        });\n        copyColumnNameButton.onInput = ui.Button.onPrimaryRelease(() => {\n            void this.#copyColumnName(copyColumnNameButton);\n        });\n        copyColumnNameButton.appendChild(copyColumnNameIcon);\n        entry.appendChild(label);\n        entry.appendChild(value);\n        entry.appendChild(copyColumnNameButton);\n        entry.appendChild(new ui.Tile({\n            tileBatch: 'context_menu.separator',\n            x: SEPARATOR_PADDING * 0.5,\n            y: entryHeight - 0.5,\n            width: entry.state.width - SEPARATOR_PADDING,\n            height: 0.5,\n            z: -0.2,\n            color: SEPARATOR_COLOR,\n        }));\n        return { entry, height: entryHeight };\n    }\n\n    #buildDescriptionEntry() {\n        const labelText = 'description:';\n        const valueFontSize = Math.max(12, this.fontSize - 6);\n        const valueLineHeight = lineHeight(this.font, valueFontSize);\n        const entryHeight = Math.max(36, valueLineHeight * VALUE_MAX_LINES + ENTRY_PADDING * 2);\n        const entry = new ui.Placeholder({\n            width: CONTENT_WIDTH,\n            height: entryHeight,\n        });\n        const labelWidth = ENTRY_LABEL_WIDTH;\n        const valueWidth = entry.state.width - labelWidth - ACTION_BUTTON_SIZE - ENTRY_PADDING * 2;\n        const formattedDescription = formatColumnName(this.font, valueFontSize, this.columnDescription, valueWidth);\n        const valueLineCount = Math.max(1, formattedDescription.split('\\n').length);\n        const valueHeight = valueLineHeight * valueLineCount;\n        const label = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: ENTRY_LABEL_FONT_SIZE,\n            text: labelText,\n            x: ENTRY_LABEL_X,\n            y: (entryHeight - ENTRY_LABEL_FONT_SIZE) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        const value = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: valueFontSize,\n            text: formattedDescription,\n            width: valueWidth,\n            height: valueLineHeight * VALUE_MAX_LINES,\n            x: labelWidth,\n            y: (entryHeight - valueHeight) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        const copyColumnDescriptionButton = new ui.Button({\n            width: 20,\n            height: entryHeight - 6,\n            x: entry.state.width - 20,\n            y: 0,\n            z: -0.1,\n            color: [0.1882, 0.1882, 0.1882, 1.0],\n            tooltipText: 'Copy column description',\n            toastEnabled: true,\n        });\n        const copyColumnDescriptionIcon = new ui.Icon({\n            width: 18,\n            height: 18,\n            x: (copyColumnDescriptionButton.state.width - 18) * 0.5,\n            y: (copyColumnDescriptionButton.state.height - 18) * 0.5,\n            z: -0.2,\n            color: TEXT_COLOR,\n            iconID: 19,\n        });\n        copyColumnDescriptionButton.onInput = ui.Button.onPrimaryRelease(() => {\n            void this.#copyColumnDescription(copyColumnDescriptionButton);\n        });\n        copyColumnDescriptionButton.appendChild(copyColumnDescriptionIcon);\n        entry.appendChild(label);\n        entry.appendChild(value);\n        entry.appendChild(copyColumnDescriptionButton);\n        entry.appendChild(new ui.Tile({\n            tileBatch: 'context_menu.separator',\n            x: SEPARATOR_PADDING * 0.5,\n            y: entryHeight - 0.5,\n            width: entry.state.width - SEPARATOR_PADDING,\n            height: 0.5,\n            z: -0.2,\n            color: SEPARATOR_COLOR,\n        }));\n        return { entry, height: entryHeight };\n    }\n\n    #buildMetadataValueEntry({ labelText, valueText }) {\n        const valueFontSize = Math.max(12, this.fontSize - 6);\n        const valueLineHeight = lineHeight(this.font, valueFontSize);\n        const entryHeight = Math.max(36, valueLineHeight * VALUE_MAX_LINES + ENTRY_PADDING * 2);\n        const entry = new ui.Placeholder({\n            width: CONTENT_WIDTH,\n            height: entryHeight,\n        });\n        const labelWidth = ENTRY_LABEL_WIDTH;\n        const valueWidth = entry.state.width - labelWidth - ENTRY_PADDING;\n        const formattedValue = formatColumnName(this.font, valueFontSize, valueText, valueWidth);\n        const valueLineCount = Math.max(1, formattedValue.split('\\n').length);\n        const valueHeight = valueLineHeight * valueLineCount;\n        const label = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: ENTRY_LABEL_FONT_SIZE,\n            text: labelText,\n            x: ENTRY_LABEL_X,\n            y: (entryHeight - ENTRY_LABEL_FONT_SIZE) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        const value = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: valueFontSize,\n            text: formattedValue,\n            width: valueWidth,\n            height: valueLineHeight * VALUE_MAX_LINES,\n            x: labelWidth,\n            y: (entryHeight - valueHeight) * 0.5,\n            z: -0.1,\n            fontColor: TEXT_COLOR,\n        });\n        entry.appendChild(label);\n        entry.appendChild(value);\n        entry.appendChild(new ui.Tile({\n            tileBatch: 'context_menu.separator',\n            x: SEPARATOR_PADDING * 0.5,\n            y: entryHeight - 0.5,\n            width: entry.state.width - SEPARATOR_PADDING,\n            height: 0.5,\n            z: -0.2,\n            color: SEPARATOR_COLOR,\n        }));\n        return { entry, height: entryHeight };\n    }\n\n    #buildTypeEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'type:',\n            valueText: this.columnType,\n        });\n    }\n\n    #buildUnitsEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'units:',\n            valueText: this.columnUnits,\n        });\n    }\n\n    #buildNullableEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'nullable:',\n            valueText: this.columnNullable,\n        });\n    }\n\n    #buildSortedEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'sorted:',\n            valueText: this.columnSorted,\n        });\n    }\n\n    #buildUniqueEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'unique:',\n            valueText: this.columnUnique,\n        });\n    }\n\n    #buildBasisEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'basis:',\n            valueText: this.columnBasis,\n        });\n    }\n\n    #buildPIIEntry() {\n        return this.#buildMetadataValueEntry({\n            labelText: 'pii:',\n            valueText: this.columnPII,\n        });\n    }\n\n    #build() {\n        const nameEntry = this.#buildNameEntry();\n        const descriptionEntry = this.#buildDescriptionEntry();\n        const typeEntry = this.#buildTypeEntry();\n        const unitsEntry = this.#buildUnitsEntry();\n        const nullableEntry = this.#buildNullableEntry();\n        const sortedEntry = this.#buildSortedEntry();\n        const uniqueEntry = this.#buildUniqueEntry();\n        const basisEntry = this.#buildBasisEntry();\n        const piiEntry = this.#buildPIIEntry();\n        const contentHeight = nameEntry.height + descriptionEntry.height + typeEntry.height + unitsEntry.height\n            + nullableEntry.height + sortedEntry.height + uniqueEntry.height + basisEntry.height + piiEntry.height;\n        const bodyHeight = Math.min(\n            MAX_BODY_HEIGHT,\n            contentHeight + PANEL_PADDING * 2,\n        );\n        const content = new ui.VBoxContainer({\n            width: CONTENT_WIDTH,\n            height: contentHeight,\n            x: PANEL_PADDING,\n            y: PANEL_PADDING,\n        });\n        content.appendChild(nameEntry.entry);\n        content.appendChild(descriptionEntry.entry);\n        content.appendChild(typeEntry.entry);\n        content.appendChild(unitsEntry.entry);\n        content.appendChild(nullableEntry.entry);\n        content.appendChild(sortedEntry.entry);\n        content.appendChild(uniqueEntry.entry);\n        content.appendChild(basisEntry.entry);\n        content.appendChild(piiEntry.entry);\n\n        const scroll = new ui.ScrollBox({\n            width: PANEL_WIDTH,\n            height: bodyHeight,\n            x: 0,\n            y: 0,\n            z: -0.2,\n            mouseSpace: 'view',\n            layout: 'vertical',\n            crossAlign: 'center',\n        });\n        scroll.appendChild(content);\n        scroll.syncContentLayout();\n\n        this.mutate({ width: PANEL_WIDTH });\n        this.mutate({ height: bodyHeight });\n        this.appendChild(scroll);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const PORTAL_MIN_BUILD = typeof __PORTAL_MIN_BUILD__ !== 'undefined'\n    ? __PORTAL_MIN_BUILD__\n    : false;\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { PORTAL_MIN_BUILD } from '../build-flags.mjs';\nimport { TEXTURES_URL } from '../config.mjs';\nimport {\n    contextImageTextureState,\n    ensureContextImageTexture,\n    peekContextImageTexture,\n} from './context-image-texture.mjs';\nimport { deleteBufferInfo, drawArraysInstancedChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { noteProgramReady, warnProgramPending } from './gl-program-wait.mjs';\nimport { tileDrawUniformState } from './tile.mjs';\n\n\nconst ATLAS_SIZE = Object.freeze([1024, 1024]);\nconst ICON_SIZE = 64;\nconst ICON_RENDER_SCALE = 0.85;\nconst ICON_ATLAS_VERSION = typeof document === \"undefined\"\n    ? null\n    : document.querySelector(\"meta[name=app-version]\")?.content ?? null;\nconst ICON_ATLAS_CACHE_KEY = ICON_ATLAS_VERSION === null\n    ? `${TEXTURES_URL}iconsAtlasMSDF.png`\n    : `${TEXTURES_URL}iconsAtlasMSDF.png?v=${encodeURIComponent(ICON_ATLAS_VERSION)}`;\nconst ICON_UV_SIZE = Object.freeze([ICON_SIZE / ATLAS_SIZE[0], ICON_SIZE / ATLAS_SIZE[1]]);\nconst ICON_TEXEL_SIZE = Object.freeze([1 / ATLAS_SIZE[0], 1 / ATLAS_SIZE[1]]);\nconst ICON_MSDF_SPREAD = 4.0;  // Matches MSDF generator pixel range\nconst ICON_MSDF_GAMMA = 1.0;   // Linear gamma correction, adjust if atlas baked differently\nconst ICON_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\n/* Keep one rate-limited atlas wait state per shared icon batch so startup logs stay readable. */\nfunction warnIconAtlasPending(shared, details = '') {\n    const now = performance.now();\n    const wait = shared.atlasWait || (shared.atlasWait = { at: now, level: 0 });\n    if (wait.level === 0) {\n        wait.level = 1;\n        console.warn(`Icon atlas is still loading${details}. Falling back to the error texture until it arrives.`);\n        return;\n    }\n    if (wait.level === 1 && now - wait.at >= 5_000) {\n        wait.level = 2;\n        console.warn(`Icon atlas is still missing after 5s${details}. This is no longer normal startup delay; check image fetch/decode latency.`);\n    }\n}\n\n/* Close one pending atlas warning once the real texture becomes available. */\nfunction noteIconAtlasReady(shared) {\n    const wait = shared.atlasWait;\n    if (!wait || wait.level === 0 || wait.closed) {\n        return;\n    }\n    wait.closed = true;\n    if (performance.now() - wait.at >= 5_000) {\n        console.warn('Icon atlas loaded after startup delay.');\n    }\n}\n\n/* Hint the browser to fetch the shared icon atlas opportunistically; live startup does not always consume it quickly enough for preload. */\nexport function preloadIconAtlasHint() {\n    if (typeof document === 'undefined') {\n        return;\n    }\n    const href = ICON_ATLAS_CACHE_KEY;\n    const selector = `link[rel=\"prefetch\"][href=\"${href}\"]`;\n    if (document.head?.querySelector?.(selector)) {\n        return;\n    }\n    const link = document.createElement('link');\n    link.rel = 'prefetch';\n    link.href = href;\n    link.crossOrigin = 'anonymous';\n    link.fetchPriority = 'low';\n    document.head?.appendChild(link);\n}\n\n/* Start the shared icon atlas fetch as soon as a GL context exists so icons do not wait for first draw. */\nexport function warmIconAtlas(gl) {\n    ensureContextImageTexture(gl, ICON_ATLAS_CACHE_KEY, {\n        url: ICON_ATLAS_CACHE_KEY,\n        origin: 'evilui.icon_atlas',\n        makeOwnGlTexture: (_gl, img) => twgl.createTexture(gl, {\n            src: img,\n            premultiplyAlpha: false,\n            format: gl.RGBA,\n            min: gl.LINEAR_MIPMAP_LINEAR,\n            mag: gl.LINEAR,\n            wrap: gl.CLAMP_TO_EDGE,\n        }),\n    });\n}\n\nfunction presentedIconNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes;\n    }\n    return shared.nodes.filter(node => scene._isPresentedNode(node));\n}\n\nfunction dropOwnGlTexture(gl, tex) {\n    if (!gl || !tex) {\n        return;\n    }\n    gl.deleteTexture(tex);\n}\n\n/* Shrink the icon quad uniformly so atlas artwork keeps a small visual margin inside the tile backing. */\nfunction scaledIconMesh(positionData) {\n    if (!(positionData instanceof Float32Array)) {\n        throw new Error('scaledIconMesh(positionData): expected a Float32Array mesh.');\n    }\n    const scaled = new Float32Array(positionData.length);\n    for (let i = 0; i < positionData.length; i += 3) {\n        scaled[i] = positionData[i] * ICON_RENDER_SCALE;\n        scaled[i + 1] = positionData[i + 1] * ICON_RENDER_SCALE;\n        scaled[i + 2] = positionData[i + 2];\n    }\n    return scaled;\n}\n\nexport class Icon extends ui.Tile {\n    constructor(state) {\n        super(state);\n\n        this.iconOffset = getIconOffsetfromID(state.iconID ?? -1);\n    }\n\n    setIconID(newID){\n        this.mutate({ iconID: newID });\n    }\n\n    /* Store spinner timing once in the instance stream; the vertex shader resolves rotation from u_time. */\n    setGpuSpin(periodS = null) {\n        const active = Number.isFinite(periodS) && periodS > 0;\n        const nextPeriod = active ? periodS : 0;\n        const nextStart = active ? (this.scene?.stage?.frameNowS ?? 0) : 0;\n        if (this.state.gpu_spin_period_s === nextPeriod\n            && (!active || Number.isFinite(this.state.gpu_spin_start_s))) {\n            return;\n        }\n        this.mutate({\n            gpu_spin_start_s: nextStart,\n            gpu_spin_period_s: nextPeriod,\n        });\n    }\n\n    mutate(newState) {\n        if (Object.hasOwn(newState, 'iconID')) {\n            this.iconOffset = getIconOffsetfromID(newState.iconID ?? -1);\n        }\n        super.mutate(newState);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.icon');\n        shared.ownGlIconAtlas = peekContextImageTexture(gl, ICON_ATLAS_CACHE_KEY);\n        shared.ownGlBufferInfo = null;\n        shared.ownGlErrorTextureSize = [2, 2];\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        shared.progWait = null;\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vshaderName = 'lib/evilui/tile-anchor';\n            const fshaderName = 'lib/evilui/icon-msdf';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.icon', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(vshaderName + '.vs.glsl', fshaderName + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                const name = shared.nodes?.[0]?.state?.name ?? shared.resourceKey ?? 'Icon';\n                console.warn(`Shader ${fshaderName} not found. Icon ${name} will not render.`);\n            }\n            shared.ownGlErrorTexture = twgl.createTexture(gl, {\n                src: new Uint8Array([\n                    255, 0, 255, 255,\n                    0, 0, 0, 255,\n                    0, 0, 0, 255,\n                    255, 0, 255, 255\n                ]),\n                width: 2,\n                height: 2,\n                min: gl.NEAREST,\n                mag: gl.NEAREST,\n                wrap: gl.REPEAT\n            });\n        })();  // fire-and-forget\n\n        warmIconAtlas(gl);\n        shared.ownGlIconAtlas = peekContextImageTexture(gl, ICON_ATLAS_CACHE_KEY);\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        super._onReleaseContext(gl, shared)\n        dropOwnGlTexture(gl, shared.ownGlErrorTexture);\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        shared.ownGlIconAtlas = null;\n        shared.ownGlErrorTexture = null;\n        shared.ownGlProgram = null;\n        shared.ownGlErrorTextureSize = null;\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null){\n        return;\n    }\n\n    /* Keep icons in the transparent pass because the MSDF atlas uses alpha composition rather than tile-style opaque coverage. */\n    static _batchPassForNode(_node) {\n        return 'transparent';\n    }\n\n    /* Shared icon resources stay owned by the transparent pass even when no node instance is available. */\n    static _batchPassForShared(_shared) {\n        return 'transparent';\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = ui.RENDER_STATUS.LOADING\n        const nodes = presentedIconNodes(shared);\n        if (nodes.length === 0) {\n            status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n        if (!shared.ownGlProgram) {\n            const n = nodes.length;\n            warnProgramPending(shared, 'Icon batch', ` (nodes=${n})`);\n            return;\n        }\n        noteProgramReady(shared, 'Icon batch');\n\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, ICON_BUFFER_KINDS)) {\n            shared.ownGlBufferInfo = batchIconBufferInfo(gl, shared, nodes);\n            clearNonPickerResourceDirty(shared);\n        }\n\n        if (!shared.ownGlBufferInfo) {\n            status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n        /*\n            To bake the mesh with the node offsets, we need the GL, we can't use the \n            have a baked bufferInfo to be recycled on gl loss, this means gl loss is not\n            something we need to worry about for this case.\n            The only 2 objects that we can save in bettwen gl loss is:\n            - Shader\n            - mesh\n\n            Program can be kept in bettwen calls but not bufferinfo\n        */\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        const drawState = tileDrawUniformState(shared, `Icon(${shared.resourceKey})`, nodes);\n        const ownGlIconAtlas = peekContextImageTexture(gl, ICON_ATLAS_CACHE_KEY) ?? shared.ownGlIconAtlas;\n        shared.ownGlIconAtlas = ownGlIconAtlas;\n        if (ownGlIconAtlas) {\n            noteIconAtlasReady(shared);\n        }\n\n        const activeTexture = ownGlIconAtlas || shared.ownGlErrorTexture;\n        const atlasSize = ownGlIconAtlas ? ATLAS_SIZE : (shared.ownGlErrorTextureSize ?? [2, 2]);\n        const iconSpread = ownGlIconAtlas ? ICON_MSDF_SPREAD : 0.0;\n        const iconGamma = ownGlIconAtlas ? ICON_MSDF_GAMMA : 1.0;\n\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            u_texture: activeTexture,\n            u_textureSize: atlasSize,\n            u_iconFrame: [ICON_SIZE, ICON_SIZE],\n            u_iconSpread: iconSpread,\n            u_iconGamma: iconGamma,\n            u_iconUVSize: ICON_UV_SIZE,\n            u_iconTexel: ICON_TEXEL_SIZE,\n            ...drawState,\n        });\n        if (!ownGlIconAtlas && contextImageTextureState(gl, ICON_ATLAS_CACHE_KEY) !== 'loading') {\n            console.error(`Failed to load icon atlas from ${ICON_ATLAS_CACHE_KEY}.`);\n        }\n        if (!ownGlIconAtlas && !PORTAL_MIN_BUILD) {\n            warnIconAtlasPending(shared, ` (nodes=${nodes.length})`);\n        }\n\n        drawArraysInstancedChecked(gl, `Icon(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n        status.response = ui.RENDER_STATUS.READY;\n    }\n}\n\n\nexport function batchIconBufferInfo(gl, shared, nodes = presentedIconNodes(shared)) {\n    const positionData = nodes[0]?.getMesh?.() ?? null;\n    return ui.syncTileBufferInfo(gl, shared, {\n        nodes,\n        positionData: positionData ? scaledIconMesh(positionData) : null,\n        baseuvsData: nodes[0]?.getUvs?.() ?? null,\n        texoffsetOfNode: node => [node.iconOffset[0] / ATLAS_SIZE[0], node.iconOffset[1] / ATLAS_SIZE[1]],\n    });\n}\n\nexport function getIconOffsetfromID(id) {\n\n\n    const columns = ATLAS_SIZE[0] / ICON_SIZE;\n    const rows = ATLAS_SIZE[1] / ICON_SIZE;\n    let iconID = id;\n\n    // Mark as not using texture, avoids artifacts on white tile\n    if (iconID < 0) {\n        return [-1, -1];\n    }\n    const maxIcons = columns * rows;\n    if (maxIcons) {\n        iconID %= maxIcons;\n    }\n\n    const x = (iconID % columns) * ICON_SIZE;\n    const y = Math.floor(iconID / columns) * ICON_SIZE;\n\n    return [x, y];\n\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { Button } from './button.mjs';\nimport { Icon } from './icon.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nexport function makeFullscreenChromeIconButton({ iconID, onInput }) {\n    const button = new Button({\n        width: 50,\n        height: 50,\n        z: -0.2,\n        y: -100,\n        color: Palette.orange,\n        onHoverColor: Palette.teal,\n    });\n    const iconMount = new Placeholder();\n    button.appendChild(iconMount);\n    iconMount.appendChild(new Icon({\n        width: button.state.width,\n        height: button.state.height,\n        z: -0.01,\n        color: [1, 1, 1, 1],\n        iconID,\n    }));\n    button.onInput = Button.onPrimaryRelease(onInput);\n    return button;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo, drawArraysChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\n\nconst UNIFORM_ZEBRA_STRIPES_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\nconst UNIFORM_ZEBRA_STRIPES_QUAD = new Float32Array([\n    -1, -1, 0,\n    +1, -1, 0,\n    -1, +1, 0,\n    +1, -1, 0,\n    +1, +1, 0,\n    -1, +1, 0,\n]);\n\n/* Keep zebra batches scoped to the currently presented subtree only. */\nfunction presentedZebraNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes;\n    }\n    return shared.nodes.filter(node => scene._isPresentedNode(node));\n}\n\n/* Resolve one shared clip payload for a zebra batch from the authoritative clip-chain model. */\nfunction zebraClipUniformState(shared, nodes = shared.nodes) {\n    return ui.batchClipUniformState(nodes, shared.scene, `UniformZebraStripes(${shared.resourceKey})`);\n}\n\n/* Resolve the shared anchor pose so draw-time presentation stays uniform-driven. */\nfunction zebraScopeMatrix(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    const matrix = node?.anchorNode?.anchorToRoot ?? null;\n    return matrix ? new Float32Array(matrix) : new Float32Array(twgl.m4.identity());\n}\n\n/* Resolve the shared anchor owner so presentation offsets are sampled exactly once per scope. */\nfunction zebraScopeNode(shared, nodes = shared.nodes) {\n    const node = nodes?.find?.(n => !!n?.anchorNode) ?? shared.nodes?.find?.(n => !!n?.anchorNode) ?? null;\n    return node?.anchorNode ?? null;\n}\n\n/* Read one zebra node's local pose within the active anchor scope. */\nfunction zebraLocalMatrix(node, scene) {\n    const pose = node._batchPose?.(scene) ?? null;\n    return pose?.localToAnchor ?? node.localToAnchor ?? node._worldMatrixForBatch?.(scene) ?? null;\n}\n\n/* Coerce one dynamic zebra stripe payload into a strict draw contract. */\nfunction normalizeStripeUniforms(raw, label) {\n    const rowHeight = Number(raw?.rowHeight ?? 0);\n    const phasePx = Number(raw?.phasePx ?? 0);\n    const startParity = Number(raw?.startParity ?? 0);\n    const stripeColor = raw?.stripeColor ?? null;\n    if (!Number.isFinite(rowHeight) || rowHeight <= 0) {\n        throw new Error(`${label}: rowHeight must be a positive finite number.`);\n    }\n    if (!Number.isFinite(phasePx)) {\n        throw new Error(`${label}: phasePx must be finite.`);\n    }\n    if (!Number.isFinite(startParity)) {\n        throw new Error(`${label}: startParity must be finite.`);\n    }\n    if (!Array.isArray(stripeColor) && !(stripeColor instanceof Float32Array)) {\n        throw new Error(`${label}: stripeColor must be an array-like rgba value.`);\n    }\n    const color = new Float32Array([\n        Number(stripeColor[0] ?? 0),\n        Number(stripeColor[1] ?? 0),\n        Number(stripeColor[2] ?? 0),\n        Number(stripeColor[3] ?? 1),\n    ]);\n    if (!Number.isFinite(color[0]) || !Number.isFinite(color[1]) || !Number.isFinite(color[2]) || !Number.isFinite(color[3])) {\n        throw new Error(`${label}: stripeColor values must be finite.`);\n    }\n    return {\n        rowHeight,\n        phasePx,\n        startParity: ((Math.trunc(startParity) % 2) + 2) % 2,\n        stripeColor: color,\n    };\n}\n\nexport class UniformZebraStripes extends ui.Node {\n    constructor(state = {}) {\n        super({\n            width: state.width ?? 0,\n            height: state.height ?? 0,\n            stripeColor: state.stripeColor ?? [0.1843, 0.2078, 0.2314, 1.0],\n            rowHeight: state.rowHeight ?? 1,\n            phasePx: state.phasePx ?? 0,\n            startParity: state.startParity ?? 0,\n            ...state,\n        });\n        this._stripeUniformProvider = null;\n    }\n\n    /* Allow callers to project stripe phase analytically at draw time without mutating node state each frame. */\n    setStripeUniformProvider(provider) {\n        if (provider !== null && typeof provider !== 'function') {\n            throw new Error('UniformZebraStripes.setStripeUniformProvider(...): expected a function or null.');\n        }\n        this._stripeUniformProvider = provider;\n    }\n\n    /* Resolve one closed zebra stripe payload for the current draw without introducing hidden fallback logic. */\n    stripeUniformState(scene) {\n        const raw = (scene && this.scene === scene && typeof this._stripeUniformProvider === 'function')\n            ? this._stripeUniformProvider({\n                node: this,\n                scene,\n                now_s: this.sceneNowS(),\n            })\n            : {\n                rowHeight: this.state.rowHeight,\n                phasePx: this.state.phasePx,\n                startParity: this.state.startParity,\n                stripeColor: this.state.stripeColor,\n            };\n        return normalizeStripeUniforms(raw, `UniformZebraStripes(${this.state?.name ?? 'unknown'})`);\n    }\n\n    mutate(newState) {\n        const prevState = this.state;\n        this.state = {\n            ...this.state,\n            ...newState,\n        };\n        if (!this._resources) {\n            return;\n        }\n        const kinds = [];\n        if (prevState.width !== this.state.width || prevState.height !== this.state.height) {\n            kinds.push(DIRTY.layout, DIRTY.instance);\n        }\n        if (prevState.stripeColor !== this.state.stripeColor) {\n            kinds.push(DIRTY.style, DIRTY.instance);\n        }\n        if (prevState.rowHeight !== this.state.rowHeight\n            || prevState.phasePx !== this.state.phasePx\n            || prevState.startParity !== this.state.startParity) {\n            kinds.push(DIRTY.content, DIRTY.instance);\n        }\n        if (kinds.length > 0) {\n            markResourceDirty(this._resources, kinds, this);\n        }\n    }\n\n    static _onAttachClass(shared) {\n        shared.nodes = [];\n    }\n\n    _onAttachNode(shared) {\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.structure, DIRTY.instance, DIRTY.buffer], this);\n        shared.nodes.push(this);\n    }\n\n    _onDetachNode(shared) {\n        markResourceDirty(shared, [DIRTY.detach, DIRTY.structure, DIRTY.instance, DIRTY.buffer], this);\n        shared.nodes = shared.nodes.filter(n => n !== this);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.uniform_zebra_stripes');\n        shared.ownGlBufferInfo = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const shaderName = 'lib/evilui/uniform-zebra-stripes';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.uniform_zebra_stripes', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(\n                    shaderName + '.vs.glsl',\n                    shaderName + '.fs.glsl',\n                );\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n        })();\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        shared.ownGlProgram = null;\n        shared.ownGlBufferInfo = null;\n        markResourceDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n    }\n\n    /* Draw zebra stripes from one static quad and per-node uniforms so scroll changes need no buffer uploads. */\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = ui.RENDER_STATUS.LOADING;\n        const nodes = presentedZebraNodes(shared);\n        if (nodes.length === 0) {\n            status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n        if (!shared.ownGlProgram) {\n            return;\n        }\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, UNIFORM_ZEBRA_STRIPES_BUFFER_KINDS)) {\n            deleteBufferInfo(gl, shared.ownGlBufferInfo);\n            shared.ownGlBufferInfo = gpuDiagWithResourceOrigin(`uniform_zebra_stripes.buffer_info.${shared.resourceKey}`, () => twgl.createBufferInfoFromArrays(gl, {\n                position: {\n                    numComponents: 3,\n                    data: UNIFORM_ZEBRA_STRIPES_QUAD,\n                },\n            }));\n            clearNonPickerResourceDirty(shared);\n        }\n        if (!shared.ownGlBufferInfo) {\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        const clipState = zebraClipUniformState(shared, nodes);\n        const anchorMatrix = zebraScopeMatrix(shared, nodes);\n        const presentationState = ui.presentationOffsetUniformState(\n            zebraScopeNode(shared, nodes),\n            shared.scene,\n            `UniformZebraStripes(${shared.resourceKey})`,\n        );\n\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        for (const node of nodes) {\n            if (!node || node.computedVisible === false) {\n                continue;\n            }\n            const width = Number(node.state.width ?? 0);\n            const height = Number(node.state.height ?? 0);\n            if (!(width > 0) || !(height > 0)) {\n                continue;\n            }\n            const localMatrix = zebraLocalMatrix(node, shared.scene);\n            if (!localMatrix) {\n                continue;\n            }\n            const stripe = node.stripeUniformState(shared.scene);\n            const color = new Float32Array(stripe.stripeColor);\n            color[3] *= node.computedOpacity ?? 1.0;\n            twgl.setUniforms(borGlProgram, {\n                u_time: t,\n                u_projectionMatrix: projectionMatrix,\n                u_viewMatrix: viewMatrix,\n                u_anchorMatrix: anchorMatrix,\n                u_localMatrix: localMatrix,\n                u_resolution: new Float32Array([width, height]),\n                u_rowHeight: stripe.rowHeight,\n                u_phasePx: stripe.phasePx,\n                u_startParity: stripe.startParity,\n                u_stripeColor: color,\n                ...presentationState,\n                ...clipState,\n            });\n            drawArraysChecked(gl, `UniformZebraStripes(${shared.resourceKey})`, shared.ownGlBufferInfo);\n        }\n        status.response = ui.RENDER_STATUS.READY;\n    }\n\n    _markLocalResourcesDirty({ kinds = null } = {}) {\n        if (!this._resources) {\n            return;\n        }\n        const dirtyKinds = kinds ?? [DIRTY.content, DIRTY.style, DIRTY.layout, DIRTY.transform, DIRTY.instance];\n        markResourceDirty(this._resources, dirtyKinds, this);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { fieldDisplayWidth, fieldPIIState, fieldSorted, fieldUnit, fieldValueNullable, headerLogicalType } from './tableview-helpers.mjs';\n\nexport const HEADER_PADDING = 4;\nexport const HEADER_ICON_GAP = 4;\nexport const HEADER_TOP_ICON_SIZE = 18;\nexport const HEADER_NULLABLE_ICON_SIZE = 16;\nexport const HEADER_BOTTOM_FONT_SIZE = 10;\n\n/* One descriptor supplies both width measurement and header rendering. */\nexport function describeFieldHeader(field) {\n    const sorted = fieldSorted(field);\n    const pii = fieldPIIState(field);\n    const nullable = fieldValueNullable(field);\n    return {\n        type: headerLogicalType(field),\n        units: fieldUnit(field),\n        sorted,\n        pii,\n        nullable,\n        sortIconID: sorted === 'ascending' ? 10 : sorted === 'descending' ? 11 : null,\n        piiIconID: pii === true ? 45 : null,\n        nullableIconID: nullable === false ? 40 : null,\n    };\n}\n\n/* Metadata-only output changes must also invalidate a passive preview. */\nexport function tableHeaderSignature(struct) {\n    return JSON.stringify((struct.fieldNames?.() ?? []).map((name) => {\n        const field = struct.field(name);\n        return [name, describeFieldHeader(field), fieldDisplayWidth(field)];\n    }));\n}\n\nexport function measureHeaderBottom(header, style) {\n    const measure = (text) => evilfont.MSDFText.measureFromState({\n        font: style.font,\n        fontSize: HEADER_BOTTOM_FONT_SIZE,\n        text: text ?? '',\n    });\n    const type = measure(header.type);\n    const units = measure(header.units);\n    const leftWidth = type.width + (header.nullableIconID === null ? 0 : HEADER_NULLABLE_ICON_SIZE + HEADER_ICON_GAP);\n    return {\n        type,\n        units,\n        minWidth: Math.max(\n            2 * (HEADER_PADDING + Math.max(leftWidth, units.width)),\n            2 * (HEADER_PADDING + HEADER_TOP_ICON_SIZE),\n        ),\n    };\n}\n\n/* The centre remains the largest section, including at small font sizes. */\nexport function headerSections(fontSize, bottomTextHeight, currentHeight) {\n    const topHeight = HEADER_TOP_ICON_SIZE + 2 * HEADER_PADDING;\n    const bottomHeight = Math.max(HEADER_NULLABLE_ICON_SIZE, bottomTextHeight) + 2 * HEADER_PADDING;\n    const middleHeight = Math.max(topHeight + 1, bottomHeight + 1, fontSize * 1.6);\n    const height = Math.max(currentHeight, topHeight + middleHeight + bottomHeight);\n    return { height, topHeight, bottomHeight, middleHeight: height - topHeight - bottomHeight };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { Tooltip } from './popup.mjs';\nimport { Mouse } from '../../controls.mjs';\n\nexport const TABLEVIEW_PRESENTATION_MODE = Object.freeze({\n    PREVIEW: 'preview',\n    FULLSCREEN: 'fullscreen',\n});\n\nexport const HEADER_TOOLTIP_BOUNDS = Object.freeze({\n    maxWidth: 420,\n    maxHeight: 160,\n    pointerGap: 10,\n});\n\nexport class TableviewHeaderTooltipController {\n    #owner;\n    #mode = TABLEVIEW_PRESENTATION_MODE.PREVIEW;\n    #session = null;\n    #showWake = null;\n    #hideWake = null;\n    #popupMount = null;\n\n    constructor(owner, mode = TABLEVIEW_PRESENTATION_MODE.PREVIEW) {\n        if (!owner || typeof owner.thinkAt !== 'function' || typeof owner.cancelThinkAt !== 'function') {\n            throw new Error('TableviewHeaderTooltipController requires a live scheduling owner.');\n        }\n        this.#owner = owner;\n        this.setMode(mode);\n    }\n\n    setMode(mode) {\n        if (!Object.values(TABLEVIEW_PRESENTATION_MODE).includes(mode)) {\n            throw new Error(`TableviewHeaderTooltipController.setMode(...): unknown mode '${mode}'.`);\n        }\n        this.#mode = mode;\n        if (mode !== TABLEVIEW_PRESENTATION_MODE.FULLSCREEN) {\n            this.invalidate();\n        }\n    }\n\n    #clearWake(slot) {\n        const token = slot === 'show' ? this.#showWake : this.#hideWake;\n        if (token !== null) {\n            this.#owner.cancelThinkAt(token);\n        }\n        if (slot === 'show') {\n            this.#showWake = null;\n        } else {\n            this.#hideWake = null;\n        }\n    }\n\n    #dropPopup() {\n        this.#popupMount?.parentNode?.removeChild(this.#popupMount);\n        this.#popupMount = null;\n    }\n\n    invalidate() {\n        this.#clearWake('show');\n        this.#clearWake('hide');\n        this.#dropPopup();\n        this.#session = null;\n    }\n\n    enter(spec) {\n        const key = String(spec.columnKey ?? '');\n        if (key === '') {\n            throw new Error('TableviewHeaderTooltipController.enter(...): columnKey is required.');\n        }\n        if (this.#session?.key !== key) {\n            this.invalidate();\n            this.#session = {\n                key,\n                text: String(spec.text ?? ''),\n                font: spec.font,\n                fontSize: spec.fontSize,\n                hovering: true,\n                dwellReady: false,\n            };\n        } else {\n            this.#session.hovering = true;\n            this.#session.text = String(spec.text ?? '');\n            this.#session.font = spec.font;\n            this.#session.fontSize = spec.fontSize;\n        }\n        this.#clearWake('hide');\n        if (this.#popupMount) {\n            return true;\n        }\n        if (this.#session.dwellReady) {\n            this.#show();\n            return true;\n        }\n        if (this.#showWake === null) {\n            const nowS = this.#owner.scene?.stage?.frameNowS ?? this.#owner.scene?.presentationTimeSeconds?.() ?? 0;\n            this.#showWake = this.#owner.thinkAt(nowS + 0.75, () => {\n                this.#showWake = null;\n                if (!this.#session) {\n                    return;\n                }\n                this.#session.dwellReady = true;\n                if (this.#session.hovering) {\n                    this.#show();\n                }\n            });\n        }\n        return true;\n    }\n\n    leave(columnKey) {\n        if (!this.#session || this.#session.key !== String(columnKey ?? '')) {\n            return;\n        }\n        this.#session.hovering = false;\n        if (this.#hideWake !== null) {\n            return;\n        }\n        const nowS = this.#owner.scene?.stage?.frameNowS ?? this.#owner.scene?.presentationTimeSeconds?.() ?? 0;\n        this.#hideWake = this.#owner.thinkAt(nowS + 0.15, () => {\n            this.#hideWake = null;\n            if (this.#session?.hovering === true) {\n                return;\n            }\n            this.invalidate();\n        });\n    }\n\n    #show() {\n        if (!this.#session || this.#popupMount) {\n            return;\n        }\n        const stage = this.#owner.scene?.stage ?? null;\n        const mountRoot = stage?.hudMountRoot?.('tooltip') ?? null;\n        const pointer = stage?.pointerPointToHud?.([Mouse.x, Mouse.y], mountRoot) ?? null;\n        if (!mountRoot || !pointer) {\n            return;\n        }\n        const popupMount = new Placeholder({ x: pointer[0], y: pointer[1], z: 0 });\n        popupMount.appendChild(new Tooltip({\n            text: this.#session.text,\n            maxWidth: HEADER_TOOLTIP_BOUNDS.maxWidth,\n            maxHeight: HEADER_TOOLTIP_BOUNDS.maxHeight,\n            pointerOffset: [HEADER_TOOLTIP_BOUNDS.pointerGap, HEADER_TOOLTIP_BOUNDS.pointerGap],\n            viewportBounds: () => stage.hudViewportBounds(popupMount),\n            font: this.#session.font,\n            fontSize: this.#session.fontSize,\n            x: 0,\n            y: 0,\n            z: -4,\n            color: [0.92, 0.92, 0.88, 0.98],\n            fontColor: [0.16, 0.16, 0.16, 1],\n        }));\n        this.#popupMount = popupMount;\n        mountRoot.appendChild(popupMount);\n    }\n\n    testingState() {\n        return {\n            mode: this.#mode,\n            key: this.#session?.key ?? null,\n            text: this.#session?.text ?? null,\n            hovering: this.#session?.hovering ?? false,\n            pending: this.#showWake !== null,\n            visible: this.#popupMount !== null,\n            popupMount: this.#popupMount,\n        };\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport {\n    fieldBasis,\n    fieldUnit,\n    previewCell,\n} from './tableview-helpers.mjs';\n\nconst UNIX_BASIS = 'UNIX';\nconst NS_PER_US = 1000n;\nconst NS_PER_MS = 1000000n;\nconst NS_PER_SEC = 1000000000n;\nconst SEC_PER_MIN = 60n;\nconst SEC_PER_HOUR = 3600n;\nconst SEC_PER_DAY = 86400n;\nconst SEC_PER_WEEK = 7n * SEC_PER_DAY;\n\nfunction pad2(n) {\n    return `${n}`.padStart(2, '0');\n}\n\nfunction padFrac(n, digits) {\n    return `${n}`.padStart(digits, '0');\n}\n\nfunction floorDivMod(n, d) {\n    let q = n / d;\n    let r = n % d;\n    if (r < 0n) {\n        q -= 1n;\n        r += d;\n    }\n    return [q, r];\n}\n\nfunction formatDateUtc(msEpoch) {\n    const d = new Date(msEpoch);\n    return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\n}\n\nfunction formatDateTimeUtc(msEpoch, suffix = '') {\n    const d = new Date(msEpoch);\n    return `${formatDateUtc(msEpoch)} ${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}:${pad2(d.getUTCSeconds())}${suffix}`;\n}\n\nfunction previewBigValue(field, i) {\n    if (!field) {\n        return null;\n    }\n    if (field.isScalar?.()) {\n        if (typeof field.valueBig === 'function') {\n            try {\n                return field.valueBig();\n            } catch (_err) {\n            }\n        }\n        if (typeof field.value === 'function') {\n            try {\n                return field.value();\n            } catch (_err) {\n            }\n        }\n        return null;\n    }\n    if (typeof field.toBigArray === 'function') {\n        try {\n            const vals = field.toBigArray();\n            return vals?.[i] ?? null;\n        } catch (_err) {\n        }\n    }\n    if (typeof field.isLeaf === 'function' && field.isLeaf() && typeof field.valueAt === 'function') {\n        try {\n            return field.valueAt(i);\n        } catch (_err) {\n        }\n    }\n    return null;\n}\n\nexport function formatUnixPreviewValue(value, unit) {\n    if (value === null || value === undefined || !unit) {\n        return null;\n    }\n\n    let n = null;\n    if (typeof value === 'bigint') {\n        n = value;\n    } else if (typeof value === 'number' && Number.isFinite(value) && Number.isInteger(value)) {\n        n = BigInt(value);\n    } else {\n        return null;\n    }\n\n    if (unit === 'month') {\n        const [yearOffset, monthIndex] = floorDivMod(n, 12n);\n        return `${1970 + Number(yearOffset)}-${pad2(Number(monthIndex) + 1)}-01`;\n    }\n\n    let sec = null;\n    let fracNanos = 0n;\n    let fracDigits = 0;\n    switch (unit) {\n    case 'week':\n        sec = n * SEC_PER_WEEK;\n        return formatDateUtc(Number(sec * 1000n));\n    case 'day':\n        sec = n * SEC_PER_DAY;\n        return formatDateUtc(Number(sec * 1000n));\n    case 'h':\n        sec = n * SEC_PER_HOUR;\n        break;\n    case 'min':\n        sec = n * SEC_PER_MIN;\n        break;\n    case 's':\n        sec = n;\n        break;\n    case 'ms': {\n        const [whole, rem] = floorDivMod(n, 1000n);\n        sec = whole;\n        fracNanos = rem * NS_PER_MS;\n        fracDigits = 3;\n        break;\n    }\n    case 'us': {\n        const [whole, rem] = floorDivMod(n, 1000000n);\n        sec = whole;\n        fracNanos = rem * NS_PER_US;\n        fracDigits = 6;\n        break;\n    }\n    case 'ns': {\n        const [whole, rem] = floorDivMod(n, NS_PER_SEC);\n        sec = whole;\n        fracNanos = rem;\n        fracDigits = 9;\n        break;\n    }\n    default:\n        return null;\n    }\n\n    const msEpoch = sec * 1000n + fracNanos / NS_PER_MS;\n    let suffix = '';\n    if (fracDigits === 3) {\n        suffix = `.${padFrac(Number(fracNanos / NS_PER_MS), 3)}`;\n    } else if (fracDigits === 6) {\n        suffix = `.${padFrac(Number(fracNanos / NS_PER_US), 6)}`;\n    } else if (fracDigits === 9) {\n        suffix = `.${padFrac(Number(fracNanos), 9)}`;\n    }\n    return formatDateTimeUtc(Number(msEpoch), suffix);\n}\n\nexport function previewDisplayCell(field, i) {\n    const value = previewCell(field, i);\n    if (value === null || value === undefined) {\n        return value;\n    }\n    if (fieldBasis(field) !== UNIX_BASIS) {\n        return value;\n    }\n    const raw = previewBigValue(field, i);\n    const formatted = formatUnixPreviewValue(raw, fieldUnit(field));\n    return formatted ?? value;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst CHUNK_PREP_EXECUTOR_KIND = Object.freeze({\n    INLINE: 'inline',\n});\n\nlet g_sharedChunkPrepareExecutor = null;\nlet g_sharedChunkPrepareConfig = null;\nconst SHARED_CHUNK_PREP_DEBUG_ID = `chunk-exec-${Date.now().toString(36)}`;\n\nexport const CHUNK_PREP_STATUS = Object.freeze({\n    QUEUED: 'queued',\n    READY_PAYLOAD: 'ready_payload',\n    ATTACHED: 'attached',\n    FAILED: 'failed',\n});\n\n/* Keep one canonical identity transform so shared-executor config checks stay stable across repeated calls. */\nfunction identityPayload(payload) {\n    return payload;\n}\n\n/* Compare the load-bearing shared-executor config by exact contract identity rather than structural guesses. */\nfunction sameChunkPrepareExecutorConfig(a, b) {\n    return a.kind === b.kind\n        && a.run === b.run;\n}\n\n/* Normalise one executor config so shared lifetime checks compare the real behaviour-shaping fields only. */\nfunction normalizeChunkPrepareExecutorConfig({\n    kind = CHUNK_PREP_EXECUTOR_KIND.INLINE,\n    run = null,\n} = {}) {\n    return {\n        kind,\n        run,\n        deserializePayload: identityPayload,\n    };\n}\n\n/* Snapshot one chunk-prepare request so later async builders can share one stable contract. */\nexport function makeChunkPrepareRequest({\n    tableName,\n    chunkKey,\n    rowBand,\n    colBand,\n    entriesBounds,\n    origin,\n    columns,\n    allColumns,\n    style,\n    previewMaxHeight,\n}) {\n    return {\n        table_name: tableName,\n        chunk_key: chunkKey,\n        row_band: rowBand,\n        col_band: colBand,\n        entries_bounds: entriesBounds ? { ...entriesBounds } : null,\n        origin,\n        columns: [...columns],\n        all_columns: [...allColumns],\n        style,\n        preview_max_height: previewMaxHeight,\n    };\n}\n\n/* Create one canonical chunk record so lifecycle state stops living implicitly in the cache shape. */\nexport function makeChunkRecord({\n    key,\n    rowBand,\n    colBand,\n    status,\n    request,\n    payload = null,\n    node = null,\n    error = null,\n    bandStartX = null,\n    bandEndX = null,\n}) {\n    return {\n        key,\n        rowBand,\n        colBand,\n        status,\n        request,\n        payload,\n        node,\n        error,\n        bandStartX,\n        bandEndX,\n    };\n}\n\n/* Run chunk-prepare work asynchronously on the main thread while exposing the same contract later worker executors will use. */\nexport class InlineChunkPrepareExecutor {\n    #closed = false;\n    #nextJobID = 1;\n    #pendingJobCount = 0;\n\n    constructor(run) {\n        if (typeof run !== 'function') {\n            throw new Error('InlineChunkPrepareExecutor(...): run must be a function.');\n        }\n        this.run = run;\n    }\n\n    /* Submit one chunk-prepare job through the stable executor seam and report deterministic executor metadata with the result. */\n    submit(job) {\n        if (this.#closed) {\n            throw new Error('InlineChunkPrepareExecutor.submit(...): executor is closed.');\n        }\n        const jobID = this.#nextJobID++;\n        this.#pendingJobCount += 1;\n        return Promise.resolve().then(() => {\n            if (this.#closed) {\n                throw new Error(`InlineChunkPrepareExecutor.submit(...): executor closed before job ${jobID} started.`);\n            }\n            return this.run(job);\n        }).then((payload) => ({\n            executor_kind: CHUNK_PREP_EXECUTOR_KIND.INLINE,\n            job_id: jobID,\n            payload,\n        })).finally(() => {\n            this.#pendingJobCount = Math.max(0, this.#pendingJobCount - 1);\n        });\n    }\n\n    /* Close this executor so later phases can swap implementations cleanly across rebuild/detach boundaries. */\n    close() {\n        this.#closed = true;\n    }\n\n    /* Snapshot executor-local state for tests and performance diagnostics. */\n    snapshot() {\n        return {\n            kind: CHUNK_PREP_EXECUTOR_KIND.INLINE,\n            closed: this.#closed,\n            pending_job_count: this.#pendingJobCount,\n            next_job_id: this.#nextJobID,\n        };\n    }\n}\n\n/* Create one chunk-prepare executor without exposing implementation details to TableView lifecycle code. */\nexport function makeChunkPrepareExecutor({\n    kind = CHUNK_PREP_EXECUTOR_KIND.INLINE,\n    run = null,\n} = {}) {\n    switch (kind) {\n    case CHUNK_PREP_EXECUTOR_KIND.INLINE:\n        if (typeof run !== 'function') {\n            throw new Error('makeChunkPrepareExecutor(...): inline executor requires a run function.');\n        }\n        return new InlineChunkPrepareExecutor(run);\n    default:\n        throw new Error(`makeChunkPrepareExecutor(...): unknown executor kind '${kind}'.`);\n    }\n}\n\n/* Borrow one process-wide chunk-prepare executor so all TableViews share the same async boundary and worker lifetime. */\nexport function ensureSharedChunkPrepareExecutor(config = {}) {\n    const normalized = normalizeChunkPrepareExecutorConfig(config);\n    if (!g_sharedChunkPrepareExecutor) {\n        g_sharedChunkPrepareConfig = normalized;\n        g_sharedChunkPrepareExecutor = makeChunkPrepareExecutor(normalized);\n        return g_sharedChunkPrepareExecutor;\n    }\n    if (!sameChunkPrepareExecutorConfig(g_sharedChunkPrepareConfig, normalized)) {\n        throw new Error(\n            `ensureSharedChunkPrepareExecutor(...): shared executor already exists with kind '${g_sharedChunkPrepareConfig.kind}'.`,\n        );\n    }\n    return g_sharedChunkPrepareExecutor;\n}\n\n/* Snapshot the shared executor for diagnostics without forcing eager creation in idle tables. */\nexport function snapshotSharedChunkPrepareExecutor() {\n    const snap = g_sharedChunkPrepareExecutor?.snapshot?.() ?? null;\n    if (!snap) {\n        return null;\n    }\n    return {\n        ...snap,\n        shared_debug_id: SHARED_CHUNK_PREP_DEBUG_ID,\n    };\n}\n\n/* Reset the shared executor only in tests so module-global state cannot leak across cases. */\nexport function resetSharedChunkPrepareExecutorForTesting() {\n    g_sharedChunkPrepareExecutor?.close?.();\n    g_sharedChunkPrepareExecutor = null;\n    g_sharedChunkPrepareConfig = null;\n}\n\nexport { CHUNK_PREP_EXECUTOR_KIND };\n", "import { glyphForSymbol } from '../evilfont/font-asset.mjs';\nimport { SortPanel } from './sort-panel.mjs';\nimport { isActivationEvent } from './activation.mjs';\nimport { FilterPanel } from './filter-panel.mjs';\nimport { FillPanel } from './fill-panel.mjs';\nimport { DataLineagePanel } from './data-lineage-panel.mjs';\nimport { ColumnsMetadataPanel } from './columns-metadata-panel.mjs';\n// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as tile from './tile.mjs'\nimport { ClickArea } from './button.mjs';\nimport * as textutils from './text-utils.mjs';\nimport { CommanderBus } from '../commander.mjs';\nimport { PORTAL_MIN_BUILD } from '../build-flags.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { makeFullscreenChromeIconButton } from './fullscreen-chrome-button.mjs';\nimport { pushTestingTableviewTrace, testingResetTableviewTrace, testingTableviewTrace } from './testing-trace.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { UniformZebraStripes } from './uniform-zebra-stripes.mjs';\nimport {\n    describeFieldHeader,\n    headerSections,\n    measureHeaderBottom,\n    tableHeaderSignature,\n    HEADER_PADDING,\n    HEADER_ICON_GAP,\n    HEADER_TOP_ICON_SIZE,\n    HEADER_NULLABLE_ICON_SIZE,\n    HEADER_BOTTOM_FONT_SIZE,\n} from './tableview-header-layout.mjs';\nimport {\n    TABLEVIEW_PRESENTATION_MODE,\n    TableviewHeaderTooltipController,\n} from './tableview-header-tooltip.mjs';\nimport {\n    DEFAULT_COLUMN_WINDOW,\n    fieldBasis,\n    fieldDescription,\n    fieldDisplayWidth,\n    fieldLineage,\n    fieldNullable,\n    fieldPII,\n    fieldSorted,\n    fieldUnit,\n    fieldUnique,\n    inferPreviewTableLayout,\n    isPassiveTablePreviewMode,\n    previewRowCount,\n    tableViewData,\n    tablePreviewSignature,\n} from './tableview-helpers.mjs';\nimport { previewDisplayCell } from './formatters.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\nimport { currentEvil } from '../eviltime.mjs';\nimport {\n    focusStackContainsContainer,\n    focusThis,\n    pushFocusEntry,\n    removeFocusEntry,\n} from './focus-manager.mjs';\nimport {\n    CHUNK_PREP_EXECUTOR_KIND,\n    CHUNK_PREP_STATUS,\n    makeChunkPrepareRequest,\n    makeChunkRecord,\n    ensureSharedChunkPrepareExecutor,\n    snapshotSharedChunkPrepareExecutor,\n} from './tableview-chunk-executor.mjs';\n\nconst ALIGNMENT = Object.freeze({\n    LEFT: 0,\n    CENTRE: 1,\n    RIGHT: 2\n});\n\nconst EMPTY_TABLE_FONT_SCALE = 1.0;\nconst NULL_CELL_TEXT = 'NULL';\nconst DEFAULT_PREVIEW_MAX_HEIGHT = 256;\nconst TABLE_WHEEL_STEP = 28;\nconst TABLE_WHEEL_BOOST = 3.0;\nconst TABLE_SHIFT_WHEEL_CARRY = 0.08;\nconst TABLE_SHIFT_WHEEL_DRAG = 0.58;\nconst TABLE_THROW_DECAY_PER_SECOND = -60.0 * Math.log(0.95);\nconst TABLE_THROW_STOP_PX_PER_SECOND = 4.0;\nconst TABLE_THROW_DISPLAY_SETTLE_PX_PER_SECOND = 24.0;\nconst TABLE_THROW_DISPLAY_SETTLE_PX = 0.125;\nconst TABLE_PREVIEW_WHEEL_ESCAPE_IDLE_LATCH_S = 0.18;\nconst CHUNK_PREP_STALL_FAIL_MS = 500;\nconst SHARED_CHUNK_PREP_PENDING_LIMIT = 2;\nconst PREVIEW_HEIGHT_EPSILON = 0.01;\nconst PREVIEW_CHAR_SAMPLE = '0000000000';\nconst DEFAULT_PREVIEW_LINE_HEIGHT_EM = 1.325;\nconst CLIPPED_TAIL_PENULT_ALPHA = 0.72;\nconst CLIPPED_TAIL_LAST_ALPHA = 0.42;\nconst FULLSCREEN_HEADER_TOAST_DWELL_S = 1.5;\nconst CELL_TOOLTIP_POINTER_OFFSET_Y = 16;\nconst CELL_COPY_TOAST_TEXT = 'Cell value copied to the clipboard';\nconst STALE_INDICATOR_ICON_ID = 24;\nconst STALE_INDICATOR_SIZE = 64;\nconst STALE_INDICATOR_INSET = 16;\nconst STALE_INDICATOR_SPIN_PERIOD_S = 1.6;\nconst STALE_INDICATOR_Z = -200;\nconst FULLSCREEN_HEADER_TOAST_HIDE_GRACE_S = 0.15;\nconst TABLE_INSPECT_TOOLBAR_HEIGHT = 40;\nconst TABLE_INSPECT_CELL_HEIGHT = 28;\nconst TABLE_INSPECT_ROW_SPACING = 2;\nconst TABLE_INSPECT_LINE_NUMBER_WIDTH = TABLE_INSPECT_CELL_HEIGHT * 3;\nconst TABLE_INSPECT_LINE_NUMBER_PADDING = 12;\nconst TABLE_INSPECT_SCROLLBAR_WIDTH = 20;\nconst TABLE_INSPECT_SCROLLBOX_RIGHT_INSET = 4;\nconst TABLE_INSPECT_BACKING_Z = -0.25;\nconst TABLE_INSPECT_REVEAL_DURATION_S = 0.3;\nconst TABLE_INSPECT_REVEAL_EASE = 'easeInOutSine';\nconst TABLE_INSPECT_TOGGLE_BUTTON_WIDTH = 120;\nconst TABLE_INSPECT_TOGGLE_BUTTON_INSET = 4;\nconst TABLE_INSPECT_TOGGLE_ICON_SIZE = 18;\nconst TABLE_INSPECT_TOGGLE_TEXT_X = 34;\nconst TABLE_INSPECT_TOOLBAR_BUTTON_GAP = 8;\nconst TABLE_INSPECT_TOOLBAR_ACTION_ICON_SIZE = 30;\nconst TABLE_INSPECT_ASSIGN_INPUT_WIDTH = 250;\nconst TABLE_INSPECT_ASSIGN_INPUT_HEIGHT = 32;\nconst TABLE_INSPECT_ASSIGN_GAP = 8;\nconst TABLE_INSPECT_ASSIGN_LABEL = 'assign to variable:';\nconst TABLE_INSPECT_VARIABLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst TABLE_INSPECT_STATE = Object.freeze({ STALE: 'STALE', REFRESHING: 'REFRESHING', UPDATED: 'UPDATED' });\n\n/* Resolve a TableView's owning Viewport across its internal content mount. */\nfunction hostViewportFor(node) {\n    if (node?.ownPreviewViewport) {\n        return node.ownPreviewViewport;\n    }\n    let cur = node?.parentNode ?? null;\n    while (cur) {\n        if (cur.focusContainerKind === 'Viewport' && typeof cur.setViewportBounds === 'function') {\n            return cur;\n        }\n        cur = cur.parentNode;\n    }\n    return null;\n}\n\n/* Solve one monotone exponential-decay boundary hit so scroll clamps can schedule one exact hard stop. */\nfunction decayBoundaryHitAfterS(position, velocity, decayPerS, boundary) {\n    if (!Number.isFinite(boundary) || !Number.isFinite(position) || !Number.isFinite(velocity) || !Number.isFinite(decayPerS) || decayPerS <= 0) {\n        return null;\n    }\n    if (velocity === 0) {\n        return position === boundary ? 0 : null;\n    }\n    const limit = position + (velocity / decayPerS);\n    if (velocity > 0) {\n        if (!(boundary >= position && boundary <= limit)) {\n            return null;\n        }\n    } else if (!(boundary <= position && boundary >= limit)) {\n        return null;\n    }\n    const unit = 1 - ((decayPerS * (boundary - position)) / velocity);\n    if (!(unit >= 0 && unit <= 1)) {\n        return null;\n    }\n    return -Math.log(Math.max(unit, 1e-12)) / decayPerS;\n}\n\n/* Estimate one monospace-like character cell in pixels from the active table font. */\nfunction previewCharacterWidth(style) {\n    const layout = evilfont.MSDFText.measureFromState({\n        font: style.font,\n        fontSize: style.fontSize,\n        text: PREVIEW_CHAR_SAMPLE,\n    });\n    const width = layout?.width;\n    if (Number.isFinite(width) && width > 0) {\n        return width / PREVIEW_CHAR_SAMPLE.length;\n    }\n    return style.fontSize * 0.6;\n}\n\n/* Convert one logical text line into pixels using the font's own line-height metric when available. */\nfunction previewLineHeight(style) {\n    const lineHeight = style.font?.fontData?.lineHeight;\n    if (Number.isFinite(lineHeight) && lineHeight > 0) {\n        return lineHeight * style.fontSize;\n    }\n    return style.fontSize * DEFAULT_PREVIEW_LINE_HEIGHT_EM;\n}\n\n/* Keep passive preview rows on one shared height per TableView build, even when no explicit hint arrives. */\nfunction defaultPreviewRowHeight(style) {\n    return previewLineHeight(style) + style.cellPadding;\n}\n\nconst UTF8_REPLACEMENT_CODEPOINT = 0xfffd;\nconst ASCII_MINUS_CODEPOINT = 0x2d;\nconst ASCII_SPACE_CODEPOINT = 0x20;\nconst ASCII_NEWLINE_CODEPOINT = 0x0a;\nconst ASCII_CARRIAGE_RETURN_CODEPOINT = 0x0d;\n\n/* All ordinary table measurement uses the same strict lookup as rendering. */\nfunction glyphForCodepoint(fontData, codepoint) {\n    return glyphForSymbol(fontData, codepoint);\n}\n\nfunction glyphAdvancePx(fontData, fontSize, codepoint) {\n    return glyphForCodepoint(fontData, codepoint).advance * fontSize;\n}\n\n/* Decode one UTF-8 codepoint directly from ptrless values storage so visible rows avoid per-cell JS strings. */\nfunction decodeUtf8Codepoint(values, index, end) {\n    const b0 = values[index];\n    if (b0 < 0x80) {\n        return { codepoint: b0, next: index + 1 };\n    }\n    if ((b0 & 0xe0) === 0xc0 && index + 1 < end) {\n        const b1 = values[index + 1];\n        return {\n            codepoint: ((b0 & 0x1f) << 6) | (b1 & 0x3f),\n            next: index + 2,\n        };\n    }\n    if ((b0 & 0xf0) === 0xe0 && index + 2 < end) {\n        const b1 = values[index + 1];\n        const b2 = values[index + 2];\n        return {\n            codepoint: ((b0 & 0x0f) << 12) | ((b1 & 0x3f) << 6) | (b2 & 0x3f),\n            next: index + 3,\n        };\n    }\n    if ((b0 & 0xf8) === 0xf0 && index + 3 < end) {\n        const b1 = values[index + 1];\n        const b2 = values[index + 2];\n        const b3 = values[index + 3];\n        return {\n            codepoint: ((b0 & 0x07) << 18) | ((b1 & 0x3f) << 12) | ((b2 & 0x3f) << 6) | (b3 & 0x3f),\n            next: index + 4,\n        };\n    }\n    return {\n        codepoint: UTF8_REPLACEMENT_CODEPOINT,\n        next: index + 1,\n    };\n}\n\n/* Collapse whitespace for one-line preview cells so bytes-backed table rows preserve the existing table contract. */\nfunction isWhitespaceCodepoint(codepoint) {\n    switch (codepoint) {\n    case 0x09:\n    case 0x0a:\n    case 0x0b:\n    case 0x0c:\n    case 0x0d:\n    case 0x20:\n    case 0x85:\n    case 0xa0:\n    case 0x1680:\n    case 0x2000:\n    case 0x2001:\n    case 0x2002:\n    case 0x2003:\n    case 0x2004:\n    case 0x2005:\n    case 0x2006:\n    case 0x2007:\n    case 0x2008:\n    case 0x2009:\n    case 0x200a:\n    case 0x2028:\n    case 0x2029:\n    case 0x202f:\n    case 0x205f:\n    case 0x3000:\n        return true;\n    default:\n        return false;\n    }\n}\n\n/* Convert one bytes-backed cell into one clipped preview line without allocating a per-cell JS string. */\nfunction appendSingleLineUtf8CellCodepoints(out, field, rowEntry, width, style) {\n    if (typeof field.validAt === 'function' && !field.validAt(rowEntry)) {\n        out.push(...stringCodepoints(NULL_CELL_TEXT));\n        return false;\n    }\n    // Sparse preview rows can be visible because another column is longer.\n    if (typeof field.length === 'function' && (rowEntry < 0 || rowEntry >= field.length())) {\n        out.push(...stringCodepoints(NULL_CELL_TEXT));\n        return false;\n    }\n    const [rawStart, rawEnd] = field.rawSliceBounds(rowEntry);\n    const start = Number(rawStart);\n    const end = Number(rawEnd);\n    if (!Number.isFinite(start) || !Number.isFinite(end) || start >= end) {\n        return false;\n    }\n    const values = field.rawValues();\n    const fontData = style.font.fontData;\n    const fontSize = style.fontSize;\n    const maxWidth = Math.max(0, width);\n    const lineStart = out.length;\n    const spaceWidth = glyphAdvancePx(fontData, fontSize, ASCII_SPACE_CODEPOINT);\n    let lineWidth = 0;\n    let cursor = start;\n    let clipped = false;\n    let pendingSpace = false;\n\n    const appendCodepoint = (codepoint, advance) => {\n        out.push(codepoint);\n        lineWidth += advance;\n    };\n\n    while (cursor < end) {\n        const decoded = decodeUtf8Codepoint(values, cursor, end);\n        cursor = decoded.next;\n        const codepoint = decoded.codepoint;\n        if (codepoint === ASCII_CARRIAGE_RETURN_CODEPOINT) {\n            if (cursor < end && values[cursor] === ASCII_NEWLINE_CODEPOINT) {\n                cursor += 1;\n            }\n            clipped = cursor < end;\n            break;\n        }\n        if (codepoint === ASCII_NEWLINE_CODEPOINT) {\n            clipped = cursor < end;\n            break;\n        }\n        if (isWhitespaceCodepoint(codepoint)) {\n            pendingSpace = out.length > lineStart;\n            continue;\n        }\n        const advance = glyphAdvancePx(fontData, fontSize, codepoint);\n        const nextSpaceWidth = pendingSpace && out.length > lineStart ? spaceWidth : 0;\n        if (lineWidth + nextSpaceWidth + advance > maxWidth) {\n            clipped = true;\n            break;\n        }\n        if (nextSpaceWidth > 0) {\n            appendCodepoint(ASCII_SPACE_CODEPOINT, nextSpaceWidth);\n            pendingSpace = false;\n        }\n        appendCodepoint(codepoint, advance);\n    }\n    return clipped;\n}\n\n/* Use the bytes-arrow public seam only for the hot single-line text case; richer formatting still falls back to the generic path. */\nfunction canUseBytesTextFastPath(field, width, style) {\n    const physicalType = typeof field?.physicalType === 'function' ? field.physicalType() : null;\n    if (physicalType !== 'BytesArrow32' && physicalType !== 'BytesArrow64') {\n        return false;\n    }\n    if (fieldBasis(field) === 'UNIX') {\n        return false;\n    }\n    if (typeof field.rawSliceBounds !== 'function' || typeof field.rawValues !== 'function') {\n        return false;\n    }\n    if (!Number.isFinite(width) || width <= 0) {\n        return false;\n    }\n    const lineHeight = previewLineHeight(style);\n    const maxLines = Math.max(1, Math.floor((style.maxCellHeight ?? 300) / Math.max(1, lineHeight)));\n    return maxLines === 1;\n}\n\n/* Reserve symmetric cell padding in the measured text width so laid-out text cannot eat the RHS margin. */\nfunction cellTextContentWidth(col, style) {\n    return Math.max(0, col.width - style.cellPadding);\n}\n\n/* Reserve one leading minus slot for signed numeric preview columns so digits align across signs. */\nfunction fieldReservesSignSlot(field) {\n    const type = typeof field?.physicalType === 'function' ? field.physicalType() : '';\n    return typeof type === 'string'\n        && (\n            type.startsWith('IntegralArrow')\n            || type.startsWith('FloatArrow')\n            || type.startsWith('IntegralArithmetic')\n            || type.startsWith('FloatArithmetic')\n        );\n}\n\n/* Convert one JS string into UTF-32 codepoints so prebuilt text shapes can share one path. */\nfunction stringCodepoints(text) {\n    return Uint32Array.from(Array.from(String(text ?? ''), (char) => char.codePointAt(0)));\n}\n\n/* Fade the trailing two rendered glyphs for one clipped cell without affecting interior spaces or newlines. */\nfunction appendCellGlyphColors(out, baseColor, fontData, codepoints, clipped, hiddenGlyphCount = 0) {\n    const glyphColor = baseColor ?? [0, 0, 0, 1];\n    const glyphFlags = [];\n    for (const codepoint of codepoints) {\n        if (codepoint === ASCII_NEWLINE_CODEPOINT || codepoint === ASCII_CARRIAGE_RETURN_CODEPOINT) {\n            continue;\n        }\n        const glyph = glyphForCodepoint(fontData, codepoint);\n        if (!glyph?.planeBounds) {\n            continue;\n        }\n        glyphFlags.push(false);\n    }\n    if (clipped && glyphFlags.length > 0) {\n        glyphFlags[glyphFlags.length - 1] = true;\n        if (glyphFlags.length > 1) {\n            glyphFlags[glyphFlags.length - 2] = true;\n        }\n    }\n    for (let i = 0; i < glyphFlags.length; i += 1) {\n        let alpha = glyphColor[3] ?? 1.0;\n        if (i < hiddenGlyphCount) {\n            alpha = 0.0;\n        }\n        if (glyphFlags[i]) {\n            alpha *= i === glyphFlags.length - 1 ? CLIPPED_TAIL_LAST_ALPHA : CLIPPED_TAIL_PENULT_ALPHA;\n        }\n        out.push(\n            glyphColor[0] ?? 0,\n            glyphColor[1] ?? 0,\n            glyphColor[2] ?? 0,\n            alpha,\n        );\n    }\n    return glyphFlags.some(Boolean) || hiddenGlyphCount > 0;\n}\n\nclass HeaderHoverToastArea extends ClickArea {\n    constructor(state = {}) {\n        super(state);\n        this.ownerTableview = state.ownerTableview ?? null;\n        this.fullHeaderText = state.fullHeaderText ?? '';\n        this.truncated = state.truncated === true;\n        this.toastFont = state.toastFont ?? null;\n        this.toastFontSize = state.toastFontSize ?? null;\n        this.tooltipController = state.tooltipController ?? null;\n        this.columnKey = state.columnKey ?? null;\n        this.onContextMenu = state.onContextMenu ?? null;\n    }\n\n    /* Arm one one-shot dwell timer instead of any per-frame hover polling. */\n    onHoverEnter() {\n        this.tooltipController?.enter({\n            columnKey: this.columnKey,\n            text: this.fullHeaderText,\n            truncated: this.truncated,\n            font: this.toastFont,\n            fontSize: Math.max(12, this.toastFontSize ?? 18),\n        });\n    }\n\n    /* Hold briefly before hiding so single-frame hover churn does not immediately dismiss the popup. */\n    onHoverExit() {\n        this.tooltipController?.leave(this.columnKey);\n    }\n\n    /* Keep hover tests and production ClickArea semantics aligned even when a test double omits the inherited hooks. */\n    _onHoverEnter() {\n        this._mouseIsHovering = true;\n        this.onHoverEnter();\n    }\n\n    /* Clear the retained hover flag before exit handling so the dwell callback cannot race with teardown. */\n    _onHoverExit() {\n        this._mouseIsHovering = false;\n        this.onHoverExit();\n    }\n\n    /* Keep the existing right-click column menu path attached to the same header hover target. */\n    onInput(event) {\n        if (event === 'R_MOUSE_UP' && typeof this.onContextMenu === 'function') {\n            this.onContextMenu();\n            return true;\n        }\n        return false;\n    }\n\n    /* Drop any pending dwell timer so detached header chrome cannot emit stale toasts later. */\n    _onDetachNode(shared) {\n        this.tooltipController?.leave(this.columnKey);\n        super._onDetachNode(shared);\n    }\n}\n\nclass CellHoverToastArea extends ClickArea {\n    #ownToastWake = null;\n    #ownHideWake = null;\n    #hoverPopupMount = null;\n    #contextMenu = null;\n\n    constructor(state = {}) {\n        super(state);\n        this.ownerTableview = state.ownerTableview ?? null;\n        this.columnName = state.columnName ?? null;\n        this.rowEntry = state.rowEntry ?? -1;\n        this.toastFont = state.toastFont ?? null;\n        this.toastFontSize = state.toastFontSize ?? null;\n        this.textBatchScopeKey = state.textBatchScopeKey ?? `${this.state.name}.tooltip`;\n    }\n\n    /* Keep popup labels out of the chunk text scope so body-scroll presentation offsets cannot separate text from the tooltip tile. */\n    _textBatchScopeForDescendants(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        return {\n            key: this.textBatchScopeKey,\n            root: this,\n        };\n    }\n\n    /* Resolve the full display value only after hover dwell, keeping chunk payloads compact. */\n    #fullCellText() {\n        return this.ownerTableview?.tooltipTextForCell?.(this.columnName, this.rowEntry) ?? '';\n    }\n\n    /* Every materialised table cell can show its complete value in either presentation mode. */\n    #wantsHoverToast() {\n        return this.ownerTableview !== null\n            && typeof this.columnName === 'string'\n            && Number.isInteger(this.rowEntry)\n            && this.rowEntry >= 0;\n    }\n\n    /* Cancel one pending dwell timer once hover ends or the area detaches. */\n    #clearToastWake() {\n        if (this.#ownToastWake === null) {\n            return;\n        }\n        this.cancelThinkAt(this.#ownToastWake);\n        this.#ownToastWake = null;\n    }\n\n    /* Cancel one pending hide grace so a transient hover miss does not blink the popup out. */\n    #clearHideWake() {\n        if (this.#ownHideWake === null) {\n            return;\n        }\n        this.cancelThinkAt(this.#ownHideWake);\n        this.#ownHideWake = null;\n    }\n\n    /* Drop the attached hover popup immediately so cell hover cannot leave stale chrome behind. */\n    #dropHoverPopup() {\n        this.#clearHideWake();\n        if (!this.#hoverPopupMount) {\n            return;\n        }\n        this.#hoverPopupMount.parentNode?.removeChild(this.#hoverPopupMount);\n        this.#hoverPopupMount = null;\n    }\n\n    /* Show one bounded popup after hover dwell only if the same cell hover is still active. */\n    #showHoverToast() {\n        this.#ownToastWake = null;\n        if (this.#hoverPopupMount || !this.#wantsHoverToast() || this._mouseIsHovering !== true || !this.parentNode) {\n            return;\n        }\n        const font = this.toastFont;\n        if (!font) {\n            throw new Error('CellHoverToastArea requires toastFont.');\n        }\n        const fontSize = Math.max(12, this.toastFontSize ?? 18);\n        const fullCellText = this.#fullCellText();\n        const stage = this.scene?.stage ?? null;\n        const hudMountRoot = stage?.hudMountRoot?.('tooltip') ?? null;\n        const mountRoot = hudMountRoot ?? this;\n        // The hit target lives in the moving table scene, but its popup is a\n        // static HUD concern. Anchor it from the normalized pointer directly;\n        // projecting the cell mixes camera/world motion back into HUD placement.\n        const pointerPlacement = hudMountRoot\n            ? (stage.pointerPointToHud?.([Mouse.x, Mouse.y], hudMountRoot) ?? [0, 0, 0])\n            : [0, this.height + 6, 0];\n        // Use pointer X/Y only so the tooltip root retains its foreground depth.\n        const popupMount = new ui.Anchor({ x: pointerPlacement[0], y: pointerPlacement[1], z: 0, textBatchScopeKey: this.textBatchScopeKey });\n        popupMount.appendChild(new ui.Tooltip({\n            text: fullCellText,\n            pointerOffset: [0, CELL_TOOLTIP_POINTER_OFFSET_Y],\n            viewportBounds: () => stage?.hudViewportBounds?.(popupMount) ?? null,\n            wrapText: true,\n            font,\n            fontSize,\n            x: 0,\n            y: 0,\n            z: -4.0,\n            color: [0.92, 0.92, 0.88, 0.98],\n            fontColor: [0.16, 0.16, 0.16, 1.0],\n        }));\n        this.#hoverPopupMount = popupMount;\n        mountRoot.appendChild(popupMount);\n    }\n\n    /* Confirm a successful clipboard write through the shared HUD toast layer. */\n    #showCopyToast() {\n        const stage = this.scene?.stage ?? null;\n        const mountRoot = stage?.hudMountRoot?.('toast')\n            ?? this.scene?.toastMountRoot?.()\n            ?? null;\n        if (!mountRoot) {\n            return;\n        }\n        const fontSize = Math.max(12, this.toastFontSize ?? 18);\n        const layout = ui.Toast.measureLayout({\n            text: CELL_COPY_TOAST_TEXT,\n            font: this.toastFont,\n            fontSize,\n        });\n        const pointer = stage?.pointerPointToHud?.([Mouse.x, Mouse.y], mountRoot) ?? [0, 0, 0];\n        const toastMount = new ui.Placeholder({\n            x: pointer[0],\n            y: pointer[1] + CELL_TOOLTIP_POINTER_OFFSET_Y,\n            z: 0,\n        });\n        toastMount.appendChild(new ui.Toast({\n            text: layout.text,\n            wrapText: false,\n            font: this.toastFont,\n            fontSize,\n            z: -4,\n            color: [0.92, 0.92, 0.88, 0.98],\n            fontColor: [0.16, 0.16, 0.16, 1.0],\n        }));\n        mountRoot.appendChild(toastMount);\n    }\n\n    /* Copy the authoritative, untruncated display value while the pointer activation is still live. */\n    #copyFullCellValue() {\n        const clipboard = globalThis.navigator?.clipboard;\n        if (typeof clipboard?.writeText !== 'function') {\n            console.warn('Cell value copy requires navigator.clipboard.writeText().');\n            return;\n        }\n        const fullCellText = this.#fullCellText();\n        Promise.resolve(clipboard.writeText(fullCellText)).then(() => {\n            if (this.parentNode) {\n                this.#showCopyToast();\n            }\n        }).catch((err) => {\n            console.error('Failed to copy cell value to the clipboard.', err);\n        });\n    }\n\n    #destroyContextMenu() {\n        if (!this.#contextMenu) {\n            return;\n        }\n        const target = this.#contextMenu.ownMount ?? this.#contextMenu;\n        target.parentNode?.removeChild(target);\n        this.#contextMenu = null;\n    }\n\n    /* Insert a one-action menu between secondary release and clipboard mutation. */\n    #openContextMenu() {\n        this.#clearToastWake();\n        this.#dropHoverPopup();\n        this.#destroyContextMenu();\n        const stage = this.scene?.stage ?? null;\n        const hudMountRoot = stage?.hudMountRoot?.('contextMenu') ?? null;\n        const parent = hudMountRoot ?? this;\n        const placement = hudMountRoot\n            ? (stage.pointerPointToHud?.([Mouse.x, Mouse.y], hudMountRoot) ?? [0, 0, 0])\n            : (this.getLocalMousePosition?.() ?? [0, 0, 0]);\n        const menu = ui.ContextMenu.mount(parent, {\n            x: placement[0] ?? 0,\n            y: placement[1] ?? 0,\n            z: -4,\n            font: this.toastFont,\n            fontSize: Math.max(12, this.toastFontSize ?? 18),\n            items: [{\n                label: 'Copy value',\n                onInput: () => {\n                    this.#destroyContextMenu();\n                    this.#copyFullCellValue();\n                },\n            }],\n        });\n        menu.destroy = () => this.#destroyContextMenu();\n        this.#contextMenu = menu;\n    }\n\n    onInput(event) {\n        if (event !== 'R_MOUSE_UP') {\n            return false;\n        }\n        this.#openContextMenu();\n        return true;\n    }\n\n    /* Arm one one-shot dwell timer instead of any per-frame hover polling. */\n    onHoverEnter() {\n        this.#clearHideWake();\n        if (this.#hoverPopupMount || !this.#wantsHoverToast() || this.#ownToastWake !== null) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.#ownToastWake = this.thinkAt(nowS + FULLSCREEN_HEADER_TOAST_DWELL_S, () => {\n            this.#showHoverToast();\n        });\n    }\n\n    /* Hold briefly before hiding so single-frame hover churn does not immediately dismiss the popup. */\n    onHoverExit() {\n        this.#clearToastWake();\n        if (!this.#hoverPopupMount || this.#ownHideWake !== null) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.#ownHideWake = this.thinkAt(nowS + FULLSCREEN_HEADER_TOAST_HIDE_GRACE_S, () => {\n            this.#ownHideWake = null;\n            if (this._mouseIsHovering === true) {\n                return;\n            }\n            this.#dropHoverPopup();\n        });\n    }\n\n    /* Keep hover tests and production ClickArea semantics aligned even when a test double omits the inherited hooks. */\n    _onHoverEnter() {\n        this._mouseIsHovering = true;\n        this.onHoverEnter();\n    }\n\n    /* Clear the retained hover flag before exit handling so the dwell callback cannot race with teardown. */\n    _onHoverExit() {\n        this._mouseIsHovering = false;\n        this.onHoverExit();\n    }\n\n    /* Drop any pending dwell timer so detached body hover chrome cannot emit stale toasts later. */\n    _onDetachNode(shared) {\n        this.#clearToastWake();\n        this.#clearHideWake();\n        this.#dropHoverPopup();\n        this.#destroyContextMenu();\n        super._onDetachNode(shared);\n    }\n}\n\nfunction renderedLineCount(text) {\n    if (typeof text !== 'string' || text.length === 0) {\n        return 1;\n    }\n    return text.split('\\n').length;\n}\n\n/* Shift one prebuilt rect stream by a fixed offset so one text node can pack multiple row-local layouts. */\nfunction appendOffsetRects(out, rects, xOffset = 0, yOffset = 0) {\n    for (let i = 0; i < rects.length; i += 4) {\n        out.push(\n            rects[i] + xOffset,\n            rects[i + 1] + yOffset,\n            rects[i + 2] + xOffset,\n            rects[i + 3] + yOffset,\n        );\n    }\n}\n\n/* Format one visible cell exactly once so chunk payload building preserves the current display contract. */\nfunction formatChunkCellText(data, style, col, rowEntry, lineLimit = null) {\n    const name = col.text ?? col.name;\n    const field = data.field(name);\n    const rawValue = previewDisplayCell(field, rowEntry);\n    const hasValue = !(rawValue === null || rawValue === undefined);\n    const reserveSign = fieldReservesSignSlot(field);\n    let width = cellTextContentWidth(col, style);\n    let limit = null;\n    let text = hasValue ? String(rawValue) : NULL_CELL_TEXT;\n    let hiddenGlyphCount = 0;\n    if (reserveSign) {\n        width = Math.max(0, width - glyphAdvancePx(style.font.fontData, style.fontSize, ASCII_MINUS_CODEPOINT));\n        const isNegative = text.startsWith('-');\n        text = isNegative ? text.slice(1) : text;\n        hiddenGlyphCount = isNegative ? 0 : 1;\n    }\n    if (lineLimit !== null) {\n        limit = lineLimit;\n    }\n    const formatted = textutils.formatCellValueLayout(text, width, style, limit);\n    return {\n        ...formatted,\n        lineCount: renderedLineCount(formatted?.text ?? ''),\n        reserveSign,\n        hiddenGlyphCount,\n    };\n}\n\n/* Build one bytes-backed column text payload directly from ptrless storage when row boundaries can be encoded as fixed line steps. */\nfunction buildFastChunkColumnTextShape(data, style, col, rows, lineAdvance, rowLineCapacity, rowAdvance) {\n    const name = col.text ?? col.name;\n    const field = data.field(name);\n    const width = cellTextContentWidth(col, style);\n    if (rowLineCapacity !== 1 || !canUseBytesTextFastPath(field, width, style)) {\n        return null;\n    }\n    const codepoints = [];\n    const glyphColors = [];\n    let hasClippedTail = false;\n    for (let i = 0; i < rows.length; i++) {\n        if (i > 0) {\n            codepoints.push(ASCII_NEWLINE_CODEPOINT);\n        }\n        const rowStart = codepoints.length;\n        const clipped = appendSingleLineUtf8CellCodepoints(codepoints, field, rows[i].entry, width, style);\n        const rowCodepoints = codepoints.slice(rowStart);\n        hasClippedTail = appendCellGlyphColors(\n            glyphColors,\n            style.cellTextColor,\n            style.font.fontData,\n            rowCodepoints,\n            clipped,\n        ) || hasClippedTail;\n    }\n    const textState = {\n        font: style.font,\n        fontSize: style.fontSize,\n        codepoints: Uint32Array.from(codepoints),\n        lineAdvance: rowAdvance,\n        glyphColors: hasClippedTail ? Float32Array.from(glyphColors) : null,\n    };\n    const shape = evilfont.buildTextShape(textState);\n    return {\n        ...textState,\n        prebuiltLayout: shape.layout,\n        prebuiltGlyphData: shape.glyphData,\n    };\n}\n\n/* Prepare one chunk's per-column text payloads as pure data so later phases can move this work off-thread. */\nfunction buildChunkColumnTextPayloads(data, style, columns, rowLayout) {\n    const firstCol = columns[0] ?? null;\n    const lastCol = columns.length > 0 ? columns[columns.length - 1] : null;\n    const rows = rowLayout?.rows ?? [];\n    const lineAdvance = previewLineHeight(style);\n    const rowAdvance = rows.length > 1\n        ? rows[1].y - rows[0].y\n        : (style.fixedRowHeight ?? lineAdvance);\n    const usableRowHeight = Math.max(0, (style.fixedRowHeight ?? 0) - style.cellPadding);\n    const rowLineCapacity = Math.max(1, Math.floor((usableRowHeight + 0.01) / Math.max(1, lineAdvance)));\n    const textPayloads = [];\n    const hoverTargets = [];\n    for (const col of columns) {\n        const name = col.text ?? col.name;\n        const field = data.field(name);\n        const fastState = buildFastChunkColumnTextShape(data, style, col, rows, lineAdvance, rowLineCapacity, rowAdvance);\n        if (fastState) {\n            for (const row of rows) {\n                hoverTargets.push({\n                    x: col.x,\n                    y: row.y,\n                    width: col.width,\n                    height: row.height,\n                    columnName: name,\n                    rowEntry: row.entry,\n                });\n            }\n            textPayloads.push({\n                ...fastState,\n                fontColor: style.cellTextColor,\n                x: col.x + style.cellPadding * 0.5,\n                y: style.cellPadding * 0.5,\n            });\n            continue;\n        }\n        const codepoints = [];\n        const positions = [];\n        const rects = [];\n        const texRects = [];\n        const atlasIndices = [];\n        const glyphColors = [];\n        let hasClippedTail = false;\n        rows.forEach((row) => {\n            const formatted = formatChunkCellText(data, style, col, row.entry, rowLineCapacity);\n            const rowCodepoints = formatted.reserveSign\n                ? Uint32Array.from([ASCII_MINUS_CODEPOINT, ...stringCodepoints(formatted.text)])\n                : stringCodepoints(formatted.text);\n            const rowShape = evilfont.buildTextShape({\n                font: style.font,\n                fontSize: style.fontSize,\n                codepoints: rowCodepoints,\n                lineAdvance,\n            });\n            for (const codepoint of rowShape.layout.codepoints) {\n                codepoints.push(codepoint);\n            }\n            for (let i = 0; i < rowShape.layout.positions.length; i += 2) {\n                positions.push(\n                    rowShape.layout.positions[i],\n                    rowShape.layout.positions[i + 1] + row.y,\n                );\n            }\n            appendOffsetRects(rects, rowShape.glyphData.rects, 0, row.y);\n            texRects.push(...rowShape.glyphData.texRects);\n            atlasIndices.push(...rowShape.glyphData.atlasIndices);\n            hasClippedTail = appendCellGlyphColors(\n                glyphColors,\n                style.cellTextColor,\n                style.font.fontData,\n                rowCodepoints,\n                formatted.clipped,\n                formatted.hiddenGlyphCount ?? 0,\n            ) || hasClippedTail;\n            hoverTargets.push({\n                x: col.x,\n                y: row.y,\n                width: col.width,\n                height: row.height,\n                columnName: name,\n                rowEntry: row.entry,\n            });\n        });\n        const codepointData = Uint32Array.from(codepoints);\n        const textState = {\n            font: style.font,\n            fontSize: style.fontSize,\n            codepoints: codepointData,\n            lineAdvance,\n            glyphColors: hasClippedTail ? Float32Array.from(glyphColors) : null,\n        };\n        textPayloads.push({\n            ...textState,\n            prebuiltLayout: {\n                width: cellTextContentWidth(col, style),\n                height: rowLayout.chunkHeight,\n                lineHeight: lineAdvance,\n                lineAdvance,\n                positions: Float32Array.from(positions),\n                codepoints: codepointData,\n            },\n            prebuiltGlyphData: {\n                glyphCount: codepoints.length,\n                rects: Float32Array.from(rects),\n                texRects: Float32Array.from(texRects),\n                atlasIndices: Uint8Array.from(atlasIndices),\n            },\n            fontColor: style.cellTextColor,\n            x: col.x + style.cellPadding * 0.5,\n            y: style.cellPadding * 0.5,\n        });\n    }\n    return {\n        bandStartX: firstCol?.x ?? 0,\n        bandEndX: lastCol ? lastCol.x + lastCol.width : (firstCol?.x ?? 0),\n        textPayloads,\n        hoverTargets,\n    };\n}\n\n/* Build stable row geometry once so later x-band swaps keep y layout fixed. */\nfunction buildChunkRowLayout({\n    data,\n    style,\n    header,\n    previewMaxHeight,\n    origin,\n    entriesBounds,\n    allColumns,\n}) {\n    const maxRows = header.dataSize !== undefined ? header.dataSize : Infinity;\n    const actualLast = Math.min(entriesBounds.last, maxRows);\n    const previewMaxY = Number.isFinite(previewMaxHeight) ? previewMaxHeight : null;\n    const fixedRowHeight = Number.isFinite(style.fixedRowHeight) && style.fixedRowHeight > 0\n        ? style.fixedRowHeight\n        : defaultPreviewRowHeight(style);\n    const rows = [];\n    let y = 0;\n\n    for (let i = entriesBounds.first; i < actualLast; ++i) {\n        const maxEntryHeight = fixedRowHeight;\n        if (maxEntryHeight <= 0) {\n            break;\n        }\n        // Keep a row whose top is inside the passive preview even when its\n        // bottom crosses the edge. The host viewport's fragment clip then\n        // crops the row precisely instead of dropping the whole text entry.\n        if (previewMaxY !== null && origin + y >= previewMaxY) {\n            break;\n        }\n        rows.push({ entry: i, y, height: maxEntryHeight });\n        y += maxEntryHeight;\n    }\n\n    return { rows, chunkHeight: y };\n}\n\n/* Prepare one chunk's render-ready payload without touching the scene graph. */\nfunction prepareChunkPayload({\n    data,\n    style,\n    header,\n    previewMaxHeight,\n    origin,\n    entriesBounds,\n    columns,\n    allColumns = columns,\n}) {\n    const rowLayout = buildChunkRowLayout({\n        data,\n        style,\n        header,\n        previewMaxHeight,\n        origin,\n        entriesBounds,\n        allColumns,\n    });\n    const text = buildChunkColumnTextPayloads(data, style, columns, rowLayout);\n    return {\n        entriesBounds,\n        columns,\n        rowLayout,\n        chunkHeight: rowLayout.chunkHeight,\n        bandStartX: text.bandStartX,\n        bandEndX: text.bandEndX,\n        textPayloads: text.textPayloads,\n        hoverTargets: text.hoverTargets,\n    };\n}\n\n/* Park live TableView chunk preparation on the main thread until the worker path is fully debugged. */\nfunction runChunkPrepareRequest({ data, header, request }) {\n    return prepareChunkPayload({\n        data,\n        style: request.style,\n        header,\n        previewMaxHeight: request.preview_max_height,\n        origin: request.origin,\n        entriesBounds: request.entries_bounds,\n        columns: request.columns,\n        allColumns: request.all_columns,\n    });\n}\n\nconst TABLEVIEW_LIVE_PROBE_LIMIT = 4096;\nconst g_tableviewChunkLifecycle = {\n    tables_created: 0,\n    chunk_nodes_created: 0,\n    chunk_nodes_attached: 0,\n    chunk_nodes_evicted: 0,\n    chunk_nodes_cleared: 0,\n    prepared_payloads_ready: 0,\n    prepared_payloads_attached: 0,\n    prepared_payloads_cleared: 0,\n    queued_requests_created: 0,\n    queued_requests_cleared: 0,\n    current_chunk_records: 0,\n    current_attached_chunks: 0,\n    current_ready_payloads: 0,\n    current_queued_requests: 0,\n};\nfunction noteTableviewLiveProbe(entry) {\n    globalThis.__tableviewLiveProbe?.note?.(entry);\n}\n\nfunction makeTableviewMSDFText(state) {\n    return new evilfont.MSDFText(state);\n}\n\n/* Keep one process-wide chunk lifecycle ledger so leak probes can compare current cache state with cumulative churn. */\nfunction noteChunkLifecycleDelta(delta = {}) {\n    for (const [key, value] of Object.entries(delta)) {\n        if (!Number.isFinite(value) || value === 0) {\n            continue;\n        }\n        const next = (g_tableviewChunkLifecycle[key] ?? 0) + value;\n        if (key.startsWith('current_') && next < 0) {\n            throw new Error(`noteChunkLifecycleDelta(...): '${key}' underflowed to ${next}.`);\n        }\n        g_tableviewChunkLifecycle[key] = next;\n    }\n}\n\n/* Read one stable copy of the global chunk lifecycle ledger for browser leak bundles. */\nexport function testingTableviewChunkLifecycleSummary() {\n    return { ...g_tableviewChunkLifecycle };\n}\n\n/* Read one typed array backing-store size without inventing bytes for ordinary JS objects. */\nfunction byteLengthOf(value) {\n    return ArrayBuffer.isView(value) ? value.byteLength : 0;\n}\n\n/* Price one retained text node by the exact typed-array payload it still owns after chunk attachment. */\nfunction summarizeRetainedTextNodeMemory(node) {\n    const layout = node?._layout ?? null;\n    const glyphData = typeof node?.glyphData === 'function' ? node.glyphData() : null;\n    const glyphColors = node?.state?.glyphColors ?? null;\n    const codepointsBytes = byteLengthOf(layout?.codepoints);\n    const positionsBytes = byteLengthOf(layout?.positions);\n    const rectsBytes = byteLengthOf(glyphData?.rects);\n    const texRectsBytes = byteLengthOf(glyphData?.texRects);\n    const atlasIndicesBytes = byteLengthOf(glyphData?.atlasIndices);\n    const glyphColorsBytes = byteLengthOf(glyphColors);\n    const glyphCount = glyphData?.glyphCount ?? layout?.codepoints?.length ?? 0;\n    return {\n        glyph_count: glyphCount,\n        exact_bytes: {\n            codepoints: codepointsBytes,\n            positions: positionsBytes,\n            rects: rectsBytes,\n            tex_rects: texRectsBytes,\n            atlas_indices: atlasIndicesBytes,\n            glyph_colors: glyphColorsBytes,\n            total: codepointsBytes + positionsBytes + rectsBytes + texRectsBytes + atlasIndicesBytes + glyphColorsBytes,\n        },\n        shell_counts: {\n            node: 1,\n            prebuilt_layout_object: layout ? 1 : 0,\n            prebuilt_glyph_data_object: glyphData ? 1 : 0,\n        },\n    };\n}\n\n/* Summarise one text-node collection so chunk and header text can share one memory-accounting path. */\nfunction summarizeTextNodeCollection(texts) {\n    const exact = {\n        codepoints: 0,\n        positions: 0,\n        rects: 0,\n        tex_rects: 0,\n        atlas_indices: 0,\n        glyph_colors: 0,\n        total: 0,\n    };\n    let glyphCount = 0;\n    let textLayoutObjects = 0;\n    let textGlyphDataObjects = 0;\n    for (const node of texts) {\n        const textMem = summarizeRetainedTextNodeMemory(node);\n        glyphCount += textMem.glyph_count;\n        exact.codepoints += textMem.exact_bytes.codepoints;\n        exact.positions += textMem.exact_bytes.positions;\n        exact.rects += textMem.exact_bytes.rects;\n        exact.tex_rects += textMem.exact_bytes.tex_rects;\n        exact.atlas_indices += textMem.exact_bytes.atlas_indices;\n        exact.glyph_colors += textMem.exact_bytes.glyph_colors;\n        textLayoutObjects += textMem.shell_counts.prebuilt_layout_object;\n        textGlyphDataObjects += textMem.shell_counts.prebuilt_glyph_data_object;\n    }\n    exact.total = exact.codepoints + exact.positions + exact.rects + exact.tex_rects + exact.atlas_indices + exact.glyph_colors;\n    return {\n        text_nodes: texts.length,\n        glyph_count: glyphCount,\n        exact_typed_array_bytes: exact,\n        shell_counts: {\n            text_nodes: texts.length,\n            text_layout_objects: textLayoutObjects,\n            text_glyph_data_objects: textGlyphDataObjects,\n        },\n        rebuild_working_set_bytes: summarizeChunkTextSyncWorkingSet(glyphCount, texts.length),\n    };\n}\n\n/* Summarise one prepared text payload so ready-but-unattached chunk buffers stay visible in leak probes. */\nfunction summarizePreparedTextPayloadMemory(textState) {\n    const layout = textState?.prebuiltLayout ?? null;\n    const glyphData = textState?.prebuiltGlyphData ?? null;\n    const glyphColors = textState?.glyphColors ?? null;\n    const codepointsBytes = byteLengthOf(layout?.codepoints ?? textState?.codepoints ?? null);\n    const positionsBytes = byteLengthOf(layout?.positions);\n    const rectsBytes = byteLengthOf(glyphData?.rects);\n    const texRectsBytes = byteLengthOf(glyphData?.texRects);\n    const atlasIndicesBytes = byteLengthOf(glyphData?.atlasIndices);\n    const glyphColorsBytes = byteLengthOf(glyphColors);\n    const glyphCount = glyphData?.glyphCount ?? layout?.codepoints?.length ?? textState?.codepoints?.length ?? 0;\n    return {\n        glyph_count: glyphCount,\n        exact_typed_array_bytes: {\n            codepoints: codepointsBytes,\n            positions: positionsBytes,\n            rects: rectsBytes,\n            tex_rects: texRectsBytes,\n            atlas_indices: atlasIndicesBytes,\n            glyph_colors: glyphColorsBytes,\n            total: codepointsBytes + positionsBytes + rectsBytes + texRectsBytes + atlasIndicesBytes + glyphColorsBytes,\n        },\n        shell_counts: {\n            text_payload_object: 1,\n            prebuilt_layout_object: layout ? 1 : 0,\n            prebuilt_glyph_data_object: glyphData ? 1 : 0,\n        },\n    };\n}\n\n/* Summarise one row-band cache record so retained row-layout shells are visible alongside chunk buffers. */\nfunction summarizeRowBandMemory(record) {\n    const rows = record?.rowLayout?.rows ?? [];\n    return {\n        row_band: record?.id ?? null,\n        first_entry: record?.entriesBounds?.first ?? null,\n        last_entry: record?.entriesBounds?.last ?? null,\n        chunk_height: record?.chunkHeight ?? 0,\n        row_count: rows.length,\n        shell_counts: {\n            row_band_record: record ? 1 : 0,\n            entries_bounds_object: record?.entriesBounds ? 1 : 0,\n            row_layout_object: record?.rowLayout ? 1 : 0,\n            row_layout_rows_array: Array.isArray(rows) ? 1 : 0,\n            row_objects: rows.length,\n        },\n    };\n}\n\n/* Summarise one deferred payload record so unattached chunk work can be budgeted separately from live scene nodes. */\nfunction summarizePreparedPayloadMemory(record) {\n    const payload = record?.payload ?? null;\n    if (!payload) {\n        return null;\n    }\n    const textPayloads = payload.textPayloads ?? [];\n    const rows = payload.rowLayout?.rows ?? [];\n    const exact = {\n        codepoints: 0,\n        positions: 0,\n        rects: 0,\n        tex_rects: 0,\n        atlas_indices: 0,\n        glyph_colors: 0,\n        total: 0,\n    };\n    let glyphCount = 0;\n    let textLayoutObjects = 0;\n    let textGlyphDataObjects = 0;\n    for (const textState of textPayloads) {\n        const mem = summarizePreparedTextPayloadMemory(textState);\n        glyphCount += mem.glyph_count;\n        exact.codepoints += mem.exact_typed_array_bytes.codepoints;\n        exact.positions += mem.exact_typed_array_bytes.positions;\n        exact.rects += mem.exact_typed_array_bytes.rects;\n        exact.tex_rects += mem.exact_typed_array_bytes.tex_rects;\n        exact.atlas_indices += mem.exact_typed_array_bytes.atlas_indices;\n        exact.glyph_colors += mem.exact_typed_array_bytes.glyph_colors;\n        textLayoutObjects += mem.shell_counts.prebuilt_layout_object;\n        textGlyphDataObjects += mem.shell_counts.prebuilt_glyph_data_object;\n    }\n    exact.total = exact.codepoints + exact.positions + exact.rects + exact.tex_rects + exact.atlas_indices + exact.glyph_colors;\n    return {\n        key: record.key,\n        row_band: record.rowBand,\n        col_band: record.colBand,\n        rows: rows.length,\n        columns: payload.columns?.length ?? 0,\n        text_payloads: textPayloads.length,\n        glyph_count: glyphCount,\n        exact_typed_array_bytes: exact,\n        shell_counts: {\n            chunk_record: 1,\n            payload_object: 1,\n            entries_bounds_object: payload.entriesBounds ? 1 : 0,\n            columns_array: Array.isArray(payload.columns) ? 1 : 0,\n            row_layout_object: payload.rowLayout ? 1 : 0,\n            row_layout_rows_array: Array.isArray(rows) ? 1 : 0,\n            row_objects: rows.length,\n            text_payload_objects: textPayloads.length,\n            text_layout_objects: textLayoutObjects,\n            text_glyph_data_objects: textGlyphDataObjects,\n        },\n    };\n}\n\n/* Summarise one queued request snapshot so async-seam copies stay visible even before payload build completes. */\nfunction summarizeQueuedChunkRequestMemory(record) {\n    const request = record?.request ?? null;\n    if (!request) {\n        return null;\n    }\n    return {\n        key: record.key,\n        row_band: record.rowBand,\n        col_band: record.colBand,\n        rows: request.entries_bounds && Number.isFinite(request.entries_bounds.first) && Number.isFinite(request.entries_bounds.last)\n            ? Math.max(0, request.entries_bounds.last - request.entries_bounds.first)\n            : 0,\n        columns: request.columns?.length ?? 0,\n        all_columns: request.all_columns?.length ?? 0,\n        shell_counts: {\n            chunk_record: 1,\n            request_object: 1,\n            entries_bounds_object: request.entries_bounds ? 1 : 0,\n            columns_array: Array.isArray(request.columns) ? 1 : 0,\n            all_columns_array: Array.isArray(request.all_columns) ? 1 : 0,\n        },\n        borrowed_refs: {\n            style: request.style ? 1 : 0,\n            column_refs: request.columns?.length ?? 0,\n            all_column_refs: request.all_columns?.length ?? 0,\n        },\n    };\n}\n\n/* Price one full text-batch rebuild from glyph/span counts so churn can be compared with retained state. */\nfunction summarizeChunkTextSyncWorkingSet(glyphCount, spanCount) {\n    const fullGlyphArraysBytes = glyphCount * (16 + 16 + 4 + 16 + 4 + 4 + 4);\n    const spanMatricesBytes = spanCount * 64;\n    const spanTextureUploadBytes = spanCount * 64;\n    return {\n        full_sync_arrays: {\n            glyph_instance_arrays: fullGlyphArraysBytes,\n            span_matrices: spanMatricesBytes,\n            span_texture_upload: spanTextureUploadBytes,\n            total: fullGlyphArraysBytes + spanMatricesBytes + spanTextureUploadBytes,\n        },\n        transform_only_arrays: {\n            span_matrices: spanMatricesBytes,\n            span_texture_upload: spanTextureUploadBytes,\n            total: spanMatricesBytes + spanTextureUploadBytes,\n        },\n        color_only_arrays: {\n            glyph_colors: glyphCount * 16,\n            total: glyphCount * 16,\n        },\n    };\n}\n\n/* Summarise one attached chunk in terms of exact retained typed arrays plus shell counts and rebuild maths. */\nfunction summarizeAttachedChunkMemory(record) {\n    const chunk = record?.node ?? null;\n    if (!chunk) {\n        return null;\n    }\n    const rows = chunk.rowLayout?.rows ?? [];\n    const texts = (chunk.children ?? []).filter((child) => child instanceof evilfont.MSDFText);\n    const textSummary = summarizeTextNodeCollection(texts);\n    return {\n        key: record.key,\n        row_band: record.rowBand,\n        col_band: record.colBand,\n        rows: rows.length,\n        columns: chunk.columns?.length ?? record.columnCount ?? 0,\n        text_nodes: textSummary.text_nodes,\n        glyph_count: textSummary.glyph_count,\n        scene_graph_nodes: 1 + texts.length,\n        ptrless_shared_refs: {\n            table_struct_on_chunk: chunk.data ? 1 : 0,\n            shared_column_objects: chunk.columns?.length ?? 0,\n            shared_row_layout: chunk.rowLayout ? 1 : 0,\n        },\n        shell_counts: {\n            chunk_node: 1,\n            text_nodes: texts.length,\n            row_layout_object: chunk.rowLayout ? 1 : 0,\n            row_layout_rows_array: Array.isArray(rows) ? 1 : 0,\n            row_objects: rows.length,\n            columns_array: Array.isArray(chunk.columns) ? 1 : 0,\n            entries_bounds_object: chunk.entriesBounds ? 1 : 0,\n            text_layout_objects: textSummary.shell_counts.text_layout_objects,\n            text_glyph_data_objects: textSummary.shell_counts.text_glyph_data_objects,\n        },\n        exact_typed_array_bytes: textSummary.exact_typed_array_bytes,\n        rebuild_working_set_bytes: textSummary.rebuild_working_set_bytes,\n    };\n}\n\n/* Route TableView-local perf counters through the shared tracker using deterministic names. */\nfunction tableviewPerfTracker() {\n    return globalThis.__eviluiPerformanceTracker ?? null;\n}\n\n/* Keep per-table timer names deterministic so snapshots can be filtered by one TableView instance. */\nfunction tableviewPerfMetricName(tableview, kind) {\n    const name = tableview?.state?.name ?? 'unknown';\n    return `tableview.${kind}.${name}`;\n}\n\n/* Start one TableView-scoped timer inside the shared performance tracker. */\nfunction beginTableviewPerf(tableview, kind) {\n    return tableviewPerfTracker()?.beginTimer(tableviewPerfMetricName(tableview, kind));\n}\n\n/* Close one TableView-scoped timer inside the shared performance tracker. */\nfunction endTableviewPerf(tableview, kind, token) {\n    tableviewPerfTracker()?.endTimer(tableviewPerfMetricName(tableview, kind), token);\n}\n\n/* Count one TableView-scoped event so chunk churn can be compared between runs. */\nfunction countTableviewPerf(tableview, kind, delta = 1) {\n    tableviewPerfTracker()?.incrementCounter(tableviewPerfMetricName(tableview, kind), delta);\n}\n\n/* Pick the hottest matching perf entries without exposing the whole global tracker dump. */\nfunction topTableviewPerfEntries(entries, include, valueKey, limit = 8) {\n    if (!entries) {\n        return [];\n    }\n    return Object.entries(entries)\n        .filter(([key, value]) => include(key) && Number.isFinite(value?.[valueKey]))\n        .map(([key, value]) => ({\n            key,\n            value: value[valueKey],\n        }))\n        .sort((a, b) => {\n            if (a.value !== b.value) {\n                return b.value - a.value;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, limit);\n}\n\n/* Summarise one line's recent TableView trace so Firefox runs are easy to compare. */\nfunction summarizeTableviewTraceForLine(lineNum) {\n    const events = testingTableviewTrace().filter((entry) => entry.line === lineNum);\n    const counts = new Map();\n    for (const entry of events) {\n        counts.set(entry.event, (counts.get(entry.event) ?? 0) + 1);\n    }\n    const topEvents = Array.from(counts.entries())\n        .map(([key, count]) => ({ key, count }))\n        .sort((a, b) => {\n            if (a.count !== b.count) {\n                return b.count - a.count;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, 12);\n    return {\n        event_count: events.length,\n        top_events: topEvents,\n        recent_events: events.slice(-20),\n    };\n}\n\n// Descendants inherit visibility; preserve their own caret blink and focus states.\nfunction setControlVisible(node, visible) {\n    if (!node) {\n        return;\n    }\n    if (typeof node.setVisibility === 'function') {\n        node.setVisibility(visible);\n    } else {\n        node.visible = visible;\n    }\n    if (typeof node.setEnabled === 'function') {\n        node.setEnabled(visible);\n    } else if ('enabled' in node) {\n        node.enabled = visible;\n    }\n}\n\nclass TableViewFullscreenChrome {\n    constructor(owner, mountParent, assignmentDraft) {\n        this.owner = owner;\n        this.mountParent = mountParent;\n        this.assignmentDraft = assignmentDraft;\n        this.mount = null;\n        this.toolbarHost = null;\n        this.closeButton = null;\n        this.saveButton = null;\n        this.assignInputCell = null;\n        this.assignLabel = null;\n        this.goToTopButton = null;\n        this.goToBotButton = null;\n    }\n\n    controls() {\n        return {\n            close: this.closeButton,\n            save: this.saveButton,\n            assignInput: this.assignInputCell,\n            assignLabel: this.assignLabel,\n            top: this.goToTopButton,\n            bottom: this.goToBotButton,\n        };\n    }\n\n    attach({ includeJumpButtons = true, toolbarHost = null, font = null, fontSize = 16 } = {}) {\n        if (this.mount) {\n            return;\n        }\n        const mount = new ui.Placeholder();\n        this.mountParent.appendChild(mount);\n        this.mount = mount;\n        this.toolbarHost = toolbarHost ?? mount;\n\n        this.closeButton = new ui.Button({\n            name: 'closeButton',\n            width: TABLE_INSPECT_TOOLBAR_HEIGHT,\n            height: TABLE_INSPECT_TOOLBAR_HEIGHT,\n            x: 0,\n            y: 0,\n            z: -1.0,\n            color: Palette.red,\n            onHoverColor: Palette.teal,\n            iconID: 3,\n            iconSize: [TABLE_INSPECT_TOOLBAR_ACTION_ICON_SIZE, TABLE_INSPECT_TOOLBAR_ACTION_ICON_SIZE],\n            iconColor: Palette.white,\n        });\n        this.closeButton.onInput = ui.Button.onPrimaryRelease(() => {\n            this.owner.requestDiscardTableview();\n        });\n        if (!this.owner.readOnly) {\n            this.saveButton = new ui.Button({\n                name: 'saveButton',\n                font,\n                fontSize,\n                tooltipEnabled: true,\n                tooltipText: 'Save changes and leave',\n                width: this.closeButton.width,\n                height: this.closeButton.height,\n                x: 0,\n                y: 0,\n                z: -1.0,\n                color: Palette.teal,\n                iconID: 42,\n                iconSize: [TABLE_INSPECT_TOOLBAR_ACTION_ICON_SIZE, TABLE_INSPECT_TOOLBAR_ACTION_ICON_SIZE],\n                iconColor: Palette.white,\n            });\n            this.toolbarHost.appendChild(this.saveButton);\n        }\n        this.toolbarHost.appendChild(this.closeButton);\n\n        if (!this.owner.readOnly && toolbarHost && font) {\n            this.assignInputCell = new ui.InputCell({\n                name: 'assignInputCell',\n                font,\n                fontSize,\n                textInput: this.assignmentDraft.text,\n                cursorIndex: this.assignmentDraft.text.length,\n                onTextChange: (text) => { this.assignmentDraft.text = text; },\n                width: TABLE_INSPECT_ASSIGN_INPUT_WIDTH,\n                height: TABLE_INSPECT_ASSIGN_INPUT_HEIGHT,\n                paddingX: 5,\n                x: 0,\n                y: 0,\n                z: -1.0,\n                focusContainerOwner: this.owner,\n                shape: ui.shapes.rounded({\n                    cornerRadius: TABLE_INSPECT_ASSIGN_INPUT_HEIGHT * 0.5,\n                }),\n                material: ui.materials.solid(),\n            });\n            this.assignLabel = new evilfont.MSDFText({\n                name: 'assignLabel',\n                font,\n                fontSize,\n                text: TABLE_INSPECT_ASSIGN_LABEL,\n                fontColor: Palette.grey,\n                z: -1.0,\n            });\n            this.toolbarHost.appendChild(this.assignLabel);\n            this.toolbarHost.appendChild(this.assignInputCell);\n        }\n\n        if (this.saveButton) this.saveButton.onInput = ui.Button.onPrimaryRelease(() => {\n            const variableName = this.assignInputCell?.textInput ?? '';\n            if (!this.owner.requestSaveTableview(variableName)) {\n                this.saveButton.toastText = 'Use a valid variable name.';\n                this.saveButton.displayToast?.();\n            }\n        });\n\n        if (includeJumpButtons) {\n            this.goToTopButton = makeFullscreenChromeIconButton({\n                iconID: 10,\n                onInput: () => {\n                    this.owner.goToChunkByEntry(0);\n                },\n            });\n            mount.appendChild(this.goToTopButton);\n\n            this.goToBotButton = makeFullscreenChromeIconButton({\n                iconID: 11,\n                onInput: () => {\n                    this.owner.goToChunkByEntry(this.owner.dataSize() - 1, { alignBottom: true });\n                },\n            });\n            mount.appendChild(this.goToBotButton);\n        }\n    }\n\n    detach() {\n        if (!this.mount) {\n            return;\n        }\n        this.mountParent.removeChild(this.mount);\n        this.mount = null;\n        this.toolbarHost = null;\n        this.closeButton = null;\n        this.saveButton = null;\n        this.assignInputCell = null;\n        this.assignLabel = null;\n        this.goToTopButton = null;\n        this.goToBotButton = null;\n    }\n\n    syncVisibility(visible) {\n        setControlVisible(this.closeButton, visible);\n        setControlVisible(this.saveButton, visible);\n        setControlVisible(this.assignInputCell, visible);\n        setControlVisible(this.assignLabel, visible);\n        setControlVisible(this.goToTopButton, visible);\n        setControlVisible(this.goToBotButton, visible);\n    }\n\n    position(viewport) {\n        if (!viewport) {\n            return;\n        }\n        const rightX = viewport.maxX;\n        const topY = viewport.minY;\n        const centreY = viewport.minY + viewport.height * 0.5;\n\n        if (this.closeButton) {\n            const btnPos = this.closeButton.localPosition();\n            const hostedInToolbar = this.closeButton.parentNode !== this.mount;\n            btnPos[0] = hostedInToolbar\n                ? (this.closeButton.parentNode?.state?.width ?? viewport.width) - this.closeButton.width - 4\n                : rightX - this.closeButton.width - 5;\n            btnPos[1] = hostedInToolbar ? 0 : topY + 1;\n            this.closeButton.setLocalPosition(btnPos);\n            if (this.saveButton) {\n                const savePos = this.saveButton.localPosition();\n                savePos[0] = btnPos[0] - TABLE_INSPECT_TOOLBAR_BUTTON_GAP - this.saveButton.width;\n                savePos[1] = btnPos[1];\n                this.saveButton.setLocalPosition(savePos);\n                if (this.assignInputCell) {\n                    const inputPos = this.assignInputCell.localPosition();\n                    inputPos[0] = savePos[0] - TABLE_INSPECT_ASSIGN_GAP - TABLE_INSPECT_ASSIGN_INPUT_WIDTH;\n                    inputPos[1] = hostedInToolbar\n                        ? (TABLE_INSPECT_TOOLBAR_HEIGHT - TABLE_INSPECT_ASSIGN_INPUT_HEIGHT) * 0.5\n                        : btnPos[1];\n                    this.assignInputCell.setLocalPosition(inputPos);\n                    if (this.assignLabel) {\n                        const labelPos = this.assignLabel.localPosition();\n                        labelPos[0] = inputPos[0] - TABLE_INSPECT_ASSIGN_GAP - this.assignLabel.width();\n                        labelPos[1] = inputPos[1]\n                            + ((TABLE_INSPECT_ASSIGN_INPUT_HEIGHT - this.assignLabel.height()) * 0.5);\n                        this.assignLabel.setLocalPosition(labelPos);\n                    }\n                }\n            }\n        }\n\n        if (this.goToBotButton && this.goToTopButton) {\n            const botPos = this.goToBotButton.localPosition();\n            const topPos = this.goToTopButton.localPosition();\n\n            botPos[0] = rightX - this.goToBotButton.width;\n            botPos[1] = centreY;\n            this.goToBotButton.setLocalPosition(botPos);\n\n            topPos[0] = rightX - this.goToTopButton.width;\n            topPos[1] = centreY - this.goToTopButton.width;\n            this.goToTopButton.setLocalPosition(topPos);\n        }\n    }\n}\n\nclass Header extends ui.Node {\n    columns = []\n    origin = { x: 0, y: 0 };\n    constructor(state) {\n        super(state);\n        this.style = state.style;\n        this.data = state.data;\n        this.dataSize = state.dataSize;\n        this.height = state.style.headerHeight;\n        this.textBatchScopeKey = state.textBatchScopeKey ?? `${this.state.name}.text`;\n        this.textBatchScopeRoot = state.textBatchScopeRoot ?? null;\n    }\n\n    destroyHeader() {\n        this.removeAllChildren();\n        this.columns = [];\n    }\n\n    buildHeader(columns, totalWidth = null) {\n        this.destroyHeader()\n\n        const addColumn = (metric) => {\n            const columnName = metric.name;\n            const field = this.data.field(columnName);\n            const leadingInset = fieldReservesSignSlot(field)\n                ? glyphAdvancePx(this.style.font.fontData, this.style.fontSize, ASCII_MINUS_CODEPOINT)\n                : 0;\n            const metadata = {\n                alignment: ALIGNMENT.CENTRE,\n                index: metric.index,\n                leadingInset,\n                ...metric.headerMetadata,\n                size: metric.width,\n            }\n\n            const newColumn = new Column(columnName, metric.x, this.style, metadata);\n            this.columns.push(newColumn);\n        }\n\n\n        for (let column of columns) {\n            addColumn(column);\n        }\n\n        // Save total header width\n        this.width = totalWidth ?? (\n            columns.length === 0\n                ? 0\n                : columns[columns.length - 1].x + columns[columns.length - 1].width\n        );\n    }\n\n    setOrigin(y) {\n        this.origin.y = y;\n    }\n\n    /* Keep header-label churn out of the scene-global unscoped text batches. */\n    _textBatchScopeForDescendants(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        return {\n            key: this.textBatchScopeKey,\n            root: this.textBatchScopeRoot ?? this,\n        };\n    }\n\n}\n\n\nclass Column {\n    constructor(text, x, style, metadata) {\n        this.x = x;\n        this.text = text;\n        this.style = style;\n\n        if (!this.style.headerFont) {\n            console.warn(\"Header font not provided.\");\n        }\n\n        if (!Number.isFinite(metadata.size) || metadata.size <= 0) {\n            throw new Error(`Column(${text}) expected a positive metric width, got ${metadata.size}.`);\n        }\n        this.width = metadata.size;\n        this.height = this.style.headerHeight;\n\n        this.alignment = metadata.alignment || ALIGNMENT.CENTRE; //left | center | right\n        this.index = metadata.index;\n        this.leadingInset = metadata.leadingInset ?? 0;\n        this.units = metadata.units ?? null;\n        this.type = metadata.type ?? null;\n        this.sortIconID = metadata.sortIconID;\n        this.piiIconID = metadata.piiIconID;\n        this.nullableIconID = metadata.nullableIconID;\n        this.bottomLayout = metadata.bottomLayout;\n    }\n}\n\nclass Cell extends ui.Node {\n\n    constructor(state, style, x, y, width) {\n        // Cells are plain positioned children within a chunk. Do not inherit\n        // the chunk's scene-graph transform state such as localToParent.\n        super({ x, y });\n        this.width = width;\n        this.style = style;\n    }\n    createEntry(value = \"defaultValue\") {\n\n        const entrylayout = evilfont.MSDFText.measureFromState({\n            font: this.style.font,\n            fontSize: this.style.fontSize,\n            text: String(value),\n        });\n\n        let entry = null;\n        //temporary test on male female icons\n        // if (value === \"1\" || value === \"2\") {\n        //     entry = new ui.Tile({\n        //         x: this.x + this.width * 0.5 - 24 * 0.5,\n        //         y: this.y + this.padding * 0.5,\n        //         z: -1,\n        //         color: [1, 1, 1, 1],\n        //         width: 24,\n        //         height: 24,\n        //         iconID: value === \"1\" ? 5 : 4\n        //     });\n        //     this.height = 24;\n\n        // } else {\n\n        entry = makeTableviewMSDFText({\n            font: this.style.font,\n            fontSize: this.style.fontSize,\n            text: String(value),\n            fontColor: this.style.cellTextColor,\n            x: this.width * 0.5 - entrylayout.width * 0.5, //alignment required here\n            y: this.style.cellPadding * 0.5\n        })\n        this.height = entrylayout.height + this.style.cellPadding\n\n        if (entry) {\n            this.appendChild(entry)\n        }\n    }\n}\n\n/*\n    An \"placeholder\" like node that handles the rendering and \n    processing of a group of cells.\n*/\nexport class Chunk extends ui.Node {\n\n\n    constructor(state, origin, header) {\n        super({ ...state, y: origin });\n        this.style = state.style;\n        this.data = state.data;\n        this.ownerTableview = state.ownerTableview ?? null;\n\n        this.origin = origin;\n        this.header = header;\n        this.previewMaxHeight = state.previewMaxHeight ?? null;\n        this.textBatchScopeKey = state.textBatchScopeKey ?? this.state.name;\n        this.textBatchScopeRoot = state.textBatchScopeRoot ?? null;\n        this.rowBand = state.rowBand ?? null;\n        this.colBand = state.colBand ?? null;\n        this.entriesBounds = null;\n        this.columns = null;\n        this.rowLayout = null;\n        this.bandStartX = 0;\n        this.bandEndX = 0;\n    }\n\n    // Keep chunk-local text in its own scope so scrolling can vary one chunk\n    // transform at draw time instead of rewriting every descendant span matrix.\n    _textBatchScopeForDescendants(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        return {\n            key: this.textBatchScopeKey,\n            root: this.textBatchScopeRoot ?? this,\n        };\n    }\n\n    /* Attach one prepared payload to this chunk so async phases can keep scene-graph work narrow and deterministic. */\n    applyPreparedPayload(payload) {\n        this.removeAllChildren();\n        this.entriesBounds = payload?.entriesBounds ?? null;\n        this.columns = payload?.columns ?? null;\n        this.rowLayout = payload?.rowLayout ?? null;\n        this.bandStartX = payload?.bandStartX ?? 0;\n        this.bandEndX = payload?.bandEndX ?? this.bandStartX;\n        const textPayloads = payload?.textPayloads ?? [];\n        for (const textState of textPayloads) {\n            const textNode = makeTableviewMSDFText({\n                font: textState.font ?? this.style.font,\n                ...textState,\n            });\n            if (textNode) {\n                this.appendChild(textNode);\n            }\n        }\n        const hoverTargets = payload?.hoverTargets ?? [];\n        for (const target of hoverTargets) {\n            const hoverArea = new CellHoverToastArea({\n                x: target.x,\n                y: target.y,\n                width: target.width,\n                height: target.height,\n                ownerTableview: this.ownerTableview,\n                columnName: target.columnName,\n                rowEntry: target.rowEntry,\n                toastFont: this.style.font,\n                toastFontSize: Math.max(12, this.style.fontSize - 2),\n            });\n            // Cell text is moved by the chunk's draw-time presentation offset.\n            // Give the pickable area the identical motion contract so its hit\n            // rectangle stays on top of the rendered cell during live scroll.\n            hoverArea.setPresentationOffsetProvider(({ scene }) => this._presentationOffsetPayload(scene));\n            this.appendChild(hoverArea);\n        }\n        this.chunkHeight = payload?.chunkHeight ?? this.rowLayout?.chunkHeight ?? 0;\n        this.end = this.origin + this.chunkHeight;\n        return {\n            cells: hoverTargets.length,\n            textNodes: textPayloads.length,\n        };\n    }\n\n}\nexport class TableView extends ui.Node {\n\n    focusContainerKind = 'TableView';\n\n    // Rebuild visuals without removing lifetime-bound children such as window source leases.\n    #contentMount = new ui.Placeholder({ name: 'tableview.content' });\n\n    anchor = 0;\n    #rowBandSize = 16; //in entries\n    #rowDrawDistance = 5; //in row bands for evicting\n    #columnBandSize = DEFAULT_COLUMN_WINDOW;\n    #columnDrawDistance = 1;\n    #chunkBuildBudget = 6;\n    #startingEntry = 0;\n    highestEntryOrigin = 0;\n    #lastEntry = 0;\n\n    #dataSize = 0; \n    #lineOnPuffbook = 0;\n    #columnStart = 0;\n    #columnCount = DEFAULT_COLUMN_WINDOW;\n    #columnMetrics = [];\n    #metricColumns = null;\n    #needsInteractiveRefresh = false;\n    readyToScreenshot = false;\n    #rowBandMap = null;\n    #chunkMap = null;\n    #chunkMount = null;\n    #chunkLayoutBodyTop = 0;\n    #currentRowBand = 0;\n    #columnBandStart = 0;\n    #columnBandCount = 0;\n\n    exportCTXMenu = null;\n    columnCTXMenu = null;\n\n    #data = null;\n    #style = null;\n    #ownOnApplyAmend = null;\n    #presentationMode = TABLEVIEW_PRESENTATION_MODE.PREVIEW;\n    #refreshing = false;\n    #staleIndicator = null;\n    #refreshBuildPending = false;\n    #headerTooltipController = null;\n    header = null;\n    columns = [];\n    isScreenshot = false;\n    inlineInputEnabled = false;\n\n    #fullscreenChrome = null;\n    #separatorMount = null;\n    #emptyLabel = null;\n    #scrollX = 0;\n    #scrollY = 0;\n    #viewportSyncDirty = true;\n    #preferredPreviewHeightCache = null;\n    #preferredPreviewHeightCacheMax = null;\n    #preferredPreviewHeightDirty = true;\n    #throwVelocityX = 0;\n    #throwVelocityY = 0;\n    #currentThrowVelocityX = 0;\n    #currentThrowVelocityY = 0;\n    #diagLastReconcile = { built: 0, duration_ms: 0, wanted_cols_start: 0, wanted_cols_end: 0 };\n    #diagLastRenderWindow = { duration_ms: 0, visible_count: 0, total_count: 0 };\n    #diagLastUpdateChunk = { duration_ms: 0 };\n    #diagLastColumnWindow = { changed: false, duration_ms: 0, header_duration_ms: 0, separators_duration_ms: 0, built: 0 };\n    #previewHints = null;\n    #previewSizing = null;\n    #previewWheelEscapeUntilS = null;\n    #headerMount = null;\n    #bodyMount = null;\n    #zebraMount = null;\n    #zebraLayer = null;\n    #liveFrameSyncIndex = -1;\n    #liveFrameSyncing = false;\n    #chunkReadyPayloadPending = false;\n    #chunkPrepareFailed = false;\n    #ownChunkPrepareWake = null;\n    #inspectInputs = [];\n    #inspectRows = [];\n    #inspectLineNumberTexts = [];\n    #inspectSourceLines = [];\n    #inspectSourceRange = null;\n    #inspectOriginalLines = [];\n    #inspectOriginalOutputLine = 0;\n    #inspectMount = null;\n    #inspectRevealClip = null;\n    #inspectBacking = null;\n    #inspectToolbar = null;\n    // The expanded session owns the draft; toolbar controls are rebuilt with table data.\n    #inspectAssignmentDraft = { text: '' };\n    #inspectToggleButton = null;\n    #inspectRevealExpanded = false;\n    #inspectRevealHeight = 0;\n    #inspectText = '';\n    #ownOnApplyInspectKeyDown = null;\n    #inspectState = TABLE_INSPECT_STATE.UPDATED;\n    #inspectOriginalText = '';\n    #ownOnApplyInspectReplacement = null;\n    #inspectOwnerToken = null;\n    #ownOnInspectSessionStart = null;\n    #ownOnInspectSessionEnd = null;\n    #inspectFinalising = false;\n    #inspectFinalRecomputeFinished = false;\n    #ownOnInspectRecomputeFinished = null;\n    #inspectDisplayLineNumber = null;\n\n    constructor(state) {\n        const dataType = state.struct?.logicalType?.() ?? state.struct?.constructor?.name ?? typeof state.struct;\n        pushTestingTableviewTrace('tableview_ctor_start', {\n            line: state.lineOnPuffbook ?? 0,\n            data_type: dataType,\n            is_screenshot: state.isScreenshot ?? false,\n        });\n        if (!state.font) {\n            throw new Error(`Font resource not set on TableView. This is mandatory.`);\n        }\n        if (!state.api) {\n            throw new Error(`Api not loaded correctly into tableview.`);\n        }\n        if (typeof state.onApplyAmend !== 'function') {\n            throw new Error('TableView requires state.onApplyAmend(body, lineNum).');\n        }\n        super(state);\n        this.appendChild(this.#contentMount);\n        noteChunkLifecycleDelta({ tables_created: 1 });\n\n        this.#data = tableViewData(state.struct);\n        if (!this.#data) {\n            throw new Error('TableView requires Struct or List[Struct|Tuple|NamedTuple] data.');\n        }\n        this.#lineOnPuffbook = state.lineOnPuffbook ?? 0;\n        this.#ownOnApplyAmend = state.onApplyAmend;\n        this.#inspectSourceLines = Array.isArray(state.inspectSourceLines)\n            ? state.inspectSourceLines.map((line) => String(line ?? ''))\n            : [typeof state.inspectText === 'string' ? state.inspectText : ''];\n        this.#inspectDisplayLineNumber = typeof state.inspectDisplayLineNumber === 'function'\n            ? state.inspectDisplayLineNumber\n            : null;\n        if (this.#inspectSourceLines.length === 0) this.#inspectSourceLines = [''];\n        this.#inspectSourceRange = state.inspectSourceRange ?? null;\n        this.#inspectText = this.#inspectSourceLines.join('\\n');\n        this.#ownOnApplyInspectKeyDown = typeof state.onApplyInspectKeyDown === 'function'\n            ? state.onApplyInspectKeyDown\n            : null;\n        this.#ownOnApplyInspectReplacement = typeof state.onApplyInspectReplacement === 'function'\n            ? state.onApplyInspectReplacement\n            : null;\n        this.#inspectOwnerToken = state.inspectOwnerToken ?? null;\n        this.#ownOnInspectSessionStart = typeof state.onInspectSessionStart === 'function'\n            ? state.onInspectSessionStart : null;\n        this.#ownOnInspectSessionEnd = typeof state.onInspectSessionEnd === 'function'\n            ? state.onInspectSessionEnd : null;\n        this.#columnStart = state.columnStart ?? 0;\n        this.#columnCount = state.columnCount ?? DEFAULT_COLUMN_WINDOW;\n        // Build style with state or defautls\n        this.#style = {\n            font: state.font,\n            headerFont: state.headerFont ?? state.font,\n            fontSize: state.fontSize || 18,\n            headerColor: state.headerColor || [0.824, 0.396, 0.255, 1.0],\n            headerTextColor: state.headerTextColor || Palette.white,\n            cellPadding: state.cellPadding || 12,\n            cellTextColor: state.cellTextColor || [1, 1, 1, 1.0],\n            cellColor: state.cellColor || [0.3, 0.3, 0.3, 1.0],\n            minColumnWidth: state.minColumnWidth || 80,\n            headerHeight: (state.fontSize || 20) * 3.0,\n            columnPadding: state.columnPadding || 32,\n            fixedRowHeight: null,\n            maxCellHeight: 500,\n        };\n        this.#previewHints = state.previewHints ?? null;\n        this.isScreenshot = state.isScreenshot ?? false\n        this.inlineInputEnabled = state.inlineInputEnabled ?? false;\n        this.#presentationMode = state.presentationMode ?? TABLEVIEW_PRESENTATION_MODE.PREVIEW;\n        this.#headerTooltipController = new TableviewHeaderTooltipController(this, this.#presentationMode);\n        this.#syncClipMode();\n        this.#fullscreenChrome = new TableViewFullscreenChrome(this, this.#contentMount, this.#inspectAssignmentDraft);\n        pushTestingTableviewTrace('tableview_ctor_done', {\n            line: this.#lineOnPuffbook,\n            data_type: dataType,\n            is_screenshot: this.isScreenshot,\n        });\n    }\n\n    testingHeaderColumns() {\n        if (!this.header?.columns) {\n            return [];\n        }\n        return this.header.columns.map(column => ({\n            text: column.text,\n            units: column.units ?? null,\n            type: column.type ?? null,\n        }));\n    }\n\n    testingColumnSeparators() {\n        return (this.#separatorMount?.children ?? []).map((node) => ({\n            x: node.localPosition()[0],\n            y: node.localPosition()[1],\n            width: node.state?.width ?? null,\n            height: node.state?.height ?? null,\n        }));\n    }\n\n    #testingNodeCanvasPoint(node, kind = null) {\n        if (!node || !this.scene?.camera) {\n            return null;\n        }\n        const [vpWidth, vpHeight] = this.scene.camera.getViewportSize();\n        const [x, y] = twgl.m4.getTranslation(node.localToWorld());\n        return {\n            kind,\n            x: x + vpWidth * 0.5,\n            y: y + vpHeight * 0.5,\n            width: node.width ?? null,\n            height: node.height ?? null,\n            icon_id: node.state?.iconID ?? null,\n            text: node.state?.text ?? null,\n        };\n    }\n\n    testingControls() {\n        const controls = this.#fullscreenChrome?.controls?.() ?? {};\n        return {\n            interactive: !this.#isPassivePreviewMode(),\n            line: this.#lineOnPuffbook,\n            close: this.#testingNodeCanvasPoint(controls.close ?? null, 'close'),\n            save: this.#testingNodeCanvasPoint(controls.save ?? null, 'save'),\n            top: this.#testingNodeCanvasPoint(controls.top ?? null, 'top'),\n            bottom: this.#testingNodeCanvasPoint(controls.bottom ?? null, 'bottom'),\n        };\n    }\n\n    /* Park the live path on one shared inline executor until worker chunk preparation is debugged end-to-end. */\n    #borChunkPrepareExecutor() {\n        return ensureSharedChunkPrepareExecutor({\n            kind: CHUNK_PREP_EXECUTOR_KIND.INLINE,\n            run: runChunkPrepareRequest,\n        });\n    }\n\n    /* Reset local chunk-prepare wake state without claiming ownership of the shared executor lifetime. */\n    #resetChunkPrepareState() {\n        this.#cancelChunkPrepareWake();\n    }\n\n    /* Cancel one queued chunk-prepare wake so stale rebuild/detach paths do not re-enter maintenance later. */\n    #cancelChunkPrepareWake() {\n        if (this.#ownChunkPrepareWake === null) {\n            return;\n        }\n        this.cancelWake(this.#ownChunkPrepareWake);\n        this.#ownChunkPrepareWake = null;\n    }\n\n    /* Route chunk-ready callbacks through the shared scene wake queue rather than a table-local timer or polling path. */\n    #scheduleChunkPrepareWake(reason) {\n        if (this.#ownChunkPrepareWake !== null || !this.scene) {\n            return;\n        }\n        this.#ownChunkPrepareWake = this.wake(() => {\n            this.#ownChunkPrepareWake = null;\n            this.#runMaintenance();\n        }, { reason });\n    }\n\n    /* Snapshot one TableView's local chunk/window state plus filtered perf counters for tests and profiling. */\n    testingPerfSummary() {\n        const perf = globalThis.__eviluiPerformanceTracker?.snapshot?.() ?? null;\n        const name = this.state?.name ?? 'unknown';\n        const lineNum = this.#lineOnPuffbook;\n        const timerPrefix = 'tableview.';\n        const timerSuffix = `.${name}`;\n        const textScopeNeedle = `${name}.chunk.`;\n        const visibleCols = this.#currentVisibleColumnBandRange();\n        const wantedCols = this.#wantedColumnBandRange();\n        const chunkRecords = Array.from(this.#chunkMap?.values?.() ?? []);\n        const chunks = chunkRecords.map((record) => record.node).filter(Boolean);\n        const visibleChunkCount = chunks.filter((chunk) => chunk.visible !== false && chunk.computedVisible !== false).length;\n        const chunkStatusCounts = {};\n        let retainedPayloadCount = 0;\n        let retainedRequestCount = 0;\n        for (const record of chunkRecords) {\n            chunkStatusCounts[record.status] = (chunkStatusCounts[record.status] ?? 0) + 1;\n            if (record.payload) {\n                retainedPayloadCount += 1;\n            }\n            if (record.request) {\n                retainedRequestCount += 1;\n            }\n        }\n        return {\n            line: lineNum,\n            name,\n            interactive: !this.#isPassivePreviewMode(),\n            sample_window_ms: perf?.sample_window_ms ?? null,\n            frame_count: perf?.frame_count ?? null,\n            fps_avg: perf?.fps_avg ?? null,\n            state: {\n                data_size: this.#dataSize,\n                refreshing: this.#refreshing,\n                inspect_state: this.#inspectState,\n                stale_indicator_visible: !!this.#staleIndicator?.parentNode,\n                stale_indicator_icon_id: this.#staleIndicator?.state?.iconID ?? null,\n                refresh_build_pending: this.#refreshBuildPending,\n                column_count: this.columns?.length ?? 0,\n                row_band_size: this.#rowBandSize,\n                row_draw_distance: this.#rowDrawDistance,\n                column_band_size: this.#columnBandSize,\n                column_draw_distance: this.#columnDrawDistance,\n                current_row_band: this.#currentRowBand,\n                column_band_start: this.#columnBandStart,\n                column_band_count: this.#columnBandCount,\n                visible_column_bands: visibleCols,\n                wanted_column_bands: wantedCols,\n                loaded_row_bands: this.#rowBandMap?.size ?? 0,\n                loaded_chunks: chunks.length,\n                visible_chunks: visibleChunkCount,\n                chunk_status_counts: chunkStatusCounts,\n                retained_payload_count: retainedPayloadCount,\n                retained_request_count: retainedRequestCount,\n                scroll_x: this.#currentScrollX(),\n                scroll_y: this.#currentScrollY(),\n                throw_vx: this.#throwVelocityX,\n                throw_vy: this.#throwVelocityY,\n                current_throw_vx: this.#currentThrowVelocityX,\n                current_throw_vy: this.#currentThrowVelocityY,\n            },\n            chunk_prepare_executor: snapshotSharedChunkPrepareExecutor(),\n            chunk_prepare_wake_pending: this.#ownChunkPrepareWake !== null,\n            diagnostics: {\n                update_chunk: this.#diagLastUpdateChunk,\n                reconcile: this.#diagLastReconcile,\n                render_window: this.#diagLastRenderWindow,\n                column_window: this.#diagLastColumnWindow,\n            },\n            trace: summarizeTableviewTraceForLine(lineNum),\n            perf: {\n                table_timers_top: topTableviewPerfEntries(\n                    perf?.timers,\n                    (key) => key.startsWith(timerPrefix) && key.endsWith(timerSuffix),\n                    'max_ms',\n                ),\n                table_counters_top: topTableviewPerfEntries(\n                    perf?.counters,\n                    (key) => key.startsWith(timerPrefix) && key.endsWith(timerSuffix),\n                    'total',\n                ),\n                text_timers_top: topTableviewPerfEntries(\n                    perf?.timers,\n                    (key) => key.includes(textScopeNeedle),\n                    'max_ms',\n                ),\n                text_counters_top: topTableviewPerfEntries(\n                    perf?.counters,\n                    (key) => key.includes(textScopeNeedle),\n                    'total',\n                ),\n            },\n        };\n    }\n\n    /* Report one live chunk-memory summary so leak triage can compare retained payload with rebuild churn. */\n    testingChunkMemorySummary() {\n        const chunkRecords = Array.from(this.#chunkMap?.values?.() ?? []);\n        const chunks = chunkRecords\n            .filter((record) => record?.status === CHUNK_PREP_STATUS.ATTACHED && record?.node)\n            .map((record) => summarizeAttachedChunkMemory(record))\n            .filter(Boolean)\n            .sort((a, b) => b.exact_typed_array_bytes.total - a.exact_typed_array_bytes.total\n                || b.glyph_count - a.glyph_count\n                || a.key.localeCompare(b.key));\n        const totals = {\n            chunks: chunks.length,\n            rows: 0,\n            columns: 0,\n            text_nodes: 0,\n            glyph_count: 0,\n            scene_graph_nodes: 0,\n            exact_typed_array_bytes: {\n                codepoints: 0,\n                positions: 0,\n                rects: 0,\n                tex_rects: 0,\n                atlas_indices: 0,\n                glyph_colors: 0,\n                total: 0,\n            },\n            rebuild_working_set_bytes: {\n                full_sync_arrays: {\n                    glyph_instance_arrays: 0,\n                    span_matrices: 0,\n                    span_texture_upload: 0,\n                    total: 0,\n                },\n                transform_only_arrays: {\n                    span_matrices: 0,\n                    span_texture_upload: 0,\n                    total: 0,\n                },\n                color_only_arrays: {\n                    glyph_colors: 0,\n                    total: 0,\n                },\n            },\n        };\n        for (const chunk of chunks) {\n            totals.rows += chunk.rows;\n            totals.columns += chunk.columns;\n            totals.text_nodes += chunk.text_nodes;\n            totals.glyph_count += chunk.glyph_count;\n            totals.scene_graph_nodes += chunk.scene_graph_nodes;\n            totals.exact_typed_array_bytes.codepoints += chunk.exact_typed_array_bytes.codepoints;\n            totals.exact_typed_array_bytes.positions += chunk.exact_typed_array_bytes.positions;\n            totals.exact_typed_array_bytes.rects += chunk.exact_typed_array_bytes.rects;\n            totals.exact_typed_array_bytes.tex_rects += chunk.exact_typed_array_bytes.tex_rects;\n            totals.exact_typed_array_bytes.atlas_indices += chunk.exact_typed_array_bytes.atlas_indices;\n            totals.exact_typed_array_bytes.glyph_colors += chunk.exact_typed_array_bytes.glyph_colors;\n            totals.exact_typed_array_bytes.total += chunk.exact_typed_array_bytes.total;\n            totals.rebuild_working_set_bytes.full_sync_arrays.glyph_instance_arrays += chunk.rebuild_working_set_bytes.full_sync_arrays.glyph_instance_arrays;\n            totals.rebuild_working_set_bytes.full_sync_arrays.span_matrices += chunk.rebuild_working_set_bytes.full_sync_arrays.span_matrices;\n            totals.rebuild_working_set_bytes.full_sync_arrays.span_texture_upload += chunk.rebuild_working_set_bytes.full_sync_arrays.span_texture_upload;\n            totals.rebuild_working_set_bytes.full_sync_arrays.total += chunk.rebuild_working_set_bytes.full_sync_arrays.total;\n            totals.rebuild_working_set_bytes.transform_only_arrays.span_matrices += chunk.rebuild_working_set_bytes.transform_only_arrays.span_matrices;\n            totals.rebuild_working_set_bytes.transform_only_arrays.span_texture_upload += chunk.rebuild_working_set_bytes.transform_only_arrays.span_texture_upload;\n            totals.rebuild_working_set_bytes.transform_only_arrays.total += chunk.rebuild_working_set_bytes.transform_only_arrays.total;\n            totals.rebuild_working_set_bytes.color_only_arrays.glyph_colors += chunk.rebuild_working_set_bytes.color_only_arrays.glyph_colors;\n            totals.rebuild_working_set_bytes.color_only_arrays.total += chunk.rebuild_working_set_bytes.color_only_arrays.total;\n        }\n        return {\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            chunk_count: chunks.length,\n            chunk_band_size: this.#columnBandSize,\n            row_band_size: this.#rowBandSize,\n            attached_chunks: chunks,\n            totals,\n        };\n    }\n\n    /* Report one chunk-allocation bundle so browser leak probes can separate each live JS retention category. */\n    testingChunkAllocationSummary() {\n        const chunkRecords = Array.from(this.#chunkMap?.values?.() ?? []);\n        const rowBands = Array.from(this.#rowBandMap?.values?.() ?? [])\n            .map((record) => summarizeRowBandMemory(record))\n            .sort((a, b) => b.row_count - a.row_count || a.row_band - b.row_band);\n        const attachedChunks = chunkRecords\n            .filter((record) => record?.status === CHUNK_PREP_STATUS.ATTACHED && record?.node)\n            .map((record) => summarizeAttachedChunkMemory(record))\n            .filter(Boolean)\n            .sort((a, b) => b.exact_typed_array_bytes.total - a.exact_typed_array_bytes.total\n                || b.glyph_count - a.glyph_count\n                || a.key.localeCompare(b.key));\n        const preparedPayloads = chunkRecords\n            .filter((record) => record?.status === CHUNK_PREP_STATUS.READY_PAYLOAD && record?.payload)\n            .map((record) => summarizePreparedPayloadMemory(record))\n            .filter(Boolean)\n            .sort((a, b) => b.exact_typed_array_bytes.total - a.exact_typed_array_bytes.total\n                || b.glyph_count - a.glyph_count\n                || a.key.localeCompare(b.key));\n        const queuedRequests = chunkRecords\n            .filter((record) => record?.request)\n            .map((record) => summarizeQueuedChunkRequestMemory(record))\n            .filter(Boolean)\n            .sort((a, b) => b.columns - a.columns || a.key.localeCompare(b.key));\n        const headerTexts = (this.header?.children ?? []).filter((child) => child instanceof evilfont.MSDFText);\n        const header = summarizeTextNodeCollection(headerTexts);\n        const separatorNodeCount = this.#separatorMount?.children?.length ?? 0;\n        const chunkStatusCounts = {};\n        for (const record of chunkRecords) {\n            chunkStatusCounts[record.status] = (chunkStatusCounts[record.status] ?? 0) + 1;\n        }\n\n        const rowBandTotals = {\n            count: rowBands.length,\n            row_count: 0,\n            chunk_height: 0,\n            shell_counts: {\n                row_band_records: 0,\n                entries_bounds_objects: 0,\n                row_layout_objects: 0,\n                row_layout_rows_arrays: 0,\n                row_objects: 0,\n            },\n        };\n        for (const rowBand of rowBands) {\n            rowBandTotals.row_count += rowBand.row_count;\n            rowBandTotals.chunk_height += rowBand.chunk_height;\n            rowBandTotals.shell_counts.row_band_records += rowBand.shell_counts.row_band_record;\n            rowBandTotals.shell_counts.entries_bounds_objects += rowBand.shell_counts.entries_bounds_object;\n            rowBandTotals.shell_counts.row_layout_objects += rowBand.shell_counts.row_layout_object;\n            rowBandTotals.shell_counts.row_layout_rows_arrays += rowBand.shell_counts.row_layout_rows_array;\n            rowBandTotals.shell_counts.row_objects += rowBand.shell_counts.row_objects;\n        }\n\n        const preparedTotals = {\n            count: preparedPayloads.length,\n            row_count: 0,\n            column_count: 0,\n            text_payloads: 0,\n            glyph_count: 0,\n            exact_typed_array_bytes: {\n                codepoints: 0,\n                positions: 0,\n                rects: 0,\n                tex_rects: 0,\n                atlas_indices: 0,\n                glyph_colors: 0,\n                total: 0,\n            },\n            shell_counts: {\n                chunk_records: 0,\n                payload_objects: 0,\n                entries_bounds_objects: 0,\n                columns_arrays: 0,\n                row_layout_objects: 0,\n                row_layout_rows_arrays: 0,\n                row_objects: 0,\n                text_payload_objects: 0,\n                text_layout_objects: 0,\n                text_glyph_data_objects: 0,\n            },\n        };\n        for (const payload of preparedPayloads) {\n            preparedTotals.row_count += payload.rows;\n            preparedTotals.column_count += payload.columns;\n            preparedTotals.text_payloads += payload.text_payloads;\n            preparedTotals.glyph_count += payload.glyph_count;\n            preparedTotals.exact_typed_array_bytes.codepoints += payload.exact_typed_array_bytes.codepoints;\n            preparedTotals.exact_typed_array_bytes.positions += payload.exact_typed_array_bytes.positions;\n            preparedTotals.exact_typed_array_bytes.rects += payload.exact_typed_array_bytes.rects;\n            preparedTotals.exact_typed_array_bytes.tex_rects += payload.exact_typed_array_bytes.tex_rects;\n            preparedTotals.exact_typed_array_bytes.atlas_indices += payload.exact_typed_array_bytes.atlas_indices;\n            preparedTotals.exact_typed_array_bytes.glyph_colors += payload.exact_typed_array_bytes.glyph_colors;\n            preparedTotals.exact_typed_array_bytes.total += payload.exact_typed_array_bytes.total;\n            preparedTotals.shell_counts.chunk_records += payload.shell_counts.chunk_record;\n            preparedTotals.shell_counts.payload_objects += payload.shell_counts.payload_object;\n            preparedTotals.shell_counts.entries_bounds_objects += payload.shell_counts.entries_bounds_object;\n            preparedTotals.shell_counts.columns_arrays += payload.shell_counts.columns_array;\n            preparedTotals.shell_counts.row_layout_objects += payload.shell_counts.row_layout_object;\n            preparedTotals.shell_counts.row_layout_rows_arrays += payload.shell_counts.row_layout_rows_array;\n            preparedTotals.shell_counts.row_objects += payload.shell_counts.row_objects;\n            preparedTotals.shell_counts.text_payload_objects += payload.shell_counts.text_payload_objects;\n            preparedTotals.shell_counts.text_layout_objects += payload.shell_counts.text_layout_objects;\n            preparedTotals.shell_counts.text_glyph_data_objects += payload.shell_counts.text_glyph_data_objects;\n        }\n\n        const queuedTotals = {\n            count: queuedRequests.length,\n            row_count: 0,\n            columns: 0,\n            all_columns: 0,\n            shell_counts: {\n                chunk_records: 0,\n                request_objects: 0,\n                entries_bounds_objects: 0,\n                columns_arrays: 0,\n                all_columns_arrays: 0,\n            },\n            borrowed_refs: {\n                style: 0,\n                column_refs: 0,\n                all_column_refs: 0,\n            },\n        };\n        for (const request of queuedRequests) {\n            queuedTotals.row_count += request.rows;\n            queuedTotals.columns += request.columns;\n            queuedTotals.all_columns += request.all_columns;\n            queuedTotals.shell_counts.chunk_records += request.shell_counts.chunk_record;\n            queuedTotals.shell_counts.request_objects += request.shell_counts.request_object;\n            queuedTotals.shell_counts.entries_bounds_objects += request.shell_counts.entries_bounds_object;\n            queuedTotals.shell_counts.columns_arrays += request.shell_counts.columns_array;\n            queuedTotals.shell_counts.all_columns_arrays += request.shell_counts.all_columns_array;\n            queuedTotals.borrowed_refs.style += request.borrowed_refs.style;\n            queuedTotals.borrowed_refs.column_refs += request.borrowed_refs.column_refs;\n            queuedTotals.borrowed_refs.all_column_refs += request.borrowed_refs.all_column_refs;\n        }\n\n        const attachedTotals = this.testingChunkMemorySummary()?.totals ?? null;\n        return {\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            interactive: !this.#isPassivePreviewMode(),\n            cache: {\n                data_size: this.#dataSize,\n                column_count: this.columns?.length ?? 0,\n                column_metrics_count: this.#columnMetrics.length,\n                row_band_size: this.#rowBandSize,\n                row_draw_distance: this.#rowDrawDistance,\n                column_band_size: this.#columnBandSize,\n                column_draw_distance: this.#columnDrawDistance,\n                current_row_band: this.#currentRowBand,\n                loaded_row_bands: this.#rowBandMap?.size ?? 0,\n                loaded_chunk_records: chunkRecords.length,\n                chunk_status_counts: chunkStatusCounts,\n                visible_column_bands: this.#currentVisibleColumnBandRange(),\n                wanted_column_bands: this.#wantedColumnBandRange(),\n                scroll_x: this.#currentScrollX(),\n                scroll_y: this.#currentScrollY(),\n            },\n            row_bands: {\n                ...rowBandTotals,\n                top_row_bands: rowBands.slice(0, 12),\n            },\n            attached_chunks: {\n                count: attachedChunks.length,\n                totals: attachedTotals,\n                top_chunks: attachedChunks.slice(0, 12),\n            },\n            prepared_payloads: {\n                ...preparedTotals,\n                top_payloads: preparedPayloads.slice(0, 12),\n            },\n            queued_requests: {\n                ...queuedTotals,\n                top_requests: queuedRequests.slice(0, 12),\n            },\n            header_window: {\n                text_nodes: header.text_nodes,\n                glyph_count: header.glyph_count,\n                exact_typed_array_bytes: header.exact_typed_array_bytes,\n                rebuild_working_set_bytes: header.rebuild_working_set_bytes,\n                shell_counts: {\n                    header_text_nodes: header.shell_counts.text_nodes,\n                    header_text_layout_objects: header.shell_counts.text_layout_objects,\n                    header_text_glyph_data_objects: header.shell_counts.text_glyph_data_objects,\n                    separator_nodes: separatorNodeCount,\n                },\n            },\n            chunk_prepare_executor: snapshotSharedChunkPrepareExecutor(),\n        };\n    }\n\n    /* Report one ptrless-memory summary for this table so leak triage can separate raw wire bytes from wrapper churn. */\n    testingPtrlessMemorySummary() {\n        const builder = this.#data?._builder ?? null;\n        if (!builder || typeof builder.testingMemorySummary !== 'function') {\n            return null;\n        }\n        return {\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            data_size: this.#dataSize,\n            builder: builder.testingMemorySummary(this.#data),\n        };\n    }\n\n    dataSize() {\n        return this.#dataSize;\n    }\n\n    setLineOnPuffbook(lineNum, recordingLineNum = lineNum) {\n        this.#lineOnPuffbook = lineNum;\n        this._recordingLineOnPuffbook = recordingLineNum;\n    }\n\n    getLineOnPuffbook() {\n        return this.#lineOnPuffbook ?? 0;\n    }\n\n    recordingLineOnPuffbook() {\n        return this._recordingLineOnPuffbook ?? this.#lineOnPuffbook ?? 0;\n    }\n\n    recordingViewState() {\n        return {\n            kind: 'table_view',\n            version: 1,\n            line: this._recordingLineOnPuffbook ?? this.#lineOnPuffbook,\n            scroll_x: this.#currentScrollX(),\n            scroll_y: this.#currentScrollY(),\n            fullscreen: this.isFullscreenPresentation(),\n        };\n    }\n\n    restoreRecordingViewState(state) {\n        if (!state || state.version !== 1\n            || !Number.isFinite(state.scroll_x) || !Number.isFinite(state.scroll_y)) {\n            throw new Error('TableView replay state requires finite version-1 scroll offsets.');\n        }\n        if (Number.isInteger(state.line) && state.line !== (this._recordingLineOnPuffbook ?? this.#lineOnPuffbook)) {\n            throw new Error(`TableView replay line mismatch: expected ${state.line}, got ${this.#lineOnPuffbook}.`);\n        }\n        this.cancelExponentialDecay('throw_scroll');\n        this.#setScroll(this.#clampedScrollX(state.scroll_x), this.#clampedScrollY(state.scroll_y));\n        this.#applyScrollNow();\n        return this.recordingViewState();\n    }\n\n    testingInspectInputForRow(row = 0) {\n        return this.#inspectInputs[row] ?? null;\n    }\n\n    testingInspectRowForRow(row = 0) {\n        return this.#inspectRows[row] ?? null;\n    }\n\n    testingInspectLineNumberTextForRow(row = 0) {\n        return this.#inspectLineNumberTexts[row] ?? null;\n    }\n\n    testingInspectScrollBox() {\n        return this.#inspectMount;\n    }\n\n    testingInspectToggleButton() {\n        return this.#inspectToggleButton;\n    }\n\n    testingSaveButton() {\n        return this.#fullscreenChrome?.controls?.().save ?? null;\n    }\n\n    testingCloseButton() {\n        return this.#fullscreenChrome?.controls?.().close ?? null;\n    }\n\n    testingAssignInputCell() {\n        return this.#fullscreenChrome?.controls?.().assignInput ?? null;\n    }\n\n    testingAssignLabel() {\n        return this.#fullscreenChrome?.controls?.().assignLabel ?? null;\n    }\n\n    testingInspectRevealHeight() {\n        return this.#inspectRevealHeight;\n    }\n\n    testingInspectBacking() {\n        return this.#inspectBacking;\n    }\n\n    testingApplyInspectKey(event, row = 0) {\n        const input = this.testingInspectInputForRow(row);\n        return input ? this.#applyInspectKeyDown(event, input) : false;\n    }\n\n    testingCommitInspectAndLeave() {\n        this.#commitAndLeave();\n    }\n\n    testingDiscardInspectAndLeave() {\n        this.#discardAndLeave();\n    }\n\n    testingSubmitSort(data) {\n        this.#handleSort(data);\n    }\n\n    testingSubmitFilter(data) {\n        this.#handleFilter(data);\n    }\n\n    testingSubmitFill(data) {\n        this.#handleFill(data);\n    }\n\n    testingSubmitFillTable() {\n        this.#handleFillTable();\n    }\n\n    #isPassivePreviewMode() {\n        return isPassiveTablePreviewMode({\n            isScreenshot: this.isScreenshot,\n            inlineInputEnabled: this.inlineInputEnabled,\n        });\n    }\n\n    get readOnly() {\n        return this.state.readOnly === true;\n    }\n\n    #inspectCellVisible() {\n        return !this.readOnly && this.isFullscreenPresentation() && !this.isScreenshot && this.#ownOnApplyInspectKeyDown !== null;\n    }\n\n    #inspectScrollableHeight() {\n        const visibleRows = Math.min(3, this.#inspectSourceLines.length);\n        return (TABLE_INSPECT_CELL_HEIGHT * visibleRows)\n            + (TABLE_INSPECT_ROW_SPACING * Math.max(0, visibleRows - 1));\n    }\n\n    #inspectEditorWidth(width = this.state.width ?? 0) {\n        return Math.max(0, width - TABLE_INSPECT_SCROLLBOX_RIGHT_INSET);\n    }\n\n    #inspectInputWidth(width = this.#inspectEditorWidth()) {\n        return Math.max(0, width - TABLE_INSPECT_LINE_NUMBER_WIDTH - TABLE_INSPECT_SCROLLBAR_WIDTH);\n    }\n\n    #inspectDocumentLineNumber(row) {\n        const fallbackStart = Math.max(0, this.#lineOnPuffbook - this.#inspectSourceLines.length + 1);\n        const localLine = (Number.isInteger(this.#inspectSourceRange?.start)\n            ? this.#inspectSourceRange.start\n            : fallbackStart) + row;\n        const displayLine = this.#inspectDisplayLineNumber?.(localLine);\n        return Number.isInteger(displayLine) ? displayLine : localLine;\n    }\n\n    #inspectCellHeight() {\n        return this.#inspectCellVisible()\n            ? TABLE_INSPECT_TOOLBAR_HEIGHT + this.#inspectRevealHeight\n            : 0;\n    }\n\n    #tableHeaderTop() {\n        return this.#inspectCellHeight();\n    }\n\n    #tableBodyTop() {\n        return this.#tableHeaderTop() + (this.header?.height ?? 0);\n    }\n\n    /* Receive the source projection after DocumentView has applied one normal editor key. */\n    syncInspectText(text, cursorIndex = null) {\n        if (typeof text !== 'string') {\n            throw new Error('TableView.syncInspectText(text): text must be a string.');\n        }\n        return this.syncInspectSource(text.split('\\n'), this.#inspectSourceRange, cursorIndex === null ? null : [0, cursorIndex]);\n    }\n\n    syncInspectSource(lines, range = this.#inspectSourceRange, cursor = null) {\n        if (!Array.isArray(lines) || lines.length === 0 || lines.some((line) => typeof line !== 'string')) {\n            throw new Error('TableView.syncInspectSource(lines): lines must be a non-empty string array.');\n        }\n        const changedShape = lines.length !== this.#inspectSourceLines.length;\n        this.#inspectSourceLines = [...lines];\n        this.#inspectSourceRange = range ?? null;\n        this.#inspectText = lines.join('\\n');\n        if (this.#inspectCellVisible() && this.#inspectMount) {\n            this.#syncInspectInputRows(lines, cursor);\n            if (changedShape) this.#syncInspectLayout();\n        }\n        return this.#inspectInputs.length > 0;\n    }\n\n    /* InputCell owns selection; DocumentView applies edits through Puffbook's command/history path. */\n    #applyInspectKeyDown(event, inputCell) {\n        if (this.readOnly) return false;\n        return this.#ownOnApplyInspectKeyDown(event, inputCell);\n    }\n\n    canUndoInspect() {\n        return !this.readOnly && this.state.onCanUndoInspect?.() === true;\n    }\n\n    requestUndoInspect() {\n        if (!this.canUndoInspect()) return false;\n        const input = this.#inspectInputs.find((cell) => cell.inFocus) ?? this.#inspectInputs[0];\n        if (!input) return false;\n        return this.#applyInspectKeyDown({ key: 'z', ctrlKey: true }, input);\n    }\n\n    moveInspectCaret(row, col) {\n        const input = this.#inspectInputs[row];\n        if (!input) return false;\n        input.syncFromDocument(input.textInput, col);\n        if (!input.inFocus) this.activateInputCell(input, col);\n        return true;\n    }\n\n    syncInspectSelection(focus) {\n        const row = focus.cursor_line - this.#inspectSourceRange.start;\n        const input = this.#inspectInputs[row];\n        if (focus.has_selection && focus.selection_line === focus.cursor_line) {\n            input.syncSelectionRange(focus.selection_start, focus.selection_end);\n        } else {\n            input.syncSelectionRange(focus.cursor_col, focus.cursor_col);\n        }\n    }\n\n    /* Keep the source editor independent from the retained table scene graph. */\n    #makeInspectRow(row, text) {\n        const rowMount = new ui.Placeholder({\n            name: ui.uniqueName(`${this.state.name}.inspect_row.${row}`),\n            width: this.#inspectEditorWidth(),\n            height: TABLE_INSPECT_CELL_HEIGHT,\n            x: 0,\n            y: row * (TABLE_INSPECT_CELL_HEIGHT + TABLE_INSPECT_ROW_SPACING),\n        });\n        const lineNumberTile = new ui.Tile({\n            name: ui.uniqueName(`${this.state.name}.inspect_line_number_tile.${row}`),\n            width: TABLE_INSPECT_LINE_NUMBER_WIDTH,\n            height: TABLE_INSPECT_CELL_HEIGHT,\n            x: 0,\n            y: 0,\n            z: -0.2,\n            color: Palette.darkgrey,\n        });\n        const lineNumber = String(this.#inspectDocumentLineNumber(row));\n        const lineNumberState = {\n            name: ui.uniqueName(`${this.state.name}.inspect_line_number.${row}`),\n            text: lineNumber,\n            font: this.#style.font,\n            fontSize: this.#style.fontSize,\n            fontColor: Palette.white,\n            z: -0.3,\n        };\n        const lineNumberLayout = evilfont.MSDFText.measureFromState(lineNumberState);\n        const lineNumberText = new evilfont.MSDFText({\n            ...lineNumberState,\n            x: TABLE_INSPECT_LINE_NUMBER_WIDTH - TABLE_INSPECT_LINE_NUMBER_PADDING - lineNumberLayout.width,\n            y: (TABLE_INSPECT_CELL_HEIGHT - lineNumberLayout.height) * 0.5,\n        });\n        lineNumberTile.appendChild(lineNumberText);\n        rowMount.appendChild(lineNumberTile);\n\n        const input = new ui.InputCell({\n            name: ui.uniqueName(`${this.state.name}.inspect_input.${row}`),\n            font: this.#style.font, fontSize: this.#style.fontSize,\n            textInput: text, cursorIndex: text.length,\n            color: Palette.grey,\n            width: this.#inspectInputWidth(),\n            height: TABLE_INSPECT_CELL_HEIGHT,\n            x: TABLE_INSPECT_LINE_NUMBER_WIDTH, y: 0, z: -0.4,\n            focusContainerOwner: this,\n            keyDelegate: (event, inputCell) => this.#applyInspectKeyDown(event, inputCell),\n            onEnterKey: () => {},\n        });\n        rowMount.appendChild(input);\n        this.#inspectRows.push(rowMount);\n        this.#inspectLineNumberTexts.push(lineNumberText);\n        this.#inspectInputs.push(input);\n        this.#inspectMount.appendChild(rowMount);\n    }\n\n    #syncInspectLineNumbers() {\n        for (let row = 0; row < this.#inspectLineNumberTexts.length; row += 1) {\n            const label = this.#inspectLineNumberTexts[row];\n            const text = String(this.#inspectDocumentLineNumber(row));\n            label.setText(text);\n            const layout = label.measure({ text });\n            label.setLocalPosition(\n                TABLE_INSPECT_LINE_NUMBER_WIDTH - TABLE_INSPECT_LINE_NUMBER_PADDING - layout.width,\n                (TABLE_INSPECT_CELL_HEIGHT - layout.height) * 0.5,\n                label.localPosition()[2],\n            );\n        }\n    }\n\n    #syncInspectInputRows(lines, cursor) {\n        while (this.#inspectInputs.length < lines.length) {\n            const row = this.#inspectInputs.length;\n            this.#makeInspectRow(row, lines[row]);\n        }\n        while (this.#inspectInputs.length > lines.length) {\n            this.#inspectInputs.pop();\n            this.#inspectLineNumberTexts.pop();\n            this.#inspectMount.removeChild(this.#inspectRows.pop());\n        }\n        for (let row = 0; row < this.#inspectInputs.length; row += 1) {\n            const input = this.#inspectInputs[row];\n            this.#inspectRows[row].setLocalPosition(\n                0,\n                row * (TABLE_INSPECT_CELL_HEIGHT + TABLE_INSPECT_ROW_SPACING),\n                this.#inspectRows[row].localPosition()[2],\n            );\n            const cursorIndex = Array.isArray(cursor) && cursor[0] === row && Number.isInteger(cursor[1]) ? cursor[1] : input.cursorIndex;\n            input.syncFromDocument(lines[row], cursorIndex);\n        }\n        this.#syncInspectLineNumbers();\n        this.#inspectMount.syncContentLayout();\n        if (Array.isArray(cursor) && this.#inspectInputs[cursor[0]]) {\n            this.activateInputCell(this.#inspectInputs[cursor[0]], cursor[1]);\n        }\n    }\n\n    /* Reflow only the editor's sibling table anchors; do not rebuild header/body/chunks. */\n    #syncInspectLayout() {\n        if (!this.#inspectMount) return;\n        const height = this.#inspectScrollableHeight();\n        if (this.#inspectMount.state.height !== height) this.#inspectMount.mutate({ height });\n        if (this.#inspectRevealClip\n            && (this.#inspectRevealClip.state.height !== height)) {\n            this.#inspectRevealClip.mutate({ height });\n        }\n        this.stopAnimation('clock_s');\n        this._animationClockS = this.#inspectRevealExpanded ? height : 0;\n        this.#applyInspectRevealHeight(this._animationClockS);\n    }\n\n    #syncInspectToggleButtonAppearance() {\n        const button = this.#inspectToggleButton;\n        if (!button) return;\n        button.mutate({\n            iconID: this.#inspectRevealExpanded ? 10 : 11,\n            text: this.#inspectRevealExpanded ? 'collapse' : 'expand',\n        });\n        if (button.iconPivot) {\n            button.iconPivot.setLocalPosition(\n                TABLE_INSPECT_TOGGLE_BUTTON_INSET + (TABLE_INSPECT_TOGGLE_ICON_SIZE * 0.5),\n                TABLE_INSPECT_TOOLBAR_HEIGHT * 0.5,\n                button.iconPivot.localPosition()[2],\n            );\n        }\n        if (button.textLabel) {\n            const layout = evilfont.MSDFText.measureFromState({\n                font: this.#style.font,\n                fontSize: this.#style.fontSize,\n                text: button.text,\n            });\n            button.textLabel.setLocalPosition(\n                TABLE_INSPECT_TOGGLE_TEXT_X,\n                (TABLE_INSPECT_TOOLBAR_HEIGHT - layout.height) * 0.5,\n                button.textLabel.localPosition()[2],\n            );\n        }\n    }\n\n    #toggleInspectReveal() {\n        if (!this.#inspectMount) return false;\n        this.#inspectRevealExpanded = !this.#inspectRevealExpanded;\n        this.#syncInspectToggleButtonAppearance();\n        this.animateTo({\n            clock_s: this.#inspectRevealExpanded ? this.#inspectScrollableHeight() : 0,\n            duration_s: TABLE_INSPECT_REVEAL_DURATION_S,\n            ease: TABLE_INSPECT_REVEAL_EASE,\n        });\n        return true;\n    }\n\n    #applyInspectRevealHeight(value) {\n        if (!this.#inspectMount) return;\n        const fullHeight = this.#inspectScrollableHeight();\n        const revealHeight = ewu.clamp(Number.isFinite(value) ? value : 0, 0, fullHeight);\n        if (this.#inspectRevealHeight === revealHeight\n            && this.#inspectMount.localPosition()[1] === revealHeight - fullHeight) return;\n        this.#inspectRevealHeight = revealHeight;\n        this.#inspectMount.setLocalPosition(\n            0,\n            revealHeight - fullHeight,\n            this.#inspectMount.localPosition()[2],\n        );\n        this.#syncInspectBacking();\n        if (this.header) {\n            this.#markViewportSyncDirty();\n            this.#runMaintenance();\n        }\n    }\n\n    #syncInspectBacking() {\n        if (!this.#inspectBacking) {\n            return;\n        }\n        const viewport = this.#viewportRect();\n        const height = this.#inspectCellHeight();\n        if (this.#inspectBacking.state.width !== viewport.width || this.#inspectBacking.state.height !== height) {\n            this.#inspectBacking.mutate({ width: viewport.width, height });\n        }\n        this.#inspectBacking.setLocalPosition(0, 0, TABLE_INSPECT_BACKING_Z);\n        if (this.#inspectToolbar?.state?.width !== viewport.width) {\n            this.#inspectToolbar.mutate({ width: viewport.width });\n        }\n    }\n\n    getInspectSourceRange() {\n        return this.#inspectSourceRange ? { ...this.#inspectSourceRange } : null;\n    }\n\n    ownedByInspectToken(token) {\n        return token !== null && token === this.#inspectOwnerToken;\n    }\n\n    acceptInspectCommitRange(range) {\n        if (!range || !Number.isInteger(range.start) || !Number.isInteger(range.end)\n            || range.start < 0 || range.end < range.start) return false;\n        this.#inspectSourceRange = { ...range };\n        this.#syncInspectLineNumbers();\n        this.setLineOnPuffbook(range.end);\n        this.ownPreviewViewport?.retireExpandedOnLeave?.(range.end !== this.#inspectOriginalOutputLine);\n        return true;\n    }\n\n    inspectEditorRow(inputCell) {\n        return this.#inspectInputs.indexOf(inputCell);\n    }\n\n    setInspectState(state) {\n        if (!Object.values(TABLE_INSPECT_STATE).includes(state)) {\n            throw new Error(`TableView.setInspectState(...): unknown state '${state}'.`);\n        }\n        if (this.#inspectState === state) return false;\n        this.#inspectState = state;\n        this.#syncStalePresentation();\n        pushTestingTableviewTrace('tableview_inspect_state', { line: this.#lineOnPuffbook, state });\n        return true;\n    }\n\n    /*\n     * The document may project several asynchronous intermediate lifecycle\n     * states after one structural source edit. While the fullscreen editor is\n     * stale, its inline restore host must remain mounted through all of them.\n     * Authoritative non-table handling is a session concern, not a reason to\n     * detach this viewport during document projection.\n     */\n    shouldRetainInspectStaleForBlock(_block) {\n        return this.#inspectInputs.length > 0\n            && this.#inspectState === TABLE_INSPECT_STATE.STALE;\n    }\n\n    /* Toolbar close bypasses the leave prompt and takes its Discard action directly. */\n    requestDiscardTableview() {\n        this.#discardAndLeave();\n    }\n\n    /* Toolbar save selects Leave or Save to variable from the optional assignment name. */\n    requestSaveTableview(variableName = '') {\n        if (this.readOnly) return false;\n        const name = String(variableName ?? '').trim();\n        if (name.length === 0) {\n            this.#commitAndLeave();\n            return true;\n        }\n        if (!TABLE_INSPECT_VARIABLE_NAME.test(name)) {\n            return false;\n        }\n        this.#saveToVariableAndLeave(name);\n        return true;\n    }\n\n    #applyLeaveReplacement(text) {\n        if (this.#inspectFinalising || this.#ownOnApplyInspectReplacement?.(text, this) !== true) return;\n        this.#inspectFinalising = true;\n        this.#inspectFinalRecomputeFinished = false;\n    }\n\n    // Restore only after fullscreen has been closed: the document's inline\n    // output host remains authoritative for the replacement.\n    #discardAndLeave() {\n        if (this.readOnly) {\n            this.#leaveTableviewNow();\n            return;\n        }\n        const originalText = this.#inspectOriginalLines.join('\\n');\n        this.#inspectSourceLines = [...this.#inspectOriginalLines];\n        this.#inspectText = originalText;\n        this.#leaveTableviewNow();\n        this.#ownOnApplyInspectReplacement?.(originalText, this);\n    }\n\n    #commitAndLeave() {\n        if (this.readOnly) return;\n        this.#leaveTableviewNow();\n    }\n\n    // An assignment no longer produces a table output, so do not keep the\n    // fullscreen table host alive while the document recomputes it.\n    #saveToVariableAndLeave(name) {\n        const assignment = [`${name} = ${this.#inspectSourceLines[0]}`, ...this.#inspectSourceLines.slice(1)].join('\\n');\n        this.#leaveTableviewNow();\n        this.#ownOnApplyInspectReplacement?.(assignment, this);\n    }\n\n    notifyInspectTerminalFailure() {\n        this.#inspectFinalising = false;\n        this.#inspectFinalRecomputeFinished = false;\n    }\n\n    #maybeCompleteFinalLeave() {\n        if (this.#inspectFinalising && this.#inspectFinalRecomputeFinished && this.#inspectState === TABLE_INSPECT_STATE.UPDATED) this.#leaveTableviewNow();\n    }\n\n    activateInputCell(inputCell, col = inputCell?.cursorIndex ?? 0) {\n        const assignInput = this.#fullscreenChrome?.controls?.().assignInput ?? null;\n        const ownsInput = this.#inspectInputs.includes(inputCell) || inputCell === assignInput;\n        if (!ownsInput || !Number.isInteger(col) || col < 0) {\n            return false;\n        }\n        if (focusStackContainsContainer(this)) {\n            return focusThis(this, inputCell) === true;\n        }\n        pushFocusEntry(this, inputCell);\n        return true;\n    }\n\n    #syncClipMode() {\n        this.clipChildren = this.#isPassivePreviewMode();\n    }\n\n    #hostViewport() {\n        if (this.ownPreviewViewport) {\n            return this.ownPreviewViewport;\n        }\n        let cur = this.parentNode;\n        while (cur) {\n            if (cur.focusContainerKind === 'Viewport') {\n                return cur;\n            }\n            cur = cur.parentNode ?? null;\n        }\n        return null;\n    }\n\n    #hostViewportSize() {\n        const host = this.#hostViewport();\n        const width = host?.state?.width;\n        const height = host?.state?.height;\n        if (!Number.isFinite(width) || !Number.isFinite(height)) {\n            throw new Error('TableView requires an ancestor Viewport with finite width/height.');\n        }\n        return [width, height];\n    }\n\n    /* Sample the live inertial scroll analytically, falling back to the last committed logical scroll when idle. */\n    #liveScrollState(nowS = this.sceneNowS()) {\n        const sample = this.sampleExponentialDecay('throw_scroll', nowS);\n        if (!sample) {\n            return {\n                x: this.#scrollX,\n                y: this.#scrollY,\n                vx: this.#throwVelocityX,\n                vy: this.#throwVelocityY,\n                active: false,\n                start_s: null,\n                stop_s: null,\n            };\n        }\n        return {\n            x: sample.position[0],\n            y: sample.position[1],\n            vx: sample.velocity[0],\n            vy: sample.velocity[1],\n            active: true,\n            start_s: sample.start_s,\n            stop_s: sample.stop_s,\n        };\n    }\n\n    /* Keep chunk/window maintenance aligned with one live inertial frame without reintroducing per-frame scroll state writes. */\n    #syncLiveFrame() {\n        if (this.#liveFrameSyncing || !this.exponentialDecayPlan('throw_scroll')) {\n            return;\n        }\n        const frameIndex = this.scene?.stage?.frameIndex ?? -1;\n        if (frameIndex === this.#liveFrameSyncIndex) {\n            return;\n        }\n        this.#liveFrameSyncing = true;\n        try {\n            this.#runMaintenance();\n            this.#liveFrameSyncIndex = frameIndex;\n        } finally {\n            this.#liveFrameSyncing = false;\n        }\n    }\n\n    /* Read one committed-or-live horizontal scroll value without forcing per-frame state writes. */\n    #currentScrollX(nowS = this.sceneNowS()) {\n        return this.#liveScrollState(nowS).x;\n    }\n\n    /* Read one committed-or-live vertical scroll value without forcing per-frame state writes. */\n    #currentScrollY(nowS = this.sceneNowS()) {\n        return this.#liveScrollState(nowS).y;\n    }\n\n    /* Persist the current analytical scroll sample into the authoritative logical state when interaction edges need a stable base. */\n    #commitLiveScroll(nowS = this.sceneNowS()) {\n        const sample = this.#liveScrollState(nowS);\n        this.#setScroll(sample.x, sample.y);\n        this.#throwVelocityX = sample.vx;\n        this.#throwVelocityY = sample.vy;\n        return sample;\n    }\n\n    /* Project the body-scope draw-time offset so chunk tiles and scoped text can ride one shared inertia payload. */\n    #bodyPresentationOffsetPayload() {\n        const plan = this.exponentialDecayPlan('throw_scroll');\n        if (!plan) {\n            return {\n                active: false,\n                position: [-this.#scrollX, -this.#scrollY, 0],\n            };\n        }\n        return {\n            active: true,\n            position: [-plan.position[0], -plan.position[1], 0],\n            velocity: [-plan.velocity[0], -plan.velocity[1], 0],\n            start_s: plan.start_s,\n            stop_s: plan.stop_s,\n            decay_per_s: plan.decay_per_s,\n        };\n    }\n\n    /* Project the header-scope draw-time offset so sticky chrome only tracks horizontal inertia. */\n    #headerPresentationOffsetPayload() {\n        const plan = this.exponentialDecayPlan('throw_scroll');\n        if (!plan) {\n            return {\n                active: false,\n                position: [-this.#scrollX, 0, 0],\n            };\n        }\n        return {\n            active: true,\n            position: [-plan.position[0], 0, 0],\n            velocity: [-plan.velocity[0], 0, 0],\n            start_s: plan.start_s,\n            stop_s: plan.stop_s,\n            decay_per_s: plan.decay_per_s,\n        };\n    }\n\n    #viewportState() {\n        const [width, height] = this.#hostViewportSize();\n        const scrollX = this.#currentScrollX();\n        const scrollY = this.#currentScrollY();\n        return {\n            width,\n            height,\n            minX: scrollX,\n            minY: scrollY,\n            maxX: scrollX + width,\n            maxY: scrollY + height,\n        };\n    }\n\n    #viewportRect() {\n        const [width, height] = this.#hostViewportSize();\n        return {\n            width,\n            height,\n            minX: 0,\n            minY: 0,\n            maxX: width,\n            maxY: height,\n        };\n    }\n\n    /* Keep passive body chrome no wider than the realised table, while still clipping wide tables to the host viewport. */\n    #visibleBodyWidth() {\n        const viewport = this.#viewportRect();\n        const tableWidth = this.header ? this.#totalColumnWidth() : viewport.width;\n        if (!Number.isFinite(tableWidth) || tableWidth <= 0) {\n            return viewport.width;\n        }\n        return Math.min(viewport.width, tableWidth);\n    }\n\n    /* Stop one inertial tail once the next frame would be visually indistinguishable in fullscreen. */\n    #throwDisplaySettled(position, velocity) {\n        const sameX = Math.abs(position[0] - this.#scrollX) <= TABLE_THROW_DISPLAY_SETTLE_PX;\n        const sameY = Math.abs(position[1] - this.#scrollY) <= TABLE_THROW_DISPLAY_SETTLE_PX;\n        if (!sameX || !sameY) {\n            return false;\n        }\n        return Math.abs(velocity[0]) <= TABLE_THROW_DISPLAY_SETTLE_PX_PER_SECOND\n            && Math.abs(velocity[1]) <= TABLE_THROW_DISPLAY_SETTLE_PX_PER_SECOND;\n    }\n\n    /* Persist one authoritative scroll position only when the logical offset really changes. */\n    #setScroll(x = this.#scrollX, y = this.#scrollY) {\n        if (!Number.isFinite(x) || !Number.isFinite(y)) {\n            throw new Error(`TableView expected finite scroll offsets, got (${x}, ${y}).`);\n        }\n        if (this.#scrollX === x && this.#scrollY === y) {\n            return;\n        }\n        this.#scrollX = x;\n        this.#scrollY = y;\n        this.#liveFrameSyncIndex = -1;\n        this.#viewportSyncDirty = true;\n    }\n\n    #applyScrollNow() {\n        this.#runMaintenance();\n    }\n\n    #markViewportSyncDirty() {\n        this.#viewportSyncDirty = true;\n    }\n\n    #invalidatePreferredPreviewHeight() {\n        this.#preferredPreviewHeightDirty = true;\n        this.#preferredPreviewHeightCache = null;\n        this.#preferredPreviewHeightCacheMax = null;\n    }\n\n    #syncViewportPlacement() {\n        this.#syncHeaderToViewport();\n        this.#syncZebraLayer();\n        this.#syncSeparatorMount();\n        this.#syncChunkMount();\n        this.#syncBackgroundToViewport();\n        this.#viewportSyncDirty = false;\n    }\n\n    resetViewportScroll() {\n        this.#setScroll(0, 0);\n        this.syncViewportLayout();\n    }\n\n    syncViewportLayout() {\n        const [width, height] = this.#hostViewportSize();\n        if (this.state.width !== width || this.state.height !== height) {\n            this.mutate({ width, height });\n        }\n        const inspectWidth = this.#inspectEditorWidth(width);\n        if (this.#inspectMount && this.#inspectMount.state.width !== inspectWidth) {\n            this.#inspectMount.mutate({ width: inspectWidth });\n            this.#inspectRevealClip?.mutate({ width: inspectWidth });\n            for (const row of this.#inspectRows) {\n                row.mutate({ width: inspectWidth });\n            }\n            for (const input of this.#inspectInputs) {\n                input.mutate({ width: this.#inspectInputWidth(inspectWidth) });\n            }\n        }\n        this.#syncInspectBacking();\n        this.#rebuildColumnSeparators();\n        this.#markViewportSyncDirty();\n        this.#runMaintenance();\n    }\n\n    #mouseWorldPosition() {\n        const cam = this.scene?.camera;\n        if (!cam?.vpBounds) {\n            throw new Error('TableView requires a live scene camera to resolve mouse position.');\n        }\n        return cam.getMouseWorldPosition();\n    }\n\n    #mouseInViewport() {\n        const [x, y] = this.getLocalMousePosition();\n        const [width, height] = this.#hostViewportSize();\n        return x >= 0 && x <= width && y >= 0 && y <= height;\n    }\n\n    #mouseInScrollBody() {\n        if (!this.#mouseInViewport()) {\n            return false;\n        }\n        const [, y] = this.getLocalMousePosition();\n        return y >= this.#tableBodyTop();\n    }\n\n    #pixelWheelAmount(raw) {\n        if (!Number.isFinite(raw)) {\n            return 0.0;\n        }\n        return Math.abs(Math.tanh(raw / 52.0));\n    }\n\n    #hasWheelInput(events) {\n        return !!events\n            && (\n                events.has?.('SCROLL_DOWN')\n                || events.has?.('SCROLL_UP')\n                || events.has?.('SCROLL_LEFT')\n                || events.has?.('SCROLL_RIGHT')\n                || events.has?.('SCROLL_DOWN_PIXEL')\n                || events.has?.('SCROLL_UP_PIXEL')\n                || events.has?.('SCROLL_LEFT_PIXEL')\n                || events.has?.('SCROLL_RIGHT_PIXEL')\n                || (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && ((events.wheelDeltaX ?? 0) !== 0 || (events.wheelDeltaY ?? 0) !== 0))\n            );\n    }\n\n    #inputFrameDeltatime(events) {\n        const dt = events?.frameDeltaTime;\n        if (!Number.isFinite(dt) || dt <= 0) {\n            throw new Error(`TableView momentum input requires a positive events.frameDeltaTime, got ${dt}.`);\n        }\n        return dt;\n    }\n\n    /* Resolve one wheel-frame dt, falling back to the scene cadence when the input envelope has no explicit frame delta. */\n    #wheelFrameDeltatime(events) {\n        const dt = events?.frameDeltaTime;\n        if (Number.isFinite(dt) && dt > 0) {\n            return dt;\n        }\n        return this.sceneFrameStepS();\n    }\n\n    /* Continue the shared inertial scroll tail from the current committed position. */\n    #startThrowDecay(position = [this.#scrollX, this.#scrollY], decayPerS = TABLE_THROW_DECAY_PER_SECOND) {\n        this.startExponentialDecay('throw_scroll', {\n            position,\n            velocity: [this.#throwVelocityX, this.#throwVelocityY],\n            decay_per_s: decayPerS,\n            epsilon: TABLE_THROW_STOP_PX_PER_SECOND,\n            predict_stop: ({ start_s, position: nextPosition, velocity, decay_per_s }) => this.#predictThrowClampStop({\n                start_s,\n                position: nextPosition,\n                velocity,\n                decay_per_s,\n            }),\n            clamp: ({ position: nextPosition, velocity }) => {\n                const nextX = this.#clampedScrollX(nextPosition[0]);\n                const nextY = this.#clampedScrollY(nextPosition[1]);\n                let stop = false;\n                let reason = 'running';\n                let nextVelocity = [...velocity];\n                if (nextX !== nextPosition[0] || nextY !== nextPosition[1]) {\n                    nextVelocity = [0.0, 0.0];\n                    stop = true;\n                    reason = 'clamped';\n                }\n                if (this.#throwDisplaySettled([nextX, nextY], nextVelocity)) {\n                    nextVelocity[0] = 0.0;\n                    nextVelocity[1] = 0.0;\n                    stop = true;\n                    reason = 'display_settled';\n                }\n                return {\n                    position: [nextX, nextY],\n                    velocity: nextVelocity,\n                    stop,\n                    reason,\n                };\n            },\n            sample_only: true,\n            onFinish: ({ position: nextPosition }) => {\n                this.#setScroll(nextPosition[0], nextPosition[1]);\n                this.#throwVelocityX = 0.0;\n                this.#throwVelocityY = 0.0;\n                this.#applyScrollNow();\n                noteTableviewLiveProbe({\n                    line: this.#lineOnPuffbook,\n                    table_name: this.state?.name ?? 'unknown',\n                    frame_index: this.scene?.stage?.frameIndex ?? null,\n                    kind: 'physics_idle',\n                    scroll_x: this.#currentScrollX(),\n                    scroll_y: this.#currentScrollY(),\n                    throw_vx: this.#throwVelocityX,\n                    throw_vy: this.#throwVelocityY,\n                });\n            },\n        });\n    }\n\n    /* Add a small local tail for shifted wheel frames so boosted gestures keep inertia even when the browser stops emitting momentum deltas. */\n    #applyShiftWheelCarry(deltaX, deltaY, events) {\n        const dt = this.#wheelFrameDeltatime(events);\n        const carryVX = (deltaX * TABLE_SHIFT_WHEEL_CARRY) / dt;\n        const carryVY = (deltaY * TABLE_SHIFT_WHEEL_CARRY) / dt;\n        if (Math.abs(carryVX) <= 0.01 && Math.abs(carryVY) <= 0.01) {\n            return;\n        }\n        if (carryVX !== 0 && this.#throwVelocityX !== 0 && Math.sign(carryVX) !== Math.sign(this.#throwVelocityX)) {\n            this.#throwVelocityX = 0.0;\n        }\n        if (carryVY !== 0 && this.#throwVelocityY !== 0 && Math.sign(carryVY) !== Math.sign(this.#throwVelocityY)) {\n            this.#throwVelocityY = 0.0;\n        }\n        this.#throwVelocityX += carryVX;\n        this.#throwVelocityY += carryVY;\n        this.#startThrowDecay([this.#scrollX, this.#scrollY], -Math.log(TABLE_SHIFT_WHEEL_DRAG) / this.sceneFrameStepS());\n    }\n\n    /* Read the authoritative constant row height used by the current virtualised table geometry. */\n    #fixedRowHeightPx() {\n        const rowHeight = this.#style?.fixedRowHeight;\n        if (!Number.isFinite(rowHeight) || rowHeight <= 0) {\n            throw new Error(`TableView expected a positive fixed row height, got ${rowHeight}.`);\n        }\n        return rowHeight;\n    }\n\n    /* Convert one absolute entry index into the local virtualised row origin under the current starting entry offset. */\n    #rowBandOriginForEntry(entry) {\n        return this.#tableBodyTop() + ((entry - this.#startingEntry) * this.#fixedRowHeightPx());\n    }\n\n    /* Keep the local virtual scroll model explicit: scrollY is offset by the current starting entry anchor. */\n    #scrollEntryOffsetPx() {\n        return this.#startingEntry * this.#fixedRowHeightPx();\n    }\n\n    /* Read the full deterministic table bottom in local virtualised coordinates without consulting chunk caches. */\n    #tableBottomLocalY() {\n        return this.#tableBodyTop() + ((this.#dataSize - this.#startingEntry) * this.#fixedRowHeightPx());\n    }\n\n    #verticalScrollBounds() {\n        if (!this.header) {\n            return { minY: 0, maxY: 0 };\n        }\n        const [, height] = this.#hostViewportSize();\n        const minY = -this.#scrollEntryOffsetPx();\n        const maxY = Math.max(minY, this.#tableBottomLocalY() - height);\n        return { minY, maxY };\n    }\n\n    /* Predict the earliest exact hard stop against deterministic x/y scroll bounds so inertia needs only one clamp wake. */\n    #predictThrowClampStop({ start_s, position, velocity, decay_per_s }) {\n        const { minX, maxX } = this.#horizontalScrollBounds();\n        const { minY, maxY } = this.#verticalScrollBounds();\n        const candidates = [];\n\n        const xBoundary = velocity[0] > 0 ? maxX : (velocity[0] < 0 ? minX : null);\n        const yBoundary = velocity[1] > 0 ? maxY : (velocity[1] < 0 ? minY : null);\n        const xDt = xBoundary === null ? null : decayBoundaryHitAfterS(position[0], velocity[0], decay_per_s, xBoundary);\n        const yDt = yBoundary === null ? null : decayBoundaryHitAfterS(position[1], velocity[1], decay_per_s, yBoundary);\n\n        if (Number.isFinite(xDt)) {\n            candidates.push({\n                dt_s: xDt,\n                axis: 'x',\n                boundary: xBoundary,\n            });\n        }\n        if (Number.isFinite(yDt)) {\n            candidates.push({\n                dt_s: yDt,\n                axis: 'y',\n                boundary: yBoundary,\n            });\n        }\n        if (candidates.length === 0) {\n            return null;\n        }\n\n        candidates.sort((a, b) => a.dt_s - b.dt_s);\n        const hit = candidates[0];\n        const decay = Math.exp(-decay_per_s * hit.dt_s);\n        const displacementScale = (1.0 - decay) / decay_per_s;\n        const nextX = position[0] + velocity[0] * displacementScale;\n        const nextY = position[1] + velocity[1] * displacementScale;\n        return {\n            stop_s: start_s + hit.dt_s,\n            position: [\n                hit.axis === 'x' ? hit.boundary : nextX,\n                hit.axis === 'y' ? hit.boundary : nextY,\n            ],\n            velocity: [0, 0],\n            reason: 'clamped',\n        };\n    }\n\n    /* Clamp horizontal camera motion against the full table width. */\n    #horizontalScrollBounds() {\n        if (!this.header) {\n            return { minX: 0, maxX: 0 };\n        }\n        const [width] = this.#hostViewportSize();\n        return {\n            minX: 0,\n            maxX: Math.max(0, this.header.width - width),\n        };\n    }\n\n    /* Keep x scroll inside the table extent so momentum cannot overshoot forever. */\n    #clampedScrollX(targetX) {\n        if (!Number.isFinite(targetX)) {\n            return this.#currentScrollX();\n        }\n        const { minX, maxX } = this.#horizontalScrollBounds();\n        return Math.max(minX, Math.min(targetX, maxX));\n    }\n\n    #clampedScrollY(targetY) {\n        if (!Number.isFinite(targetY)) {\n            return this.#currentScrollY();\n        }\n        const { minY, maxY } = this.#verticalScrollBounds();\n        let nextY = targetY;\n        if (Number.isFinite(minY)) {\n            nextY = Math.max(nextY, minY);\n        }\n        if (Number.isFinite(maxY)) {\n            nextY = Math.min(nextY, maxY);\n        }\n        return nextY;\n    }\n\n    /* Decide whether one passive-preview wheel frame can move the table on either scroll axis. */\n    #inlineWheelCanConsume(deltaX, deltaY) {\n        const hasX = Number.isFinite(deltaX) && deltaX !== 0;\n        const hasY = Number.isFinite(deltaY) && deltaY !== 0;\n        if (!hasX && !hasY) {\n            return false;\n        }\n        const scrollY = this.#currentScrollY();\n        const scrollX = this.#currentScrollX();\n        const nextX = hasX ? this.#clampedScrollX(scrollX + deltaX) : scrollX;\n        const nextY = hasY ? this.#clampedScrollY(scrollY + deltaY) : scrollY;\n        return Math.abs(nextX - scrollX) > 0.01 || Math.abs(nextY - scrollY) > 0.01;\n    }\n\n    #stopHostCameraMotion() {\n        const viewport = this.#hostViewport();\n        if (viewport?.expanded) {\n            return;\n        }\n        this.scene?.camera?.stopMotion?.();\n    }\n\n    #enableInlineInteractivePreview() {\n        if (this.inlineInputEnabled) {\n            return;\n        }\n        this.#stopHostCameraMotion();\n        this.inlineInputEnabled = true;\n        this.#needsInteractiveRefresh = false;\n        this.#rebuild();\n        this.resetViewportScroll();\n    }\n\n    #syncPreviewHostHeight() {\n        const viewport = this.#hostViewport();\n        let cur = viewport;\n        while (cur) {\n            if (typeof cur.syncPreviewViewportHeight === 'function') {\n                cur.syncPreviewViewportHeight(viewport);\n                return;\n            }\n            cur = cur.parentNode;\n        }\n    }\n\n    #syncPassivePreviewViewport() {\n        if (!this.#isPassivePreviewMode()) {\n            return;\n        }\n        const viewport = this.#hostViewport();\n        if (!viewport || typeof viewport.setViewportBounds !== 'function') {\n            return;\n        }\n        if (viewport.expanded) {\n            return;\n        }\n        const width = viewport.state?.width ?? this.state.width;\n        const height = this.preferredPreviewHeight(DEFAULT_PREVIEW_MAX_HEIGHT);\n        viewport.setViewportBounds(width, height);\n        this.resetViewportScroll();\n        this.#syncPreviewHostHeight();\n    }\n\n    #reconcilePassivePreviewViewportHeight() {\n        if (!this.#isPassivePreviewMode()) {\n            return;\n        }\n        const viewport = this.#hostViewport();\n        if (!viewport || typeof viewport.setViewportBounds !== 'function' || viewport.expanded) {\n            return;\n        }\n        const width = viewport.state?.width ?? this.state.width;\n        const height = this.preferredPreviewHeight(DEFAULT_PREVIEW_MAX_HEIGHT);\n        const curHeight = viewport.state?.height ?? null;\n        if (Number.isFinite(curHeight) && Math.abs(curHeight - height) <= PREVIEW_HEIGHT_EPSILON) {\n            return;\n        }\n        viewport.setViewportBounds(width, height);\n        this.resetViewportScroll();\n        this.#syncPreviewHostHeight();\n    }\n\n    /* Rebuild only when the visible table contract changes; passive previews should retain their scene graph across immutable snapshot churn. */\n    setStruct(struct) {\n        if (!struct) {\n            throw new Error('TableView.setStruct(struct): struct must be present.');\n        }\n        const table = tableViewData(struct);\n        if (!table) {\n            throw new Error('TableView.setStruct requires Struct or List[Struct|Tuple|NamedTuple] data.');\n        }\n        const passivePreview = this.#isPassivePreviewMode();\n        const previousSchema = passivePreview ? null : this.#schemaSignature(this.#data);\n        const nextSchema = passivePreview ? null : this.#schemaSignature(table);\n        if (!passivePreview && this.#data === table) {\n            return false;\n        }\n        const samePreview = passivePreview\n            && tableHeaderSignature(this.#data) === tableHeaderSignature(table)\n            && tablePreviewSignature(this.#data) === tablePreviewSignature(table);\n        if (this.#data !== table) {\n            this.#headerTooltipController.invalidate();\n        }\n        this.#data = table;\n        if (passivePreview && samePreview) {\n            this.#needsInteractiveRefresh = false;\n            this.#syncPassivePreviewViewport();\n            return false;\n        }\n        if (!passivePreview && samePreview) {\n            this.#needsInteractiveRefresh = true;\n            this.#syncPassivePreviewViewport();\n            return false;\n        }\n        this.#needsInteractiveRefresh = false;\n        // Track loading until the replacement chunk graph is ready.\n        // Awaiting a source result retains the old table without changing input handling.\n        if (this.isFullscreenPresentation() && !this.isScreenshot) {\n            this.#refreshBuildPending = true;\n            if (this.#inspectInputs.length > 0) {\n                this.setInspectState(TABLE_INSPECT_STATE.REFRESHING);\n            }\n            this.#syncStalePresentation();\n        }\n        this.#rebuild();\n        if (!passivePreview) {\n            this.#restoreScrollAfterStructUpdate(previousSchema === nextSchema);\n        }\n        this.#syncPassivePreviewViewport();\n        return true;\n    }\n\n    #schemaSignature(struct) {\n        const names = struct?.fieldNames?.() ?? [];\n        return names.map((name) => {\n            const field = struct.field(name);\n            const type = field?.deepLogicalType?.() ?? field?.logicalType?.() ?? field?.constructor?.name ?? typeof field;\n            return name + \":\" + type;\n        }).join(\"|\");\n    }\n\n    #restoreScrollAfterStructUpdate(sameSchema) {\n        const targetX = sameSchema ? this.#clampedScrollX(this.#scrollX) : 0;\n        const targetY = this.#clampedScrollY(this.#scrollY);\n        this.cancelExponentialDecay(\"throw_scroll\");\n        this.#setScroll(targetX, targetY);\n        this.#applyScrollNow();\n        pushTestingTableviewTrace(\"tableview_struct_scroll_reconciled\", {\n            line: this.#lineOnPuffbook,\n            same_schema: sameSchema,\n            scroll_x: targetX,\n            scroll_y: targetY,\n        });\n    }\n\n    /* Lifecycle presentation is deliberately separate from the last successful struct. */\n    setRefreshState(refreshing) {\n        if (typeof refreshing !== 'boolean') {\n            throw new Error('TableView.setRefreshState(refreshing): refreshing must be boolean.');\n        }\n        if (refreshing && this.#inspectInputs.length > 0 && this.#inspectState === TABLE_INSPECT_STATE.STALE) {\n            return false;\n        }\n        if (this.#refreshing === refreshing) {\n            return false;\n        }\n        this.#refreshing = refreshing;\n        this.#syncStalePresentation();\n        pushTestingTableviewTrace('tableview_refresh_state', {\n            line: this.#lineOnPuffbook,\n            refreshing,\n            fullscreen: this.isFullscreenPresentation(),\n        });\n        return true;\n    }\n\n    #syncStalePresentation() {\n        const stale = this.#inspectState === TABLE_INSPECT_STATE.STALE;\n        const visible = stale\n            && this.isFullscreenPresentation()\n            && !this.isScreenshot;\n        if (!visible) {\n            this.#clearStalePresentation();\n            return;\n        }\n        const stage = this.scene?.stage ?? null;\n        const mountRoot = stage?.hudMountRoot?.('content') ?? null;\n        if (!mountRoot) {\n            return;\n        }\n        if (!this.#staleIndicator) {\n            this.#staleIndicator = new ui.Icon({\n                name: `.stale_indicator`,\n                width: STALE_INDICATOR_SIZE,\n                height: STALE_INDICATOR_SIZE,\n                z: STALE_INDICATOR_Z,\n                color: Palette.white,\n                iconID: STALE_INDICATOR_ICON_ID,\n            });\n            mountRoot.appendChild(this.#staleIndicator);\n            this.#staleIndicator.setGpuSpin(STALE_INDICATOR_SPIN_PERIOD_S);\n            this.#staleIndicator.animateTo({\n                clock_s: 1,\n                duration_s: STALE_INDICATOR_SPIN_PERIOD_S,\n                ease: 'linear',\n                loop: 'repeat',\n                accumulate: true,\n            });\n            pushTestingTableviewTrace('tableview_stale_indicator_spawned', {\n                line: this.#lineOnPuffbook,\n                icon_id: STALE_INDICATOR_ICON_ID,\n            });\n        } else if (this.#staleIndicator.parentNode !== mountRoot) {\n            this.#staleIndicator.parentNode?.removeChild(this.#staleIndicator);\n            mountRoot.appendChild(this.#staleIndicator);\n        }\n        this.#positionStalePresentation(mountRoot);\n    }\n\n    #clearStalePresentation() {\n        if (this.#staleIndicator) {\n            this.#staleIndicator.stopAnimation('clock_s');\n            this.#staleIndicator.setGpuSpin(null);\n            this.#staleIndicator.parentNode?.removeChild(this.#staleIndicator);\n            this.#staleIndicator = null;\n        }\n    }\n\n    #positionStalePresentation(mountRoot = this.#staleIndicator?.parentNode ?? null) {\n        if (!this.#staleIndicator) {\n            return;\n        }\n        const bounds = this.scene?.stage?.hudViewportBounds?.(mountRoot) ?? null;\n        if (!bounds) {\n            return;\n        }\n        this.#staleIndicator.setLocalPosition([\n            bounds.left + STALE_INDICATOR_INSET,\n            bounds.bottom - STALE_INDICATOR_SIZE - STALE_INDICATOR_INSET,\n            STALE_INDICATOR_Z,\n        ]);\n    }\n\n    #refreshBuildIsComplete() {\n        if (this.#dataSize === 0) {\n            return true;\n        }\n        const records = [...(this.#chunkMap?.values() ?? [])];\n        return records.length > 0 && records.every((record) => record.status === CHUNK_PREP_STATUS.ATTACHED && !!record.node);\n    }\n\n    #finishRefreshBuildIfReady() {\n        if (!this.#refreshBuildPending || !this.#refreshBuildIsComplete()) {\n            return;\n        }\n        this.#refreshBuildPending = false;\n        if (this.#inspectInputs.length > 0 && this.#inspectState === TABLE_INSPECT_STATE.REFRESHING) {\n            this.setInspectState(TABLE_INSPECT_STATE.UPDATED);\n        }\n        this.#maybeCompleteFinalLeave();\n        this.#syncStalePresentation();\n        pushTestingTableviewTrace('tableview_refresh_build_finished', {\n            line: this.#lineOnPuffbook,\n        });\n    }\n\n    setPreviewHints(previewHints) {\n        const next = previewHints ?? null;\n        if (this.#previewHints === next) {\n            return false;\n        }\n        this.#previewHints = next;\n        this.#rebuild();\n        this.#syncPassivePreviewViewport();\n        return true;\n    }\n\n    setPresentationMode(mode) {\n        if (!Object.values(TABLEVIEW_PRESENTATION_MODE).includes(mode)) {\n            throw new Error(`TableView.setPresentationMode(...): unknown mode '${mode}'.`);\n        }\n        if (this.#presentationMode === mode) {\n            return false;\n        }\n        this.#presentationMode = mode;\n        this.#headerTooltipController.setMode(mode);\n        this.#syncStalePresentation();\n        return true;\n    }\n\n    testingHeaderTooltipState() {\n        return this.#headerTooltipController.testingState();\n    }\n\n    isFullscreenPresentation() {\n        return this.#presentationMode === TABLEVIEW_PRESENTATION_MODE.FULLSCREEN;\n    }\n\n    /* Resolve tooltip text on demand so prepared chunks do not retain full copies of every cell value. */\n    tooltipTextForCell(columnName, rowEntry) {\n        if (typeof columnName !== 'string' || !Number.isInteger(rowEntry) || rowEntry < 0) {\n            return '';\n        }\n        const field = this.#data?.field?.(columnName) ?? null;\n        if (!field) {\n            return '';\n        }\n        if (typeof field.validAt === 'function' && !field.validAt(rowEntry)) {\n            return NULL_CELL_TEXT;\n        }\n        if (typeof field.length === 'function' && rowEntry >= field.length()) {\n            return NULL_CELL_TEXT;\n        }\n        const value = previewDisplayCell(field, rowEntry);\n        return value === null || value === undefined ? NULL_CELL_TEXT : String(value);\n    }\n\n    enterInteractiveMode() {\n        this.#inspectAssignmentDraft.text = '';\n        this.setPresentationMode(TABLEVIEW_PRESENTATION_MODE.FULLSCREEN);\n        this.#ownOnInspectSessionStart?.(this);\n        this.#inspectOriginalText = this.#inspectText;\n        this.#inspectOriginalLines = [...this.#inspectSourceLines];\n        this.#inspectOriginalOutputLine = this.#lineOnPuffbook;\n        pushTestingTableviewTrace('tableview_enter_interactive', {\n            line: this.#lineOnPuffbook,\n        });\n        this.isScreenshot = false;\n        this.#needsInteractiveRefresh = false;\n        this.#syncClipMode();\n        this.#rebuild();\n    }\n\n    preferredPreviewHeight(maxHeight = 256) {\n        if (\n            !this.#preferredPreviewHeightDirty\n            && this.#preferredPreviewHeightCacheMax === maxHeight\n            && Number.isFinite(this.#preferredPreviewHeightCache)\n        ) {\n            return this.#preferredPreviewHeightCache;\n        }\n        const startedAt = Date.now();\n        if (!Number.isFinite(maxHeight) || maxHeight <= 0) {\n            throw new Error(`TableView.preferredPreviewHeight(${maxHeight}): maxHeight must be positive.`);\n        }\n        let result = maxHeight;\n        if (!this.header || this.#dataSize === 0) {\n            result = maxHeight;\n        } else {\n            result = Math.min(maxHeight, this.header.height + this.#dataSize * this.#fixedRowHeightPx());\n        }\n        this.#preferredPreviewHeightDirty = false;\n        this.#preferredPreviewHeightCache = result;\n        this.#preferredPreviewHeightCacheMax = maxHeight;\n        pushTestingTableviewTrace('tableview_preferred_preview_height_done', {\n            line: this.#lineOnPuffbook,\n            max_height: maxHeight,\n            result,\n            duration_ms: Date.now() - startedAt,\n        });\n        return result;\n    }\n\n    parseValueType(value, type){\n        const emptyValue = value === ''\n\n        if([\"List[Float64]\", \"List[Float32]\", \"List[oFloat64]\", \"List[oFloat32]\"].includes(type)){\n            return emptyValue ? 0.0 : parseFloat(value);\n        }\n        if([\"List[Str]\", \"List[oStr]\"].includes(type)){\n            return `'${value}'`;\n        }\n        if([\"List[Bool]\", \"List[oBool]\"].includes(type)){\n            if([\"True\", \"true\", \"t\", \"T\", \"1\"].includes(value)) {\n                return 'true';\n            }\n            return 'false'\n        }\n        return emptyValue ? 0 : parseInt(value, 10);\n    }\n\n    #applyAmend(body) {\n        return Promise.resolve(this.#ownOnApplyAmend(body, this.#lineOnPuffbook)).catch((err) => {\n            console.error('TableView amend failed', err);\n        });\n    }\n\n\n    #handleSort(data) {\n        if (this.readOnly) return;\n        if (this.isFullscreenPresentation()) {\n            this.setRefreshState(true);\n        }\n\n        const sortArguments = data.map(rule => {\n            const columnName = rule[0];\n            const direction = rule[1];\n            const columnString = `.['${columnName}']`;\n\n            if (direction === \"descending\") {\n                return `descending(${columnString})`;\n            }\n            return columnString;\n        });\n\n        const argsString = sortArguments.length === 1\n            ? sortArguments[0]\n            : `(${sortArguments.join(', ')})`;\n\n        const body = `sort(${argsString})`;\n        void this.#applyAmend(body);\n    }\n\n    #handleFilter(data) {\n        if (this.readOnly) return;\n        if (this.isFullscreenPresentation()) {\n            this.setRefreshState(true);\n        }\n        let formattedValue = this.parseValueType(data.value, data.type);\n\n        const col = `.['${data.column}']`;\n        let expression;\n\n        switch (data.condition) {\n            case \"equal to\":\n                expression = `${col} == ${formattedValue}`;\n                break;\n            case \"greater or equal to\":\n                expression = `${col} >= ${formattedValue}`;\n                break;\n            case \"less or equal to\":\n                expression = `${col} <= ${formattedValue}`;\n                break;\n            case \"greater than\":\n                expression = `${col} > ${formattedValue}`;\n                break;\n            case \"less than\":\n                expression = `${col} < ${formattedValue}`;\n                break;\n            case \"is not\":\n                expression = `${col} != ${formattedValue}`;\n                break;\n            case \"is null\":\n                expression = `${col}.is_null()`;\n                break;\n            case \"contains\":\n                expression = `${col}.contains(${formattedValue})`;\n                break;\n            case \"starts with\":\n                expression = `${col}.starts_with(${formattedValue})`;\n                break;\n            case \"ends with\":\n                expression = `${col}.ends_with(${formattedValue})`;\n                break;\n            default:\n                expression = `${col} == ${formattedValue}`;\n                break;\n        }\n\n        const text = `filter(${expression})`;\n        void this.#applyAmend(text);\n    }\n\n    #handleFill(data) {\n        if (this.readOnly) return;\n        if (this.isFullscreenPresentation()) {\n            this.setRefreshState(true);\n        }\n\n        let formattedValue = this.parseValueType(data.value, data.type);\n        const text = `fill({'${data.column}': ${formattedValue}})`;\n        void this.#applyAmend(text);\n    }\n\n    #handleFillTable() {\n        if (this.readOnly) return;\n        if (this.isFullscreenPresentation()) {\n            this.setRefreshState(true);\n        }\n        void this.#applyAmend('fill()');\n    }\n\n    createBackground() {\n        if (!this.background) {\n            const [w, h] = this.#hostViewportSize();\n            this.background = new ui.Tile({\n                tileBatch: 'tableview.background',\n                width: w,\n                height: h,\n                z: 1.0,\n                color: [0.098, 0.122, 0.145, 1.0]\n            })\n            this.#contentMount.appendChild(this.background);\n        }\n        this.#syncBackgroundToViewport();\n    }\n\n    #positionEmptyLabel() {\n        if (!this.#emptyLabel || !this.header) {\n            return;\n        }\n        const viewport = this.#viewportRect();\n        const bodyTop = this.#tableBodyTop();\n        const bodyHeight = Math.max(0, viewport.height - bodyTop);\n        const layout = evilfont.MSDFText.measureFromState({\n            font: this.#style.headerFont,\n            fontSize: this.#style.fontSize * EMPTY_TABLE_FONT_SCALE,\n            text: 'No rows',\n        });\n        const headerX = -this.#currentScrollX() - this.header.origin.x;\n        this.#emptyLabel.setLocalPosition([\n            headerX + Math.max(0, this.header.width * 0.5 - layout.width * 0.5),\n            viewport.minY + bodyTop + Math.max(0, bodyHeight * 0.5 - layout.height * 0.5),\n            this.#emptyLabel.localPosition()[2],\n        ]);\n    }\n\n    #syncFullscreenChrome() {\n        this.#fullscreenChrome?.syncVisibility(!this.isScreenshot);\n    }\n\n    #positionFullscreenChrome() {\n        if (!this.#fullscreenChrome) {\n            return;\n        }\n        this.#fullscreenChrome.position(this.#viewportRect());\n    }\n\n    /* Keep chunk/cache maintenance aligned with live analytic momentum before transform propagation runs. */\n    _evaluateAnimations(nowS) {\n        super._evaluateAnimations(nowS);\n        if (this.#inspectMount && Number.isFinite(this._animationClockS)) {\n            this.#applyInspectRevealHeight(this._animationClockS);\n        }\n        this.#syncLiveFrame();\n    }\n\n    /* Apply table layout/cache maintenance immediately where state changes, rather than via unconditional class polling. */\n    #runMaintenance() {\n        this.#assertNoFailedChunkPayloads();\n        this.#assertNoStalledChunkPayloads();\n        const startedAt = performance.now();\n        this.#positionEmptyLabel();\n        this.#syncStalePresentation();\n\n        const columnWindowChanged = this.#updateColumnWindow();\n\n        if (this.#dataSize > 0) {\n            this.updateChunkSystem();\n        }\n\n        const attachedReady = this.#drainReadyChunkPayloads();\n        this.#finishRefreshBuildIfReady();\n\n        if (this.header) {\n            const scroll = this.#liveScrollState();\n            const nextScrollX = this.#clampedScrollX(scroll.x);\n            const nextScrollY = this.#clampedScrollY(scroll.y);\n            if (Math.abs(nextScrollX - scroll.x) > 0.01 || Math.abs(nextScrollY - scroll.y) > 0.01) {\n                this.#setScroll(nextScrollX, nextScrollY);\n            }\n        }\n\n        if (this.#viewportSyncDirty) {\n            this.#syncViewportPlacement();\n        }\n\n        if (this.#dataSize > 0) {\n            this.#syncChunkRenderWindow();\n        }\n\n        this.#reconcilePassivePreviewViewportHeight();\n        this.#syncFullscreenChrome();\n        this.#positionFullscreenChrome();\n\n        noteTableviewLiveProbe({\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            frame_index: this.scene?.stage?.frameIndex ?? null,\n            kind: 'maintenance',\n            stage_ms: performance.now() - startedAt,\n            column_window_changed: columnWindowChanged,\n            attached_ready_chunks: attachedReady,\n            column_window_ms: this.#diagLastColumnWindow.duration_ms,\n            update_chunk_ms: this.#diagLastUpdateChunk.duration_ms,\n            reconcile_ms: this.#diagLastReconcile.duration_ms,\n            reconcile_built: this.#diagLastReconcile.built,\n            render_window_ms: this.#diagLastRenderWindow.duration_ms,\n            render_window_visible: this.#diagLastRenderWindow.visible_count,\n            render_window_total: this.#diagLastRenderWindow.total_count,\n            scroll_x: this.#currentScrollX(),\n            scroll_y: this.#currentScrollY(),\n            throw_vx: this.#throwVelocityX,\n            throw_vy: this.#throwVelocityY,\n            loaded_row_bands: this.#rowBandMap?.size ?? 0,\n            loaded_chunks: this.#chunkMap?.size ?? 0,\n        });\n    }\n\n    onKeyDown(event) {\n        const key = event.key\n        const command = event.ctrlKey || event.metaKey;\n        if (command && key?.toLowerCase() === 'z') {\n            if (event.ctrlKey && !event.shiftKey && !this.#fullscreenChrome.controls().assignInput?.inFocus) {\n                this.requestUndoInspect();\n            }\n            return true;\n        }\n        // Amend exposes Undo only on Ctrl+Z. Consume alternate undo/redo\n        // chords here so they cannot reach an underlying document editor.\n        if ((command && key?.toLowerCase() === 'y') || (event.altKey && key === 'Backspace')) return true;\n        if (key === \"Escape\") {\n            this.requestDiscardTableview();\n            return true;\n        }\n        return false;\n    }\n\n    onPointerInput(events, { forceViewportHit = false } = {}) {\n        if (!forceViewportHit && !this.#mouseInViewport()) {\n            return false;\n        }\n        if (shouldYieldWheelToCamera(events)) {\n            return false;\n        }\n        const passivePreview = this.#isPassivePreviewMode();\n        const embeddedPreview = this.isScreenshot === true;\n        // A release and double-click can share one frame. Yield the whole\n        // expansion frame to the viewport even after inline scroll capture.\n        if (embeddedPreview && events.has('DOUBLE_CLICK')) {\n            this.#commitLiveScroll();\n            this.cancelExponentialDecay('throw_scroll');\n            this.#throwVelocityX = 0;\n            this.#throwVelocityY = 0;\n            this.#currentThrowVelocityX = 0;\n            this.#currentThrowVelocityY = 0;\n            return false;\n        }\n        const hasWheelInput = this.#hasWheelInput(events);\n        const nowS = this.scene?.stage?.frameNowS ?? currentEvil();\n        if (passivePreview && !hasWheelInput && !this.#mouseInScrollBody()) {\n            return false;\n        }\n        if (embeddedPreview && hasWheelInput) {\n            const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n            if (cam?.ownsActiveWheelGesture?.(nowS) === true) {\n                return false;\n            }\n            if (Number.isFinite(this.#previewWheelEscapeUntilS) && nowS <= this.#previewWheelEscapeUntilS) {\n                return false;\n            }\n        }\n\n        let deltaX = 0.0;\n        let deltaY = 0.0;\n        let dragDX = 0.0;\n        let dragDY = 0.0;\n        let consumed = false;\n        const wheelScale = events?.has?.('SHIFT_KEY') ? TABLE_WHEEL_BOOST : 1.0;\n        for (const event of events) {\n            if (event === 'SCROLL_RIGHT') {\n                deltaX += TABLE_WHEEL_STEP * wheelScale;\n            } else if (event === 'SCROLL_LEFT') {\n                deltaX -= TABLE_WHEEL_STEP * wheelScale;\n            } else if (event === 'SCROLL_DOWN') {\n                deltaY += TABLE_WHEEL_STEP * wheelScale;\n            } else if (event === 'SCROLL_UP') {\n                deltaY -= TABLE_WHEEL_STEP * wheelScale;\n            } else if (event === 'L_MOUSE_DOWN_HOLD' && !passivePreview) {\n                if (!Mouse.movedSinceButtonDown(0)) {\n                    consumed = true;\n                    continue;\n                }\n                const dt = this.#inputFrameDeltatime(events);\n                const [width, height] = this.#hostViewportSize();\n                dragDX = -(Mouse.x - Mouse.lastX) * width;\n                dragDY = -(Mouse.y - Mouse.lastY) * height;\n                if (dragDX !== 0.0 || dragDY !== 0.0) {\n                    this.#commitLiveScroll();\n                    const dot = this.#throwVelocityX * dragDX + this.#throwVelocityY * dragDY;\n                    if (dot < 0) {\n                        this.#throwVelocityX = 0.0;\n                        this.#throwVelocityY = 0.0;\n                        this.cancelExponentialDecay('throw_scroll');\n                    }\n                    this.#currentThrowVelocityX = dragDX / dt;\n                    this.#currentThrowVelocityY = dragDY / dt;\n                    this.cancelExponentialDecay('throw_scroll');\n                    this.#setScroll(\n                        this.#clampedScrollX(this.#scrollX + dragDX),\n                        this.#clampedScrollY(this.#scrollY + dragDY),\n                    );\n                    this.#applyScrollNow();\n                }\n                consumed = true;\n            } else if (event === 'L_MOUSE_UP' && !passivePreview) {\n                this.#commitLiveScroll();\n                this.#throwVelocityX += this.#currentThrowVelocityX;\n                this.#throwVelocityY += this.#currentThrowVelocityY;\n                this.#currentThrowVelocityX = 0.0;\n                this.#currentThrowVelocityY = 0.0;\n                this.#startThrowDecay();\n                consumed = true;\n            }\n        }\n\n        if (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n            if ((events.wheelDeltaX ?? 0) !== 0) {\n                deltaX += this.#pixelWheelAmount(events.wheelDeltaX) * TABLE_WHEEL_STEP * wheelScale * Math.sign(events.wheelDeltaX);\n            }\n            if ((events.wheelDeltaY ?? 0) !== 0) {\n                deltaY += this.#pixelWheelAmount(events.wheelDeltaY) * TABLE_WHEEL_STEP * wheelScale * Math.sign(events.wheelDeltaY);\n            }\n        }\n\n        if (deltaX === 0 && deltaY === 0) {\n            return consumed;\n        }\n\n        if (passivePreview) {\n            this.#stopHostCameraMotion();\n            if (!this.#inlineWheelCanConsume(deltaX, deltaY)) {\n                if (embeddedPreview) {\n                    this.#previewWheelEscapeUntilS = nowS + TABLE_PREVIEW_WHEEL_ESCAPE_IDLE_LATCH_S;\n                }\n                return false;\n            }\n            this.#enableInlineInteractivePreview();\n        } else {\n            this.#stopHostCameraMotion();\n        }\n\n        this.#commitLiveScroll();\n        const prevX = this.#scrollX;\n        const prevY = this.#scrollY;\n        this.cancelExponentialDecay('throw_scroll');\n        this.#setScroll(\n            this.#clampedScrollX(this.#scrollX + deltaX),\n            this.#clampedScrollY(this.#scrollY + deltaY),\n        );\n        this.#applyScrollNow();\n        consumed = Math.abs(this.#scrollX - prevX) > 0.01 || Math.abs(this.#scrollY - prevY) > 0.01;\n        if (consumed) {\n            this.#previewWheelEscapeUntilS = null;\n            const wantsShiftCarry = events?.has?.('SHIFT_KEY');\n            if (wantsShiftCarry) {\n                this.#applyShiftWheelCarry(deltaX, deltaY, events);\n            }\n        }\n\n        if (!consumed && embeddedPreview) {\n            this.#previewWheelEscapeUntilS = nowS + TABLE_PREVIEW_WHEEL_ESCAPE_IDLE_LATCH_S;\n            return false;\n        }\n        return consumed || !embeddedPreview;\n    }\n\n    leaveTableview(sendLeaveSignal = true, force = false) {\n        if (!force) {\n            this.requestDiscardTableview();\n            return;\n        }\n        this.#leaveTableviewNow(sendLeaveSignal);\n    }\n\n    #leaveTableviewNow(sendLeaveSignal = true) {\n        if (focusStackContainsContainer(this)) {\n            removeFocusEntry(this);\n        }\n        this.setPresentationMode(TABLEVIEW_PRESENTATION_MODE.PREVIEW);\n        pushTestingTableviewTrace('tableview_leave', {\n            line: this.#lineOnPuffbook,\n            send_leave_signal: !!sendLeaveSignal,\n        });\n        this.isScreenshot = true;\n        this.inlineInputEnabled = false;\n        this.#needsInteractiveRefresh = false;\n        this.#startingEntry = 0;\n        this.#syncClipMode();\n        this.#rebuild();\n        this.goToChunkByEntry(0);\n        const preview = this.ownPreviewViewport ?? null;\n        preview?.leaveExpandedMode?.();\n        this.#ownOnInspectSessionEnd?.(this);\n        this.resetViewportScroll();\n        if (sendLeaveSignal) {\n            CommanderBus.emit(\"LEFT_TABLEVIEW_W_KEY\");\n        }\n    }\n\n\n    _onAttachNode() {\n        this.#ownOnInspectRecomputeFinished = ({ lineNum } = {}) => {\n            if (lineNum === this.#lineOnPuffbook && this.#inspectFinalising) {\n                this.#inspectFinalRecomputeFinished = true;\n                this.#maybeCompleteFinalLeave();\n            }\n        };\n        CommanderBus.on('AMEND_RECOMPUTE_FINISHED', this.#ownOnInspectRecomputeFinished);\n        this.#rebuild();\n        this.#runMaintenance();\n    }\n\n    _onDetachNode(shared) {\n        CommanderBus.off('AMEND_RECOMPUTE_FINISHED', this.#ownOnInspectRecomputeFinished);\n        this.#ownOnInspectRecomputeFinished = null;\n        this.#headerTooltipController.invalidate();\n        this.#clearStalePresentation();\n        this.#resetChunkPrepareState();\n        super._onDetachNode(shared);\n    }\n\n    //todu:comented for now to keep track of how the export fetch was working\n    // async loadData() {\n    //     this.#data = await this.api.table(this.dataParams);\n    //     this.#rebuild();\n    // }\n\n    // async getDataBuffer(format = \"ptl\") {\n    //     return await this.api.tableAsBuffer({\n    //         ...this.dataParams,\n    //         format: format\n    //     });\n    // }\n\n    initChunkSystem() {\n        this.#rowBandMap = new Map();\n        this.#chunkMap = new Map();\n        this.#chunkLayoutBodyTop = this.#tableBodyTop();\n\n        // Keep coarse vertical position as:\n        //   loaded row band starting at row n + pixel offset inside that band.\n        this.averageCellHeight = this.#style.maxCellHeight * 0.5; //Estimate\n        const startRowBand = 0;\n        this.#startingEntry = this.#clampChunkStart(this.#startingEntry);\n\n        const entries = this.#chunkEntries(this.#startingEntry);\n        if (!entries) {\n            return;\n        }\n        this.#buildRowBand(startRowBand, entries, this.#rowBandOriginForEntry(entries.first));\n        this.#currentRowBand = startRowBand;\n        this.#ensureChunkBuffer();\n        this.#reconcileChunkCache({ buildLimit: Infinity });\n        this.#syncChunkRenderWindow();\n        this.#markViewportSyncDirty();\n    }\n\n    updateChunkSystem() {\n        const perfToken = beginTableviewPerf(this, 'update_chunk_system');\n        const startedAt = performance.now();\n        if (!this.#rowBandMap) {\n            this.#diagLastUpdateChunk = { duration_ms: performance.now() - startedAt };\n            endTableviewPerf(this, 'update_chunk_system', perfToken);\n            return;\n        }\n\n        const visibleTop = this.#visibleBodyTop();\n        let rowBand = this.#rowBandRecord(this.#currentRowBand);\n        if (!rowBand || rowBand.end == null) {\n            this.#diagLastUpdateChunk = { duration_ms: performance.now() - startedAt };\n            endTableviewPerf(this, 'update_chunk_system', perfToken);\n            return;\n        }\n\n        while (visibleTop >= rowBand.end) {\n            if (!this.switchToRowBand(this.#currentRowBand + 1)) {\n                break;\n            }\n            rowBand = this.#rowBandRecord(this.#currentRowBand);\n            if (!rowBand) {\n                this.#diagLastUpdateChunk = { duration_ms: performance.now() - startedAt };\n                endTableviewPerf(this, 'update_chunk_system', perfToken);\n                return;\n            }\n        }\n\n        while (visibleTop < rowBand.origin) {\n            if (!this.switchToRowBand(this.#currentRowBand - 1)) {\n                break;\n            }\n            rowBand = this.#rowBandRecord(this.#currentRowBand);\n            if (!rowBand) {\n                this.#diagLastUpdateChunk = { duration_ms: performance.now() - startedAt };\n                endTableviewPerf(this, 'update_chunk_system', perfToken);\n                return;\n            }\n        }\n        this.#ensureChunkBuffer();\n        this.#reconcileChunkCache({ buildLimit: this.#chunkBuildBudget, deferPrepares: true });\n        this.#diagLastUpdateChunk = {\n            duration_ms: performance.now() - startedAt,\n            current_row_band: this.#currentRowBand,\n            loaded_row_bands: this.#rowBandMap?.size ?? 0,\n            loaded_chunks: this.#chunkMap?.size ?? 0,\n        };\n        endTableviewPerf(this, 'update_chunk_system', perfToken);\n    }\n\n    /* Evict chunks and row bands that have moved outside the retained cache window. */\n    evictFarChunks() {\n        const perfToken = beginTableviewPerf(this, 'evict_far_chunks');\n        const startedAt = performance.now();\n        if (!this.#chunkMap || !this.#rowBandMap) {\n            endTableviewPerf(this, 'evict_far_chunks', perfToken);\n            return;\n        }\n        const rowMin = this.#currentRowBand - this.#rowDrawDistance;\n        const rowMax = this.#currentRowBand + this.#rowDrawDistance;\n        const cols = this.#wantedColumnBandRange();\n        const colMin = cols.start - this.#columnDrawDistance;\n        const colMax = cols.end - 1 + this.#columnDrawDistance;\n        let evictedChunks = 0;\n        let evictedRowBands = 0;\n\n        for (const [key, chunk] of this.#chunkMap) {\n            const rowFar = chunk.rowBand < rowMin || chunk.rowBand > rowMax;\n            const colFar = chunk.colBand < colMin || chunk.colBand > colMax;\n            if (!rowFar && !colFar) {\n                continue;\n            }\n            const wasAttached = chunk.status === CHUNK_PREP_STATUS.ATTACHED && !!chunk.node;\n            const hadPayload = !!chunk.payload;\n            const hadRequest = !!chunk.request;\n            if (chunk.node?.parentNode === this.#chunkMount) {\n                this.#chunkMount?.removeChild(chunk.node);\n            }\n            this.#chunkMap.delete(key);\n            noteChunkLifecycleDelta({\n                chunk_nodes_evicted: wasAttached ? 1 : 0,\n                prepared_payloads_cleared: hadPayload ? 1 : 0,\n                queued_requests_cleared: hadRequest ? 1 : 0,\n                current_chunk_records: -1,\n                current_attached_chunks: wasAttached ? -1 : 0,\n                current_ready_payloads: hadPayload ? -1 : 0,\n                current_queued_requests: hadRequest ? -1 : 0,\n            });\n            evictedChunks += 1;\n        }\n\n        for (const [rowID] of this.#rowBandMap) {\n            if (rowID < rowMin || rowID > rowMax) {\n                this.#rowBandMap.delete(rowID);\n                evictedRowBands += 1;\n            }\n        }\n        this.#refreshHighestEntryOrigin();\n        this.#markViewportSyncDirty();\n        countTableviewPerf(this, 'evict_chunk.count', evictedChunks);\n        countTableviewPerf(this, 'evict_row_band.count', evictedRowBands);\n        if (evictedChunks > 0 || evictedRowBands > 0) {\n            noteTableviewLiveProbe({\n                line: this.#lineOnPuffbook,\n                table_name: this.state?.name ?? 'unknown',\n                frame_index: this.scene?.stage?.frameIndex ?? null,\n                kind: 'cache_evict',\n                duration_ms: performance.now() - startedAt,\n                evicted_chunks: evictedChunks,\n                evicted_row_bands: evictedRowBands,\n                loaded_row_bands: this.#rowBandMap?.size ?? 0,\n                loaded_chunks: this.#chunkMap?.size ?? 0,\n                scroll_x: this.#currentScrollX(),\n                scroll_y: this.#currentScrollY(),\n            });\n        }\n        endTableviewPerf(this, 'evict_far_chunks', perfToken);\n    }\n\n    clearChunks() {\n        this.#resetChunkPrepareState();\n        if (this.#rowBandMap) {\n            this.#rowBandMap.clear();\n            this.#rowBandMap = null;\n        }\n        if (this.#chunkMap) {\n            for (const chunk of this.#chunkMap.values()) {\n                const wasAttached = chunk.status === CHUNK_PREP_STATUS.ATTACHED && !!chunk.node;\n                const hadPayload = !!chunk.payload;\n                const hadRequest = !!chunk.request;\n                if (chunk.node?.parentNode === this.#chunkMount) {\n                    this.#chunkMount?.removeChild(chunk.node);\n                }\n                noteChunkLifecycleDelta({\n                    chunk_nodes_cleared: wasAttached ? 1 : 0,\n                    prepared_payloads_cleared: hadPayload ? 1 : 0,\n                    queued_requests_cleared: hadRequest ? 1 : 0,\n                    current_chunk_records: -1,\n                    current_attached_chunks: wasAttached ? -1 : 0,\n                    current_ready_payloads: hadPayload ? -1 : 0,\n                    current_queued_requests: hadRequest ? -1 : 0,\n                });\n            }\n            this.#chunkMap.clear();\n            this.#chunkMap = null;\n        }\n\n        this.#currentRowBand = 0;\n        this.#columnBandStart = 0;\n        this.#columnBandCount = 0;\n        this.highestEntryOrigin = 0;\n        this.#chunkReadyPayloadPending = false;\n        this.#chunkPrepareFailed = false;\n        this.#invalidatePreferredPreviewHeight();\n        this.#markViewportSyncDirty();\n    }\n\n    goToChunkByEntry(entry, { alignBottom = false } = {}) {\n        pushTestingTableviewTrace('tableview_go_to_chunk_by_entry', {\n            line: this.#lineOnPuffbook,\n            entry,\n            align_bottom: !!alignBottom,\n        });\n        this.clearChunks();\n        this.#startingEntry = this.#clampChunkStart(entry);\n        this.initChunkSystem();\n        const activeRowBand = this.#rowBandRecord(0);\n        if (!activeRowBand) {\n            return;\n        }\n        if (alignBottom) {\n            const viewport = this.#viewportState();\n            this.#setScroll(this.#scrollX, this.#clampedScrollY(this.#tableBottomLocalY() - viewport.height));\n        } else {\n            this.#setScroll(this.#scrollX, this.#clampedScrollY(activeRowBand.origin - this.#tableBodyTop()));\n        }\n        this.updateChunkSystem();\n        this.evictFarChunks();\n        this.#syncViewportPlacement();\n        this.#syncChunkRenderWindow();\n    }\n\n    /* Move the active row-band anchor and keep neighbouring row bands loaded. */\n    switchToRowBand(newRowBand) {\n        if (newRowBand === this.#currentRowBand) {\n            return true;\n        }\n        const oldRowBand = this.#rowBandRecord(this.#currentRowBand);\n        const direction = newRowBand > this.#currentRowBand ? 1 : -1;\n        if (!oldRowBand) {\n            return false;\n        }\n\n        let nextRowBand = this.#rowBandRecord(newRowBand);\n        if (!nextRowBand) {\n            nextRowBand = this.loadRowBand(this.#currentRowBand, direction);\n        }\n\n        if (!nextRowBand) {\n            return false;\n        }\n\n        this.#currentRowBand = newRowBand;\n        this.#ensureChunkBuffer();\n        this.#reconcileChunkCache({ buildLimit: this.#chunkBuildBudget, deferPrepares: true });\n        this.evictFarChunks();\n        this.#syncChunkRenderWindow();\n        this.#markViewportSyncDirty();\n        return true;\n    }\n\n    /* Extend the row-band cache one band above or below the current anchor. */\n    loadRowBand(anchorID, direction) {\n        const current = this.#rowBandRecord(anchorID);\n        if (!current) {\n            throw new Error(`TableView.loadRowBand(${anchorID}, ${direction}): anchor row band missing.`);\n        }\n        const nextID = anchorID + direction;\n        if (this.#rowBandMap.has(nextID)) {\n            return this.#rowBandMap.get(nextID);\n        }\n\n        let entries = null;\n        if (direction < 0) {\n            if (current.entriesBounds.first <= 0) {\n                return null;\n            }\n            entries = {\n                first: Math.max(0, current.entriesBounds.first - this.#rowBandSize),\n                last: current.entriesBounds.first,\n            };\n        } else if (direction > 0) {\n            if (current.entriesBounds.last >= this.#dataSize) {\n                return null;\n            }\n            entries = {\n                first: current.entriesBounds.last,\n                last: Math.min(current.entriesBounds.last + Math.max(1, this.#rowBandSize), this.#dataSize),\n            };\n        } else {\n            throw new Error(`TableView.loadRowBand(${anchorID}, ${direction}): direction must be +/-1.`);\n        }\n\n        const startedAt = performance.now();\n        const rowBand = this.#buildRowBand(nextID, entries, this.#rowBandOriginForEntry(entries.first));\n        this.#refreshHighestEntryOrigin();\n        this.#markViewportSyncDirty();\n        noteTableviewLiveProbe({\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            frame_index: this.scene?.stage?.frameIndex ?? null,\n            kind: 'row_band_load',\n            direction,\n            row_band: nextID,\n            entries_first: entries.first,\n            entries_last: entries.last,\n            duration_ms: performance.now() - startedAt,\n            loaded_row_bands: this.#rowBandMap?.size ?? 0,\n            loaded_chunks: this.#chunkMap?.size ?? 0,\n            scroll_x: this.#currentScrollX(),\n            scroll_y: this.#currentScrollY(),\n        });\n        return rowBand;\n    }\n\n    #visibleBodyTop() {\n        return this.#currentScrollY() + this.#tableBodyTop();\n    }\n\n    /* Resolve one positive modulo so stripe phase stays canonical across jumps and negative offsets. */\n    #mod(value, base) {\n        if (!Number.isFinite(value) || !Number.isFinite(base) || base <= 0) {\n            throw new Error(`TableView.#mod(${value}, ${base}): expected finite value and positive base.`);\n        }\n        return ((value % base) + base) % base;\n    }\n\n    /* Keep stripe parity explicit so virtual-row rebases cannot change a row's band. */\n    #uniformZebraState(nowS = this.sceneNowS()) {\n        const rowHeight = this.#fixedRowHeightPx();\n        const absBodyScrollPx = this.#absoluteBodyScrollPx(nowS);\n        const rowPhasePx = this.#mod(absBodyScrollPx, rowHeight);\n        return {\n            rowHeight,\n            phasePx: rowPhasePx,\n            startParity: Math.floor(absBodyScrollPx / rowHeight),\n            stripeColor: [0.1843, 0.2078, 0.2314, 1.0],\n        };\n    }\n\n    /* Read the absolute row-offset in pixels from logical row zero to the current body viewport top. */\n    #absoluteBodyScrollPx(nowS = this.sceneNowS()) {\n        return this.#currentScrollY(nowS) + this.#scrollEntryOffsetPx();\n    }\n\n    #syncHeaderToViewport() {\n        if (!this.header || !this.#headerMount) {\n            return;\n        }\n        this.#headerMount.setPresentationOffsetProvider(() => this.#headerPresentationOffsetPayload());\n        const pos = this.header.localPosition();\n        pos[0] = -this.header.origin.x;\n        pos[1] = this.#tableHeaderTop() - this.header.origin.y;\n        this.header.setLocalPosition(pos);\n    }\n\n    /* Keep zebra stripes viewport-local while overscanning one row so two-row phase shifts stay clipped outside the body edge. */\n    #syncZebraLayer() {\n        if (!this.#zebraLayer || !this.#zebraMount) {\n            return;\n        }\n        const viewport = this.#viewportRect();\n        const bodyWidth = this.#visibleBodyWidth();\n        const bodyTop = this.#tableBodyTop();\n        const bodyHeight = Math.max(0, viewport.height - bodyTop);\n        const zebraOverdraw = this.#fixedRowHeightPx();\n        if (this.#zebraMount.state.width !== bodyWidth || this.#zebraMount.state.height !== bodyHeight) {\n            this.#zebraMount.mutate({\n                width: bodyWidth,\n                height: bodyHeight,\n            });\n        }\n        this.#zebraMount.setLocalPosition(0, bodyTop, this.#zebraMount.localPosition()[2]);\n        const zebraHeight = bodyHeight + (zebraOverdraw * 2);\n        const zebraRowHeight = this.#style.fixedRowHeight ?? 1;\n        if (\n            this.#zebraLayer.state.width !== bodyWidth\n            || this.#zebraLayer.state.height !== zebraHeight\n            || this.#zebraLayer.state.rowHeight !== zebraRowHeight\n        ) {\n            this.#zebraLayer.mutate({\n                width: bodyWidth,\n                height: zebraHeight,\n                rowHeight: zebraRowHeight,\n            });\n        }\n        this.#zebraLayer.setPresentationOffsetProvider(null);\n        this.#zebraLayer.setLocalPosition(0, -zebraOverdraw, this.#zebraLayer.localPosition()[2]);\n        this.#zebraLayer.setVisibility(bodyHeight > 0 && this.#dataSize > 0);\n    }\n\n    /* Keep the preview body on one shared 2D anchor; older code hung this payload directly off chunk_mount. */\n    #syncChunkMount() {\n        if (!this.#bodyMount) {\n            return;\n        }\n        this.#bodyMount.setPresentationOffsetProvider(() => this.#bodyPresentationOffsetPayload());\n        if (this.#chunkMount) {\n            this.#chunkMount.setLocalPosition(\n                0,\n                this.#tableBodyTop() - this.#chunkLayoutBodyTop,\n                this.#chunkMount.localPosition()[2],\n            );\n        }\n    }\n\n    /* Keep column separators in the sticky header scope so they only track horizontal preview motion. */\n    #syncSeparatorMount() {\n        if (!this.#separatorMount || !this.header) {\n            return;\n        }\n        this.#separatorMount.setLocalPosition(0, 0, this.#separatorMount.localPosition()[2]);\n        const viewport = this.#viewportRect();\n        for (const node of this.#separatorMount.children ?? []) {\n            if ((node.state?.height ?? null) !== viewport.height) {\n                node.mutate({ height: viewport.height });\n            }\n        }\n    }\n\n    #syncBackgroundToViewport() {\n        if (!this.background) {\n            return;\n        }\n        const viewport = this.#viewportRect();\n        const bodyWidth = this.#visibleBodyWidth();\n        if (this.background.state.width !== bodyWidth || this.background.state.height !== viewport.height) {\n            this.background.mutate({\n                width: bodyWidth,\n                height: viewport.height,\n            });\n        }\n        this.background.setLocalPosition(\n            viewport.minX,\n            viewport.minY,\n            1.0,\n        );\n    }\n\n    #clampChunkStart(entry) {\n        const chunkSize = Math.max(1, this.#rowBandSize);\n        const dataSize = Math.max(0, this.#dataSize ?? 0);\n        if (dataSize <= chunkSize) {\n            return 0;\n        }\n        const raw = Number.isFinite(entry) ? entry : 0;\n        return Math.max(0, Math.min(Math.floor(raw), dataSize - chunkSize));\n    }\n\n    #chunkEntries(first) {\n        const dataSize = Math.max(0, this.#dataSize ?? 0);\n        if (dataSize <= 0) {\n            return null;\n        }\n        const start = this.#clampChunkStart(first);\n        const last = Math.min(start + Math.max(1, this.#rowBandSize), dataSize);\n        if (start >= last) {\n            return null;\n        }\n        return { first: start, last };\n    }\n\n    #chunkKey(rowBand, colBand) {\n        return `r${rowBand}:c${colBand}`;\n    }\n\n    /* Read one column band's x-span directly from the authoritative metric slice when payload builds are disabled. */\n    #columnBandEdges(columns) {\n        const first = columns?.[0] ?? null;\n        const last = columns && columns.length > 0 ? columns[columns.length - 1] : null;\n        return {\n            start: first?.x ?? 0,\n            end: last ? last.x + last.width : (first?.x ?? 0),\n        };\n    }\n\n    #rowBandRecord(rowBand) {\n        return this.#rowBandMap?.get(rowBand) ?? null;\n    }\n\n    /* Read one chunk lifecycle record by cache coordinates. */\n    #chunkRecord(rowBand, colBand) {\n        return this.#chunkMap?.get(this.#chunkKey(rowBand, colBand)) ?? null;\n    }\n\n    /* Read one attached chunk node from the lifecycle record when present. */\n    #chunkNode(rowBand, colBand) {\n        return this.#chunkRecord(rowBand, colBand)?.node ?? null;\n    }\n\n    /* Convert the visible x-range into the active column-band range. */\n    #currentVisibleColumnBandRange() {\n        const range = this.#visibleColumnRange();\n        return this.#columnBandRangeFromColumnRange(range.start, range.end);\n    }\n\n    /* Expand the active x-range into the wanted column-band cache window. */\n    #wantedColumnBandRange() {\n        const visible = this.#currentVisibleColumnBandRange();\n        return {\n            start: Math.max(0, visible.start - this.#columnDrawDistance),\n            end: Math.min(this.#columnBandCountTotal(), visible.end + this.#columnDrawDistance),\n        };\n    }\n\n    #columnBandCountTotal() {\n        this.#ensureColumnMetrics(this.columns.length);\n        if (this.#columnMetrics.length === 0) {\n            return 0;\n        }\n        return Math.ceil(this.#columnMetrics.length / Math.max(1, this.#columnBandSize));\n    }\n\n    #columnBandRangeFromColumnRange(start, end) {\n        this.#ensureColumnMetrics(this.columns.length);\n        if (this.#columnMetrics.length === 0) {\n            return { start: 0, end: 0 };\n        }\n        const maxIndex = this.#columnMetrics.length - 1;\n        const safeStart = Math.max(0, Math.min(start, maxIndex));\n        const safeEnd = Math.max(safeStart + 1, Math.min(this.#columnMetrics.length, end));\n        return {\n            start: Math.floor(safeStart / Math.max(1, this.#columnBandSize)),\n            end: Math.floor((safeEnd - 1) / Math.max(1, this.#columnBandSize)) + 1,\n        };\n    }\n\n    #columnsForBand(colBand) {\n        const start = Math.max(0, colBand * Math.max(1, this.#columnBandSize));\n        const end = Math.min(this.#columnMetrics.length, start + Math.max(1, this.#columnBandSize));\n        return this.#columnMetrics.slice(start, end);\n    }\n\n    #headerWindowForBandRange(startBand, endBand) {\n        const start = Math.max(0, startBand * Math.max(1, this.#columnBandSize));\n        const end = Math.min(this.#columnMetrics.length, endBand * Math.max(1, this.#columnBandSize));\n        return {\n            start,\n            count: Math.max(0, end - start),\n        };\n    }\n\n    /* Build one vertical row band and cache its coarse layout for later chunk mounts. */\n    #buildRowBand(rowBand, entries, origin) {\n        const perfToken = beginTableviewPerf(this, 'build_row_band');\n        pushTestingTableviewTrace('tableview_build_row_band_start', {\n            line: this.#lineOnPuffbook,\n            row_band: rowBand,\n            first: entries?.first ?? null,\n            last: entries?.last ?? null,\n            origin,\n        });\n        const startedAt = Date.now();\n        const rowLayout = buildChunkRowLayout({\n            data: this.#data,\n            style: this.#style,\n            header: this.header,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n            origin,\n            entriesBounds: entries,\n            allColumns: this.#columnMetrics,\n        });\n        const record = {\n            id: rowBand,\n            entriesBounds: entries,\n            origin,\n            rowLayout,\n            chunkHeight: rowLayout.chunkHeight,\n            end: origin + rowLayout.chunkHeight,\n        };\n        this.#rowBandMap.set(rowBand, record);\n        if (rowBand === 0) {\n            this.#invalidatePreferredPreviewHeight();\n        }\n        this.#refreshHighestEntryOrigin();\n        pushTestingTableviewTrace('tableview_build_row_band_done', {\n            line: this.#lineOnPuffbook,\n            row_band: rowBand,\n            first: entries?.first ?? null,\n            last: entries?.last ?? null,\n            origin,\n            chunk_height: record.chunkHeight,\n            duration_ms: Date.now() - startedAt,\n        });\n        countTableviewPerf(this, 'build_row_band.count');\n        countTableviewPerf(this, 'build_row_band.rows', rowLayout.rows?.length ?? 0);\n        endTableviewPerf(this, 'build_row_band', perfToken);\n        return record;\n    }\n\n    /* Materialise one body chunk for the requested row-band and column-band pair. */\n    #buildChunk(rowBand, colBand) {\n        const perfToken = beginTableviewPerf(this, 'build_chunk');\n        const row = this.#rowBandRecord(rowBand);\n        if (!row) {\n            endTableviewPerf(this, 'build_chunk', perfToken);\n            throw new Error(`TableView.#buildChunk(${rowBand}, ${colBand}): row band missing.`);\n        }\n        const key = this.#chunkKey(rowBand, colBand);\n        const existing = this.#chunkRecord(rowBand, colBand);\n        if (existing) {\n            endTableviewPerf(this, 'build_chunk', perfToken);\n            return existing;\n        }\n        const columns = this.#columnsForBand(colBand);\n        if (columns.length === 0) {\n            endTableviewPerf(this, 'build_chunk', perfToken);\n            return null;\n        }\n        pushTestingTableviewTrace('tableview_build_chunk_start', {\n            line: this.#lineOnPuffbook,\n            row_band: rowBand,\n            col_band: colBand,\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            origin: row.origin,\n        });\n        const startedAt = Date.now();\n        const request = makeChunkPrepareRequest({\n            tableName: this.state?.name ?? 'unknown',\n            chunkKey: key,\n            rowBand,\n            colBand,\n            entriesBounds: row.entriesBounds,\n            origin: row.origin,\n            columns,\n            allColumns: this.#columnMetrics,\n            style: this.#style,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n        });\n        const payload = prepareChunkPayload({\n            data: this.#data,\n            style: this.#style,\n            header: this.header,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n            origin: row.origin,\n            entriesBounds: row.entriesBounds,\n            columns,\n            allColumns: this.#columnMetrics,\n        });\n        const chunk = new Chunk({\n            name: ui.uniqueName(`${this.state.name}.chunk.${rowBand}.${colBand}`),\n            style: this.#style,\n            data: this.#data,\n            ownerTableview: this,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n            textBatchScopeKey: `${this.state.name}.chunk.${rowBand}.${colBand}`,\n            rowBand,\n            colBand,\n        }, row.origin, this.header);\n        if (!this.#chunkMount) {\n            throw new Error('TableView.#buildChunk(...): chunk mount missing.');\n        }\n        this.#chunkMount.appendChild(chunk);\n        chunk.setPresentationOffsetProvider(() => this.#bodyPresentationOffsetPayload());\n        pushTestingTableviewTrace('tableview_generate_chunk_start', {\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            column_count: columns?.length ?? 0,\n        });\n        const draw = chunk.applyPreparedPayload(payload);\n        pushTestingTableviewTrace('tableview_generate_chunk_done', {\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            column_count: columns?.length ?? 0,\n            cells: draw.cells,\n            text_nodes: draw.textNodes,\n            text_mode: 'column_chunk',\n            chunk_height: chunk.chunkHeight,\n            duration_ms: Date.now() - startedAt,\n        });\n        chunk.origin = row.origin;\n        chunk.end = row.end;\n        chunk.setLocalPosition(0, row.origin, chunk.localPosition()[2]);\n        const record = makeChunkRecord({\n            key,\n            rowBand,\n            colBand,\n            status: CHUNK_PREP_STATUS.ATTACHED,\n            request: null,\n            payload: null,\n            node: chunk,\n        });\n        record.columnCount = columns.length;\n        this.#chunkMap.set(key, record);\n        noteChunkLifecycleDelta({\n            chunk_nodes_created: 1,\n            chunk_nodes_attached: 1,\n            current_chunk_records: 1,\n            current_attached_chunks: 1,\n        });\n        noteTableviewLiveProbe({\n            line: this.#lineOnPuffbook,\n            table_name: this.state?.name ?? 'unknown',\n            frame_index: this.scene?.stage?.frameIndex ?? null,\n            kind: 'chunk_build',\n            row_band: rowBand,\n            col_band: colBand,\n            entries_first: row.entriesBounds?.first ?? null,\n            entries_last: row.entriesBounds?.last ?? null,\n            duration_ms: Date.now() - startedAt,\n            loaded_row_bands: this.#rowBandMap?.size ?? 0,\n            loaded_chunks: this.#chunkMap?.size ?? 0,\n            scroll_x: this.#currentScrollX(),\n            scroll_y: this.#currentScrollY(),\n        });\n        pushTestingTableviewTrace('tableview_build_chunk_done', {\n            line: this.#lineOnPuffbook,\n            row_band: rowBand,\n            col_band: colBand,\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            origin: row.origin,\n            chunk_height: chunk.chunkHeight,\n            duration_ms: Date.now() - startedAt,\n        });\n        countTableviewPerf(this, 'build_chunk.count');\n        countTableviewPerf(this, 'build_chunk.columns', columns.length);\n        countTableviewPerf(this, 'build_chunk.rows', row.rowLayout?.rows?.length ?? 0);\n        endTableviewPerf(this, 'build_chunk', perfToken);\n        return record;\n    }\n\n    /* Queue one body chunk payload build behind an async executor seam while keeping the chunk work unit unchanged. */\n    #queueChunkPrepare(rowBand, colBand) {\n        const row = this.#rowBandRecord(rowBand);\n        if (!row) {\n            throw new Error(`TableView.#queueChunkPrepare(${rowBand}, ${colBand}): row band missing.`);\n        }\n        const key = this.#chunkKey(rowBand, colBand);\n        const existing = this.#chunkRecord(rowBand, colBand);\n        if (existing) {\n            return existing;\n        }\n        const columns = this.#columnsForBand(colBand);\n        if (columns.length === 0) {\n            return null;\n        }\n        pushTestingTableviewTrace('tableview_build_chunk_start', {\n            line: this.#lineOnPuffbook,\n            row_band: rowBand,\n            col_band: colBand,\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            origin: row.origin,\n            deferred: true,\n        });\n        const startedAt = Date.now();\n        const request = makeChunkPrepareRequest({\n            tableName: this.state?.name ?? 'unknown',\n            chunkKey: key,\n            rowBand,\n            colBand,\n            entriesBounds: row.entriesBounds,\n            origin: row.origin,\n            columns,\n            allColumns: this.#columnMetrics,\n            style: this.#style,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n        });\n        const record = makeChunkRecord({\n            key,\n            rowBand,\n            colBand,\n            status: CHUNK_PREP_STATUS.QUEUED,\n            request,\n        });\n        record.jobID = null;\n        record.executorKind = null;\n        record.queuedAtMS = performance.now();\n        record.readyAtMS = null;\n        this.#chunkMap.set(key, record);\n        noteChunkLifecycleDelta({\n            queued_requests_created: 1,\n            current_chunk_records: 1,\n            current_queued_requests: 1,\n        });\n        const executor = this.#borChunkPrepareExecutor();\n        pushTestingTableviewTrace('tableview_generate_chunk_start', {\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            column_count: columns?.length ?? 0,\n            deferred: true,\n        });\n        executor.submit({\n            data: this.#data,\n            header: this.header,\n            request,\n        }).then((result) => {\n            const live = this.#chunkMap?.get(key);\n            if (live !== record) {\n                return;\n            }\n            live.payload = result.payload;\n            live.status = CHUNK_PREP_STATUS.READY_PAYLOAD;\n            live.error = null;\n            live.executorKind = result.executor_kind ?? null;\n            live.jobID = result.job_id ?? null;\n            live.readyAtMS = performance.now();\n            noteChunkLifecycleDelta({\n                prepared_payloads_ready: 1,\n                current_ready_payloads: 1,\n            });\n            this.#chunkReadyPayloadPending = true;\n            pushTestingTableviewTrace('tableview_generate_chunk_done', {\n                first: row.entriesBounds?.first ?? null,\n                last: row.entriesBounds?.last ?? null,\n                column_count: columns?.length ?? 0,\n                cells: 0,\n                text_nodes: result.payload?.textPayloads?.length ?? 0,\n                text_mode: 'column_chunk',\n                chunk_height: result.payload?.chunkHeight ?? null,\n                executor_kind: result.executor_kind,\n                job_id: result.job_id,\n                duration_ms: Date.now() - startedAt,\n                deferred: true,\n            });\n            this.#scheduleChunkPrepareWake('tableview_chunk_payload_ready');\n        }).catch((err) => {\n            const live = this.#chunkMap?.get(key);\n            if (live !== record) {\n                return;\n            }\n            live.status = CHUNK_PREP_STATUS.FAILED;\n            live.error = err;\n            this.#chunkPrepareFailed = true;\n            this.#scheduleChunkPrepareWake('tableview_chunk_payload_failed');\n        });\n        return record;\n    }\n\n    /* Fail fast on deferred chunk build errors once the scene gets a chance to surface them coherently. */\n    #assertNoFailedChunkPayloads() {\n        if (!this.#chunkPrepareFailed || !this.#chunkMap) {\n            return;\n        }\n        for (const record of this.#chunkMap.values()) {\n            if (record.status !== CHUNK_PREP_STATUS.FAILED) {\n                continue;\n            }\n            this.#chunkPrepareFailed = false;\n            throw new Error(\n                `TableView chunk prepare failed for row band ${record.rowBand}, column band ${record.colBand}.`,\n                { cause: record.error ?? undefined },\n            );\n        }\n        this.#chunkPrepareFailed = false;\n    }\n\n    /* Read one record's x-span from the authoritative attached node when present, else from the queued request snapshot. */\n    #chunkRecordBandX(record) {\n        if (record.node) {\n            return {\n                start: record.node.bandStartX,\n                end: record.node.bandEndX,\n            };\n        }\n        if (Number.isFinite(record.bandStartX) && Number.isFinite(record.bandEndX)) {\n            return {\n                start: record.bandStartX,\n                end: record.bandEndX,\n            };\n        }\n        const cols = record.request?.columns ?? [];\n        const first = cols[0] ?? null;\n        const last = cols.length > 0 ? cols[cols.length - 1] : null;\n        return {\n            start: first?.x ?? 0,\n            end: last ? last.x + last.width : (first?.x ?? 0),\n        };\n    }\n\n    /* Apply shared-executor backpressure so deferred chunk churn cannot flood the async seam. */\n    #chunkPrepareQueueSlots() {\n        const pending = snapshotSharedChunkPrepareExecutor()?.pending_job_count ?? 0;\n        if (!Number.isFinite(pending) || pending < 0) {\n            throw new Error(`TableView.#chunkPrepareQueueSlots(): expected a non-negative pending_job_count, got ${pending}.`);\n        }\n        return Math.max(0, SHARED_CHUNK_PREP_PENDING_LIMIT - pending);\n    }\n\n    /* Only visible-risk deferred chunks should trip the stall invariant; speculative preload is allowed to lag. */\n    #chunkRecordThreatensVisibleBlank(record) {\n        const rowBand = this.#rowBandRecord(record.rowBand);\n        if (!rowBand) {\n            return false;\n        }\n        const viewport = this.#viewportState();\n        const visibleTop = this.#visibleBodyTop();\n        const visibleBottom = viewport.maxY;\n        const visibleLeft = this.#currentScrollX();\n        const visibleRight = viewport.maxX;\n        const preloadY = viewport.height * 0.5;\n        const preloadX = viewport.width * 0.5;\n        const visibleCols = this.#currentVisibleColumnBandRange();\n        const bandX = this.#chunkRecordBandX(record);\n        const overlapsY =\n            rowBand.end > visibleTop - preloadY\n            && rowBand.origin < visibleBottom + preloadY;\n        const overlapsX =\n            bandX.end > visibleLeft - preloadX\n            && bandX.start < visibleRight + preloadX;\n        const nearCurrent =\n            Math.abs(record.rowBand - this.#currentRowBand) <= 1\n            && record.colBand >= visibleCols.start - 1\n            && record.colBand < visibleCols.end + 1;\n        return (overlapsY && overlapsX) || nearCurrent;\n    }\n\n    /* Fail fast when a visible-risk deferred chunk stops making progress and would otherwise leave a silent blank region. */\n    #assertNoStalledChunkPayloads() {\n        if (!this.#chunkMap || this.#chunkMap.size === 0) {\n            return;\n        }\n        const nowMs = performance.now();\n        const visibleCols = this.#currentVisibleColumnBandRange();\n        const executorSnap = snapshotSharedChunkPrepareExecutor();\n        for (const record of this.#chunkMap.values()) {\n            if (record.status !== CHUNK_PREP_STATUS.QUEUED && record.status !== CHUNK_PREP_STATUS.READY_PAYLOAD) {\n                continue;\n            }\n            if (!this.#chunkRecordThreatensVisibleBlank(record)) {\n                continue;\n            }\n            const sinceMs = record.status === CHUNK_PREP_STATUS.QUEUED\n                ? record.queuedAtMS\n                : record.readyAtMS;\n            if (!Number.isFinite(sinceMs)) {\n                throw new Error(\n                    `TableView chunk prepare lost ${record.status} timing for row band ${record.rowBand}, column band ${record.colBand}.`,\n                );\n            }\n            const ageMs = nowMs - sinceMs;\n            if (ageMs <= CHUNK_PREP_STALL_FAIL_MS) {\n                continue;\n            }\n            throw new Error(\n                `TableView chunk prepare stalled in state ${record.status} for ${ageMs.toFixed(1)}ms at row band ${record.rowBand}, column band ${record.colBand}. `\n                + `Current row band=${this.#currentRowBand}, visible column bands=${visibleCols.start}-${visibleCols.end - 1}, `\n                + `executor=${JSON.stringify(executorSnap)}.`,\n            );\n        }\n    }\n\n    /* Attach one prepared chunk payload to the live scene graph once its async build has completed. */\n    #attachPreparedChunkRecord(record) {\n        if (!record || record.status !== CHUNK_PREP_STATUS.READY_PAYLOAD || !record.payload) {\n            throw new Error('TableView.#attachPreparedChunkRecord(...): expected one ready payload record.');\n        }\n        const row = this.#rowBandRecord(record.rowBand);\n        if (!row) {\n            throw new Error(`TableView.#attachPreparedChunkRecord(...): row band ${record.rowBand} missing.`);\n        }\n        if (!this.#chunkMount) {\n            throw new Error('TableView.#attachPreparedChunkRecord(...): chunk mount missing.');\n        }\n        const chunk = new Chunk({\n            name: ui.uniqueName(`${this.state.name}.chunk.${record.rowBand}.${record.colBand}`),\n            style: this.#style,\n            data: this.#data,\n            ownerTableview: this,\n            previewMaxHeight: this.#isPassivePreviewMode() ? DEFAULT_PREVIEW_MAX_HEIGHT : null,\n            textBatchScopeKey: `${this.state.name}.chunk.${record.rowBand}.${record.colBand}`,\n            rowBand: record.rowBand,\n            colBand: record.colBand,\n        }, row.origin, this.header);\n        this.#chunkMount.appendChild(chunk);\n        chunk.setPresentationOffsetProvider(() => this.#bodyPresentationOffsetPayload());\n        const draw = chunk.applyPreparedPayload(record.payload);\n        chunk.origin = row.origin;\n        chunk.end = row.end;\n        chunk.setLocalPosition(0, row.origin, chunk.localPosition()[2]);\n        record.node = chunk;\n        const columnCount = record.request?.columns?.length ?? 0;\n        record.columnCount = columnCount;\n        noteChunkLifecycleDelta({\n            chunk_nodes_created: 1,\n            chunk_nodes_attached: 1,\n            prepared_payloads_attached: 1,\n            current_attached_chunks: 1,\n            current_ready_payloads: -1,\n            current_queued_requests: -1,\n        });\n        record.payload = null;\n        record.request = null;\n        record.status = CHUNK_PREP_STATUS.ATTACHED;\n        pushTestingTableviewTrace('tableview_build_chunk_done', {\n            line: this.#lineOnPuffbook,\n            row_band: record.rowBand,\n            col_band: record.colBand,\n            first: row.entriesBounds?.first ?? null,\n            last: row.entriesBounds?.last ?? null,\n            origin: row.origin,\n            chunk_height: chunk.chunkHeight,\n            deferred: true,\n            text_nodes: draw.textNodes,\n        });\n        countTableviewPerf(this, 'build_chunk.count');\n        countTableviewPerf(this, 'build_chunk.columns', columnCount);\n        countTableviewPerf(this, 'build_chunk.rows', row.rowLayout?.rows?.length ?? 0);\n    }\n\n    /* Drain all prepared chunk payloads in viewport-priority order so async results attach deterministically. */\n    #drainReadyChunkPayloads({ attachLimit = Infinity } = {}) {\n        if (!this.#chunkMap || !this.#chunkReadyPayloadPending) {\n            return 0;\n        }\n        const visibleCols = this.#currentVisibleColumnBandRange();\n        const colMid = visibleCols.start + ((visibleCols.end - visibleCols.start) * 0.5);\n        const ready = [...this.#chunkMap.values()]\n            .filter((record) => record.status === CHUNK_PREP_STATUS.READY_PAYLOAD)\n            .sort((a, b) => {\n                const da = Math.abs(a.rowBand - this.#currentRowBand) + Math.abs(a.colBand - colMid);\n                const db = Math.abs(b.rowBand - this.#currentRowBand) + Math.abs(b.colBand - colMid);\n                if (da !== db) {\n                    return da - db;\n                }\n                if (a.rowBand !== b.rowBand) {\n                    return a.rowBand - b.rowBand;\n                }\n                return a.colBand - b.colBand;\n            });\n        let attached = 0;\n        for (const record of ready) {\n            if (attached >= attachLimit) {\n                break;\n            }\n            this.#attachPreparedChunkRecord(record);\n            attached += 1;\n        }\n        this.#chunkReadyPayloadPending = ready.length > attached;\n        if (attached > 0) {\n            this.#syncChunkRenderWindow();\n            this.#markViewportSyncDirty();\n        }\n        return attached;\n    }\n\n    #ensureChunkBuffer() {\n        let lo = this.#currentRowBand;\n        for (let i = 0; i < this.#rowDrawDistance; i++) {\n            const nextID = lo - 1;\n            if (this.#rowBandMap.has(nextID)) {\n                lo = nextID;\n                continue;\n            }\n            const rowBand = this.loadRowBand(lo, -1);\n            if (!rowBand) {\n                break;\n            }\n            lo = nextID;\n        }\n\n        let hi = this.#currentRowBand;\n        for (let i = 0; i < this.#rowDrawDistance; i++) {\n            const nextID = hi + 1;\n            if (this.#rowBandMap.has(nextID)) {\n                hi = nextID;\n                continue;\n            }\n            const rowBand = this.loadRowBand(hi, 1);\n            if (!rowBand) {\n                break;\n            }\n            hi = nextID;\n        }\n    }\n\n    #orderedRowBandIDs() {\n        if (!this.#rowBandMap || this.#rowBandMap.size === 0) {\n            return [];\n        }\n        return [...this.#rowBandMap.keys()].sort((a, b) => {\n            const da = Math.abs(a - this.#currentRowBand);\n            const db = Math.abs(b - this.#currentRowBand);\n            return da - db || a - b;\n        });\n    }\n\n    #orderedColumnBandIDs(start, end) {\n        const ids = [];\n        for (let i = start; i < end; ++i) {\n            ids.push(i);\n        }\n        const mid = this.#currentVisibleColumnBandRange().start;\n        ids.sort((a, b) => {\n            const da = Math.abs(a - mid);\n            const db = Math.abs(b - mid);\n            return da - db || a - b;\n        });\n        return ids;\n    }\n\n    /* Reconcile the 2D body-chunk cache against the wanted row/column bands. */\n    #reconcileChunkCache({ buildLimit = Infinity, deferPrepares = false } = {}) {\n        const perfToken = beginTableviewPerf(this, 'reconcile_chunk_cache');\n        const startedAt = performance.now();\n        if (!this.#rowBandMap || !this.#chunkMap) {\n            const result = { built: 0, duration_ms: performance.now() - startedAt, wanted_cols_start: 0, wanted_cols_end: 0 };\n            this.#diagLastReconcile = result;\n            endTableviewPerf(this, 'reconcile_chunk_cache', perfToken);\n            return result;\n        }\n        const wantedCols = this.#wantedColumnBandRange();\n        const effectiveBuildLimit = deferPrepares\n            ? Math.min(buildLimit, this.#chunkPrepareQueueSlots())\n            : buildLimit;\n        if (effectiveBuildLimit <= 0) {\n            const result = {\n                built: 0,\n                duration_ms: performance.now() - startedAt,\n                wanted_cols_start: wantedCols.start,\n                wanted_cols_end: wantedCols.end,\n            };\n            this.#diagLastReconcile = result;\n            endTableviewPerf(this, 'reconcile_chunk_cache', perfToken);\n            return result;\n        }\n        let built = 0;\n        for (const rowBand of this.#orderedRowBandIDs()) {\n            for (const colBand of this.#orderedColumnBandIDs(wantedCols.start, wantedCols.end)) {\n                const key = this.#chunkKey(rowBand, colBand);\n                if (this.#chunkMap.has(key)) {\n                    continue;\n                }\n                if (deferPrepares) {\n                    this.#queueChunkPrepare(rowBand, colBand);\n                } else {\n                    this.#buildChunk(rowBand, colBand);\n                }\n                built += 1;\n                if (built >= effectiveBuildLimit) {\n                    const result = {\n                        built,\n                        duration_ms: performance.now() - startedAt,\n                        wanted_cols_start: wantedCols.start,\n                        wanted_cols_end: wantedCols.end,\n                    };\n                    this.#diagLastReconcile = result;\n                    countTableviewPerf(this, 'reconcile_chunk_cache.built', built);\n                    endTableviewPerf(this, 'reconcile_chunk_cache', perfToken);\n                    return result;\n                }\n            }\n        }\n        const result = {\n            built,\n            duration_ms: performance.now() - startedAt,\n            wanted_cols_start: wantedCols.start,\n            wanted_cols_end: wantedCols.end,\n        };\n        this.#diagLastReconcile = result;\n        countTableviewPerf(this, 'reconcile_chunk_cache.built', built);\n        endTableviewPerf(this, 'reconcile_chunk_cache', perfToken);\n        return result;\n    }\n\n    #refreshHighestEntryOrigin() {\n        if (!this.#rowBandMap || this.#rowBandMap.size === 0) {\n            this.highestEntryOrigin = 0;\n            return;\n        }\n        let top = Infinity;\n        for (const rowBand of this.#rowBandMap.values()) {\n            if (rowBand.origin < top) {\n                top = rowBand.origin;\n            }\n        }\n        this.highestEntryOrigin = Number.isFinite(top)\n            ? Math.max(0, top - this.#tableBodyTop())\n            : 0;\n    }\n\n    #lastLoadedChunk() {\n        if (!this.#rowBandMap || this.#rowBandMap.size === 0) {\n            return null;\n        }\n        let tailID = -Infinity;\n        let tail = null;\n        for (const [id, chunk] of this.#rowBandMap) {\n            if (id > tailID) {\n                tailID = id;\n                tail = chunk;\n            }\n        }\n        return tail;\n    }\n\n    #firstLoadedChunk() {\n        if (!this.#rowBandMap || this.#rowBandMap.size === 0) {\n            return null;\n        }\n        let headID = Infinity;\n        let head = null;\n        for (const [id, chunk] of this.#rowBandMap) {\n            if (id < headID) {\n                headID = id;\n                head = chunk;\n            }\n        }\n        return head;\n    }\n\n    #syncChunkRenderWindow() {\n        const perfToken = beginTableviewPerf(this, 'sync_chunk_render_window');\n        const startedAt = performance.now();\n        if (!this.#chunkMap) {\n            this.#diagLastRenderWindow = { duration_ms: performance.now() - startedAt, visible_count: 0, total_count: 0 };\n            endTableviewPerf(this, 'sync_chunk_render_window', perfToken);\n            return;\n        }\n        const viewport = this.#viewportState();\n        const visibleTop = this.#visibleBodyTop();\n        const visibleBottom = viewport.maxY;\n        const visibleLeft = this.#currentScrollX();\n        const visibleRight = viewport.maxX;\n        const preloadY = viewport.height * 0.5;\n        const preloadX = viewport.width * 0.5;\n        const visibleCols = this.#currentVisibleColumnBandRange();\n        let visibleCount = 0;\n        for (const record of this.#chunkMap.values()) {\n            if (record.status !== CHUNK_PREP_STATUS.ATTACHED || !record.node) {\n                continue;\n            }\n            const chunk = record.node;\n            const rowBand = this.#rowBandRecord(record.rowBand);\n            if (!rowBand) {\n                throw new Error(`TableView.#syncChunkRenderWindow(): missing row band ${record.rowBand}.`);\n            }\n            const overlapsY =\n                rowBand.end > visibleTop - preloadY\n                && rowBand.origin < visibleBottom + preloadY;\n            const overlapsX =\n                chunk.bandEndX > visibleLeft - preloadX\n                && chunk.bandStartX < visibleRight + preloadX;\n            const nearCurrent =\n                Math.abs(record.rowBand - this.#currentRowBand) <= 1\n                && record.colBand >= visibleCols.start - 1\n                && record.colBand < visibleCols.end + 1;\n            const visible = (overlapsY && overlapsX) || nearCurrent;\n            if (visible) {\n                visibleCount += 1;\n            }\n            chunk.setVisibility(visible);\n        }\n        this.#diagLastRenderWindow = {\n            duration_ms: performance.now() - startedAt,\n            visible_count: visibleCount,\n            total_count: this.#chunkMap.size,\n        };\n        countTableviewPerf(this, 'sync_chunk_render_window.visible_chunks', visibleCount);\n        countTableviewPerf(this, 'sync_chunk_render_window.total_chunks', this.#chunkMap.size);\n        endTableviewPerf(this, 'sync_chunk_render_window', perfToken);\n    }\n\n\n    #visibleColumns() {\n        this.#ensureColumnMetrics(this.columns.length);\n        if (this.#columnMetrics.length === 0) {\n            return [];\n        }\n        const start = Math.min(Math.max(0, this.#columnStart), this.#columnMetrics.length);\n        const count = Math.max(0, this.#columnCount);\n        return this.#columnMetrics.slice(start, start + count);\n    }\n\n    #visibleColumnRange() {\n        this.#ensureColumnMetrics(this.columns.length);\n        if (this.#columnMetrics.length === 0) {\n            return { start: 0, end: 0 };\n        }\n        const viewport = this.#viewportState();\n        const bodyWidth = Math.max(1, viewport.width);\n        const scrollX = this.#currentScrollX();\n        const start = this.#columnIndexAt(scrollX);\n        const end = Math.min(\n            this.#columnMetrics.length,\n            this.#columnIndexAt(scrollX + bodyWidth) + 1,\n        );\n        return {\n            start,\n            end: Math.max(start, end),\n        };\n    }\n\n    #columnIndexAt(x) {\n        if (x <= 0) {\n            return 0;\n        }\n        this.#ensureColumnMetrics(1, x);\n        let lo = 0;\n        let hi = this.#columnMetrics.length;\n        while (lo < hi) {\n            const mid = Math.floor((lo + hi) / 2);\n            const col = this.#columnMetrics[mid];\n            if (col.x + col.width < x) {\n                lo = mid + 1;\n            } else {\n                hi = mid;\n            }\n        }\n        return lo;\n    }\n\n    #updateColumnWindow() {\n        const perfToken = beginTableviewPerf(this, 'update_column_window');\n        const startedAt = performance.now();\n        if (!this.columns || this.columns.length === 0 || !this.header) {\n            this.#diagLastColumnWindow = { changed: false, duration_ms: performance.now() - startedAt, header_duration_ms: 0, separators_duration_ms: 0, built: 0 };\n            endTableviewPerf(this, 'update_column_window', perfToken);\n            return false;\n        }\n        const wantedBands = this.#wantedColumnBandRange();\n        if (\n            wantedBands.start === this.#columnBandStart\n            && wantedBands.end - wantedBands.start === this.#columnBandCount\n        ) {\n            this.#diagLastColumnWindow = { changed: false, duration_ms: performance.now() - startedAt, header_duration_ms: 0, separators_duration_ms: 0, built: 0 };\n            endTableviewPerf(this, 'update_column_window', perfToken);\n            return false;\n        }\n        const next = this.#headerWindowForBandRange(wantedBands.start, wantedBands.end);\n        if (next.count <= 0) {\n            this.#diagLastColumnWindow = { changed: false, duration_ms: performance.now() - startedAt, header_duration_ms: 0, separators_duration_ms: 0, built: 0 };\n            endTableviewPerf(this, 'update_column_window', perfToken);\n            return false;\n        }\n\n        this.#columnBandStart = wantedBands.start;\n        this.#columnBandCount = wantedBands.end - wantedBands.start;\n        this.#columnStart = next.start;\n        this.#columnCount = next.count;\n        pushTestingTableviewTrace('tableview_column_window_change', {\n            line: this.#lineOnPuffbook,\n            column_start: this.#columnStart,\n            column_count: this.#columnCount,\n            column_band_start: this.#columnBandStart,\n            column_band_count: this.#columnBandCount,\n            scroll_x: this.#currentScrollX(),\n        });\n\n        const applyStartedAt = performance.now();\n        const headerStartedAt = performance.now();\n        this.#rebuildHeader();\n        const headerDurationMS = performance.now() - headerStartedAt;\n        const separatorsStartedAt = performance.now();\n        this.#rebuildColumnSeparators();\n        const separatorsDurationMS = performance.now() - separatorsStartedAt;\n        const reconcile = this.#reconcileChunkCache({ buildLimit: this.#chunkBuildBudget, deferPrepares: true });\n        const applyDurationMS = performance.now() - applyStartedAt;\n        this.evictFarChunks();\n        this.#syncChunkRenderWindow();\n        this.#markViewportSyncDirty();\n        this.#syncViewportPlacement();\n        this.#diagLastColumnWindow = {\n            changed: true,\n            duration_ms: performance.now() - startedAt,\n            header_duration_ms: headerDurationMS,\n            separators_duration_ms: separatorsDurationMS,\n            built: reconcile.built ?? 0,\n        };\n        countTableviewPerf(this, 'update_column_window.change');\n        countTableviewPerf(this, 'update_column_window.columns', this.#columnCount);\n        countTableviewPerf(this, 'update_column_window.built', reconcile.built ?? 0);\n        endTableviewPerf(this, 'update_column_window', perfToken);\n        return true;\n    }\n\n    /* Return the authoritative full table width from the current column metrics. */\n    #totalColumnWidth() {\n        this.#ensureColumnMetrics(this.columns.length);\n        if (this.#columnMetrics.length === 0) {\n            return 0;\n        }\n        const last = this.#columnMetrics[this.#columnMetrics.length - 1];\n        return last.x + last.width;\n    }\n\n    /* Rebuild top-level column separators so they stay flush with the viewport top edge. */\n    #rebuildColumnSeparators() {\n        if (this.#separatorMount?.parentNode) {\n            this.#separatorMount.parentNode.removeChild(this.#separatorMount);\n        }\n        this.#separatorMount = null;\n\n        const viewport = this.#viewportRect();\n        if (!this.header || !this.#headerMount || viewport.height <= 0) {\n            return;\n        }\n\n        const columns = this.#visibleColumns();\n        if (columns.length === 0) {\n            return;\n        }\n\n        const mount = new ui.Placeholder({ name: ui.uniqueName(`${this.state.name}.column_separators`) });\n        for (const col of columns) {\n            if (col.x < 1) {\n                continue;\n            }\n            mount.appendChild(new tile.Tile({\n                z: -0.2,\n                x: col.x,\n                y: 0,\n                width: 1.0,\n                height: viewport.height,\n                color: [0.4, 0.4, 0.4, 1.0],\n            }));\n        }\n        this.header.appendChild(mount);\n        this.#separatorMount = mount;\n        this.#syncSeparatorMount();\n    }\n\n    /* Convert one cached logical sizing plan into pixel widths for all columns. */\n    #buildPreviewSizing(columns) {\n        const hints = inferPreviewTableLayout(this.#previewHints);\n        const charWidth = previewCharacterWidth(this.#style);\n        const lineHeight = previewLineHeight(this.#style);\n        const headerMetadata = [];\n        const columnWidths = columns.map((name, i) => {\n            const field = this.#data?.field?.(name) ?? null;\n            const header = describeFieldHeader(field);\n            header.bottomLayout = measureHeaderBottom(header, this.#style);\n            headerMetadata.push(header);\n            const textLayout = evilfont.MSDFText.measureFromState({\n                font: this.#style.headerFont,\n                fontSize: this.#style.fontSize,\n                text: name,\n            });\n            const hintedChars = hints.columnWidths[i];\n            const metadataChars = fieldDisplayWidth(field);\n            const signSlotWidth = fieldReservesSignSlot(field)\n                ? glyphAdvancePx(this.#style.font.fontData, this.#style.fontSize, ASCII_MINUS_CODEPOINT)\n                : 0;\n            let width = this.#style.minColumnWidth;\n            if (Number.isInteger(hintedChars) && hintedChars > 0) {\n                width = Math.max(width, hintedChars * charWidth + this.#style.columnPadding + signSlotWidth);\n            } else if (Number.isInteger(metadataChars) && metadataChars > 0) {\n                width = Math.max(width, metadataChars * charWidth + this.#style.columnPadding + signSlotWidth);\n            } else {\n                width = Math.max(width, textLayout.width + this.#style.columnPadding);\n            }\n            if (name === 'plot') {\n                width = Math.max(width, 500);\n            }\n            return Math.max(width, header.bottomLayout.minWidth);\n        });\n        const bottomTextHeight = headerMetadata.reduce((height, header) => Math.max(\n            height, header.bottomLayout.type.height, header.bottomLayout.units.height,\n        ), 0);\n        this.#style.headerSections = headerSections(\n            this.#style.fontSize, bottomTextHeight, (this.state.fontSize || 20) * 3.0,\n        );\n        this.#style.headerHeight = this.#style.headerSections.height;\n        const rowHeight = Number.isInteger(hints.rowHeight) && hints.rowHeight > 0\n            ? hints.rowHeight * lineHeight + this.#style.cellPadding\n            : defaultPreviewRowHeight(this.#style);\n        return {\n            charWidth,\n            lineHeight,\n            columnWidths,\n            headerMetadata,\n            rowHeight,\n        };\n    }\n\n    /* Materialise all column metrics once per build so chunk paths stay purely consumptive. */\n    #buildColumnMetrics(columns) {\n        const widths = this.#previewSizing?.columnWidths ?? [];\n        this.#columnMetrics = [];\n        this.#metricColumns = columns;\n        let x = 0;\n        for (let i = 0; i < columns.length; i++) {\n            const width = widths[i];\n            if (!Number.isFinite(width) || width <= 0) {\n                throw new Error(`TableView expected a positive cached width for column ${i} (${columns[i]}).`);\n            }\n            this.#columnMetrics.push({\n                index: i,\n                name: columns[i],\n                x,\n                width,\n                headerMetadata: this.#previewSizing.headerMetadata[i],\n            });\n            x += width;\n        }\n    }\n\n    #ensureColumnMetrics(minEndIndex = 0, minEndX = null) {\n        const columns = this.columns;\n        if (!columns || columns.length === 0) {\n            return;\n        }\n        if (this.#metricColumns !== columns || this.#columnMetrics.length !== columns.length) {\n            if (!this.#previewSizing) {\n                this.#previewSizing = this.#buildPreviewSizing(columns);\n            }\n            this.#buildColumnMetrics(columns);\n        }\n    }\n\n    buildEmptyTableLabel() {\n        if (this.#emptyLabel) {\n            this.#contentMount.removeChild(this.#emptyLabel);\n        }\n        const label = makeTableviewMSDFText({\n            font: this.#style.headerFont,\n            fontSize: this.#style.fontSize * EMPTY_TABLE_FONT_SCALE,\n            text: 'No rows',\n            fontColor: this.#style.headerTextColor,\n            x: 0,\n            y: 0,\n            z: -0.2\n        });\n        this.#emptyLabel = label;\n        if (label) {\n            this.#contentMount.appendChild(label);\n            this.#positionEmptyLabel();\n        }\n    }\n\n    /* Rebuild header children for the currently loaded horizontal column band only. */\n    #rebuildHeader() {\n        if (!this.header) {\n            throw new Error('TableView.#rebuildHeader(): header must exist before drawing.');\n        }\n        this.header.buildHeader(this.#visibleColumns(), this.#totalColumnWidth());\n        pushTestingTableviewTrace('tableview_rebuild_header_done', {\n            line: this.#lineOnPuffbook,\n            header_column_count: this.header.columns?.length ?? 0,\n        });\n        const headerStyle = {\n            ...this.#style,\n            font: this.#style.headerFont,\n            maxCellHeight: this.#style.headerHeight,\n        };\n\n        for (const column of this.header.columns) {\n            const contentWidth = Math.max(0, column.width - column.leadingInset);\n            const formatted = textutils.formatCellValueLayout(String(column.text), contentWidth, headerStyle, 1);\n            const visibleText = formatted?.text ?? '';\n            const visibleLayout = evilfont.MSDFText.measureFromState({\n                font: this.#style.headerFont,\n                fontSize: this.#style.fontSize,\n                text: visibleText,\n            });\n            column.textLayout = visibleLayout;\n            const sections = this.#style.headerSections;\n            const textY = sections.topHeight + (sections.middleHeight - visibleLayout.height) / 2;\n            const textX = column.x + column.leadingInset + contentWidth / 2.0 - visibleLayout.width / 2.0;\n            const codepoints = stringCodepoints(visibleText);\n            const glyphColors = [];\n            const hasClippedTail = appendCellGlyphColors(\n                glyphColors,\n                this.#style.headerTextColor,\n                this.#style.headerFont.fontData,\n                codepoints,\n                formatted?.clipped === true,\n            );\n            const headerText = makeTableviewMSDFText({\n                font: this.#style.headerFont,\n                fontSize: this.#style.fontSize,\n                text: visibleText,\n                fontColor: this.#style.headerTextColor,\n                glyphColors: hasClippedTail ? Float32Array.from(glyphColors) : null,\n                x: textX,\n                y: textY,\n                z: -0.2,\n            });\n            if (headerText) {\n                this.header.appendChild(headerText);\n            }\n\n            if (column.units) {\n                const unitslayout = column.bottomLayout.units;\n\n                const unitsText = makeTableviewMSDFText({\n                    font: this.#style.font,\n                    fontSize: HEADER_BOTTOM_FONT_SIZE,\n                    text: String(column.units),\n                    fontColor: this.#style.headerTextColor,\n                    x: column.x + column.width - unitslayout.width - HEADER_PADDING,\n                    y: column.height - sections.bottomHeight + (sections.bottomHeight - unitslayout.height) / 2,\n                    z: -0.2,\n                });\n                if (unitsText) {\n                    this.header.appendChild(unitsText);\n                }\n            }\n\n            if (column.type) {\n                const typeText = makeTableviewMSDFText({\n                    font: this.#style.font,\n                    fontSize: HEADER_BOTTOM_FONT_SIZE,\n                    text: String(column.type),\n                    fontColor: this.#style.headerTextColor,\n                    x: column.x + HEADER_PADDING + (column.nullableIconID === null ? 0 : HEADER_NULLABLE_ICON_SIZE + HEADER_ICON_GAP),\n                    y: column.height - sections.bottomHeight + (sections.bottomHeight - column.bottomLayout.type.height) / 2,\n                    z: -0.2,\n                });\n                if (typeText) {\n                    this.header.appendChild(typeText);\n                }\n            }\n\n            this.header.appendChild(new tile.Tile({\n                z: -0.1,\n                x: column.x,\n                width: column.width,\n                height: column.height,\n                color: this.#style.headerColor,\n            }));\n\n            const sortIconID = column.sortIconID;\n            if (sortIconID !== null) {\n                this.header.appendChild(new ui.Icon({\n                    x: column.x + HEADER_PADDING,\n                    y: HEADER_PADDING,\n                    width: HEADER_TOP_ICON_SIZE,\n                    height: HEADER_TOP_ICON_SIZE,\n                    z: -0.2,\n                    color: this.#style.headerTextColor,\n                    iconID: sortIconID,\n                }));\n            }\n\n            if (column.piiIconID !== null) {\n                this.header.appendChild(new ui.Icon({\n                    x: column.x + column.width - HEADER_PADDING - HEADER_TOP_ICON_SIZE,\n                    y: HEADER_PADDING,\n                    width: HEADER_TOP_ICON_SIZE,\n                    height: HEADER_TOP_ICON_SIZE,\n                    z: -0.2,\n                    color: this.#style.headerTextColor,\n                    iconID: column.piiIconID,\n                }));\n            }\n            if (column.nullableIconID !== null) {\n                this.header.appendChild(new ui.Icon({\n                    x: column.x + HEADER_PADDING,\n                    y: column.height - sections.bottomHeight + (sections.bottomHeight - HEADER_NULLABLE_ICON_SIZE) / 2,\n                    width: HEADER_NULLABLE_ICON_SIZE,\n                    height: HEADER_NULLABLE_ICON_SIZE,\n                    z: -0.2,\n                    color: this.#style.headerTextColor,\n                    iconID: column.nullableIconID,\n                }));\n            }\n\n            const clickArea = new HeaderHoverToastArea({\n                x: column.x,\n                y: column.y,\n                width: column.width,\n                height: column.height,\n                ownerTableview: this,\n                tooltipController: this.#headerTooltipController,\n                columnKey: `${column.index}:${column.text}`,\n                fullHeaderText: String(column.text),\n                truncated: formatted?.clipped === true,\n                toastFont: this.#style.headerFont,\n                toastFontSize: Math.max(12, this.#style.fontSize - 2),\n                onContextMenu: () => {\n                    const field = this.#data?.field?.(column.text) ?? null;\n                    this.buildColumnCTXMenu({\n                        columnName: column.text,\n                        columnType: column.type,\n                        columnDescription: fieldDescription(field) ?? '[null]',\n                        columnUnits: fieldUnit(field) ?? '[null]',\n                        columnNullable: fieldNullable(field) ?? '[null]',\n                        columnSorted: fieldSorted(field) ?? '[null]',\n                        columnUnique: fieldUnique(field) ?? '[null]',\n                        columnBasis: fieldBasis(field) ?? '[null]',\n                        columnPII: fieldPII(field) ?? '[null]',\n                        ...fieldLineage(field, this.#data),\n                    });\n                },\n            });\n            this.header.appendChild(clickArea);\n        }\n    }\n\n    #rebuild() {\n        if (!this.#data) {\n            return;\n        }\n        const startedAt = Date.now();\n        this.#resetChunkPrepareState();\n        this.#invalidatePreferredPreviewHeight();\n        pushTestingTableviewTrace('tableview_rebuild_start', {\n            line: this.#lineOnPuffbook,\n            data_type: this.#data.logicalType?.() ?? this.#data.constructor?.name ?? typeof this.#data,\n        });\n        try {\n\n        const columns = this.#data.fieldNames();\n        this.columns = columns; //saving here but its temp\n        pushTestingTableviewTrace('tableview_rebuild_field_names', {\n            line: this.#lineOnPuffbook,\n            column_count: columns?.length ?? 0,\n        });\n\n            if (!columns || columns.length === 0 || !this.state.font) { //todu: rework fonts here\n                this.createBackground()\n                this.buildEmptyTableLabel();\n                pushTestingTableviewTrace('tableview_rebuild_done', {\n                    line: this.#lineOnPuffbook,\n                    column_count: columns?.length ?? 0,\n                    data_size: 0,\n                    duration_ms: Date.now() - startedAt,\n                });\n                return;\n            }\n\n            this.#previewSizing = this.#buildPreviewSizing(columns);\n            this.#buildColumnMetrics(columns);\n\n            if(this.header){\n                this.header.removeAllChildren();\n            }\n            this.clearChunks();\n            this.#contentMount.removeAllChildren();\n            this.background = null;\n            this.#fullscreenChrome = new TableViewFullscreenChrome(this, this.#contentMount, this.#inspectAssignmentDraft);\n            this.#chunkMount = null;\n            this.#headerMount = null;\n            this.#bodyMount = null;\n            this.#zebraMount = null;\n            this.#zebraLayer = null;\n            this.#separatorMount = null;\n            this.#emptyLabel = null;\n            this.#inspectInputs = [];\n            this.#inspectRows = [];\n            this.#inspectLineNumberTexts = [];\n            this.#inspectMount = null;\n            this.#inspectRevealClip = null;\n            this.#inspectBacking = null;\n            this.#inspectToolbar = null;\n            this.#inspectToggleButton = null;\n\n            this.createBackground()\n            if (this.#inspectCellVisible()) {\n                this.#inspectBacking = new ui.Tile({\n                    name: ui.uniqueName(`${this.state.name}.inspect_backing`),\n                    width: this.#viewportRect().width,\n                    height: this.#inspectCellHeight(),\n                    x: 0,\n                    y: 0,\n                    z: TABLE_INSPECT_BACKING_Z,\n                    color: [0.098, 0.122, 0.145, 1.0],\n                });\n                this.#contentMount.appendChild(this.#inspectBacking);\n                // Amend Toolbar Tool/Feature: source editor toggle, variable assignment, save, and discard.\n                this.#inspectToolbar = new ui.Tile({\n                    name: ui.uniqueName(`${this.state.name}.inspect_toolbar`),\n                    width: this.#viewportRect().width,\n                    height: TABLE_INSPECT_TOOLBAR_HEIGHT,\n                    x: 0,\n                    y: 0,\n                    z: -0.3,\n                    color: Palette.lightgrey,\n                });\n                this.#contentMount.appendChild(this.#inspectToolbar);\n                this.#inspectToggleButton = new ui.Button({\n                    name: ui.uniqueName(`${this.state.name}.inspect_toggle`),\n                    font: this.#style.font,\n                    fontSize: this.#style.fontSize,\n                    text: this.#inspectRevealExpanded ? 'collapse' : 'expand',\n                    textExpand: false,\n                    width: TABLE_INSPECT_TOGGLE_BUTTON_WIDTH,\n                    height: TABLE_INSPECT_TOOLBAR_HEIGHT,\n                    x: TABLE_INSPECT_TOGGLE_BUTTON_INSET,\n                    y: 0,\n                    z: -0.4,\n                    color: Palette.darkgrey,\n                    onHoverColor: Palette.grey,\n                    iconID: this.#inspectRevealExpanded ? 10 : 11,\n                    iconSize: [TABLE_INSPECT_TOGGLE_ICON_SIZE, TABLE_INSPECT_TOGGLE_ICON_SIZE],\n                    iconExpand: false,\n                });\n                this.#inspectToggleButton.onInput = (event) => {\n                    if (!isActivationEvent(event)) return false;\n                    return this.#toggleInspectReveal();\n                };\n                this.#inspectToolbar.appendChild(this.#inspectToggleButton);\n                this.#syncInspectToggleButtonAppearance();\n                const inspectHeight = this.#inspectScrollableHeight();\n                this.#inspectRevealHeight = this.#inspectRevealExpanded ? inspectHeight : 0;\n                this._animationClockS = this.#inspectRevealHeight;\n                this.#inspectRevealClip = new ui.Placeholder({\n                    name: ui.uniqueName(`${this.state.name}.inspect_reveal_clip`),\n                    width: this.#inspectEditorWidth(),\n                    height: inspectHeight,\n                    x: 0,\n                    y: TABLE_INSPECT_TOOLBAR_HEIGHT,\n                    clipChildren: true,\n                });\n                this.#contentMount.appendChild(this.#inspectRevealClip);\n                this.#inspectMount = new ui.ScrollBox({\n                    name: ui.uniqueName(`${this.state.name}.inspect_mount`),\n                    width: this.#inspectEditorWidth(),\n                    height: inspectHeight,\n                    x: 0,\n                    y: this.#inspectRevealHeight - inspectHeight,\n                    layout: 'manual',\n                    mouseSpace: 'local',\n                    contentZ: -0.3,\n                    scrollbarZ: -1.0,\n                    scrollbarHandleZ: -1.1,\n                });\n                this.#inspectRevealClip.appendChild(this.#inspectMount);\n                for (let row = 0; row < this.#inspectSourceLines.length; row += 1) {\n                    this.#makeInspectRow(row, this.#inspectSourceLines[row]);\n                }\n                this.#inspectMount.syncContentLayout();\n                this.#syncInspectBacking();\n            }\n            this.#bodyMount = new ui.Anchor({ name: ui.uniqueName(`${this.state.name}.body_mount`) });\n            this.#contentMount.appendChild(this.#bodyMount);\n            this.#zebraMount = new ui.Anchor({\n                name: ui.uniqueName(`${this.state.name}.zebra_mount`),\n                clipChildren: true,\n                width: this.state.width ?? 0,\n                height: Math.max(0, (this.state.height ?? 0) - this.#tableBodyTop()),\n                y: this.#tableBodyTop(),\n            });\n            this.#bodyMount.appendChild(this.#zebraMount);\n            this.#chunkMount = new ui.Anchor({ name: ui.uniqueName(`${this.state.name}.chunk_mount`) });\n            this.#bodyMount.appendChild(this.#chunkMount);\n            this.#headerMount = new ui.Anchor({ name: ui.uniqueName(`${this.state.name}.header_mount`) });\n            this.#contentMount.appendChild(this.#headerMount);\n\n            this.#style.fixedRowHeight = this.#previewSizing.rowHeight;\n            this.#style.maxCellHeight = this.#previewSizing.rowHeight;\n            this.#dataSize = columns.reduce((maxRows, name) => {\n                return Math.max(maxRows, previewRowCount(this.#data.field(name)));\n            }, 0);\n            const wantedBands = this.#wantedColumnBandRange();\n            const columnWindow = this.#headerWindowForBandRange(wantedBands.start, wantedBands.end);\n            this.#columnBandStart = wantedBands.start;\n            this.#columnBandCount = wantedBands.end - wantedBands.start;\n            this.#columnStart = columnWindow.start;\n            this.#columnCount = columnWindow.count;\n            const visibleColumns = this.#visibleColumns();\n            pushTestingTableviewTrace('tableview_rebuild_layout', {\n                line: this.#lineOnPuffbook,\n                column_count: columns.length,\n                visible_column_count: visibleColumns.length,\n                visible_column_start: this.#columnStart,\n                data_size: this.#dataSize,\n            });\n\n        //gets font and fontSize for measurements only\n            this.header = new Header({\n                name: `${this.state.name}.header`,\n                style: this.#style,\n                data: this.#data,\n                dataSize: this.#dataSize,\n                textBatchScopeKey: `${this.state.name}.header.text`,\n                textBatchScopeRoot: this.#headerMount,\n            });\n\n            this.#zebraLayer = new UniformZebraStripes({\n                name: `${this.state.name}.uniform_zebra_stripes`,\n                width: this.state.width ?? 0,\n                height: Math.max(0, (this.state.height ?? 0) - this.#tableBodyTop()),\n                z: 0.2,\n                rowHeight: this.#style.fixedRowHeight,\n                stripeColor: [0.1843, 0.2078, 0.2314, 1.0],\n                phasePx: 0,\n                startParity: 0,\n            });\n            this.#zebraLayer.setStripeUniformProvider(() => this.#uniformZebraState());\n            this.#zebraMount.appendChild(this.#zebraLayer);\n            this.#headerMount.appendChild(this.header);\n            this.#rebuildHeader();\n            this.#rebuildColumnSeparators();\n            this.#syncZebraLayer();\n\n            if (this.#dataSize === 0) {\n                this.buildEmptyTableLabel();\n                if (!this.isScreenshot) {\n                    this.#fullscreenChrome.attach({\n                        includeJumpButtons: false,\n                        toolbarHost: this.#inspectToolbar,\n                        font: this.#style.font,\n                        fontSize: this.#style.fontSize,\n                    });\n                }\n            pushTestingTableviewTrace('tableview_rebuild_done', {\n                line: this.#lineOnPuffbook,\n                column_count: columns.length,\n                data_size: 0,\n                duration_ms: Date.now() - startedAt,\n            });\n                return;\n            }\n\n        //Chunk system\n            this.initChunkSystem()\n\n        //Close Button\n            if (!this.isScreenshot) {\n                this.#fullscreenChrome.attach({\n                    includeJumpButtons: true,\n                    toolbarHost: this.#inspectToolbar,\n                    font: this.#style.font,\n                    fontSize: this.#style.fontSize,\n                });\n            }\n            pushTestingTableviewTrace('tableview_rebuild_done', {\n                line: this.#lineOnPuffbook,\n                column_count: columns.length,\n                data_size: this.#dataSize,\n                duration_ms: Date.now() - startedAt,\n            });\n        } catch (err) {\n            pushTestingTableviewTrace('tableview_rebuild_error', {\n                line: this.#lineOnPuffbook,\n                error: err?.message ?? String(err),\n                duration_ms: Date.now() - startedAt,\n            });\n            throw err;\n        }\n    }\n    destroyColumnCTXMenu() {\n        if (this.columnCTXMenu) {\n            const target = this.columnCTXMenu.ownMount ?? this.columnCTXMenu;\n            if (target.parentNode) {\n                target.parentNode.removeChild(target);\n            }\n        }\n        this.columnCTXMenu = null;\n    }\n\n    buildColumnCTXMenu(data = null) {\n        /*\n            Get the Mouse screen position in world space,\n            then convert it into the presented scene root. Menus and dialogs\n            must be siblings of the preview viewport, rather than its children,\n            so inline table previews cannot clip them.\n        */\n        const [worldX, worldY] = this.#mouseWorldPosition();\n        const [x, y] = this.scene?.worldToPresentationPoint?.([worldX, worldY, 0])\n            ?? [worldX, worldY, 0];\n        const mountParent = this.scene?.presentedRoot?.();\n        if (!mountParent) {\n            throw new Error(\"TableView requires a presented scene root to mount column menus.\");\n        }\n\n        const inverseParentMatrix = twgl.m4.inverse(mountParent.localToWorld());\n        const localTransform = twgl.m4.transformPoint(inverseParentMatrix, [x, y, -5]);\n\n        /*\n            When trying to create a new columnCTXMenu,\n            delete the old one before making a new one.\n        */\n        if (this.columnCTXMenu) {\n            this.destroyColumnCTXMenu();\n        }\n\n        const parent = this;\n        this.columnCTXMenu = ui.ContextMenu.mount(mountParent, {\n            font: this.#style.font,\n            fontSize: this.#style.fontSize,\n            x: localTransform[0],\n            y: localTransform[1],\n            items: [\n                ...(this.readOnly ? [] : [\n                    {\n                        label: \"Filter\", onInput: () => {\n                            const conlumnData = {\n                                columnName: data?data.columnName:null,\n                                columnType: data?data.columnType:null\n                            }\n                            ui.UIWindow.mount(parent, {\n                                font: this.#style.font,\n                                fontSize: this.#style.fontSize,\n                                x: localTransform[0],\n                                y: localTransform[1],\n                                mountParent,\n                                panel: new FilterPanel({\n                                    font: this.#style.font,\n                                    fontSize: this.#style.fontSize,\n                                    columnData: conlumnData,\n                                    onSubmit: (filterData) => parent.#handleFilter(filterData),\n                                }),\n                                windowTitle: 'Filter',\n                            });\n                            parent.destroyColumnCTXMenu();\n                        }\n                    },\n                    {\n                        label: \"Advanced Sort\",\n                        onInput: () => {\n                            ui.UIWindow.mount(parent, {\n                                font: this.#style.font,\n                                fontSize: this.#style.fontSize,\n                                x: localTransform[0],\n                                y: localTransform[1],\n                                mountParent,\n                                panel: new SortPanel({\n                                    font: this.#style.font,\n                                    fontSize: this.#style.fontSize,\n                                    columnNames: [...(parent.columns ?? [])],\n                                    columnData: data,\n                                    onSubmit: (sortData) => parent.#handleSort(sortData),\n                                }),\n                                windowTitle: 'Advanced Sort',\n                            });\n                            parent.destroyColumnCTXMenu();\n                        }\n                    },\n                    {\n                        label: \"Fill Column\", onInput: () => {\n                            const conlumnData = {\n                                columnName: data ? data.columnName : null,\n                                columnType: data ? data.columnType : null\n                            }\n                            ui.UIWindow.mount(parent, {\n                                font: this.#style.font,\n                                fontSize: this.#style.fontSize,\n                                x: localTransform[0],\n                                y: localTransform[1],\n                                mountParent,\n                                panel: new FillPanel({\n                                    font: this.#style.font,\n                                    fontSize: this.#style.fontSize,\n                                    columnData: conlumnData,\n                                    onSubmit: (fillData) => parent.#handleFill(fillData),\n                                }),\n                                windowTitle: 'Fill Column',\n                            });\n                            parent.destroyColumnCTXMenu();\n                        }\n                    },\n                    {\n                        label: \"Fill Table\", onInput: () => {\n                            this.#handleFillTable();\n                            parent.destroyColumnCTXMenu();\n                        },\n                        toastEnabled: true,\n                        toastText: \"Table filled with default values.\",\n                        tooltipText: \"Fill all null entries in the Table with a default value of: 0 or '' for strings.\"\n                    },\n                ]),\n                {\n                    label: \"Copy Column Name\",\n                    toastEnabled: true,\n                    toastText: \"Column name copied to the clipboard\",\n                    onInput: function () {\n                        const clipboard = globalThis.navigator?.clipboard;\n                        if (typeof clipboard?.writeText !== 'function') {\n                            console.warn('Column name copy requires navigator.clipboard.writeText().');\n                            parent.destroyColumnCTXMenu();\n                            return;\n                        }\n                        Promise.resolve(clipboard.writeText(data.columnName)).catch((err) => {\n                            console.error('Failed to copy column name to the clipboard.', err);\n                        });\n                        this.displayToast();\n                        parent.destroyColumnCTXMenu();\n                    },\n                },\n                {\n                    label: \"Column's Metadata\",\n                    onInput: () => {\n                        ui.UIWindow.mount(parent, {\n                            font: this.#style.font,\n                            fontSize: this.#style.fontSize,\n                            x: localTransform[0],\n                            y: localTransform[1],\n                            mountParent,\n                            panel: new ColumnsMetadataPanel({\n                                font: this.#style.font,\n                                fontSize: this.#style.fontSize,\n                                columnData: data,\n                            }),\n                            windowTitle: \"Column's Metadata\",\n                        });\n                        parent.destroyColumnCTXMenu();\n                    },\n                },\n                {\n                    label: \"Column's Lineage\",\n                    onInput: () => {\n                        ui.UIWindow.mount(parent, {\n                            font: this.#style.font,\n                            fontSize: this.#style.fontSize,\n                            x: localTransform[0],\n                            y: localTransform[1],\n                            mountParent,\n                            panel: new DataLineagePanel({\n                                font: this.#style.font,\n                                fontSize: this.#style.fontSize,\n                                columnData: data,\n                            }),\n                            windowTitle: \"Column's Lineage\",\n                        });\n                        parent.destroyColumnCTXMenu();\n                    },\n                }\n                //********DISABLED EXPORT TEMP */\n                // {\n                //     label: \"Export Table\",\n                //     toastEnabled: false,\n                //     onButtonUp: function () {\n                //         console.log(\"Export\")\n\n                //     }\n                // }\n               \n            ],\n            separators: [2, 3]\n        })\n\n        this.columnCTXMenu.destroy = () => {\n            this.destroyColumnCTXMenu();\n        };\n\n    }\n};\n\nexport { testingResetTableviewTrace, testingTableviewTrace };\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport { Button } from './button.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { materials } from './tile-material.mjs';\n\nconst DEFAULT_TILE_SIZE = Object.freeze([14.5, 14.5]);\nconst DEFAULT_ICON_SIZE = Object.freeze([8.25, 8.25]);\n\n/*\n * A button-backed boolean control. The button icon is the checked indicator:\n * it is present only while the checkbox is checked.\n */\nexport class Checkbox extends Button {\n    constructor(state = {}) {\n        const checked = state.checked ?? false;\n        if (typeof checked !== 'boolean') {\n            throw new TypeError('Checkbox: checked must be a boolean.');\n        }\n        super({\n            ...state,\n            // Icon 0 is the standard checkbox indicator unless the caller\n            // deliberately supplies another icon.\n            iconID: state.iconID ?? 0,\n            tileSize: state.tileSize ?? DEFAULT_TILE_SIZE,\n            iconSize: state.iconSize ?? DEFAULT_ICON_SIZE,\n            iconColor: state.iconColor ?? Palette.orange,\n            outlineEnabled: state.outlineEnabled ?? true,\n            outlineColor: state.outlineColor ?? Palette.orange,\n            outlineWidth: state.outlineWidth ?? 2,\n            outlineMaterial: state.outlineMaterial ?? materials.solid(),\n             checked,\n        });\n\n        this.checked = checked;\n        this.onChange = state.onChange ?? (() => {});\n        if (typeof this.onChange !== 'function') {\n            throw new TypeError('Checkbox: onChange must be a function.');\n        }\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#syncCheckIcon();\n    }\n\n    mutate(newState) {\n        if (Object.hasOwn(newState, 'checked') && typeof newState.checked !== 'boolean') {\n            throw new TypeError('Checkbox.mutate(): checked must be a boolean.');\n        }\n        super.mutate(newState);\n        if (Object.hasOwn(newState, 'checked')) {\n            this.checked = newState.checked;\n            this.#syncCheckIcon();\n        }\n    }\n\n    focusSemantics() {\n        return { ...super.focusSemantics(), role: 'checkbox', checked: this.state.checked };\n    }\n\n    setChecked(checked) {\n        this.mutate({ checked });\n    }\n\n    toggle() {\n        this.setChecked(!this.checked);\n    }\n\n    onInput(event) {\n        if (!isActivationEvent(event)) {\n            return false;\n        }\n        this.toggle();\n        this.onChange(this.checked);\n        return true;\n    }\n\n    #syncCheckIcon() {\n        if (!this.icon) {\n            return;\n        }\n        this.icon.setVisibility(this.visible !== false && this.checked);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { isActivationEvent } from './activation.mjs';\nimport { currentFocusTarget, focusControl, focusNavigationControls, navigateFocus } from './focus-manager.mjs';\n\nconst CONTEXT_MENU_AWAY_GRACE = 2.0;\nconst CONTEXT_MENU_STATIC_GRACE = 3.6;\nconst CONTEXT_MENU_FRAME = 6;\nconst onPrimaryRelease = ui.Button.onPrimaryRelease ?? ((callback) => function (event) {\n    if (!isActivationEvent(event)) {\n        return false;\n    }\n    callback.call(this);\n    return true;\n});\n\n\nconst CONTEXT_MENU_FADE_TIME = 0.9;\nconst CONTEXT_MENU_VICINITY_PAD = 36;\n\n/* HUD-mounted menus leave their source subtree, so retain the enclosing dialog for input arbitration. */\nfunction inputOwnerWindowFor(node) {\n    for (let current = node; current; current = current.parentNode ?? null) {\n        if (current.focusContainerKind === 'DialogWindow') {\n            return current;\n        }\n    }\n    return null;\n}\n\n\nexport class ContextMenu extends ui.Tile {\n    static mount(parent, state) {\n        const stage = parent.scene?.stage ?? null;\n        const mountParent = stage?.hudMountRoot?.('contextMenu') ?? parent;\n        let menuState = state;\n        if (mountParent !== parent) {\n            const placement = stage.projectNodePointToHud(parent, [\n                state.x ?? 0,\n                state.y ?? 0,\n                state.z ?? 0,\n            ], mountParent);\n            if (placement) {\n                menuState = { ...state, x: placement[0], y: placement[1], z: 0 };\n            }\n        }\n        const mount = new ui.Placeholder({ name: 'contextMenuMount' });\n        const menu = new ContextMenu(menuState);\n        menu.ownMount = mount;\n        /*\n            Menus remain in the shared HUD overlay layer, but an originating\n            UIWindow can claim one for modal input routing.\n        */\n        menu.inputOwnerWindow = state.ownerWindow ?? inputOwnerWindowFor(parent);\n        menu.focusInvoker = currentFocusTarget();\n        menu.inputOwnerDialog = stage?.activeDialog?.ownsNode(parent) ? stage.activeDialog : null;\n        mount.appendChild(menu);\n        mountParent.appendChild(mount);\n        if (menu.focusInvoker?.focusTargetKind === 'control' && menu.focusInvoker.focusVisible) {\n            const first = focusNavigationControls(stage).find(node => menu.#containsPickedNode(node));\n            if (first) focusControl(first, { keyboard: true });\n        }\n        return menu;\n    }\n\n    constructor(state) {\n        state.color = state.color ?? Palette.darkgrey\n        super(state);\n        this.items = state.items ?? null\n        this.itemsArray = state.itemsArray ?? null\n        this.separators = state.separators || []\n        this.state.backgroundColor = this.state.backgroundColor || Palette.darkgrey\n        this.state.buttonsColor = this.state.buttonsColor || Palette.darkgrey\n        this.state.seperatorColor = this.state.seperatorColor || [0.3647, 0.3647, 0.3647, 1.0]\n        this.state.opacity = state.opacity ?? 1.0;\n        this.ownMount = null;\n        this.inputOwnerWindow = null;\n        this.ownLoopThink = null;\n        this.ownPointerInputCaptureDispose = null;\n        this._lastLoopS = null;\n    }\n    #buttons = new Map();\n    #maxWidth = 0;\n    #awayTime = 0.0;\n    #stillTime = 0.0;\n    #fading = false;\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#listenForOutsidePointerInput();\n        this.#rebuild()\n        this.#scheduleLoop();\n    }\n\n    _onDetachNode(shared) {\n        this.#stopListeningForOutsidePointerInput();\n        this.#clearLoop();\n        super._onDetachNode(shared);\n    }\n\n    _onBeforeDetachNode(shared) {\n        const focused = currentFocusTarget();\n        if (this.#containsPickedNode(focused)) {\n            // Exclude the whole menu before its children unregister, so removal\n            // cannot restore focus to another item that is being destroyed.\n            this.closed = true;\n            if (this.focusInvoker?.focusTargetKind === 'control') {\n                focusControl(this.focusInvoker, { keyboard: focused.focusVisible });\n            }\n        }\n        super._onBeforeDetachNode(shared);\n    }\n\n    onFocusEscape() {\n        this.destroy();\n        return true;\n    }\n\n    onFocusTab(direction) {\n        const controls = focusNavigationControls(this.scene.stage).filter(node => this.#containsPickedNode(node));\n        const index = controls.indexOf(currentFocusTarget());\n        const next = controls[index + direction];\n        if (next) return focusControl(next, { keyboard: true });\n        const stage = this.scene.stage;\n        this.destroy();\n        return navigateFocus(stage, direction);\n    }\n\n    /*\n        User override, this is a common behaviour for all\n        ctx menus but each obvject my need to handle differently.\n    */\n    destroy(){\n        throw Error(\"Please override destroy() for this ctx menu.\")\n    }\n\n    onPointerInput(events) {\n\n        for (let event of events) {\n            if (event === \"L_MOUSE_DOWN\") {\n                this.destroy()\n                return true;\n            } else if (event === \"R_MOUSE_DOWN\") {\n                this.destroy()\n                return true;\n            }\n        }\n    \n        return false;\n    }\n\n    /* Close on a press routed outside this menu, while leaving that press available to its real target. */\n    #listenForOutsidePointerInput() {\n        this.#stopListeningForOutsidePointerInput();\n        const scene = this.scene;\n        if (!scene || typeof scene.addPointerInputCaptureListener !== 'function') {\n            return;\n        }\n        this.ownPointerInputCaptureDispose = scene.addPointerInputCaptureListener((events, picked) => {\n            if (!events?.has?.('L_MOUSE_DOWN') && !events?.has?.('R_MOUSE_DOWN')) {\n                return;\n            }\n            if (!this.#containsPickedNode(picked)) {\n                this.destroy();\n            }\n        });\n    }\n\n    #stopListeningForOutsidePointerInput() {\n        this.ownPointerInputCaptureDispose?.();\n        this.ownPointerInputCaptureDispose = null;\n    }\n\n    #containsPickedNode(node) {\n        for (let cur = node; cur; cur = cur.parentNode) {\n            if (cur === this) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    #runLoop(deltatime) {\n        if (this.#containsPickedNode(currentFocusTarget())) {\n            this.#awayTime = this.#stillTime = 0;\n            return;\n        }\n        const local = this.getLocalMousePosition();\n        const inVicinity = local\n            && local[0] >= -CONTEXT_MENU_VICINITY_PAD\n            && local[0] <= this.state.width + CONTEXT_MENU_VICINITY_PAD\n            && local[1] >= -CONTEXT_MENU_VICINITY_PAD\n            && local[1] <= this.state.height + CONTEXT_MENU_VICINITY_PAD;\n\n        if (inVicinity) {\n            this.#awayTime = 0.0;\n            if (Mouse.mouseMoved()) {\n                this.#stillTime = 0.0;\n            } else {\n                this.#stillTime += deltatime;\n            }\n        } else {\n            this.#awayTime += deltatime;\n            this.#stillTime = 0.0;\n        }\n\n        if (!this.#fading && (this.#awayTime >= CONTEXT_MENU_AWAY_GRACE || this.#stillTime >= CONTEXT_MENU_STATIC_GRACE)) {\n            this.#beginFadeOut();\n        }\n    }\n\n    /* Cancel one pending menu-idle follow-up when the menu fades or detaches. */\n    #clearLoop() {\n        if (this.ownLoopThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownLoopThink);\n        this.ownLoopThink = null;\n    }\n\n    /* Keep the menu-idle detector explicit by rearming one sparse follow-up at a time. */\n    #scheduleLoop() {\n        this.#clearLoop();\n        if (!this.scene || this.#fading) {\n            return;\n        }\n        this.ownLoopThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), ({ now_s }) => {\n            this.ownLoopThink = null;\n            const last = this._lastLoopS ?? (now_s - this.sceneFrameStepS());\n            this._lastLoopS = now_s;\n            this.#runLoop(Math.max(0, now_s - last));\n            this.#scheduleLoop();\n        });\n    }\n\n    /* Hand the visual fade itself to the animation system once idle detection decides to dismiss the menu. */\n    #beginFadeOut() {\n        if (this.#fading) {\n            return;\n        }\n        this.#fading = true;\n        this.stopAnimation('opacity');\n        this.animateTo({\n            duration_s: CONTEXT_MENU_FADE_TIME,\n            opacity: 0.0,\n            onFinish: ({ node }) => {\n                if (node === this) {\n                    this.destroy();\n                }\n            },\n        });\n        this.#clearLoop();\n    }\n\n    #itemSpecs() {\n        const specs = [];\n        if (this.items) {\n            for (const item of this.items) {\n                specs.push({\n                    key: item.label,\n                    label: item.label,\n                    onInput: typeof item.onInput === 'function' ? onPrimaryRelease(item.onInput) : undefined,\n                    toastText: item.toastText,\n                    tooltipText: item.tooltipText,\n                    toastEnabled: item.toastEnabled,\n                });\n            }\n        }\n        if (this.itemsArray) {\n            for (let i = 0; i < this.itemsArray.labels.length; i++) {\n                const label = this.itemsArray.labels[i];\n                specs.push({\n                    key: `${label}${i}`,\n                    label,\n                    onInput: onPrimaryRelease(() => {\n                        this.itemsArray.onInput(i);\n                    }),\n                });\n            }\n        }\n        return specs;\n    }\n\n    #measureWidth(label) {\n        const layout = evilfont.MSDFText.measureFromState({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            text: label,\n        });\n        const horizontalPadding = 28;\n        return Math.max(120, layout.width + horizontalPadding);\n    }\n\n    #buildItems() {\n        const specs = this.#itemSpecs();\n        const rowHeight = 32;\n        const defaultMaxHeight = 320;\n        const maxHeight = Number.isFinite(this.state.maxHeight)\n            ? Math.max(rowHeight, this.state.maxHeight)\n            : defaultMaxHeight;\n        this.#maxWidth = 0;\n        for (const spec of specs) {\n            this.#maxWidth = Math.max(this.#maxWidth, this.#measureWidth(spec.label));\n        }\n\n        const contentHeight = rowHeight * specs.length;\n        const bodyHeight = Math.min(contentHeight + CONTEXT_MENU_FRAME * 2, maxHeight);\n        this.state.width = this.#maxWidth;\n        this.state.height = bodyHeight;\n\n        const scrollBox = new ui.ScrollBox({\n            width: this.state.width,\n            height: this.state.height,\n            padding: CONTEXT_MENU_FRAME,\n            color: this.state.backgroundColor,\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n            backgroundTileBatch: 'context_menu.background',\n            z: -0.1,\n            mouseSpace: \"world\",\n            layout: \"vertical\",\n        });\n        const innerRect = scrollBox.requestedContentRect;\n        const scrollbarWidth = contentHeight > innerRect.height ? scrollBox.thumbWidth : 0;\n        const buttonWidth = innerRect.width - scrollbarWidth;\n\n        this.appendChild(scrollBox);\n\n        const separatorKeys = new Set(this.separators.map((idx) => specs[idx]?.key).filter(Boolean));\n        for (const spec of specs) {\n            const row = new ui.Placeholder({\n                width: innerRect.width,\n                height: rowHeight,\n                z: -0.2,\n            });\n            const btn = new ui.Button({\n                font: this.state.font,\n                fontSize: this.state.fontSize,\n                width: buttonWidth,\n                height: rowHeight,\n                x: 0,\n                y: 0,\n                z: -1,\n                text: spec.label,\n                textVAlignment: 'CENTER',\n                textHAlignment: 'LEFT',\n                color: this.state.buttonsColor,\n                toastText: spec.toastText,\n                tooltipText: spec.tooltipText,\n                toastEnabled: spec.toastEnabled,\n            });\n            btn.onInput = function (event) {\n                return typeof spec.onInput === 'function'\n                    ? spec.onInput.call(this, event)\n                    : false;\n            };\n            row.appendChild(btn);\n            this.#buttons.set(spec.key, btn);\n\n            if (separatorKeys.has(spec.key)) {\n                const separatorPadding = 25;\n                row.appendChild(new ui.Tile({\n                    tileBatch: \"context_menu.separator\",\n                    x: separatorPadding * 0.5,\n                    y: rowHeight - 0.5,\n                    height: 0.5,\n                    width: buttonWidth - separatorPadding,\n                    color: this.state.seperatorColor,\n                    z: -2,\n                }));\n            }\n            scrollBox.appendChild(row);\n        }\n        scrollBox.syncContentLayout();\n    }\n\n    #rebuild() {\n        this.#buttons = new Map();\n        this.#buildItems();\n    }\n\n    getButton(key) {\n        return this.#buttons.get(key);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { identity } from '../quat.mjs';\n\n\nexport class Toolbar extends ui.Tile {\n    static HEIGHT = 22\n    \n    constructor(state) {\n        super({\n            ...state,\n            height: Toolbar.HEIGHT\n        })\n        this.width = state.width\n        this.items = state.items\n        this.parent = state.parent\n        this.fontSize = state.fontSize\n        this.height = Toolbar.HEIGHT\n    }\n    #buttons = []\n    #PADDING = 12\n\n    #closeButtonSize = 22;\n    closeButton = null;\n    closePressOverride = null;\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        let pos = identity();\n        this.setLocalPosition([pos[0], pos[1] - Toolbar.HEIGHT, this.state.z || pos[2]])\n        this.#rebuild()\n    }\n\n    #buildItems() {\n        let x = this.localPosition()[0] + this.#PADDING;\n        if(!this.items){\n            return;\n        }\n        for (const item of this.items) {\n\n            const textLayout = evilfont.MSDFText.measureFromState({\n                font: this.state.font,\n                fontSize: this.state.fontSize,\n                text: item.label\n            });\n           \n            const btn = new ui.Button({\n                font: this.state.font,\n                fontSize: this.state.fontSize,\n                height: Toolbar.HEIGHT,\n                x: x,\n                z: -1,\n                text: item.label,\n                color: this.state.color,\n                textPadding: 0\n            });\n\n            x += textLayout.width + this.#PADDING\n            btn.onInput = ui.Button.onPrimaryRelease(item.onInput);\n            this.appendChild(btn);\n            this.#buttons.push(btn)\n            \n        }\n    }\n\n    #destroy(){\n        this.removeAllChildren();\n        this.#buttons = [];\n        this.closeButton = null;\n    }\n\n    #rebuild() {\n        \n        this.#destroy();\n        this.#buttons = []\n        this.#buildItems();\n\n        this.closeButton = new ui.Button({\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            x: this.state.width - this.#closeButtonSize,\n            width: this.#closeButtonSize,\n            height: this.#closeButtonSize,\n            z:- 1,\n            color: [1, 1, 1, 1],\n            onHoverColor: [1,0,0,1],\n            iconID: 3,\n            tooltipText: \"Go back to puffbook.\"\n        })\n\n        if(this.closePressOverride){\n            this.closeButton.onInput = ui.Button.onPrimaryRelease(this.closePressOverride);\n        }\n        this.appendChild(this.closeButton)\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { drawArraysInstancedChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { tileDrawUniformState } from './tile.mjs';\n\nconst INNER_SHADOW_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\n/**\n * @deprecated Use a Tile or Button with `materials.beveled({ bevelType: 'inner' })`.\n * Retained temporarily for compatibility with downstream callers.\n */\nexport class InnerShadowTile extends ui.Tile{\n    static deprecated = true;\n\n    constructor(state) {\n        super(state);\n    }\n\n    static _onAcquireContext(gl, shared) {\n            shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.inner_shadow');\n            shared.ownGlBufferInfo = null;\n            markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n            const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n    \n            (async () => {\n                const vshader = 'lib/evilui/tile-anchor';\n                const fshader = 'lib/evilui/inner-shadow'\n                const ownGlProgram = await getContextGlProgram(gl, 'gl_program.inner_shadow', async () => {\n                    const [vsSrc, fsSrc] = await ewu.loadSource(vshader + '.vs.glsl', fshader + '.fs.glsl');\n                    return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n                });\n                if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                    return;\n                }\n                shared.ownGlProgram = ownGlProgram;\n                if (!shared.ownGlProgram) {\n                    const name = shared.nodes?.[0]?.state?.name ?? shared.resourceKey ?? 'InnerShadowTile';\n                    console.warn(`Shader ${fshader} or ${vshader} not found. InnerShadowTile ${name} will not render.`);\n                }\n            })();\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        shared.ownGlProgram = null;\n        super._onReleaseContext(gl, shared);\n    }\n\n    // Override to draw nothing\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix){\n        return;\n    }\n\n    /* Inner shadows are alpha-composited overlays, so keep the shared batch in the transparent pass. */\n    static _batchPassForNode(_node) {\n        return 'transparent';\n    }\n\n    /* Shared inner-shadow resources stay owned by the transparent pass after the last node detaches. */\n    static _batchPassForShared(_shared) {\n        return 'transparent';\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n            status.response = ui.RENDER_STATUS.LOADING\n            const nodes = shared.nodes.filter(node => node.computedVisible !== false);\n            /*\n                The last node might have been removed, in which case, we are not dumping\n                resources but we need to tell the pipeline its \"ready\".\n            */\n            if(nodes.length < 1){\n                status.response = ui.RENDER_STATUS.READY;\n                return;\n            }\n\n            if (!shared.ownGlProgram) {\n                return;\n            }\n    \n            if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, INNER_SHADOW_BUFFER_KINDS)) {\n                shared.ownGlBufferInfo = ui.syncTileBufferInfo(gl, shared, { nodes });\n                clearNonPickerResourceDirty(shared);\n            }\n    \n            if (!shared.ownGlBufferInfo) {\n                status.response = ui.RENDER_STATUS.READY;\n                return;\n            }\n    \n            /*\n                To bake the mesh with the node offsets, we need the GL, we can't use the \n                have a baked bufferInfo to be recycled on gl loss, this means gl loss is not\n                something we need to worry about for this case.\n                The only 2 objects that we can save in bettwen gl loss is:\n                - Shader\n                - mesh\n    \n                Program can be kept in bettwen calls but not bufferinfo\n            */\n            const borGlProgram = shared.ownGlProgram;\n            gl.useProgram(borGlProgram.program);\n            twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n    \n            twgl.setUniforms(borGlProgram, {\n                u_time: t,\n                u_viewMatrix: viewMatrix,\n                u_projectionMatrix: projectionMatrix,\n                ...tileDrawUniformState(shared),\n                u_size: [2,2],\n                u_blur: 4,\n                u_shadowColor: [0.1,0.1,0.1,1],\n                u_highlightColor: [0.6,0.6,0.6,1]\n            });\n\n\n            drawArraysInstancedChecked(gl, `InnerShadowTile(${shared.resourceKey})`, shared.ownGlBufferInfo, shared.ownGlBufferInfo.instanceCount);\n            status.response = ui.RENDER_STATUS.READY;\n        }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport { RENDER_STATUS } from './base.mjs';\nimport { drawArraysInstancedChecked } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { Tile, syncTileBufferInfo, tileDrawUniformState } from './tile.mjs';\n\nconst DROP_SHADOW_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n]);\n\n/* One restrained desktop-window style keeps every shadow in the same instanced batch. */\nexport const WINDOW_DROP_SHADOW = Object.freeze({\n    blurRadius: 16,\n    cornerRadius: 3,\n    offsetX: 0,\n    offsetY: 3,\n    opacity: 0.34,\n    z: 0.2,\n});\n\n/* Expand the draw quad around its source rectangle without coupling shadow geometry to UIWindow. */\nexport function dropShadowState(width, height) {\n    const margin = WINDOW_DROP_SHADOW.blurRadius;\n    return {\n        name: 'dropShadow',\n        width: width + 2 * margin,\n        height: height + 2 * margin,\n        x: -margin + WINDOW_DROP_SHADOW.offsetX,\n        y: -margin + WINDOW_DROP_SHADOW.offsetY,\n        z: WINDOW_DROP_SHADOW.z,\n        color: [0, 0, 0, WINDOW_DROP_SHADOW.opacity],\n    };\n}\n\n/* Analytic outer shadow: one expanded quad per surface, instanced in one transparent draw. */\nexport class DropShadowTile extends Tile {\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.drop_shadow');\n        shared.ownGlBufferInfo = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer, DIRTY.instance]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vertexShader = 'lib/evilui/tile-anchor';\n            const fragmentShader = 'lib/evilui/drop-shadow';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.drop_shadow', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(`${vertexShader}.vs.glsl`, `${fragmentShader}.fs.glsl`);\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!ownGlProgram) {\n                console.warn('DropShadowTile shader program was not acquired.');\n            }\n        })();\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        super._onReleaseContext(gl, shared);\n    }\n\n    static _drawOpaque() {}\n\n    static _batchPassForNode() {\n        return 'transparent';\n    }\n\n    static _batchPassForShared() {\n        return 'transparent';\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = RENDER_STATUS.LOADING;\n        const nodes = shared.nodes.filter(node => node.computedVisible !== false);\n        if (nodes.length === 0) {\n            status.response = RENDER_STATUS.READY;\n            return;\n        }\n        if (!shared.ownGlProgram) {\n            return;\n        }\n\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, DROP_SHADOW_BUFFER_KINDS)) {\n            shared.ownGlBufferInfo = syncTileBufferInfo(gl, shared, { nodes });\n            clearNonPickerResourceDirty(shared);\n        }\n        if (!shared.ownGlBufferInfo) {\n            status.response = RENDER_STATUS.READY;\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo);\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix,\n            ...tileDrawUniformState(shared, `DropShadowTile(${shared.resourceKey})`),\n            u_blurRadius: WINDOW_DROP_SHADOW.blurRadius,\n            u_cornerRadius: WINDOW_DROP_SHADOW.cornerRadius,\n        });\n        drawArraysInstancedChecked(\n            gl,\n            `DropShadowTile(${shared.resourceKey})`,\n            shared.ownGlBufferInfo,\n            shared.ownGlBufferInfo.instanceCount,\n        );\n        status.response = RENDER_STATUS.READY;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n// Keep passive right-edge chrome on one consistent external gutter so\n// adjacent document/preview affordances read as one layout system.\nexport const EXTERNAL_RIGHT_ICON_GAP = 8;\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { noteProgramReady, warnProgramPending } from './gl-program-wait.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\nimport { currentFocusContainer, popFocusEntry, pushFocusEntry, removeFocusEntry } from './focus-manager.mjs';\nimport { pushTestingTableviewTrace } from './testing-trace.mjs';\nimport { EXTERNAL_RIGHT_ICON_GAP } from './chrome-spacing.mjs';\nimport { currentEvil } from '../eviltime.mjs';\n\nconst VIEWPORT_STATIC_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.buffer,\n]);\nconst EXPAND_BUTTON_SIZE = 32;\nconst EXPAND_BUTTON_INSET = EXTERNAL_RIGHT_ICON_GAP;\nconst PREVIEW_WHEEL_ESCAPE_IDLE_LATCH_S = 0.18;\n\nfunction findNode(root, predicate) {\n    if (!root) {\n        return null;\n    }\n    if (predicate(root)) {\n        return root;\n    }\n    for (const child of root.children ?? []) {\n        const found = findNode(child, predicate);\n        if (found) {\n            return found;\n        }\n    }\n    return null;\n}\n\nfunction syncViewportLayoutSubtree(root) {\n    if (!root) {\n        return;\n    }\n    if (typeof root.syncViewportLayout === 'function') {\n        root.syncViewportLayout();\n    }\n    for (const child of root.children ?? []) {\n        syncViewportLayoutSubtree(child);\n    }\n}\n\nfunction viewportTraceLabel(node) {\n    if (!node) {\n        return '<none>';\n    }\n    return node.state?.name ?? node.constructor?.name ?? '<unnamed>';\n}\n\nfunction syncPreviewViewportHost(root, viewport) {\n    let cur = root;\n    while (cur) {\n        if (typeof cur.syncPreviewViewportHeight === 'function') {\n            cur.syncPreviewViewportHeight(viewport);\n            return;\n        }\n        cur = cur.parentNode ?? null;\n    }\n}\n\nfunction hasWheelInput(events) {\n    return !!events\n        && (\n            events.has?.('SCROLL_DOWN')\n            || events.has?.('SCROLL_UP')\n            || events.has?.('SCROLL_LEFT')\n            || events.has?.('SCROLL_RIGHT')\n            || events.has?.('SCROLL_DOWN_PIXEL')\n            || events.has?.('SCROLL_UP_PIXEL')\n            || events.has?.('SCROLL_LEFT_PIXEL')\n            || events.has?.('SCROLL_RIGHT_PIXEL')\n            || (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && ((events.wheelDeltaX ?? 0) !== 0 || (events.wheelDeltaY ?? 0) !== 0))\n        );\n}\n\nexport class Viewport extends ui.Tile {\n    focusContainerKind = 'Viewport';\n    #previewWheelEscapeUntilS = null;\n    #tableDragActive = false;\n\n    constructor(state) {\n        super(state);\n        if (state.ownContentRoot || state.ownContentCamera) {\n            throw new Error('Viewport embedded content host is retired. Append ordinary direct children instead.');\n        }\n        this.actsAsContainer = state.actsAsContainer ?? false;\n        this.drawSurface = state.drawSurface ?? true;\n        this.allowExpand = state.allowExpand ?? false;\n        this.sharedRef = null; //there has to be a better way to do this\n        this.ownClickArea = null;\n        this.ownContentMount = null;\n        this.ownChromeMount = null;\n        this.ownExpandButton = null;\n        this.ownFullscreenMount = null;\n        this.fullscreenRestore = null;\n        this.retireFullscreenOnLeave = false;\n        this.expanded = false;\n        this.clipChildren = !this.actsAsContainer;\n    }\n\n    #isInternalChild(node) {\n        return node === this.ownClickArea || node === this.ownContentMount;\n    }\n\n    #contentHost() {\n        if (this.actsAsContainer) {\n            return null;\n        }\n        if (!this.ownContentMount) {\n            const mount = new ui.Placeholder({});\n            this.ownContentMount = mount;\n            super.appendChild(mount);\n        }\n        return this.ownContentMount;\n    }\n\n    appendChild(child) {\n        if (this.actsAsContainer || this.#isInternalChild(child)) {\n            super.appendChild(child);\n            return;\n        }\n        const host = this.#contentHost();\n        if (host) {\n            host.appendChild(child);\n            return;\n        }\n        super.appendChild(child);\n    }\n\n    insertChildBefore(child, beforeChild = null) {\n        if (this.actsAsContainer || this.#isInternalChild(child)) {\n            super.insertChildBefore(child, beforeChild);\n            return;\n        }\n        const host = this.#contentHost();\n        if (!host) {\n            super.insertChildBefore(child, beforeChild);\n            return;\n        }\n        if (!beforeChild || this.#isInternalChild(beforeChild)) {\n            host.appendChild(child);\n            return;\n        }\n        if (beforeChild.parentNode === host) {\n            host.insertChildBefore(child, beforeChild);\n            return;\n        }\n        super.insertChildBefore(child, beforeChild);\n    }\n\n    removeChild(child) {\n        if (this.actsAsContainer || this.#isInternalChild(child)) {\n            super.removeChild(child);\n            return;\n        }\n        if (this.ownContentMount && child?.parentNode === this.ownContentMount) {\n            this.ownContentMount.removeChild(child);\n            return;\n        }\n        super.removeChild(child);\n    }\n\n    replaceChild(oldChild, newChild) {\n        if (this.actsAsContainer\n            || this.#isInternalChild(oldChild)\n            || this.#isInternalChild(newChild)) {\n            super.replaceChild(oldChild, newChild);\n            return;\n        }\n        const host = this.ownContentMount;\n        if (host && (oldChild === null || oldChild.parentNode === host)) {\n            host.replaceChild(oldChild, newChild);\n            return;\n        }\n        if (!host && oldChild === null && newChild) {\n            this.#contentHost()?.appendChild(newChild);\n            return;\n        }\n        super.replaceChild(oldChild, newChild);\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.sharedRef = shared\n        this.#build()\n    }\n\n    _onDetachNode(shared) {\n        this.#dropChromeMount();\n        super._onDetachNode(shared);\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.viewport');\n        shared.ownGlBufferInfo = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer]);\n        shared.progWait = null;\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vshader = 'lib/evilui/forward';\n            const fshader = 'lib/evilui/viewport'\n            shared.ownGlErrorTexture = twgl.createTexture(gl, {\n                src: [\n                    16, 18, 20, 255,\n                    16, 18, 20, 255,\n                    16, 18, 20, 255,\n                    16, 18, 20, 255\n                ],\n                width: 2,\n                height: 2,\n                min: gl.NEAREST,\n                mag: gl.NEAREST,\n                wrap: gl.REPEAT\n            });\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.viewport', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(vshader + '.vs.glsl', fshader + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                const name = shared.nodes?.[0]?.state?.name ?? shared.resourceKey ?? 'Viewport';\n                console.warn(`Shader ${fshader} or ${vshader} not found. Viewport ${name} will not render.`);\n            }\n        })();\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) status.response = ui.RENDER_STATUS.LOADING;\n\n        if (!shared.ownGlProgram) {\n            warnProgramPending(shared, 'Viewport batch');\n            return;\n        }\n        noteProgramReady(shared, 'Viewport batch');\n\n        if (shared.nodes.length < 1) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix\n        });\n\n        const drawableNodes = shared.nodes.filter(node => (\n            node.computedVisible !== false\n            && node.actsAsContainer !== true\n            && node.drawSurface !== false\n        ));\n        if (drawableNodes.length === 0) {\n            deleteBufferInfo(gl, shared.ownGlBufferInfo);\n            shared.ownGlBufferInfo = null;\n            clearNonPickerResourceDirty(shared);\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        // Batch\n        if (!shared.ownGlBufferInfo || hasAnyResourceDirty(shared, VIEWPORT_STATIC_BUFFER_KINDS)) {\n            deleteBufferInfo(gl, shared.ownGlBufferInfo);\n            shared.ownGlBufferInfo = gpuDiagWithResourceOrigin('viewport.static_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n                position: drawableNodes[0].getMesh(),\n                baseuvs: drawableNodes[0].getUvs()\n            }));\n            clearNonPickerResourceDirty(shared);\n        }\n\n        if (!shared.ownGlBufferInfo ) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n        for (const node of shared.nodes) {\n            if (node.computedVisible === false || node.actsAsContainer || node.drawSurface === false) {\n                continue;\n            }\n            const pose = node._batchPose?.(shared.scene);\n            if (!pose) {\n                throw new Error(`${node.state?.name ?? node.constructor?.name ?? 'Viewport'} reached draw without a live batch pose.`);\n            }\n\n            twgl.setBuffersAndAttributes(gl, borGlProgram, shared.ownGlBufferInfo );\n\n            twgl.setUniforms(borGlProgram, {\n                u_matrix: pose.worldMatrix,\n                u_resolution: [node.state.width, node.state.height],\n                u_textureResolution: [1, 1],\n                u_color: [\n                    node.state.color[0],\n                    node.state.color[1],\n                    node.state.color[2],\n                    (node.state.color[3] ?? 1.0) * (pose.opacity ?? 1.0),\n                ],\n                u_texture: shared.ownGlErrorTexture\n            });\n\n            twgl.drawBufferInfo(gl, shared.ownGlBufferInfo);\n        }\n\n        if (status) status.response = ui.RENDER_STATUS.READY;\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        deleteBufferInfo(gl, shared.ownGlBufferInfo);\n        if (shared.ownGlErrorTexture) {\n            gl.deleteTexture(shared.ownGlErrorTexture);\n        }\n        shared.ownGlProgram = null;\n        shared.ownGlBufferInfo = null;\n        shared.ownGlErrorTexture = null;\n        markResourceDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n    }\n\n    #build() {\n        if (this.actsAsContainer || !this.#canExpand()) {\n            this.#dropChromeMount();\n            return;\n        }\n        if (!this.ownClickArea) {\n            const clickarea = new ui.ClickArea({\n                width: this.state.width,\n                height: this.state.height,\n                z: 0.1,\n                pickerAlwaysBehind: true,\n            });\n            clickarea.onInput = (event) => {\n                return false\n            };\n            this.ownClickArea = clickarea;\n            super.appendChild(clickarea);\n        }\n        if (!this.actsAsContainer) {\n            this.#contentHost();\n        }\n        if (!this.ownChromeMount) {\n            this.ownChromeMount = new ui.Placeholder({});\n        }\n        if (this.ownChromeMount.parentNode !== this.parentNode) {\n            if (this.ownChromeMount.parentNode) {\n                this.ownChromeMount.remount(this.parentNode);\n            } else {\n                this.parentNode.appendChild(this.ownChromeMount);\n            }\n        }\n        if (!this.ownExpandButton) {\n            const expandButton = new ui.Button({\n                font: this.state.font,\n                fontSize: this.state.fontSize,\n                width: EXPAND_BUTTON_SIZE,\n                height: EXPAND_BUTTON_SIZE,\n                x: 0,\n                y: 0,\n                color: Palette.orange,\n                onHoverColor: Palette.teal,\n            });\n            const iconMount = new ui.Placeholder();\n            expandButton.appendChild(iconMount);\n            iconMount.appendChild(new ui.Icon({\n                width: EXPAND_BUTTON_SIZE,\n                height: EXPAND_BUTTON_SIZE,\n                z: -0.01,\n                color: [1, 1, 1, 1],\n                iconID: 8,\n            }));\n            expandButton.onInput = (event) => {\n                if (!isActivationEvent(event)) return false;\n                if (!this.#canExpand()) {\n                    return false;\n                }\n                this.expand();\n                return true;\n            };\n            this.ownExpandButton = expandButton;\n            this.ownChromeMount.appendChild(expandButton);\n        }\n        this.#syncChromeLayout();\n    }\n\n    #dropChromeMount() {\n        if (this.ownChromeMount?.parentNode) {\n            this.ownChromeMount.parentNode.removeChild(this.ownChromeMount);\n        }\n        this.ownChromeMount = null;\n        this.ownExpandButton = null;\n    }\n\n    #syncChromeMountPlacement() {\n        if (!this.ownChromeMount) {\n            return;\n        }\n        const pos = this.localPosition();\n        this.ownChromeMount.setLocalPosition([\n            pos[0] + this.state.width + EXPAND_BUTTON_INSET,\n            pos[1] + this.state.height * 0.5 - EXPAND_BUTTON_SIZE * 0.5,\n            pos[2],\n        ]);\n    }\n\n    onViewportResized(gl){\n        this.#syncChromeLayout();\n        if (this.expanded) {\n            this.#syncExpandedLayout();\n        }\n        for (const child of this.children ?? []) {\n            syncViewportLayoutSubtree(child);\n        }\n    }\n\n    _onRemountNode(newParent) {\n        if (this.ownChromeMount?.parentNode) {\n            this.ownChromeMount.remount(newParent);\n        }\n        super._onRemountNode(newParent);\n    }\n\n    onPointerInput(events) {\n        if (!this.expanded && events?.has?.('DOUBLE_CLICK')) {\n            const [x, y] = this.getLocalMousePosition();\n            if (x >= 0 && x <= this.state.width && y >= 0 && y <= this.state.height) {\n                pushTestingTableviewTrace('viewport_double_click', {\n                    viewport_label: viewportTraceLabel(this),\n                    expanded: !!this.expanded,\n                    allow_expand: !!this.allowExpand,\n                });\n                if (!this.#canExpand()) {\n                    pushTestingTableviewTrace('viewport_double_click_rejected', {\n                        viewport_label: viewportTraceLabel(this),\n                        expanded: !!this.expanded,\n                        allow_expand: !!this.allowExpand,\n                    });\n                    return false;\n                }\n                this.expand();\n                return true;\n            }\n        }\n        const tableview = this.#tableview();\n        /* Route wheel input through the hosted tableview so previews can escape at hard stops and expanded tables can scroll without relying on picked descendants. */\n        if (tableview && hasWheelInput(events)) {\n            if (shouldYieldWheelToCamera(events)) {\n                return false;\n            }\n            if (this.expanded) {\n                return tableview.onPointerInput?.(events, { forceViewportHit: true }) === true;\n            }\n            const [x, y] = this.getLocalMousePosition();\n            if (x >= 0 && x <= this.state.width && y >= 0 && y <= this.state.height) {\n                const nowS = this.scene?.stage?.frameNowS ?? currentEvil();\n                const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n                if (cam?.ownsActiveWheelGesture?.(nowS) === true) {\n                    return false;\n                }\n                if (Number.isFinite(this.#previewWheelEscapeUntilS) && nowS <= this.#previewWheelEscapeUntilS) {\n                    return false;\n                }\n                const handled = tableview.onPointerInput?.(events) === true;\n                if (handled) {\n                    this.#previewWheelEscapeUntilS = null;\n                    return true;\n                }\n                this.#previewWheelEscapeUntilS = nowS + PREVIEW_WHEEL_ESCAPE_IDLE_LATCH_S;\n                return false;\n            }\n        }\n        /* Route only releases belonging to a fullscreen table drag; ordinary click releases must remain available to picked controls. */\n        const hasTableDragHold = events?.has?.('L_MOUSE_DOWN_HOLD') === true;\n        const hasTableDragRelease = events?.has?.('L_MOUSE_UP') === true && this.#tableDragActive;\n        if (tableview && this.expanded && (hasTableDragHold || hasTableDragRelease)) {\n            this.#tableDragActive = hasTableDragHold && !events.has?.('L_MOUSE_UP');\n            return tableview.onPointerInput?.(events, { forceViewportHit: true }) === true;\n        }\n        return false;\n    }\n\n    recordingViewState() {\n        const table = this.#tableview();\n        /* Root/container viewports can contain a table somewhere below them.\n           Only the preview viewport owned by that table represents its\n           expanded/collapsed presentation state. */\n        if (!table || table.ownPreviewViewport !== this) return null;\n        return {\n            kind: 'viewport',\n            version: 1,\n            line: typeof table?.getLineOnPuffbook === 'function' ? table.getLineOnPuffbook() : null,\n            expanded: this.expanded === true,\n        };\n    }\n\n    restoreRecordingViewState(state) {\n        if (!state || state.version !== 1 || typeof state.expanded !== 'boolean') {\n            throw new Error('Viewport replay state requires a version-1 expanded flag.');\n        }\n        const table = this.#tableview();\n        if (!table || table.ownPreviewViewport !== this) {\n            throw new Error('Viewport replay state can only be restored by its owning table preview.');\n        }\n        if (state.expanded && !this.expanded) this.#moveToFullscreenScene();\n        if (!state.expanded && this.expanded) this.leaveExpandedMode();\n        return this.recordingViewState();\n    }\n\n    #tableview() {\n        for (const child of this.children ?? []) {\n            const found = findNode(child, item => 'isScreenshot' in item);\n            if (found) {\n                return found;\n            }\n        }\n        return null;\n    }\n\n    #canExpand() {\n        return this.allowExpand || !!this.#tableview();\n    }\n\n    #syncChromeLayout() {\n        if (!this.ownClickArea) {\n            return;\n        }\n        this.ownClickArea.mutate({\n            width: this.expanded ? 0 : this.state.width,\n            height: this.state.height,\n        });\n        this.ownClickArea.setEnabled(!this.expanded);\n        this.#syncChromeMountPlacement();\n        const showExpand = !this.expanded && this.#canExpand();\n        this.ownExpandButton?.setVisibility(showExpand);\n        this.ownExpandButton?.setEnabled(showExpand);\n    }\n    onKeyDown(event) {\n        if (!this.expanded) {\n            return false;\n        }\n        const tableview = this.#tableview();\n        if (tableview?.onKeyDown(event) === true) return true;\n        if (event?.key === 'Escape') {\n            if (tableview?.requestDiscardTableview) {\n                tableview.requestDiscardTableview();\n            } else {\n                this.leaveExpandedMode();\n            }\n            return true;\n        }\n        return false;\n    }\n\n    #syncExpandedLayout() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!this.expanded || !cam) {\n            return;\n        }\n        const [width, height] = cam.getViewportSize();\n        const [camX, camY] = cam.localPosition();\n        this.setViewportBounds(width, height);\n        this.setLocalPosition([camX - width * 0.5, camY - height * 0.5, this.localPosition()[2]]);\n        this.#syncChromeLayout();\n    }\n\n    #moveToFullscreenScene() {\n        if (this.expanded) {\n            return;\n        }\n        this.#tableDragActive = false;\n        const scene = this.scene;\n        const stage = scene?.stage ?? null;\n        const parent = this.parentNode;\n        if (!parent) {\n            throw new Error('Viewport.#moveToFullscreenScene(): viewport must have a parent.');\n        }\n        if (!scene || !stage) {\n            throw new Error('Viewport.#moveToFullscreenScene(): source stage fullscreen scene is required.');\n        }\n        const fullscreenScene = stage.ensureFullscreenScene();\n        const targetParent = fullscreenScene.rootViewport ?? fullscreenScene.presentedRoot?.();\n        if (!targetParent) {\n            throw new Error('Viewport.#moveToFullscreenScene(): fullscreen scene root viewport is required.');\n        }\n        this.retireFullscreenOnLeave = false;\n        this.fullscreenRestore = {\n            parent,\n            localToParent: new Float32Array(this.localToParent()),\n            width: this.state.width,\n            height: this.state.height,\n            scene,\n            activeViewport: scene.activeViewport ?? scene.rootViewport ?? null,\n            camera: stage.activeCamera ?? scene.presentationCamera?.() ?? scene.camera ?? null,\n        };\n        stage.remountNode(this, targetParent, { preserveWorld: false });\n        this.expanded = true;\n        fullscreenScene.setActiveViewport(this);\n        stage.setActiveScene(fullscreenScene);\n        if (fullscreenScene.camera) {\n            stage.setActiveCamera(fullscreenScene.camera);\n        }\n        pushFocusEntry(this, null);\n        this.#syncExpandedLayout();\n    }\n\n    leaveExpandedMode() {\n        if (!this.expanded) {\n            return;\n        }\n        this.#tableDragActive = false;\n        const restore = this.fullscreenRestore;\n        const tableview = this.#tableview();\n        const stage = this.scene?.stage ?? null;\n        const sourceScene = restore?.scene ?? null;\n        this.expanded = false;\n        this.fullscreenRestore = null;\n        this.ownFullscreenMount = null;\n        if (!sourceScene || !stage) {\n            throw new Error('Viewport.leaveExpandedMode(): missing restore scene.');\n        }\n        const restoreParentAttached = this.retireFullscreenOnLeave !== true\n            && restore?.parent?.scene === sourceScene;\n        const restoreTarget = restoreParentAttached\n            ? restore.parent\n            : sourceScene.rootViewport ?? sourceScene.presentedRoot?.();\n        if (!restoreTarget) {\n            throw new Error('Viewport.leaveExpandedMode(): source scene has no restore target.');\n        }\n        stage.remountNode(this, restoreTarget, { preserveWorld: false });\n        if (restoreParentAttached) {\n            this.setLocalToParent(restore.localToParent);\n            if (tableview?.isScreenshot && typeof tableview.preferredPreviewHeight === 'function') {\n                this.setViewportBounds(restore.width, tableview.preferredPreviewHeight(restore.height));\n                tableview.syncViewportLayout?.();\n            } else {\n                this.setViewportBounds(restore.width, restore.height);\n                syncViewportLayoutSubtree(this);\n            }\n        }\n        if (restore.activeViewport?.scene === sourceScene) {\n            sourceScene.setActiveViewport(restore.activeViewport);\n        }\n        if (restoreParentAttached) syncPreviewViewportHost(this.parentNode, this);\n        stage.setActiveScene(sourceScene);\n        if (restore.camera) {\n            stage.setActiveCamera(restore.camera);\n        } else if (sourceScene.camera) {\n            stage.setActiveCamera(sourceScene.camera);\n        }\n        if (currentFocusContainer() === this) {\n            popFocusEntry(this);\n        } else {\n            removeFocusEntry(this);\n        }\n        this.#syncChromeLayout();\n        // The document may have legitimately replaced the old inline host while\n        // fullscreen was open. In that case the current document projection owns\n        // the replacement preview, so retire this obsolete fullscreen viewport.\n        if (!restoreParentAttached && this.parentNode === restoreTarget) {\n            restoreTarget.removeChild(this);\n        }\n    }\n\n    /* Retire a fullscreen viewport whose original inline row is no longer authoritative. */\n    retireExpandedOnLeave(retire = true) {\n        if (!this.expanded || !this.fullscreenRestore) return false;\n        this.retireFullscreenOnLeave = retire === true;\n        return true;\n    }\n\n    testingCanvasPoint() {\n        const cam = this.scene?.camera;\n        if (!cam) {\n            return null;\n        }\n        const [vpWidth, vpHeight] = cam.getViewportSize();\n        const [x, y] = twgl.m4.getTranslation(this.localToWorld());\n        return {\n            x: x + vpWidth * 0.5,\n            y: y + vpHeight * 0.5,\n            width: this.state.width ?? null,\n            height: this.state.height ?? null,\n            interactive: this.expanded,\n        };\n    }\n\n    expand() {\n        const tableview = this.#tableview();\n        pushTestingTableviewTrace('viewport_expand_start', {\n            viewport_label: viewportTraceLabel(this),\n            expanded: !!this.expanded,\n            has_tableview: !!tableview,\n            table_line: tableview?.getLineOnPuffbook?.() ?? null,\n        });\n        this.#moveToFullscreenScene();\n        pushTestingTableviewTrace('viewport_expand_remounted', {\n            viewport_label: viewportTraceLabel(this),\n            expanded: !!this.expanded,\n            has_tableview: !!tableview,\n            table_line: tableview?.getLineOnPuffbook?.() ?? null,\n        });\n        if (!tableview) {\n            pushTestingTableviewTrace('viewport_expand_no_tableview', {\n                viewport_label: viewportTraceLabel(this),\n                expanded: !!this.expanded,\n            });\n            return;\n        }\n        tableview.inlineInputEnabled = true;\n        tableview.enterInteractiveMode?.();\n        tableview.resetViewportScroll?.();\n        tableview.syncViewportLayout?.();\n        pushTestingTableviewTrace('viewport_expand_done', {\n            viewport_label: viewportTraceLabel(this),\n            expanded: !!this.expanded,\n            table_line: tableview?.getLineOnPuffbook?.() ?? null,\n            interactive: !tableview?.isScreenshot,\n        });\n    }\n\n    setViewportBounds(width, height) {\n        if (!Number.isFinite(width) || width < 0 || !Number.isFinite(height) || height < 0) {\n            throw new Error(`Viewport.setViewportBounds(${width}, ${height}): width and height must be finite non-negative numbers.`);\n        }\n        this.mutate({ width, height });\n        this.#syncChromeLayout();\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const STACK_ORIENTATION = Object.freeze({ HORIZONTAL: 0, VERTICAL: 1 });\n\nconst ORIENTATION_INDEX = Object.freeze({\n    horizontal: 0, horiz: 0, h: 0, row: 0, rows: 0,\n    vertical: 1, vert: 1, v: 1, column: 1, columns: 1, col: 1,\n});\nconst ALIGN_INDEX = Object.freeze({\n    start: 0, begin: 0, left: 0, top: 0,\n    centre: 1, center: 1, middle: 1,\n    end: 2, right: 2, bottom: 2,\n});\n\nexport function normalizeStackOrientation(value, fallback = STACK_ORIENTATION.HORIZONTAL) {\n    if (value == null) return fallback;\n    if (typeof value === 'number' && Number.isFinite(value)) {\n        const index = Math.trunc(value);\n        return index === 0 || index === 1 ? index : fallback;\n    }\n    if (typeof value === 'string') {\n        const key = value.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n        if (key === '0' || key === '1') return Number.parseInt(key, 10);\n        return ORIENTATION_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\nexport function normalizeStackAlignment(value, fallback = 0) {\n    if (value == null) return fallback;\n    if (typeof value === 'number' && Number.isFinite(value)) {\n        const index = Math.trunc(value);\n        return index >= 0 && index <= 2 ? index : fallback;\n    }\n    if (typeof value === 'string') {\n        const key = value.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n        if (/^[012]$/.test(key)) return Number.parseInt(key, 10);\n        return ALIGN_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\nexport function normalizeStackSpacing(value, fallback = 0) {\n    if (value == null) return fallback;\n    const number = Number(value);\n    return Number.isFinite(number) ? Math.max(0, number) : fallback;\n}\n\nexport function resolveStackDimension(source, key) {\n    const direct = Number(source?.[key]);\n    if (Number.isFinite(direct) && direct > 0) return direct;\n    const stateValue = Number(source?.state?.[key]);\n    return Number.isFinite(stateValue) && stateValue > 0 ? stateValue : 0;\n}\n\nexport function measureStackChildren({\n    children = [], orientation = STACK_ORIENTATION.HORIZONTAL, spacing = 0,\n} = {}) {\n    const horizontal = orientation === STACK_ORIENTATION.HORIZONTAL;\n    const orderedChildren = Array.from(children);\n    const gap = normalizeStackSpacing(spacing, 0);\n    const widths = orderedChildren.map(child => resolveStackDimension(child, 'width'));\n    const heights = orderedChildren.map(child => resolveStackDimension(child, 'height'));\n    const mainExtents = horizontal ? widths : heights;\n    return {\n        width: horizontal\n            ? mainExtents.reduce((total, extent) => total + extent, 0)\n                + (orderedChildren.length > 1 ? gap * (orderedChildren.length - 1) : 0)\n            : Math.max(0, ...widths),\n        height: horizontal\n            ? Math.max(0, ...heights)\n            : mainExtents.reduce((total, extent) => total + extent, 0)\n                + (orderedChildren.length > 1 ? gap * (orderedChildren.length - 1) : 0),\n    };\n}\n\nfunction alignmentOffset(alignment, childExtent, availableExtent) {\n    if (!Number.isFinite(availableExtent) || availableExtent <= 0) return 0;\n    const slack = Math.max(0, availableExtent - Math.max(0, childExtent));\n    return alignment === 1 ? slack * 0.5 : alignment === 2 ? slack : 0;\n}\n\n/*\n * Lay out supplied children without making assumptions about their parent.\n * Positions are written immediately; callers decide whether to batch or defer this\n * operation. Dimensions are read from child.width/height, then child.state.\n */\nexport function layoutStackChildren({\n    children = [], orientation = STACK_ORIENTATION.HORIZONTAL, spacing = 0,\n    mainAlign = 0, crossAlign = 0, width = 0, height = 0, x = 0, y = 0,\n} = {}) {\n    const horizontal = orientation === STACK_ORIENTATION.HORIZONTAL;\n    const mainKey = horizontal ? 'width' : 'height';\n    const crossKey = horizontal ? 'height' : 'width';\n    const orderedChildren = Array.from(children);\n    const gap = normalizeStackSpacing(spacing, 0);\n    const extents = orderedChildren.map((child) => resolveStackDimension(child, mainKey));\n    const totalExtent = extents.reduce((total, extent) => total + extent, 0)\n        + (orderedChildren.length > 1 ? gap * (orderedChildren.length - 1) : 0);\n    const availableMain = horizontal ? width : height;\n    const availableCross = horizontal ? height : width;\n\n    let offset = (horizontal ? x : y) + alignmentOffset(mainAlign, totalExtent, availableMain);\n    for (let index = 0; index < orderedChildren.length; index += 1) {\n        const child = orderedChildren[index];\n        const crossOffset = (horizontal ? y : x)\n            + alignmentOffset(crossAlign, resolveStackDimension(child, crossKey), availableCross);\n        const current = child.localPosition?.() ?? [0, 0, 0];\n        const z = Array.isArray(current) || ArrayBuffer.isView(current) ? (current[2] ?? 0) : 0;\n        child.setLocalPosition(horizontal ? [offset, crossOffset, z] : [crossOffset, offset, z]);\n        offset += extents[index] + (index < orderedChildren.length - 1 ? gap : 0);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst ZERO_PADDING = Object.freeze({ top: 0, right: 0, bottom: 0, left: 0 });\n\nfunction finiteNonNegative(name, value) {\n    const number = Number(value);\n    if (!Number.isFinite(number) || number < 0) {\n        throw new Error(`${name} must be a finite non-negative number; got '${value}'.`);\n    }\n    return Object.is(number, -0) ? 0 : number;\n}\n\nexport function normalizePadding(value = 0) {\n    if (value == null) {\n        return ZERO_PADDING;\n    }\n    if (typeof value === 'number') {\n        const inset = finiteNonNegative('padding', value);\n        return Object.freeze({ top: inset, right: inset, bottom: inset, left: inset });\n    }\n    if (typeof value !== 'object' || Array.isArray(value)) {\n        throw new Error(`padding must be a non-negative number or edge object; got '${value}'.`);\n    }\n    return Object.freeze({\n        top: finiteNonNegative('padding.top', value.top ?? 0),\n        right: finiteNonNegative('padding.right', value.right ?? 0),\n        bottom: finiteNonNegative('padding.bottom', value.bottom ?? 0),\n        left: finiteNonNegative('padding.left', value.left ?? 0),\n    });\n}\n\nfunction resolveAxisPadding(start, end, containerExtent, requiredExtent) {\n    const requested = start + end;\n    if (requested <= 0) {\n        return [0, 0];\n    }\n    const extent = Number.isFinite(containerExtent) ? Math.max(0, containerExtent) : requiredExtent + requested;\n    const slack = Math.max(0, extent - Math.max(0, requiredExtent));\n    const scale = Math.min(1, slack / requested);\n    return [start * scale, end * scale];\n}\n\nexport function resolveAdaptivePadding({\n    width,\n    height,\n    requiredWidth = 0,\n    requiredHeight = 0,\n    padding = ZERO_PADDING,\n} = {}) {\n    const normalized = normalizePadding(padding);\n    const [left, right] = resolveAxisPadding(\n        normalized.left,\n        normalized.right,\n        width,\n        requiredWidth,\n    );\n    const [top, bottom] = resolveAxisPadding(\n        normalized.top,\n        normalized.bottom,\n        height,\n        requiredHeight,\n    );\n    const outerWidth = Number.isFinite(width) ? Math.max(0, width) : requiredWidth + left + right;\n    const outerHeight = Number.isFinite(height) ? Math.max(0, height) : requiredHeight + top + bottom;\n    return Object.freeze({\n        padding: Object.freeze({ top, right, bottom, left }),\n        x: left,\n        y: top,\n        width: Math.max(0, outerWidth - left - right),\n        height: Math.max(0, outerHeight - top - bottom),\n    });\n}\n\nexport function requestedContentRect({ width, height, padding = ZERO_PADDING } = {}) {\n    return resolveAdaptivePadding({ width, height, padding });\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { Placeholder } from './base.mjs';\nimport { ClickArea, InputMode } from './button.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport { Tile } from './tile.mjs';\nimport { Icon } from './icon.mjs';\nimport {\n    STACK_ORIENTATION,\n    layoutStackChildren,\n    measureStackChildren,\n    normalizeStackAlignment,\n    normalizeStackSpacing,\n} from './stack-layout.mjs';\nimport { normalizePadding, requestedContentRect, resolveAdaptivePadding } from './padding-layout.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nconst THUMB_MIN_HEIGHT = 30\nconst THUMB_WIDTH = 20\nconst CONTENT_Z = -0.3\nconst SCROLLBAR_Z = -0.1\nconst SCROLLBAR_HANDLE_Z = -0.5\nconst THUMB_ICON_SIZE = 14\n// Must sit above panel-wide wheel capture overlays while the visible tile keeps its existing depth.\nconst SCROLL_STRENGTH = 24\n// The wheel layer must remain pickable over empty scroll content, but never mask a row action.\nconst WHEEL_CAPTURE_PICKER_BEHIND_CONTENT = true\n\n/* Preserve modifier and wheel units while routing diagonal gestures independently. */\nexport function splitWheelAxes(events) {\n    return ['X', 'Y'].map(axis => {\n        const names = axis === 'X'\n            ? ['SCROLL_LEFT', 'SCROLL_RIGHT', 'SCROLL_LEFT_PIXEL', 'SCROLL_RIGHT_PIXEL']\n            : ['SCROLL_UP', 'SCROLL_DOWN', 'SCROLL_UP_PIXEL', 'SCROLL_DOWN_PIXEL'];\n        const wheel = new Set([...events].filter(event => event.endsWith('_KEY') || names.includes(event)));\n        wheel.wheelDeltaMode = events.wheelDeltaMode;\n        wheel.wheelDeltaX = axis === 'X' ? (events.wheelDeltaX ?? 0) : 0;\n        wheel.wheelDeltaY = axis === 'Y' ? (events.wheelDeltaY ?? 0) : 0;\n        return wheel;\n    });\n}\n\nfunction normalizeLayoutMode(value, fallback = false) {\n    if (value == null) {\n        return fallback;\n    }\n    if (value === true) {\n        return true;\n    }\n    if (value === false) {\n        return false;\n    }\n    if (typeof value === 'string') {\n        const mode = value.trim().toLowerCase();\n        if (['vertical', 'vbox', 'stack', 'auto'].includes(mode)) {\n            return true;\n        }\n        if (['manual', 'none', 'off'].includes(mode)) {\n            return false;\n        }\n    }\n    return fallback;\n}\n\n/*\n * Scroll hosted content vertically by default. axes: 'horizontal' or 'both'\n * enables horizontal overflow and reserves scrollbar space on the required axes.\n * The default layout is manual, preserving the\n * existing contract where callers assign each row position then call\n * syncContentLayout() after direct host changes. Set layout: 'vertical' (or\n * layout = 'vertical') to stack hosted rows automatically; spacing, mainAlign,\n * and crossAlign then use the same semantics as VBoxContainer. Scrollbar chrome is\n * not part of that layout.\n */\nexport class ScrollBox extends Placeholder {\n    #isInContext = false\n    #basePos = new WeakMap()\n    #contentHost = null\n    #viewportHost = null\n    #overlayHost = null\n    #backgroundTile = null\n    #wheelCapture = null\n    #usesExternalContentHost = false\n    #mouseSpace = 'world'\n    #autoLayout = false\n    #spacing = 0\n    #mainAlign = 0\n    #crossAlign = 0\n    #isThumbHeld = false\n    #thumbGrabOffset = 0\n    #heldAxis = 1\n    #renderedPos = new WeakMap()\n    #axes = 'vertical'\n    #fullContentRect = null\n    #thumbDragThink = null\n    #contentZ = CONTENT_Z\n    #scrollbarZ = SCROLLBAR_Z\n    #scrollbarHandleZ = SCROLLBAR_HANDLE_Z\n    #padding = normalizePadding(0)\n    #contentRect = Object.freeze({ x: 0, y: 0, width: 0, height: 0 })\n    \n    constructor(state){\n        super(state)\n        this.clipChildren = false;\n        this.#axes = state.axes ?? 'vertical';\n        if (!['vertical', 'horizontal', 'both'].includes(this.#axes)) {\n            throw new Error(`ScrollBox: axes must be vertical, horizontal or both; got '${this.#axes}'.`);\n        }\n        this.horizontalThumb = null;\n        this.horizontalThumbHandle = null;\n        this.horizontalThumbIcon = null;\n        this.contentPositionX = 0;\n        this.contentExtentWidth = 0;\n        this.#padding = normalizePadding(state.padding ?? 0);\n        this.state.padding = this.#padding;\n\n        this.thumb = null\n        this.thumbHandle = null\n        this.thumbIcon = null\n        this.onContentHoverEnter = state.onContentHoverEnter ?? (() => {});\n        this.onContentHoverExit = state.onContentHoverExit ?? (() => {});\n        this._thumbheight = THUMB_MIN_HEIGHT\n        this._height = state.height\n        this.enabled = true\n        this.inputMode = state.inputMode ?? InputMode.BLOCK\n        this.#mouseSpace = state.mouseSpace ?? 'world'\n        this.#contentZ = state.contentZ ?? CONTENT_Z\n        this.#scrollbarZ = state.scrollbarZ ?? SCROLLBAR_Z\n        this.#scrollbarHandleZ = state.scrollbarHandleZ ?? SCROLLBAR_HANDLE_Z\n        this.#autoLayout = normalizeLayoutMode(state.layout ?? state.autoLayout, false);\n        this.#spacing = normalizeStackSpacing(state.spacing, 0);\n        const align = state.align ?? state.alignment ?? state.mainAlign ?? state.mainAlignment;\n        const cross = state.crossAlign ?? state.crossAlignment ?? state.secondaryAlign ?? state.secondaryAlignment;\n        this.#mainAlign = normalizeStackAlignment(align, 0);\n        this.#crossAlign = normalizeStackAlignment(cross, 0);\n        \n        this.thumbWidth = THUMB_WIDTH\n\n        /*prototype*/\n        this.contentPosition = 0 // 0 is the top, bottom is contentHeight - state.height\n        this.contentHeight = 0\n        this.tolerance = 0\n        this.#build()\n        this.syncContentLayout()\n    }\n\n    /* Switch between caller-positioned rows ('manual') and immediate VBox-style layout ('vertical'). */\n    get layout() {\n        return this.#autoLayout ? 'vertical' : 'manual';\n    }\n\n    set layout(value) {\n        const next = normalizeLayoutMode(value, this.#autoLayout);\n        if (next !== this.#autoLayout) {\n            this.#autoLayout = next;\n            this.syncContentLayout();\n        }\n    }\n\n    get spacing() {\n        return this.#spacing;\n    }\n\n    set spacing(value) {\n        const next = normalizeStackSpacing(value, this.#spacing);\n        if (next !== this.#spacing) {\n            this.#spacing = next;\n            this.syncContentLayout();\n        }\n    }\n\n    get mainAlign() {\n        return this.#mainAlign;\n    }\n\n    set mainAlign(value) {\n        const next = normalizeStackAlignment(value, this.#mainAlign);\n        if (next !== this.#mainAlign) {\n            this.#mainAlign = next;\n            this.syncContentLayout();\n        }\n    }\n\n    get crossAlign() {\n        return this.#crossAlign;\n    }\n\n    get padding() {\n        return this.#padding;\n    }\n\n    set padding(value) {\n        this.#padding = normalizePadding(value);\n        this.state.padding = this.#padding;\n        this.syncContentLayout({ preserveBasePositions: true });\n    }\n\n    get contentRect() {\n        return this.#contentRect;\n    }\n\n    get contentWidth() {\n        return this.#contentRect.width;\n    }\n\n    get viewportHeight() {\n        return this.#contentRect.height;\n    }\n\n    get requestedContentRect() {\n        return requestedContentRect({\n            width: this.state.width,\n            height: this.state.height,\n            padding: this.#padding,\n        });\n    }\n\n    get requestedContentWidth() {\n        return this.requestedContentRect.width;\n    }\n\n    get overlayHost() {\n        return this.#overlayHost;\n    }\n\n    get backgroundTile() {\n        return this.#backgroundTile;\n    }\n\n    set crossAlign(value) {\n        const next = normalizeStackAlignment(value, this.#crossAlign);\n        if (next !== this.#crossAlign) {\n            this.#crossAlign = next;\n            this.syncContentLayout();\n        }\n    }\n\n    /* Resolve wheel focus lazily from the current pointer position rather than maintaining a frame-polled cache. */\n    #containsMouse() {\n        const local = this.#mouseSpace === 'view'\n            ? this.getLocalMouseViewPosition()\n            : this.getLocalMousePosition();\n        return local[0] >= this.#contentRect.x\n            && local[0] < this.#contentRect.x + this.#contentRect.width\n            && local[1] >= this.#contentRect.y\n            && local[1] < this.#contentRect.y + this.#contentRect.height;\n    }\n\n    #mouseInContext() {\n        for (let node = this; node; node = node.parentNode) {\n            if (node instanceof ScrollBox && !node.#containsMouse()) return false;\n        }\n        return true;\n    }\n\n    get contentHost() {\n        return this.#contentHost;\n    }\n\n    appendOverlayChild(child) {\n        if (!this.#overlayHost) {\n            throw new Error('ScrollBox.appendOverlayChild(child): overlay host is unavailable.');\n        }\n        this.#overlayHost.appendChild(child);\n        return child;\n    }\n\n    appendChild(child) {\n        if (!this.#contentHost) {\n            throw new Error('ScrollBox.appendChild(child): content host is unavailable.');\n        }\n        this.#contentHost.appendChild(child);\n        this.syncContentLayout({ preserveBasePositions: true });\n        return child;\n    }\n\n    removeChild(child) {\n        if (child?.parentNode === this.#contentHost) {\n            this.#contentHost.removeChild(child);\n            child.setCulled(false);\n            this.syncContentLayout({ preserveBasePositions: true });\n            return;\n        }\n        super.removeChild(child);\n    }\n\n    #destroy() {\n        this.#endThumbDrag();\n        this.#contentHost?.removeAllChildren();\n        this.#overlayHost?.removeAllChildren();\n        this.removeAllChildren();\n        this.#contentHost = null;\n        this.#viewportHost = null;\n        this.#overlayHost = null;\n        this.#backgroundTile = null;\n        this.#wheelCapture = null;\n        this.#usesExternalContentHost = false;\n        this.thumb = null;\n        this.thumbHandle = null;\n        this.thumbIcon = null;\n        this.horizontalThumb = this.horizontalThumbHandle = this.horizontalThumbIcon = null;\n        this.#basePos = new WeakMap();\n    }\n\n    /* Create the retained content and wheel-input layers used by the default API. */\n    #createOwnedLayers() {\n        if (this.state.material || this.state.color) {\n            this.#backgroundTile = new Tile({\n                tileBatch: this.state.backgroundTileBatch ?? 'scrollbox.background',\n                width: this.state.width,\n                height: this.state.height,\n                color: this.state.color,\n                ...(this.state.material ? { material: this.state.material } : {}),\n                z: this.state.backgroundZ ?? 0,\n            });\n        }\n        this.#viewportHost = new Placeholder({\n            width: this.state.width,\n            height: this.state.height,\n            clipChildren: true,\n        });\n        this.#contentHost = new Placeholder({\n            width: this.state.width,\n            height: this.state.height,\n            z: this.#contentZ,\n        });\n        this.#overlayHost = new Placeholder({\n            width: this.state.width,\n            height: this.state.height,\n            z: this.#contentZ,\n        });\n        this.#wheelCapture = new ClickArea({\n            width: this.state.width,\n            height: this.state.height,\n            z: -0.4,\n            pickerAlwaysBehind: WHEEL_CAPTURE_PICKER_BEHIND_CONTENT,\n        });\n        this.#wheelCapture.onPointerInput = (events) => this.onPointerInput(events);\n        this.#wheelCapture.onHoverEnter = () => this.onContentHoverEnter?.();\n        this.#wheelCapture.onHoverExit = () => this.onContentHoverExit?.();\n        if (this.#backgroundTile) {\n            super.appendChild(this.#backgroundTile);\n        }\n        this.#viewportHost.appendChild(this.#contentHost);\n        this.#viewportHost.appendChild(this.#overlayHost);\n        super.appendChild(this.#viewportHost);\n        super.appendChild(this.#wheelCapture);\n    }\n\n    /* Keep retained internal chrome sized to the ScrollBox body after relayout. */\n    #syncOwnedLayers() {\n        const children = this.#contentHost?.children ?? [];\n        let requiredWidth = 0;\n        let requiredHeight = 0;\n        for (const child of children) {\n            const width = this.#getNodeWidth(child);\n            const height = this.#getNodeHeight(child);\n            const position = this.#basePos.get(child) ?? child.localPosition();\n            requiredWidth = Math.max(\n                requiredWidth,\n                this.#autoLayout ? width : Math.max(0, position[0]) + width,\n            );\n            requiredHeight = Math.max(requiredHeight, height);\n        }\n        this.#fullContentRect = resolveAdaptivePadding({\n            width: this.state.width,\n            height: this.state.height,\n            requiredWidth,\n            requiredHeight,\n            padding: this.#padding,\n        });\n        this.#contentRect = this.#fullContentRect;\n        if (this.#axes !== 'vertical') {\n            // Resolve both bars together: reserving one can cause the other to overflow.\n            const stack = this.#autoLayout ? measureStackChildren({\n                children, orientation: STACK_ORIENTATION.VERTICAL, spacing: this.#spacing,\n            }) : null;\n            let extentWidth = stack?.width ?? 0;\n            let extentHeight = stack?.height ?? 0;\n            if (!stack) {\n                for (const child of children) {\n                    const pos = this.#basePos.get(child) ?? child.localPosition();\n                    extentWidth = Math.max(extentWidth, pos[0] + this.#getNodeWidth(child));\n                    extentHeight = Math.max(extentHeight, pos[1] + this.#getNodeHeight(child));\n                }\n            }\n            let horizontal = false;\n            let vertical = false;\n            for (let pass = 0; pass < 3; pass++) {\n                horizontal = extentWidth > this.#fullContentRect.width - (vertical ? THUMB_WIDTH : 0);\n                vertical = this.#axes === 'both'\n                    && extentHeight > this.#fullContentRect.height - (horizontal ? THUMB_WIDTH : 0);\n            }\n            this.#contentRect = Object.freeze({\n                ...this.#fullContentRect,\n                width: Math.max(0, this.#fullContentRect.width - (vertical ? THUMB_WIDTH : 0)),\n                height: Math.max(0, this.#fullContentRect.height - (horizontal ? THUMB_WIDTH : 0)),\n            });\n        }\n        this._height = this.#contentRect.height;\n\n        if (this.#viewportHost?.parentNode !== this) {\n            super.appendChild(this.#viewportHost);\n        }\n        if (this.#backgroundTile && this.#backgroundTile.parentNode !== this) {\n            super.insertChildBefore(this.#backgroundTile, this.#viewportHost);\n        }\n        if (!this.#usesExternalContentHost && this.#contentHost?.parentNode !== this.#viewportHost) {\n            this.#viewportHost?.appendChild(this.#contentHost);\n        }\n        if (this.#overlayHost?.parentNode !== this.#viewportHost) {\n            this.#viewportHost?.appendChild(this.#overlayHost);\n        }\n        if (this.#wheelCapture?.parentNode !== this) {\n            super.appendChild(this.#wheelCapture);\n        }\n        this.#viewportHost?.mutate({\n            width: this.#contentRect.width,\n            height: this.#contentRect.height,\n        });\n        this.#viewportHost?.setLocalPosition([\n            this.#contentRect.x,\n            this.#contentRect.y,\n            this.#viewportHost.localPosition()[2],\n        ]);\n        this.#backgroundTile?.mutate({\n            width: this.state.width,\n            height: this.state.height,\n        });\n        if (!this.#usesExternalContentHost) {\n            this.#contentHost?.mutate({\n                width: this.#contentRect.width,\n                height: this.#contentRect.height,\n            });\n        }\n        this.#overlayHost?.mutate({\n            width: this.#contentRect.width,\n            height: this.#contentRect.height,\n        });\n        this.#wheelCapture?.mutate({\n            width: this.#contentRect.width,\n            height: this.#contentRect.height,\n        });\n        this.#wheelCapture?.setLocalPosition([\n            this.#contentRect.x,\n            this.#contentRect.y,\n            this.#wheelCapture.localPosition()[2],\n        ]);\n    }\n\n    #thumbForAxis(axis) {\n        return axis === 0 ? this.horizontalThumb : this.thumb;\n    }\n\n    #handleForAxis(axis) {\n        return axis === 0 ? this.horizontalThumbHandle : this.thumbHandle;\n    }\n\n    #viewportExtent(axis) {\n        return axis === 0 ? this.#contentRect.width : this.#contentRect.height;\n    }\n\n    #scrollExtent(axis) {\n        if ((axis === 0 && this.#axes === 'vertical') || (axis === 1 && this.#axes === 'horizontal')) return 0;\n        const extent = axis === 0 ? this.contentExtentWidth : this.contentHeight;\n        return Math.max(0, extent - this.#viewportExtent(axis));\n    }\n\n    #position(axis) {\n        return axis === 0 ? this.contentPositionX : this.contentPosition;\n    }\n\n    #syncThumb(axis) {\n        const size = this.#viewportExtent(axis);\n        const extent = this.#scrollExtent(axis);\n        let thumb = this.#thumbForAxis(axis);\n        let handle = this.#handleForAxis(axis);\n        if (size <= 0 || extent <= 0) {\n            if (this.#isThumbHeld && this.#heldAxis === axis) this.#endThumbDrag();\n            if (thumb?.parentNode === this) super.removeChild(thumb);\n            if (handle?.parentNode === this) super.removeChild(handle);\n            if (axis === 0) {\n                this.horizontalThumb = this.horizontalThumbHandle = this.horizontalThumbIcon = null;\n            } else {\n                this.thumb = this.thumbHandle = this.thumbIcon = null;\n            }\n            return;\n        }\n        const minimum = size <= THUMB_MIN_HEIGHT ? size * 0.5 : THUMB_MIN_HEIGHT;\n        const length = Math.min(size, Math.max(minimum, size * size / (size + extent)));\n        const thickness = Math.min(THUMB_WIDTH, axis === 0 ? this.#fullContentRect.height : this.#fullContentRect.width);\n        const geometry = axis === 0 ? { width: length, height: thickness } : { width: thickness, height: length };\n        if (axis === 1) this._thumbheight = length;\n        if (!thumb) {\n            thumb = new Tile({ ...geometry, z: this.#scrollbarZ });\n            handle = new ClickArea({ ...geometry, z: this.#scrollbarHandleZ });\n            handle.onInput = event => this.#onThumbInput(event, axis);\n            const icon = new Icon({ iconID: 32, color: Palette.white, z: -0.15 });\n            thumb.appendChild(icon);\n            if (axis === 0) {\n                this.horizontalThumb = thumb;\n                this.horizontalThumbHandle = handle;\n                this.horizontalThumbIcon = icon;\n            } else {\n                this.thumb = thumb;\n                this.thumbHandle = handle;\n                this.thumbIcon = icon;\n            }\n        }\n        thumb.mutate(geometry);\n        handle.mutate(geometry);\n        const icon = axis === 0 ? this.horizontalThumbIcon : this.thumbIcon;\n        if (icon.parentNode !== thumb) thumb.appendChild(icon);\n        const iconSize = Math.min(THUMB_ICON_SIZE, length, thickness);\n        icon.mutate({ width: iconSize, height: iconSize });\n        if (axis === 0) {\n            // Rotate around the grip's centre while retaining its centred bounds.\n            icon.setLocalToParent(twgl.m4.multiply(\n                twgl.m4.translation([(geometry.width + iconSize) * 0.5, (geometry.height - iconSize) * 0.5, -0.15]),\n                twgl.m4.rotationZ(Math.PI * 0.5),\n            ));\n        } else {\n            icon.setLocalPosition([(geometry.width - iconSize) * 0.5, (geometry.height - iconSize) * 0.5, -0.15]);\n        }\n        if (thumb.parentNode !== this) super.appendChild(thumb);\n        if (handle.parentNode !== this) super.appendChild(handle);\n        this.#positionThumb(axis);\n    }\n\n    #positionThumb(axis) {\n        const thumb = this.#thumbForAxis(axis);\n        if (!thumb) return;\n        const length = axis === 0 ? thumb.state.width : thumb.state.height;\n        const start = axis === 0 ? this.#contentRect.x : this.#contentRect.y;\n        const travel = Math.max(0, this.#viewportExtent(axis) - length);\n        const offset = this.#scrollExtent(axis) > 0 ? this.#position(axis) / this.#scrollExtent(axis) * travel : 0;\n        const x = axis === 0 ? start + offset\n            : this.#contentRect.x + Math.max(0, this.#contentRect.width - (this.#axes === 'vertical' ? THUMB_WIDTH : 0));\n        const y = axis === 1 ? start + offset : this.#contentRect.y + this.#contentRect.height;\n        thumb.setLocalPosition([x, y, thumb.localPosition()[2]]);\n        const handle = this.#handleForAxis(axis);\n        handle.setLocalPosition([x, y, handle.localPosition()[2]]);\n    }\n\n    #build() {\n        this.#destroy();\n        this.#createOwnedLayers();\n    }\n\n    /* Reconcile retained geometry without remounting content or losing either scroll offset. */\n    syncContentLayout({ preserveBasePositions = false } = {}) {\n        for (const child of this.#contentHost?.children ?? []) {\n            const current = Array.from(child.localPosition());\n            const rendered = this.#renderedPos.get(child);\n            const unchanged = rendered && current.every((value, index) => value === rendered[index]);\n            if (!this.#basePos.has(child) || !preserveBasePositions && !unchanged) {\n                this.#basePos.set(child, current);\n            }\n        }\n        this.#syncOwnedLayers();\n        this.#layoutHostedChildren();\n        this.contentHeight = 0;\n        this.contentExtentWidth = 0;\n        this.tolerance = 0;\n        for (const child of this.#contentHost?.children ?? []) {\n            if (this.#autoLayout) this.#basePos.set(child, Array.from(child.localPosition()));\n            const basePos = this.#basePos.get(child);\n            this.contentHeight = Math.max(basePos[1] + this.#getNodeHeight(child), this.contentHeight);\n            this.contentExtentWidth = Math.max(basePos[0] + this.#getNodeWidth(child), this.contentExtentWidth);\n        }\n        this.contentPosition = Math.max(0, Math.min(this.contentPosition, this.#scrollExtent(1)));\n        this.contentPositionX = Math.max(0, Math.min(this.contentPositionX, this.#scrollExtent(0)));\n        this.#syncThumb(0);\n        this.#syncThumb(1);\n        this.#updateNodes();\n    }\n\n    /* Scroll layout is synchronous so extent and culling always use fresh row positions. */\n    #layoutHostedChildren() {\n        if (!this.#autoLayout) {\n            return;\n        }\n        layoutStackChildren({\n            children: this.#contentHost?.children ?? [],\n            orientation: STACK_ORIENTATION.VERTICAL,\n            spacing: this.#spacing,\n            mainAlign: this.#mainAlign,\n            crossAlign: this.#crossAlign,\n            width: this.#contentRect.width,\n            height: this.#contentRect.height,\n            x: 0,\n            y: 0,\n        });\n    }\n\n    /* Public content-coordinate scrolling also supports revealing focused controls. */\n    scrollTo(x, y) {\n        if (![x, y].every(Number.isFinite)) throw new Error('ScrollBox.scrollTo: offsets must be finite.');\n        const nextX = Math.max(0, Math.min(x, this.#scrollExtent(0)));\n        const nextY = Math.max(0, Math.min(y, this.#scrollExtent(1)));\n        if (nextX === this.contentPositionX && nextY === this.contentPosition) return false;\n        this.contentPositionX = nextX;\n        this.contentPosition = nextY;\n        this.#positionThumb(0);\n        this.#positionThumb(1);\n        this.#updateNodes();\n        requestFrame('scrollbox_scroll');\n        return true;\n    }\n\n    scrollIntoView(node) {\n        return this.revealFocusTarget(node);\n    }\n\n    #setThumbPosition(position, axis) {\n        const thumb = this.#thumbForAxis(axis);\n        if (!thumb) return false;\n        const start = axis === 0 ? this.#contentRect.x : this.#contentRect.y;\n        const length = axis === 0 ? thumb.state.width : thumb.state.height;\n        const travel = Math.max(0, this.#viewportExtent(axis) - length);\n        const progress = travel > 0 ? Math.max(0, Math.min(1, (position - start) / travel)) : 0;\n        const next = this.#scrollExtent(axis) * progress;\n        return this.scrollTo(axis === 0 ? next : this.contentPositionX, axis === 1 ? next : this.contentPosition);\n    }\n\n    #thumbMousePosition(axis) {\n        const local = this.#mouseSpace === 'view'\n            ? this.getLocalMouseViewPosition()\n            : this.getLocalMousePosition();\n        return local[axis];\n    }\n\n    #onThumbInput(event, axis) {\n        if (event === 'L_MOUSE_DOWN') {\n            this.#beginThumbDrag(axis);\n            return true;\n        }\n        return this.#consumeThumbDragInput(new Set([event]));\n    }\n\n    #consumeThumbDragInput(events) {\n        if (!this.#isThumbHeld) return false;\n        let consumed = false;\n        for (const event of events) {\n            if (event === 'L_MOUSE_DOWN_HOLD') {\n                this.#updateThumbDrag();\n                consumed = true;\n            } else if (event === 'L_MOUSE_UP') {\n                this.#endThumbDrag();\n                consumed = true;\n            }\n        }\n        return consumed;\n    }\n\n    #beginThumbDrag(axis) {\n        const thumb = this.#thumbForAxis(axis);\n        if (!thumb) return;\n        this.#heldAxis = axis;\n        const length = axis === 0 ? thumb.state.width : thumb.state.height;\n        this.#thumbGrabOffset = Math.max(0, Math.min(length, this.#thumbMousePosition(axis) - thumb.localPosition()[axis]));\n        this.#isThumbHeld = true;\n        if (this.scene) {\n            this.scene.dragCapture = 'scrollbox';\n            this.scene.pointerCaptureOwner = this;\n        }\n        this.#scheduleThumbDragThink();\n    }\n\n    #updateThumbDrag() {\n        if (this.#isThumbHeld) {\n            this.#setThumbPosition(this.#thumbMousePosition(this.#heldAxis) - this.#thumbGrabOffset, this.#heldAxis);\n        }\n    }\n\n    #clearThumbDragThink() {\n        if (this.#thumbDragThink !== null) {\n            this.cancelThinkAt(this.#thumbDragThink);\n            this.#thumbDragThink = null;\n        }\n    }\n\n    #scheduleThumbDragThink() {\n        this.#clearThumbDragThink();\n        if (!this.#isThumbHeld || !this.scene) {\n            return;\n        }\n        this.#thumbDragThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), () => {\n            this.#thumbDragThink = null;\n            if (!this.#isThumbHeld) {\n                return;\n            }\n            // The release may be routed to another node once the pointer leaves\n            // the handle, so use global button state as the authoritative end signal.\n            if (!Mouse.leftDown) {\n                this.#endThumbDrag();\n                return;\n            }\n            this.#updateThumbDrag();\n            this.#scheduleThumbDragThink();\n        });\n    }\n\n    #endThumbDrag() {\n        this.#isThumbHeld = false;\n        this.#thumbGrabOffset = 0;\n        this.#clearThumbDragThink();\n        if (this.scene?.pointerCaptureOwner === this) {\n            this.scene.pointerCaptureOwner = null;\n            if (this.scene.dragCapture === 'scrollbox') this.scene.dragCapture = null;\n        }\n    }\n\n    #getNodeHeight(node) {\n        if (!node) {\n            return 0;\n        }\n        if (typeof node.height === 'function') {\n            return node.height();\n        }\n        if (typeof node.height === 'number') {\n            return node.height;\n        }\n        if (typeof node.state?.height === 'number') {\n            return node.state.height;\n        }\n        return 0;\n    }\n\n    #getNodeWidth(node) {\n        if (!node) {\n            return 0;\n        }\n        if (typeof node.width === 'function') {\n            return node.width();\n        }\n        if (typeof node.width === 'number') {\n            return node.width;\n        }\n        if (typeof node.state?.width === 'number') {\n            return node.state.width;\n        }\n        return 0;\n    }\n\n    #updateNodes() {\n        const fits = this.contentHeight <= this.#contentRect.height\n\n        for (const node of this.#contentHost?.children ?? []) {\n            const basePos = this.#basePos.get(node) ?? node.localPosition();\n            const nextX = basePos[0] - this.contentPositionX;\n            const nextY = basePos[1] - this.contentPosition;\n            const pos = node.localPosition();\n            if (pos[0] !== nextX || pos[1] !== nextY || pos[2] !== basePos[2]) {\n                node.setLocalPosition(nextX, nextY, basePos[2]);\n            }\n\n            this.#renderedPos.set(node, Array.from(node.localPosition()));\n            if (this.#axes !== 'vertical') continue;\n            const height = this.#getNodeHeight(node);\n            if (!height) {\n                continue;\n            }\n\n            // Content visibility is derived from viewport inclusion: a child is\n            // visible iff either everything fits, or its translated row box\n            // overlaps the scroll box body.\n            if (fits) {\n                this.uncull(node);\n                continue;\n            }\n\n            if (nextY + height <= 0 || nextY >= this.#contentRect.height) {\n                this.cull(node);\n            } else {\n                this.uncull(node);\n            }\n        }\n    }\n\n    cull(node) {\n        node.setCulled(true);\n    }\n\n    uncull(node) {\n        node.setCulled(false);\n    }\n\n    /* Resolve only the requested target's geometry, including nested transforms. */\n    revealFocusTarget(target) {\n        let hosted = target;\n        while (hosted && hosted.parentNode !== this.#contentHost) hosted = hosted.parentNode;\n        if (!hosted) return false;\n        // Compose live local transforms; cached world matrices may precede the\n        // inner ScrollBox's reveal during this same synchronous navigation.\n        let matrix = twgl.m4.identity();\n        for (let node = target; node !== this.#contentHost; node = node.parentNode) {\n            matrix = twgl.m4.multiply(node.localToParent(), matrix);\n        }\n        const width = typeof target.width === 'number' ? target.width : target.state.width;\n        const height = typeof target.height === 'number' ? target.height : target.state.height;\n        const corners = [[0, 0, 0], [width, 0, 0], [0, height, 0], [width, height, 0]]\n            .map(point => twgl.m4.transformPoint(matrix, point));\n        const min = [0, 1].map(axis => Math.min(...corners.map(point => point[axis])));\n        const max = [0, 1].map(axis => Math.max(...corners.map(point => point[axis])));\n        const positions = [];\n        for (const axis of [0, 1]) {\n            const extent = this.#viewportExtent(axis);\n            const delta = min[axis] < 0 ? min[axis]\n                : max[axis] > extent ? Math.min(min[axis], max[axis] - extent) : 0;\n            const position = Math.max(0, Math.min(this.#scrollExtent(axis), this.#position(axis) + delta));\n            positions[axis] = position;\n        }\n        return this.scrollTo(positions[0], positions[1]);\n    }\n    \n    onPointerInput(events) {\n        if (this.#consumeThumbDragInput(events)) {\n            return true;\n        }\n        this.#isInContext = this.#mouseInContext();\n        if (!this.#isInContext || !this.enabled || this.computedVisible === false) {\n            return false;\n        }\n        let eventConsumed = false;\n        for (const wheel of splitWheelAxes(events)) {\n            for (let node = this; node; node = node.parentNode) {\n                if (node instanceof ScrollBox && node.enabled && node.computedVisible !== false\n                    && node.#mouseInContext() && node.consumeWheelInput(wheel)) {\n                    eventConsumed = true;\n                    break;\n                }\n            }\n        }\n\n        if (this.inputMode === InputMode.PASS) {\n            return false;\n        } else {\n            return eventConsumed;\n        }\n    }\n\n    /* Return false at an edge so an enclosing scroll container can consume that movement. */\n    consumeWheelInput(events, { force = false } = {}) {\n        if (!force && shouldYieldWheelToCamera(events)) return false;\n        const verticalAxis = events.has('ALT_KEY') ? 0 : 1;\n        let consumed = false;\n        for (const event of events) {\n            if (this.onInput(event) === true) consumed = true;\n            else if (event === 'SCROLL_UP') consumed = this.#scroll(-1, verticalAxis) || consumed;\n            else if (event === 'SCROLL_DOWN') consumed = this.#scroll(1, verticalAxis) || consumed;\n            else if (event === 'SCROLL_LEFT') consumed = this.#scroll(-1, 0) || consumed;\n            else if (event === 'SCROLL_RIGHT') consumed = this.#scroll(1, 0) || consumed;\n        }\n        const pixelDeltaMode = globalThis.WheelEvent?.DOM_DELTA_PIXEL ?? 0;\n        if (events.wheelDeltaMode === pixelDeltaMode) {\n            const x = events.wheelDeltaX ?? 0;\n            const y = events.wheelDeltaY ?? 0;\n            if (Number.isFinite(x) && x !== 0) consumed = this.#scroll(Math.tanh(x / 52), 0) || consumed;\n            if (Number.isFinite(y) && y !== 0) consumed = this.#scroll(Math.tanh(y / 52), verticalAxis) || consumed;\n        }\n        return consumed;\n    }\n\n    #scroll(direction, axis) {\n        const thumb = this.#thumbForAxis(axis);\n        if (!thumb) return false;\n        return this.#setThumbPosition(thumb.localPosition()[axis] + direction * SCROLL_STRENGTH, axis);\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.#endThumbDrag();\n        super._onBeforeDetachNode(shared);\n    }\n\n    _onReleaseNode(gl, shared, visited) {\n        this.#endThumbDrag();\n        super._onReleaseNode(gl, shared, visited);\n    }\n\n    onInput(event){\n        return false\n    }\n\n    /*\n     * Legacy escape hatch for callers with a separately rendered content layer.\n     * New callers should append directly to this ScrollBox.\n     */\n    attachContentHost(host) {\n        if (!host) {\n            throw new Error('ScrollBox.attachContentHost(host): host is required.');\n        }\n        if (host === this.#contentHost) {\n            return;\n        }\n        if (this.#usesExternalContentHost) {\n            throw new Error('ScrollBox.attachContentHost(host): content host already attached.');\n        }\n        if ((this.#contentHost?.children.length ?? 0) > 0) {\n            throw new Error('ScrollBox.attachContentHost(host): cannot replace the owned host after content was added.');\n        }\n        if (this.#contentHost?.parentNode === this.#viewportHost) {\n            this.#viewportHost.removeChild(this.#contentHost);\n        }\n        this.#contentHost = host;\n        this.#usesExternalContentHost = true;\n        this.syncContentLayout();\n    }\n\n    /* Refresh the thumb and culling state after width/height relayout without discarding the existing hosted content. */\n    mutate(newState) {\n        const patch = Object.hasOwn(newState, 'padding')\n            ? { ...newState, padding: normalizePadding(newState.padding) }\n            : newState;\n        super.mutate(patch);\n        if (Object.hasOwn(patch, 'padding')) {\n            this.#padding = patch.padding;\n        }\n        this.syncContentLayout({ preserveBasePositions: true });\n    }\n\n    setEnabled(state) {\n        this.enabled = state;\n        if (!state) {\n            this.#endThumbDrag();\n        }\n    }\n\n    setVisibility(state) {\n        if (this.visible === state) {\n            return;\n        }\n        this.visible = state;\n        // ScrollBox visibility is the gate for both the thumb and all hosted\n        // content. When the box is hidden, every hosted node is culled\n        // immediately; when shown, node visibility is recomputed from the\n        // viewport-overlap predicate in #updateNodes().\n        for (const chrome of [this.thumb, this.thumbHandle, this.horizontalThumb, this.horizontalThumbHandle]) {\n            chrome?.setVisibility(state);\n        }\n        if (state === false) {\n            this.#endThumbDrag();\n            if (this.#axes === 'vertical') {\n                for (const node of this.#contentHost?.children ?? []) this.cull(node);\n            }\n            return;\n        }\n        this.#updateNodes();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as twgl from 'twgl';\nimport { ScrollBox, splitWheelAxes } from './scroll-box.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport {\n    currentFocusContainer,\n    focusThis,\n    pushFocusEntry,\n    removeFocusEntry,\n    replaceTopFocusEntry,\n    currentFocusTarget,\n    focusNavigationControls,\n    focusControl,\n} from './focus-manager.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { shouldYieldWheelToCamera } from '../input-pick-policy.mjs';\n\n\n/* A lease stays in the source subtree while its window lives in the HUD. */\nclass WindowSourceLease extends ui.Placeholder {\n    _onBeforeDetachNode(shared) {\n        const window = this.window;\n        if (window) {\n            this.window = null;\n            window.sourceLease = null;\n            window.closeFocusContainer();\n        }\n        super._onBeforeDetachNode(shared);\n    }\n}\n\nconst HEADER_STYLE_KEYS = new Set([\n    'color', 'shape', 'material', 'outlineEnabled', 'outlineColor',\n    'outlineWidth', 'outlineAlignment', 'outlineMaterial',\n]);\n\n/* Fit one header title to the available dialog chrome width instead of letting it overlap the close button. */\nfunction truncateWindowTitle(font, fontSize, text, maxWidth) {\n    const raw = `${text ?? ''}`;\n    if (raw === '') {\n        return raw;\n    }\n    const measure = (value) => evilfont.MSDFText.measureFromState({\n        font,\n        fontSize,\n        text: value,\n    }).width;\n    if (measure(raw) <= maxWidth) {\n        return raw;\n    }\n    const ellipsis = '...';\n    if (measure(ellipsis) > maxWidth) {\n        return '';\n    }\n    let lo = 0;\n    let hi = raw.length;\n    while (lo < hi) {\n        const mid = Math.floor((lo + hi + 1) / 2);\n        const candidate = `${raw.slice(0, mid)}${ellipsis}`;\n        if (measure(candidate) <= maxWidth) {\n            lo = mid;\n        } else {\n            hi = mid - 1;\n        }\n    }\n    return `${raw.slice(0, lo)}${ellipsis}`;\n}\n\n/*\n * panel is an unparented Node with build(window), called once while detached.\n * It owns its controls and positive content width/height in local coordinates.\n * After changing those dimensions, call window.requestLayout(); chrome and\n * placement remain shell-owned. The retained body scrolls on both axes when the\n * preferred size exceeds half the presentation viewport's width or height.\n * Optional panel.headerStyle overrides the\n * default header appearance using HEADER_STYLE_KEYS, never its controls.\n */\nexport class UIWindow extends ui.Tile {\n    static HEADER_HEIGHT = 22\n    focusContainerKind = 'DialogWindow'\n    modal = true\n\n    static mount(parent, state) {\n        const keyboardOpened = currentFocusTarget()?.focusVisible === true;\n        const sourceMount = state.mountParent ?? parent;\n        const stage = parent.scene?.stage ?? sourceMount.scene?.stage ?? null;\n        const mountParent = stage?.hudMountRoot?.('window') ?? sourceMount;\n        let windowState = state;\n        if (mountParent !== sourceMount) {\n            const placement = stage.projectNodePointToHud(sourceMount, [\n                state.x ?? 0,\n                state.y ?? 0,\n                state.z ?? 0,\n            ], mountParent);\n            if (placement) {\n                windowState = { ...state, x: placement[0], y: placement[1], z: 0 };\n            }\n        }\n        const mount = new ui.Placeholder({ name: 'windowMount' });\n        const win = new UIWindow(windowState);\n        win.keyboardOpened = keyboardOpened;\n        win.ownMount = mount;\n        mount.appendChild(win);\n        const lease = new WindowSourceLease({ name: 'windowSourceLease' });\n        lease.window = win;\n        win.sourceLease = lease;\n        parent.appendChild(lease);\n        mountParent.appendChild(mount);\n        requestFrame('window_open');\n        return win;\n    }\n\n    constructor({ panel, padding = 0, ...state }) {\n        if (!(panel instanceof ui.Node) || typeof panel.build !== 'function' || panel.parentNode || panel.scene) {\n            throw new Error('UIWindow(...): panel must be an unparented, detached Node with build(window).');\n        }\n        if (!Number.isFinite(padding) || padding < 0) {\n            throw new Error('UIWindow(...): padding must be a non-negative finite number.');\n        }\n        for (const key of Object.keys(panel.headerStyle ?? {})) {\n            if (!HEADER_STYLE_KEYS.has(key)) {\n                throw new Error(`UIWindow(...): unsupported panel.headerStyle field '${key}'. Header overrides are styling only.`);\n            }\n        }\n        super({ ...state, color: state.color ?? [0.2549, 0.2549, 0.2549, 1.0], z: 0 });\n        this.panel = panel;\n        this.padding = padding;\n        this.closed = false;\n        this.sourceLease = null;\n        this.initialPositionApplied = false;\n        this.backColor = this.state.color\n        /* UIWindow retains full layout bounds, while its visible backing starts below the header. */\n        this.color = [this.backColor[0], this.backColor[1], this.backColor[2], 0]\n        this.isHeld = false\n        this.dragOffset = [0, 0]\n        this.modal = state.modal !== false\n        this.windowId = state.windowId ?? null;\n        this.ownerWindow = state.ownerWindow ?? null;\n        this.ownerWindowId = state.ownerWindowId ?? null;\n        this.workspaceId = state.workspaceId ?? \"default\";\n        this.windowManager = null;\n        this.headerTile = null\n        this.titleLabel = null\n        this.dragHandle = null\n        this.bodyInputBlocker = null\n        this.backTile = null\n        this.dropShadow = null\n        this.ownMount = null\n        this.ownDragThink = null\n        this.fieldInputs = new Map()\n        this.focusedFieldKey = null\n        this.onClose = typeof state.onClose === 'function' ? state.onClose : null;\n        this.anchorPositioned = state.anchorPositioned !== false\n        this.anchor = state.anchor ?? 'top_left'\n        this.anchorPoint = this.anchorPositioned && this.anchor === 'center'\n            ? [state.x ?? 0, state.y ?? 0]\n            : null\n\n        this.bodyScroll = new ScrollBox({\n            name: 'windowBodyScroll', width: 0, height: 0, axes: 'both',\n            contentZ: -0.1, scrollbarZ: -0.1, scrollbarHandleZ: -0.5,\n        });\n        this.panelHost = new ui.Placeholder({ name: 'windowPanelHost', width: 0, height: 0 });\n        this.bodyScroll.appendChild(this.panelHost);\n        this.appendChild(this.bodyScroll);\n        this.panelHost.appendChild(panel);\n        panel.build(this);\n        this.requestLayout();\n    }\n\n    get headerHeight() {\n        return Math.min(UIWindow.HEADER_HEIGHT, this.state.height);\n    }\n\n    closeButton = null\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        const manager = this.scene?.stage?.windowManager ?? null;\n        if (manager) {\n            manager.register(this);\n        } else {\n            this.scene?.registerWindow?.(this);\n        }\n\n        if (!this.headerTile) {\n            this.#buildChrome();\n        }\n        this.requestLayout();\n        if (!this.initialPositionApplied) {\n            this.#syncAnchorPosition();\n            this.#clampHeaderToHudViewport();\n            this.initialPositionApplied = true;\n        }\n        if (this.modal) {\n            pushFocusEntry(this, this.currentFocusedInputCell() ?? null);\n            if (!this.currentFocusedInputCell()) {\n                const initial = this.initialFocusControl\n                    ?? focusNavigationControls(this.scene.stage).find(control => {\n                        for (let node = control.parentNode; node; node = node.parentNode) {\n                            if (node === this) return true;\n                        }\n                        return false;\n                    });\n                if (initial) focusControl(initial, { keyboard: this.keyboardOpened });\n            }\n        }\n    }\n\n    #notifyClose() {\n        const onClose = this.onClose;\n        this.onClose = null;\n        onClose?.();\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.closed = true;\n        this.#releaseSourceLease();\n        this.#endDrag();\n        super._onBeforeDetachNode(shared);\n    }\n\n    #releaseSourceLease() {\n        const lease = this.sourceLease;\n        if (lease) {\n            this.sourceLease = null;\n            lease.window = null;\n            lease.parentNode?.removeChild(lease);\n        }\n    }\n\n    _onDetachNode(shared) {\n        this.#notifyClose();\n        const manager = this.windowManager ?? this.scene?.stage?.windowManager ?? null;\n        if (manager) {\n            manager.unregister(this);\n        } else {\n            this.scene?.unregisterWindow?.(this);\n        }\n        this.#endDrag();\n        super._onDetachNode(shared);\n    }\n\n    onKeyDown(event) {\n        if (!this.modal || event.key !== 'Escape') {\n            return false;\n        }\n        this.closeFocusContainer();\n        return true;\n    }\n\n    /* Restore dialog focus from the live top-of-stack input cell rather than a parallel field snapshot. */\n    restoreFocusState(inputCell = this.currentFocusedInputCell()) {\n        const fieldKey = this.#fieldKeyForInputCell(inputCell);\n        if (fieldKey === null) {\n            this.focusedFieldKey = null;\n            return;\n        }\n        this.focusedFieldKey = fieldKey;\n        if (!inputCell.inFocus) {\n            inputCell.syncFocusVisual?.(true, 'dialog_restore');\n        }\n        this.#revealInput(inputCell);\n    }\n\n    #revealInput(inputCell) {\n        for (let node = inputCell.parentNode; node && node !== this; node = node.parentNode) {\n            if (node instanceof ScrollBox) node.scrollIntoView(inputCell);\n        }\n    }\n\n    onViewportResized(_gl) {\n        // Scene publishes its new dimensions before Stage finishes the resize traversal.\n        const dimensions = this.scene.viewportDimensions;\n        this.#layout(dimensions);\n        this.#clampHeaderToHudViewport(dimensions);\n        const input = this.currentFocusedInputCell();\n        if (input) this.#revealInput(input);\n    }\n\n    clearRenderedFocus() {\n        this.currentFocusedInputCell()?.syncFocusVisual?.(false, 'scene_hidden');\n    }\n\n    /* Resolve the dialog's active field to a currently attached input cell. */\n    currentFocusedInputCell() {\n        const fieldKey = this.#resolveFocusedFieldKey(this.focusedFieldKey);\n        if (fieldKey === null) {\n            return null;\n        }\n        this.focusedFieldKey = fieldKey;\n        return this.#inputFieldCell(fieldKey);\n    }\n\n    /* Register one semantic dialog field so the stack restores by field key rather than by remembered child object slot. */\n    registerInputField(fieldKey, inputCell) {\n        if (typeof fieldKey !== 'string' || fieldKey.length === 0) {\n            throw new Error('UIWindow.registerInputField(...): fieldKey must be a non-empty string.');\n        }\n        if (!inputCell) {\n            throw new Error(`UIWindow.registerInputField(${fieldKey}): inputCell is required.`);\n        }\n        for (const [otherKey, otherCell] of this.fieldInputs.entries()) {\n            if (otherKey !== fieldKey && otherCell === inputCell) {\n                this.fieldInputs.delete(otherKey);\n            }\n        }\n        const prev = this.fieldInputs.get(fieldKey) ?? null;\n        if (this.#ownsInputFieldCell(prev) && prev.inFocus && prev !== inputCell) {\n            prev.syncFocusVisual(false, 'focus_handoff');\n        }\n        inputCell.focusContainerOwner = this;\n        this.fieldInputs.set(fieldKey, inputCell);\n        if (this.focusedFieldKey === null || this.focusedFieldKey === fieldKey || this.#inputFieldCell(this.focusedFieldKey) === null) {\n            this.focusedFieldKey = fieldKey;\n        }\n        if (currentFocusContainer() === this) {\n            replaceTopFocusEntry(this, inputCell);\n            this.restoreFocusState(inputCell);\n        }\n        return inputCell;\n    }\n\n    /* Activate one registered dialog field by moving this window to the top of the focus stack and restoring that field's state there. */\n    activateInputCell(inputCell, clickedIndex = null) {\n        const fieldKey = this.#fieldKeyForInputCell(inputCell);\n        if (fieldKey === null) {\n            throw new Error('UIWindow.activateInputCell(...): inputCell must be registered on this dialog.');\n        }\n        const cell = this.#inputFieldCell(fieldKey);\n        if (!cell) {\n            throw new Error(`UIWindow.activateInputCell(...): field ${fieldKey} is not attached to this dialog.`);\n        }\n        this.focusedFieldKey = fieldKey;\n        const prevCol = cell.cursorIndex;\n        if (Number.isInteger(clickedIndex)) {\n            cell.cursorIndex = clickedIndex;\n        }\n        if (!focusThis(this, cell)) {\n            cell.cursorIndex = prevCol;\n            return false;\n        }\n        this.restoreFocusState(cell);\n        return true;\n    }\n\n\n    pullForward() {\n        const manager = this.windowManager ?? this.scene?.stage?.windowManager ?? null;\n        if (manager) {\n            manager.activate(this);\n        } else {\n            this.scene?.bringWindowToFront?.(this);\n        }\n        if (this.modal) {\n            focusThis(this, this.currentFocusedInputCell() ?? null);\n        }\n    }\n\n    /* Close this window and its owned descendants, letting the manager restore focus during detach. */\n    closeFocusContainer() {\n        if (this.closed) return;\n        this.closed = true;\n        this.#releaseSourceLease();\n        const manager = this.windowManager ?? this.scene?.stage?.windowManager ?? null;\n        if (manager) {\n            manager.closeWindow(this);\n        } else {\n            if (this.modal) {\n                removeFocusEntry(this);\n            }\n            const target = this.ownMount ?? this;\n            target.parentNode?.removeChild(target);\n        }\n        this.#notifyClose();\n        requestFrame('dialog_close');\n    }\n\n    #updateDragPosition() {\n        if (!this.isHeld) {\n            return;\n        }\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            return;\n        }\n        const [x, y] = this.scene?.worldToPresentationPoint\n            ? this.scene.worldToPresentationPoint(cam.getMouseWorldPosition())\n            : cam.getMouseWorldPosition();\n        const parentMatrix = this.parentNode ? this.parentNode.localToWorld() : twgl.m4.identity();\n        const inverseParentMatrix = twgl.m4.inverse(parentMatrix);\n        const localTransform = twgl.m4.transformPoint(inverseParentMatrix, [x, y, 0]);\n        const newLocalPos = [\n            localTransform[0] + (this.dragOffset ? this.dragOffset[0] : 0),\n            localTransform[1] + (this.dragOffset ? this.dragOffset[1] : 0),\n            this.localPosition()[2] // Keep Z as is\n        ];\n\n        this.setLocalPosition(newLocalPos);\n        this.#clampHeaderToHudViewport();\n    }\n\n    onPointerInput(events) {\n        const local = this.getLocalMousePosition();\n        const inTitlebar = local[0] >= 0\n            && local[0] < Math.max(0, this.state.width - Math.min(this.headerHeight, this.state.width))\n            && local[1] >= 0\n            && local[1] < this.headerHeight;\n        let eventConsumed = false;\n\n        for (const event of events) {\n            if (event === 'L_MOUSE_DOWN' && inTitlebar) {\n                this.#beginDrag();\n                eventConsumed = true;\n            } else if (event === 'L_MOUSE_DOWN_HOLD' && this.isHeld) {\n                this.scene.dragCapture = 'window';\n                eventConsumed = true;\n            } else if (event === 'L_MOUSE_UP'\n                && (this.isHeld || this.scene?.pointerCaptureOwner === this)) {\n                this.#endDrag();\n                eventConsumed = true;\n            }\n        }\n\n        return eventConsumed;\n    }\n\n    /* The modal body blocker wins picking over fallback wheel layers, so explicitly offer wheel frames to nested ScrollBoxes first. */\n    #forwardWheelToDescendantScrollBox(events) {\n        const hasWheel = [...events].some(event => event.startsWith('SCROLL_'))\n            || (events.wheelDeltaX ?? 0) !== 0 || (events.wheelDeltaY ?? 0) !== 0;\n        if (!hasWheel || shouldYieldWheelToCamera(events)) return false;\n        const candidates = [];\n        const visit = (node) => {\n            for (const child of node?.children ?? []) {\n                visit(child);\n            }\n            if (node !== this.bodyInputBlocker\n                && typeof node?.consumeWheelInput === 'function'\n                && typeof node?.onPointerInput === 'function') {\n                candidates.push(node);\n            }\n        };\n        visit(this);\n        // Route each physical wheel axis separately so an inner vertical list\n        // cannot swallow a simultaneous horizontal gesture intended for the shell.\n        let consumed = false;\n        for (const wheel of splitWheelAxes(events)) {\n            for (const scrollBox of candidates) {\n                if (scrollBox.onPointerInput(wheel) === true) {\n                    consumed = true;\n                    break;\n                }\n            }\n        }\n        return consumed;\n    }\n\n    /* Return one attached input cell for the requested semantic dialog field. */\n    #inputFieldCell(fieldKey) {\n        const cell = this.fieldInputs.get(fieldKey) ?? null;\n        return this.#ownsInputFieldCell(cell) ? cell : null;\n    }\n\n    /* Accept registered fields mounted anywhere within the dialog's panel tree. */\n    #ownsInputFieldCell(inputCell) {\n        let current = inputCell ?? null;\n        while (current) {\n            if (current === this) {\n                return true;\n            }\n            current = current.parentNode ?? null;\n        }\n        return false;\n    }\n\n    /* Find the semantic field key that currently owns one attached input cell. */\n    #fieldKeyForInputCell(inputCell) {\n        for (const [fieldKey, cell] of this.fieldInputs.entries()) {\n            if (cell === inputCell && this.#ownsInputFieldCell(cell)) {\n                return fieldKey;\n            }\n        }\n        return null;\n    }\n\n    /* Keep dialog focus recovery inside registered semantic fields only, with first attached field as the sole fallback. */\n    #resolveFocusedFieldKey(preferredFieldKey) {\n        if (typeof preferredFieldKey === 'string' && this.#inputFieldCell(preferredFieldKey)) {\n            return preferredFieldKey;\n        }\n        for (const [fieldKey] of this.fieldInputs.entries()) {\n            if (this.#inputFieldCell(fieldKey)) {\n                return fieldKey;\n            }\n        }\n        return null;\n    }\n\n    #beginDrag() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            return;\n        }\n        const [mouseX, mouseY] = this.scene?.worldToPresentationPoint\n            ? this.scene.worldToPresentationPoint(cam.getMouseWorldPosition())\n            : cam.getMouseWorldPosition();\n        const parentMatrix = this.parentNode ? this.parentNode.localToWorld() : twgl.m4.identity();\n        const inverseParentMatrix = twgl.m4.inverse(parentMatrix);\n        const mouseLocalPos = twgl.m4.transformPoint(inverseParentMatrix, [mouseX, mouseY, this.localPosition()[2]]);\n        const currentPos = this.localPosition();\n        this.dragOffset = [\n            currentPos[0] - mouseLocalPos[0],\n            currentPos[1] - mouseLocalPos[1],\n        ];\n        this.isHeld = true;\n        this.#scheduleDragThink();\n        this.scene.pointerCaptureOwner = this;\n        this.scene.dragCapture = 'window';\n        this.pullForward();\n    }\n\n    /* Release every ownership marker for this drag, including when the pointer has left the title bar. */\n    #endDrag() {\n        this.isHeld = false;\n        this.#clearDragThink();\n        if (this.scene?.pointerCaptureOwner === this) {\n            this.scene.pointerCaptureOwner = null;\n        }\n        if (this.scene?.dragCapture === 'window') {\n            this.scene.dragCapture = null;\n        }\n    }\n\n    /* Cancel one pending drag follow-up once the window is dropped or detached. */\n    #clearDragThink() {\n        if (this.ownDragThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownDragThink);\n        this.ownDragThink = null;\n    }\n\n    /* Keep dragging explicit by rescheduling only while the title-bar hold is still live. */\n    #scheduleDragThink() {\n        this.#clearDragThink();\n        if (!this.isHeld || !this.scene) {\n            return;\n        }\n        this.ownDragThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), () => {\n            this.ownDragThink = null;\n            if (!this.isHeld) {\n                return;\n            }\n            this.#updateDragPosition();\n            this.#scheduleDragThink();\n        });\n    }\n\n    /* Translate anchor-space placement into the window's top-left local position once panel dimensions are known. */\n    #syncAnchorPosition() {\n        if (!this.anchorPositioned || this.anchor !== 'center' || !this.anchorPoint) {\n            return;\n        }\n        const pos = this.localPosition();\n        this.setLocalPosition([\n            this.anchorPoint[0] - this.state.width * 0.5,\n            this.anchorPoint[1] - this.state.height * 0.5,\n            pos[2],\n        ]);\n    }\n\n    /* Keep the complete title bar reachable when click-relative placement lands beyond a HUD edge. */\n    #clampHeaderToHudViewport(dimensions) {\n        const stage = this.scene?.stage ?? null;\n        const positionParent = this.parentNode ?? null;\n        if (!stage || this.scene !== stage.hudScene || !positionParent) {\n            return;\n        }\n        const bounds = stage.hudViewportBounds?.(positionParent, dimensions) ?? null;\n        const pos = this.localPosition();\n        const width = this.state.width;\n        if (!bounds\n            || !Number.isFinite(pos?.[0])\n            || !Number.isFinite(pos?.[1])\n            || !Number.isFinite(width)) {\n            return;\n        }\n        const maxX = Math.max(bounds.left, bounds.right - Math.max(0, width));\n        const maxY = Math.max(bounds.top, bounds.bottom - this.headerHeight);\n        const x = Math.max(bounds.left, Math.min(maxX, pos[0]));\n        const y = Math.max(bounds.top, Math.min(maxY, pos[1]));\n        if (x !== pos[0] || y !== pos[1]) {\n            this.setLocalPosition([x, y, pos[2]]);\n        }\n    }\n\n\n    #viewportSize(dimensions) {\n        const stage = this.scene?.stage;\n        if (stage && this.scene === stage.hudScene && this.parentNode) {\n            const bounds = stage.hudViewportBounds(this.parentNode, dimensions);\n            if (bounds) return [bounds.right - bounds.left, bounds.bottom - bounds.top];\n        }\n        const camera = this.scene?.presentationCamera?.() ?? this.scene?.camera;\n        return camera?.getViewportSize?.() ?? null;\n    }\n\n    /* Reconcile shell geometry without remounting content or resetting focus. */\n    requestLayout() {\n        this.#layout();\n        if (this.initialPositionApplied) this.#clampHeaderToHudViewport();\n    }\n\n    #layout(dimensions) {\n        const { width, height } = this.panel.state;\n        if (![width, height].every(value => Number.isFinite(value) && value > 0)) {\n            throw new Error(`UIWindow.requestLayout(): ${this.panel.constructor.name} must provide positive finite content dimensions; got ${width} x ${height}.`);\n        }\n        const preferredWidth = width + this.padding * 2;\n        const preferredHeight = height + this.padding * 2 + UIWindow.HEADER_HEIGHT;\n        const viewport = this.#viewportSize(dimensions);\n        const outerWidth = viewport ? Math.min(preferredWidth, viewport[0] * 0.5) : preferredWidth;\n        const outerHeight = viewport ? Math.min(preferredHeight, viewport[1] * 0.5) : preferredHeight;\n        this.mutate({ width: outerWidth, height: outerHeight });\n        const bodyHeight = Math.max(0, outerHeight - this.headerHeight);\n        // The root Tile is layout/picking geometry only; the separate body owns its fill.\n        this.color = [this.backColor[0], this.backColor[1], this.backColor[2], 0];\n        this.panel.setLocalPosition([this.padding, this.padding, 0]);\n        this.panelHost.mutate({ width: preferredWidth, height: height + this.padding * 2 });\n        this.bodyScroll.setLocalPosition([0, this.headerHeight, 0]);\n        this.bodyScroll.mutate({ width: outerWidth, height: bodyHeight });\n        if (!this.headerTile) return;\n        this.backTile?.mutate({ width: outerWidth, height: bodyHeight });\n        this.backTile?.setLocalPosition([0, this.headerHeight, 0]);\n        const { x, y, z, ...shadowSize } = ui.dropShadowState(outerWidth, this.state.height);\n        this.dropShadow.mutate(shadowSize);\n        this.dropShadow.setLocalPosition([x ?? 0, y ?? 0, z ?? 0]);\n        this.headerTile.mutate({ width: outerWidth, height: this.headerHeight });\n        const closeSize = Math.min(this.headerHeight, outerWidth);\n        const titleWidth = Math.max(0, outerWidth - closeSize);\n        const text = truncateWindowTitle(this.state.font, this.state.fontSize,\n            this.state.windowTitle ?? 'Popup Window', Math.max(0, titleWidth - 24));\n        this.titleLabel.setText(text);\n        const titleLayout = evilfont.MSDFText.measureFromState(this.titleLabel.state);\n        this.titleLabel.setLocalPosition([\n            Math.max(0, (titleWidth - titleLayout.width) * 0.5),\n            (this.headerHeight - titleLayout.height) * 0.5,\n            -0.1,\n        ]);\n        this.dragHandle.mutate({ width: titleWidth, height: this.headerHeight });\n        this.closeButton.mutate({ width: closeSize, height: this.headerHeight });\n        this.closeButton.setLocalPosition([titleWidth, 0, -0.3]);\n        this.bodyInputBlocker.mutate({ width: outerWidth, height: this.state.height });\n        requestFrame('window_layout');\n    }\n\n    #buildChrome() {\n        const title = this.state.windowTitle ?? 'Popup Window';\n        const bodyHeight = Math.max(0, this.state.height - this.headerHeight);\n        if (bodyHeight > 0 && this.state.bodyBacking !== false) {\n            const backTile = new ui.Tile({\n                name: 'windowBodyBacking',\n                width: this.state.width,\n                height: bodyHeight,\n                y: this.headerHeight,\n                color: this.backColor,\n            });\n            this.appendChild(backTile);\n            this.backTile = backTile;\n        }\n\n        const dropShadow = new ui.DropShadowTile(ui.dropShadowState(this.state.width, this.state.height));\n        this.appendChild(dropShadow);\n        this.dropShadow = dropShadow;\n\n        const headerTitleWidth = Math.max(0, this.state.width - Math.min(this.headerHeight, this.state.width));\n        const titleMaxWidth = Math.max(0, headerTitleWidth - 24);\n        const titleText = truncateWindowTitle(this.state.font, this.state.fontSize, title, titleMaxWidth);\n        const titleLayout = evilfont.MSDFText.measureFromState({\n            ...this.state,\n            text: titleText,\n        })\n        const titleX = Math.max(0, (headerTitleWidth - titleLayout.width) * 0.5);\n\n        const headerState = {\n            width: this.state.width,\n            height: this.headerHeight,\n            outlineEnabled: true,\n            outlineColor: Palette.orange,\n            outlineWidth: 2,\n            /* Keep window chrome within one peer-window depth slot so promotion contains the whole window. */\n            z: -0.2,\n        };\n        const headerShape = ui.shapes.rounded({\n            cornerRadius: 20,\n            roundTopLeft: true,\n            roundTopRight: true,\n            roundBottomLeft: false,\n            roundBottomRight: false,\n        });\n        const headerMaterial = ui.materials.frostedGlass({\n            tintColor: [0.824, 0.396, 0.255],\n            tintAmount: 0.32,\n            noiseAmount: 0.02,\n        });\n        const headerTile = new ui.Tile({\n            ...headerState,\n            shape: headerShape,\n            material: headerMaterial,\n            ...this.panel.headerStyle,\n        });\n        this.appendChild(headerTile)\n        this.headerTile = headerTile\n\n        const titleLabel = new evilfont.MSDFText({\n            text: titleText,\n            font: this.state.font,\n            fontSize: this.state.fontSize,\n            fontColor: Palette.white,\n            z: -0.1,\n            x: titleX,\n            y: (this.headerHeight - titleLayout.height) * 0.5\n        })\n        headerTile.appendChild(titleLabel)\n        this.titleLabel = titleLabel\n\n        const clickarea = new ui.ClickArea({\n            width: Math.max(0, this.state.width - Math.min(this.headerHeight, this.state.width)),\n            height: this.headerHeight,\n            z: -0.2\n        })\n        this.dragHandle = clickarea\n\n        const parent = this\n        clickarea.onInput = function (event) {\n            if (event !== 'L_MOUSE_DOWN') {\n                return false;\n            }\n            parent.#beginDrag();\n            return true;\n        }\n        headerTile.appendChild(clickarea)\n\n        //Close button\n        this.closeButton = new ui.CloseButton({\n            width: Math.min(this.headerHeight, this.state.width),\n            height: this.headerHeight,\n            nodeToFree: this,\n            x: Math.max(0, this.state.width - Math.min(this.headerHeight, this.state.width)),\n            z: -0.3\n        })\n        headerTile.appendChild(this.closeButton)\n\n        const blocker = new ui.ClickArea({\n            width: this.state.width,\n            height: this.state.height,\n            z: 0.1,\n        })\n        blocker.onPointerInput = (events) => {\n            this.#forwardWheelToDescendantScrollBox(events);\n            return true;\n        };\n        this.bodyInputBlocker = blocker\n        this.insertChildBefore(blocker, this.children[0] ?? null)\n\n\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { Node, Placeholder } from './base.mjs';\nimport { ClickArea } from './button.mjs';\nimport { Tile, roundedTileOutlineRects, rectangularTileOutlineRingRects } from './tile.mjs';\nimport { shapes } from './tile-shape.mjs';\nimport { materials, normaliseTileMaterial } from './tile-material.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport {\n    currentFocusEntry, focusThis, pushFocusEntry, removeFocusEntry,\n} from './focus-manager.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\n\n/* A source-tree lease closes the HUD-mounted dialog synchronously when its\n * originating object is removed, without polling or retaining a dead owner. */\nclass DialogOwnerLease extends Placeholder {\n    _onBeforeDetachNode(shared) {\n        this.dialog?.dismiss('owner_removed');\n        super._onBeforeDetachNode(shared);\n    }\n}\n\nexport class UIDialog extends Placeholder {\n    focusContainerKind = 'TransientDialog';\n    blocksKeyPropagation = true;\n    #backgroundStyle;\n\n    /* x/y/z are in the source parent's local coordinates. Both placement modes\n     * render in the dialog HUD layer; world mode projects position and scale. */\n    static mount(parent, { panel, placement = 'hud', followWorld = true, hudAnchor = null, ...state }) {\n        const stage = parent.scene?.stage;\n        const layer = stage?.hudMountRoots.get('dialog');\n        if (!layer) throw new Error('UIDialog.mount(...): source must belong to a Stage with a dialog HUD layer.');\n        if ((parent.scene !== stage.activeScene && parent.scene !== stage.hudScene) || parent.computedVisible === false) {\n            throw new Error('UIDialog.mount(...): source must be visible in a presented scene.');\n        }\n        if (!['hud', 'world'].includes(placement)) throw new Error('UIDialog.mount(...): placement must be hud or world.');\n        if (hudAnchor !== null && (hudAnchor !== 'top_center' || placement !== 'hud')) {\n            throw new Error('UIDialog.mount(...): hudAnchor must be top_center with HUD placement.');\n        }\n        const dialog = new UIDialog({ ...state, panel });\n        dialog.source = parent;\n        dialog.stage = stage;\n        dialog.placement = placement;\n        dialog.followWorld = followWorld;\n        dialog.hudAnchor = hudAnchor;\n        dialog.anchorPoint = [state.x ?? 0, state.y ?? 0, state.z ?? 0];\n        dialog.layer = layer;\n        dialog.syncPlacement();\n        stage.activeDialog?.dismiss('replaced');\n        stage.activeDialog = dialog;\n        const lease = new DialogOwnerLease({ name: 'dialogOwnerLease' });\n        lease.dialog = dialog;\n        dialog.ownerLease = lease;\n        parent.appendChild(lease);\n        layer.appendChild(dialog);\n        requestFrame('dialog_open');\n        return dialog;\n    }\n\n    constructor({ panel, padding = 8, ...state }) {\n        super({ name: 'dialog', ...state });\n        if (!(panel instanceof Node) || typeof panel.build !== 'function' || panel.parentNode) {\n            throw new Error('UIDialog(...): panel must be an unparented Node with build(dialog).');\n        }\n        if (!Number.isFinite(padding) || padding < 0) throw new Error('UIDialog(...): padding must be non-negative.');\n        this.panel = panel;\n        this.padding = padding;\n        this.fieldInputs = new Map();\n        this.focusedFieldKey = null;\n        this.closed = false;\n        this.dismissReason = null;\n        this.#backgroundStyle = {\n            color: Palette.darkgrey,\n            shape: shapes.rounded(),\n            material: materials.solid(),\n            outlineEnabled: true,\n            outlineWidth: 2,\n            outlineColor: Palette.white,\n            outlineAlignment: 'center',\n            ...panel.background,\n        };\n        // The fill writes depth before ordinary panel text. Only the border\n        // uses the transparent pass, so it cannot paint over interior labels.\n        this.background = new Tile({\n            ...this.#backgroundStyle,\n            name: 'dialogBackground',\n            outlineEnabled: false,\n            outlineMaterial: materials.solid(),\n        });\n        this.outline = null;\n        this.bodyInputBlocker = new ClickArea({ name: 'dialogBodyInput', z: -0.02 });\n        this.bodyInputBlocker.onPointerInput = () => true;\n        this.content = new Placeholder({ name: 'dialogContent', x: padding, y: padding, z: -0.1 });\n        this.appendChild(this.background);\n        this.appendChild(this.bodyInputBlocker);\n        this.appendChild(this.content);\n        this.content.appendChild(panel);\n        panel.build(this);\n        this.layout();\n        if (this.fieldInputs.size === 0) throw new Error('UIDialog(...): panel.build(dialog) must register at least one input.');\n        if (panel.initialFocusField !== null && panel.initialFocusField !== undefined) {\n            if (!this.fieldInputs.has(panel.initialFocusField)) throw new Error('UIDialog(...): initialFocusField must name a registered input.');\n            this.focusedFieldKey = panel.initialFocusField;\n        }\n    }\n\n    /* Call after a panel changes its preferred content dimensions. */\n    layout() {\n        const { width, height } = this.panel.state;\n        if (![width, height].every(value => Number.isFinite(value) && value > 0)) {\n            throw new Error('UIDialog.layout(): panel.state.width and height must be positive finite dimensions.');\n        }\n        const size = { width: width + this.padding * 2, height: height + this.padding * 2 };\n        this.mutate(size);\n        const geometry = {\n            ...size,\n            // Keep the default rounding at 50% as panel dimensions change.\n            ...(this.panel.background?.shape === undefined\n                ? { cornerRadius: this.panel.background?.cornerRadius ?? Math.min(size.width, size.height) * 0.5 }\n                : {}),\n        };\n        this.background.mutate(geometry);\n        this.#layoutOutline(geometry);\n        this.bodyInputBlocker.mutate(size);\n    }\n\n    #layoutOutline(geometry) {\n        const style = {\n            ...this.#backgroundStyle,\n            ...geometry,\n            name: 'dialogOutline',\n            color: Palette.clear,\n            material: materials.translucentSolid(),\n            outlineMaterial: materials.solid(),\n        };\n        let outlineMaterial = this.#backgroundStyle.outlineMaterial;\n        if (outlineMaterial === undefined) {\n            const ring = {\n                shape: this.background.shape,\n                state: { ...this.background.state, outlineEnabled: style.outlineEnabled },\n            };\n            const rects = ring.shape.kind === 'rounded'\n                ? roundedTileOutlineRects(ring) : rectangularTileOutlineRingRects(ring);\n            const { width, height } = rects[0] ?? geometry;\n            const longestSide = Math.max(width, height);\n            const dx = width / longestSide;\n            const dy = height / longestSide;\n            outlineMaterial = materials.linearGradient({\n                // Compensate for the analytic ring's aspect ratio to keep a\n                // 45-degree direction in pixels for every dialog size.\n                start: [(1 - dx) * 0.5, (1 - dy) * 0.5],\n                end: [(1 + dx) * 0.5, (1 + dy) * 0.5],\n                points: [\n                    { offset: 0, color: Palette.orange },\n                    { offset: 1, color: Palette.yellow },\n                ],\n            });\n        } else outlineMaterial = normaliseTileMaterial(outlineMaterial);\n        if (this.outline && outlineMaterial.batchKey === this.outline.outlineMaterial.batchKey) {\n            this.outline.mutate(geometry);\n            return;\n        }\n        const next = new Tile(style);\n        next.mutate({ ...geometry, outlineMaterial });\n        // Materials are immutable batch descriptors. Framework replacement\n        // releases the old border without remounting the panel or its inputs.\n        this.replaceChild(this.outline, next);\n        this.outline = next;\n    }\n\n    ownsNode(node) {\n        for (let current = node; current; current = current.parentNode) {\n            if (current === this || current.inputOwnerDialog === this) return true;\n        }\n        return false;\n    }\n\n    registerInputField(key, cell) {\n        if (typeof key !== 'string' || key.length === 0 || this.fieldInputs.has(key)\n            || !this.ownsNode(cell) || [...this.fieldInputs.values()].includes(cell)) {\n            throw new Error('UIDialog.registerInputField(...): expected a unique field key and an input mounted inside this dialog.');\n        }\n        cell.focusContainerOwner = this;\n        this.fieldInputs.set(key, cell);\n        this.focusedFieldKey ??= key;\n        return cell;\n    }\n\n    currentFocusedInputCell() {\n        return this.fieldInputs.get(this.focusedFieldKey) ?? null;\n    }\n\n    restoreFocusState(cell) {\n        for (const [key, input] of this.fieldInputs) {\n            if (input === cell) this.focusedFieldKey = key;\n        }\n    }\n\n    clearRenderedFocus() {\n        this.currentFocusedInputCell()?.syncFocusVisual(false, 'scene_hidden');\n    }\n\n    activateInputCell(cell, clickedIndex = null) {\n        if (![...this.fieldInputs.values()].includes(cell) || !this.ownsNode(cell)) {\n            throw new Error('UIDialog.activateInputCell(...): input must be registered on this dialog.');\n        }\n        const previousIndex = cell.cursorIndex;\n        if (Number.isInteger(clickedIndex)) cell.cursorIndex = clickedIndex;\n        if (!focusThis(this, cell)) {\n            cell.cursorIndex = previousIndex;\n            return false;\n        }\n        this.restoreFocusState(cell);\n        return true;\n    }\n\n    tabFocusInputCell(cell, direction) {\n        const fields = [...this.fieldInputs.values()];\n        const index = fields.indexOf(cell);\n        if (index === -1) throw new Error('UIDialog.tabFocusInputCell(...): unregistered input.');\n        return this.activateInputCell(fields[(index + direction + fields.length) % fields.length]);\n    }\n\n    onKeyDownCapture(event) {\n        if (event.key === 'Escape') {\n            this.dismiss('escape');\n            return true;\n        }\n        if (event.key === 'Tab' && !event.ctrlKey && !event.metaKey && !event.altKey) {\n            return this.tabFocusInputCell(this.currentFocusedInputCell(), event.shiftKey ? -1 : 1);\n        }\n        return false;\n    }\n\n    onKeyDown(event) {\n        return this.panel.onKeyDown?.(event) === true;\n    }\n\n    onFocusChanged() {\n        const entry = currentFocusEntry();\n        if (!this.closed && entry?.container !== this && !this.ownsNode(entry?.container)) {\n            this.dismiss('focus_lost');\n        }\n    }\n\n    syncPlacement() {\n        if (this.closed) return;\n        const sourceScene = this.source.scene;\n        if (!sourceScene || sourceScene.stage !== this.stage\n            || (sourceScene !== this.stage.activeScene && sourceScene !== this.stage.hudScene)\n            || this.source.computedVisible === false) {\n            this.dismiss('owner_hidden');\n            return;\n        }\n        if (this.placement === 'hud' && this.placed && this.hudAnchor === null) return;\n        if (this.placement === 'world' && !this.followWorld && this.placed) return;\n        const project = point => this.stage.projectNodePointToHud(this.source, point, this.layer);\n        const bounds = this.hudAnchor ? this.stage.hudViewportBounds(this.layer) : null;\n        const origin = bounds\n            ? [(bounds.left + bounds.right - this.state.width) * 0.5 + this.anchorPoint[0], bounds.top + this.anchorPoint[1], 0]\n            : project(this.anchorPoint);\n        if (!origin || !origin.every(Number.isFinite)) throw new Error('UIDialog.syncPlacement(): source cannot be projected into the HUD.');\n        const matrix = twgl.m4.translation([origin[0], origin[1], 0]);\n        if (this.placement === 'world') {\n            const [x, y, z] = this.anchorPoint;\n            const right = project([x + 1, y, z]);\n            const down = project([x, y + 1, z]);\n            matrix[0] = right[0] - origin[0];\n            matrix[1] = right[1] - origin[1];\n            matrix[4] = down[0] - origin[0];\n            matrix[5] = down[1] - origin[1];\n        }\n        if (!this.placed || matrix.some((value, index) => value !== this.state.localToParent[index])) {\n            this.setLocalToParent(matrix);\n        }\n        this.placed = true;\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        const input = this.currentFocusedInputCell();\n        if (!input || input.scene !== this.scene) throw new Error('UIDialog: panel must register an initial input before mounting.');\n        pushFocusEntry(this, input);\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.#finishDismiss(this.dismissReason ?? 'removed');\n        super._onBeforeDetachNode(shared);\n    }\n\n    dismiss(reason = 'cancelled') {\n        if (this.closed) return;\n        this.dismissReason = reason;\n        this.#finishDismiss(reason);\n        this.parentNode?.removeChild(this);\n        requestFrame('dialog_dismiss');\n    }\n\n    closeFocusContainer() { this.dismiss(); }\n\n    #finishDismiss(reason) {\n        if (this.closed) return;\n        this.closed = true;\n        if (this.stage?.activeDialog === this) this.stage.activeDialog = null;\n        const lease = this.ownerLease;\n        if (lease) {\n            lease.dialog = null;\n            // During source teardown the lease is already being detached.\n            if (reason !== 'owner_removed') lease.parentNode?.removeChild(lease);\n            this.ownerLease = null;\n        }\n        removeFocusEntry(this);\n        this.panel.onDismiss?.(reason);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\n\n/* Panels own their content dimensions and build inputs with the supplied dialog\n * as focusContainerOwner. UIDialog accepts instances, never panel type names. */\nexport class DialogPanel extends Placeholder {\n    constructor(state) {\n        super(state);\n        this.background = state.background ?? {};\n        this.initialFocusField = state.initialFocusField ?? null;\n    }\n\n    build(_dialog) {}\n    onKeyDown(_event) { return false; }\n    onDismiss(_reason) {}\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport function lowerBound(values, want, left = 0, right = values.length) {\n    let lo = left;\n    let hi = right;\n    while (lo < hi) {\n        const mid = Math.floor((lo + hi) / 2);\n        if (values[mid] < want) {\n            lo = mid + 1;\n        } else {\n            hi = mid;\n        }\n    }\n    return lo;\n}\n\nexport function upperBound(values, want, left = 0, right = values.length) {\n    let lo = left;\n    let hi = right;\n    while (lo < hi) {\n        const mid = Math.floor((lo + hi) / 2);\n        if (values[mid] <= want) {\n            lo = mid + 1;\n        } else {\n            hi = mid;\n        }\n    }\n    return lo;\n}\n\nexport function positionFromIndex(widths, index, textLength, offset = 0) {\n    const safeIndex = Math.max(0, Math.min(index, textLength));\n    if (safeIndex <= offset) {\n        return 0;\n    }\n    return widths[safeIndex] - widths[offset];\n}\n\nexport function indexFromPixelX(widths, startIdx, endIdx, targetPixelX) {\n    if (widths.codepointOffsets) {\n        const offsets = widths.codepointOffsets;\n        const start = lowerBound(offsets, startIdx);\n        const end = Math.max(start, upperBound(offsets, endIdx) - 1);\n        return offsets[indexFromPixelX(widths.codepointWidths, start, end, targetPixelX)];\n    }\n    if (targetPixelX <= 0) {\n        return startIdx;\n    }\n\n    const startWidth = widths[startIdx];\n    const endWidth = widths[endIdx];\n    const totalWidth = endWidth - startWidth;\n    if (targetPixelX >= totalWidth) {\n        return endIdx;\n    }\n\n    const targetWidth = startWidth + targetPixelX;\n    let left = startIdx;\n    let right = endIdx - 1;\n\n    while (left <= right) {\n        const mid = Math.floor((left + right) / 2);\n        const widthAtMid = widths[mid + 1];\n\n        if (widthAtMid < targetWidth) {\n            left = mid + 1;\n        } else {\n            right = mid - 1;\n        }\n    }\n\n    const charIndex = left;\n    const widthBefore = widths[charIndex];\n    const widthAfter = widths[Math.min(charIndex + 1, endIdx)];\n    const distanceToLeft = targetWidth - widthBefore;\n    const distanceToRight = widthAfter - targetWidth;\n    return distanceToLeft < distanceToRight ? charIndex : Math.min(charIndex + 1, endIdx);\n}\n\nexport function calculateDisplayBounds(widths, text, targetIndex, displayOffset, maxWidth) {\n    if (widths.codepointOffsets) {\n        const offsets = widths.codepointOffsets;\n        const target = Math.max(0, upperBound(offsets, targetIndex) - 1);\n        const offset = Math.max(0, upperBound(offsets, displayOffset ?? 0) - 1);\n        const result = displayBounds(widths.codepointWidths, offsets.length - 1, target, offset, maxWidth);\n        const start = offsets[result.displayOffset];\n        const end = offsets[result.endIdx];\n        return { displayOffset: start, endIdx: end, visibleText: text.substring(start, end) };\n    }\n    const result = displayBounds(widths, text?.length ?? 0, targetIndex, displayOffset, maxWidth);\n    return { ...result, visibleText: (text ?? '').substring(result.displayOffset, result.endIdx) };\n}\n\n/* Reveal a whole range with minimal movement; an oversized range starts at\n   the left edge. Work in code points so the viewport never splits a surrogate. */\nexport function calculateRangeDisplayBounds(widths, text, startIndex, endIndex, displayOffset, maxWidth) {\n    const offsets = widths.codepointOffsets;\n    const advances = offsets ? widths.codepointWidths : widths;\n    const start = offsets ? Math.max(0, upperBound(offsets, startIndex) - 1) : startIndex;\n    const end = offsets ? lowerBound(offsets, endIndex) : endIndex;\n    let offset = offsets ? Math.max(0, upperBound(offsets, displayOffset ?? 0) - 1) : (displayOffset ?? 0);\n    const rangeWidth = advances[end] - advances[start];\n    const width = Math.max(0, maxWidth);\n    const gap = Math.min(4, Math.max(0, (width - rangeWidth) / 2));\n    if (rangeWidth > width) {\n        offset = start;\n    } else if (start < offset) {\n        offset = lowerBound(advances, Math.max(0, advances[start] - gap), 0, start + 1);\n    } else if (advances[end] - advances[offset] > width) {\n        offset = lowerBound(advances, advances[end] + gap - width, 0, start + 1);\n    }\n    const endIdx = Math.max(offset, upperBound(advances, advances[offset] + width, offset) - 1);\n    const sourceOffset = offsets ? offsets[offset] : offset;\n    const sourceEnd = offsets ? offsets[endIdx] : endIdx;\n    return { displayOffset: sourceOffset, endIdx: sourceEnd, visibleText: text.substring(sourceOffset, sourceEnd) };\n}\n\nfunction displayBounds(widths, textLength, targetIndex, displayOffset, maxWidth) {\n    if (textLength === 0) return { displayOffset: 0, endIdx: 0 };\n\n    const safeTarget = Math.max(0, Math.min(targetIndex, textLength));\n    let offset = Math.max(0, Math.min(displayOffset ?? 0, textLength));\n    let endIdx = upperBound(widths, widths[offset] + maxWidth, offset, widths.length) - 1;\n    endIdx = Math.max(offset, Math.min(endIdx, textLength));\n\n    // Keep a stable text viewport when the caret is already visible. Replacing\n    // this with the leftmost possible offset makes a second click visibly snap\n    // a horizontally scrolled input back toward the start.\n    if (safeTarget < offset) {\n        // Keep a leftward drag adjacent to the prior viewport. Selecting one\n        // character past its left edge must not reset the viewport to zero.\n        offset = safeTarget;\n        endIdx = upperBound(widths, widths[offset] + maxWidth, offset, widths.length) - 1;\n        endIdx = Math.max(offset, Math.min(endIdx, textLength));\n    } else if (safeTarget >= endIdx && safeTarget > offset) {\n        const minWidth = widths[safeTarget] - maxWidth;\n        offset = lowerBound(widths, minWidth, 0, safeTarget + 1);\n        endIdx = upperBound(widths, widths[offset] + maxWidth, offset, widths.length) - 1;\n        endIdx = Math.max(offset, Math.min(endIdx, textLength));\n    }\n\n    if (safeTarget > endIdx && endIdx === textLength) {\n        const minWidth = widths[endIdx] - maxWidth;\n        offset = lowerBound(widths, minWidth, 0, endIdx + 1);\n    }\n\n    return {\n        displayOffset: offset,\n        endIdx,\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { getTextAdvanceMetrics } from '../evilfont/evilfont.mjs';\nimport { indexFromPixelX } from './input-cell-math.mjs';\n\n/* Soft breaks are display geometry only. All cursor and selection positions\n * remain UTF-16 offsets into the unchanged logical cell text. */\nexport class WrappedInputLayout {\n    constructor(font, fontSize, text, width, padding, lineHeight) {\n        this.text = text;\n        this.width = width;\n        this.padding = Math.min(padding, width / 2);\n        this.lineHeight = lineHeight;\n        this.widths = getTextAdvanceMetrics(font, fontSize, text).widths;\n        this.rows = [];\n        const offsets = this.widths.codepointOffsets;\n        const available = Math.max(0, width - this.padding * 2 - 2);\n        let start = 0;\n        while (start < offsets.length - 1) {\n            let end = start;\n            let wordBreak = start;\n            while (end + 1 < offsets.length\n                && this.widths[offsets[end + 1]] - this.widths[offsets[start]] <= available) {\n                end++;\n                if (/\\s/u.test(text.slice(offsets[end - 1], offsets[end]))) wordBreak = end;\n            }\n            if (end + 1 < offsets.length && wordBreak > start) end = wordBreak;\n            // A glyph wider than the available area still makes progress.\n            end = Math.max(start + 1, end);\n            this.rows.push({ start: offsets[start], end: offsets[end] });\n            start = end;\n        }\n        if (!this.rows.length) this.rows.push({ start: 0, end: 0 });\n    }\n\n    rowAt(index, affinity = 'forward') {\n        const found = this.rows.findIndex(row => index < row.end || (affinity === 'backward' && index === row.end));\n        return found < 0 ? this.rows.length - 1 : found;\n    }\n\n    point(index, affinity = 'forward') {\n        const row = this.rowAt(index, affinity);\n        return { row, x: this.xInRow(index, row), y: row * this.lineHeight };\n    }\n\n    xInRow(index, row) {\n        return Math.min(Math.max(this.padding, this.width - this.padding - 2),\n            this.padding + this.widths[index] - this.widths[this.rows[row].start]);\n    }\n\n    indexAt(x, row) {\n        const { start, end } = this.rows[row];\n        return indexFromPixelX(this.widths, start, end, Math.max(0, x - this.padding));\n    }\n\n    pick(x, y) {\n        const row = Math.max(0, Math.min(this.rows.length - 1, Math.floor(y / this.lineHeight)));\n        const index = this.indexAt(x, row);\n        return { index, affinity: index === this.rows[row].end && row + 1 < this.rows.length ? 'backward' : 'forward' };\n    }\n\n    hit(x, y) { return this.pick(x, y).index; }\n\n    selectionRects({ start, end, newline }) {\n        return this.rows.flatMap((row, i) => {\n            const a = Math.max(start, row.start);\n            const b = Math.min(end, row.end);\n            const includesNewline = newline && i === this.rows.length - 1;\n            if (b <= a && !includesNewline) return [];\n            const x = this.xInRow(a, i);\n            const right = Math.max(x, this.width - this.padding);\n            return [{ x, y: i * this.lineHeight, height: this.lineHeight,\n                width: Math.min(right - x, this.xInRow(b, i) - x + (includesNewline ? 8 : 0)) }];\n        });\n    }\n}\n", "import { WrappedInputLayout } from './wrapped-input-layout.mjs';\nimport { glyphForSymbol } from '../evilfont/font-asset.mjs';\n// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport * as ewu from '../evil-works-utils.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { moveCursorByWord, previousCodepointIndex, nextCodepointIndex } from './text-utils.mjs';\nimport { SPACE_TAB_TEXT, isSpaceTabKey, spaceTabBackspaceStart } from './space-tabs.mjs';\nimport { CaretQuad } from './caret-quad.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { translucentSolidTileMaterial } from './tile-material.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport {\n    normalizePasteText,\n} from './clipboard-text.mjs';\nimport {\n    calculateDisplayBounds,\n    calculateRangeDisplayBounds,\n    indexFromPixelX,\n    positionFromIndex,\n} from './input-cell-math.mjs';\nimport { appendClickTraceEvent } from './click-trace.mjs';\nimport { clearFocusTargetReferences, currentFocusedInputCell } from './focus-manager.mjs';\n\nexport function recordingInputLineIdentity(cellID, ownerDocumentView = null) {\n    if (!Number.isInteger(cellID) || cellID < 0) return null;\n    const line = ownerDocumentView?.recordingLineNumber?.(cellID) ?? cellID;\n    return {\n        stable_key: `puffbook.input:line=${line}`,\n        line,\n        local_line: cellID,\n    };\n}\n\nfunction hasPointerInput(events) {\n    if (!events || typeof events.has !== 'function') {\n        return false;\n    }\n    return events.has('L_MOUSE_DOWN')\n        || events.has('L_MOUSE_UP')\n        || events.has('L_MOUSE_DOWN_HOLD')\n        || events.has('R_MOUSE_DOWN')\n        || events.has('R_MOUSE_UP')\n        || events.has('R_MOUSE_DOWN_HOLD')\n        || events.has('DOUBLE_CLICK')\n        || events.has('TRIPLE_CLICK');\n}\n\n/* Compare two RGBA vectors by value so visual-only document syncs do not depend on array identity. */\nfunction sameColor(a, b) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n        return false;\n    }\n    return a.every((value, i) => value === b[i]);\n}\n\n/* Compare source-column sync spans by value so per-glyph recolours follow content, not array identity. */\nfunction sameSyncSpans(a, b) {\n    const left = Array.isArray(a) ? a : [];\n    const right = Array.isArray(b) ? b : [];\n    if (left.length !== right.length) {\n        return false;\n    }\n    for (let i = 0; i < left.length; i += 1) {\n        if (left[i]?.start_col !== right[i]?.start_col\n            || left[i]?.end_col !== right[i]?.end_col\n            || left[i]?.phase !== right[i]?.phase) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction syncSpanColorsVisible() {\n    if (!Object.prototype.hasOwnProperty.call(globalThis, '__portalPendingTextDebugVisible')) {\n        return true;\n    }\n    return globalThis.__portalPendingTextDebugVisible === true;\n}\n\n/* Keep local-pending and sent-pending glyph colours explicit at the input display seam. */\nfunction syncPhaseColor(phase) {\n    if (!syncSpanColorsVisible()) {\n        return null;\n    }\n    switch (phase) {\n    case 'local':\n        return [1.0, 0.18, 0.18, 1.0];\n    case 'sent':\n        return [1.0, 0.58, 0.12, 1.0];\n    default:\n        return null;\n    }\n}\n\nconst CARET_HEIGHT_EXTRA_PX = 2;\nconst CARET_Y_OFFSET_PX = 1;\nconst RETAINED_POINTER_CARET_HOLD_S = 0.6;\nconst INPUT_HIT_RIGHT_PAD_PX = 16;\n\n/* Return the contiguous editor-word span at a clicked caret index. A click at a glyph boundary belongs to the glyph on its left, matching normal text-editor selection. */\nfunction wordRangeAtIndex(text, index) {\n    const value = String(text ?? '');\n    if (value.length === 0) {\n        return [0, 0];\n    }\n    const clicked = Math.max(0, Math.min(Number.isInteger(index) ? index : 0, value.length));\n    const target = Math.min(clicked, value.length - 1);\n    if (!/[A-Za-z0-9_]/.test(value[target])) {\n        return [clicked, clicked];\n    }\n    let start = target;\n    let end = target + 1;\n    while (start > 0 && /[A-Za-z0-9_]/.test(value[start - 1])) {\n        start -= 1;\n    }\n    while (end < value.length && /[A-Za-z0-9_]/.test(value[end])) {\n        end += 1;\n    }\n    return [start, end];\n}\n\n/* Use one nominal glyph cell as the minimum visible-text hit width for non-empty rows. */\nfunction nominalHitWidth(cell) {\n    const size = cell?.displayFontSize ?? cell?.state?.fontSize ?? 14;\n    return Math.max(12, Math.round(size * 1.2));\n}\n\n/* Bound ordinary pointer activation to the visible text span plus a small trailing cushion, not the whole row width. */\nfunction interactiveHitWidth(cell) {\n    const width = cell.state.width ?? cell.width ?? 0;\n    if (!Number.isFinite(width) || width <= 0) {\n        return 0;\n    }\n    const textLength = cell.textInput?.length ?? 0;\n    if (textLength === 0) {\n        return width;\n    }\n    const textEndX = typeof cell.getPositionFromIndex === 'function'\n        ? cell.getPositionFromIndex(textLength)\n        : 0;\n    const target = Math.max(nominalHitWidth(cell), textEndX + INPUT_HIT_RIGHT_PAD_PX);\n    return Math.max(0, Math.min(width, target));\n}\n\n/* Input cells clamp x-to-index mapping, so initial caret placement must reject off-cell misses explicitly. */\nfunction hasLocalPointerDownHit(cell) {\n    if (!cell || typeof cell.getLocalMousePosition !== 'function') {\n        return false;\n    }\n    const local = cell.getLocalMousePosition();\n    if (!Array.isArray(local)) {\n        return false;\n    }\n    const [x, y] = local;\n    const width = interactiveHitWidth(cell);\n    const height = cell.state.height ?? cell.height ?? 0;\n    return Number.isFinite(x)\n        && Number.isFinite(y)\n        && Number.isFinite(width)\n        && Number.isFinite(height)\n        && x >= 0\n        && y >= 0\n        && x <= width\n        && y <= height;\n}\n\n/* Single-line editor rows should accept clicks anywhere inside the row and clamp the cursor to the line end. */\nfunction hasLocalPointerRowHit(cell) {\n    if (!cell || typeof cell.getLocalMousePosition !== 'function') {\n        return false;\n    }\n    const local = cell.getLocalMousePosition();\n    if (!Array.isArray(local)) {\n        return false;\n    }\n    const [x, y] = local;\n    const width = cell.state.width ?? cell.width ?? 0;\n    const height = cell.state.height ?? cell.height ?? 0;\n    return Number.isFinite(x)\n        && Number.isFinite(y)\n        && Number.isFinite(width)\n        && Number.isFinite(height)\n        && x >= 0\n        && y >= 0\n        && x <= width\n        && y <= height;\n}\n\n/* Keep source-to-display mapping explicit so hidden source prefixes share one authoritative caret/click projection. */\nfunction normalizeDisplayTransformResult(text, spec) {\n    const raw = typeof text === 'string' ? text : '';\n    if (!spec || typeof spec !== 'object') {\n        return {\n            sourcePrefixChars: 0,\n            displayText: raw,\n        };\n    }\n    const prefix = Math.max(0, Math.min(spec.sourcePrefixChars ?? 0, raw.length));\n    const displayText = typeof spec.displayText === 'string'\n        ? spec.displayText\n        : raw.substring(prefix);\n    return {\n        sourcePrefixChars: prefix,\n        displayText,\n    };\n}\n\nfunction inputCellLabel(cell) {\n    if (!cell) {\n        return 'InputCell(<null>)';\n    }\n    return `InputCell(line=${cell.cellID},name=${cell.state?.name ?? 'unnamed'})`;\n}\n\n/* Emit one end-to-end mouse-coordinate bundle so click-hit debugging can identify the first bad space conversion. */\nfunction pointerDiag(cell) {\n    const scene = cell?.scene ?? null;\n    const cam = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const mouseWorld = cam?.getMouseWorldPosition?.() ?? null;\n    const mousePresentation = scene?.worldToPresentationPoint && Array.isArray(mouseWorld)\n        ? scene.worldToPresentationPoint(mouseWorld)\n        : mouseWorld;\n    return {\n        mouse_norm: [Mouse.x, Mouse.y],\n        mouse_client: [Mouse.clientX, Mouse.clientY],\n        mouse_canvas_rect: Mouse.canvasRect,\n        mouse_world: mouseWorld,\n        mouse_presentation: mousePresentation,\n        camera_vp_bounds: cam?.vpBounds ?? null,\n        interactive_width: interactiveHitWidth(cell),\n    };\n}\n\nexport class InputCell extends ui.Button {\n    constructor(state) {\n        if (!state?.focusContainerOwner) {\n            throw new Error('InputCell(...): focusContainerOwner is required.');\n        }\n        state.color = state.color || [0.1882, 0.1882, 0.1882, 1.0]\n        state.onHoverColor = state.onHoverColor || Palette.charcoal\n        state.inputMode = ui.InputMode.BLOCK;\n        state.capturesPrimaryPointer = false;\n        state.height = state.height || state.fontSize || 12\n        //state.onHoverColor = [0.1882, 0.1882, 0.1882, 1.0]\n        super(state);\n        this.focusTargetKind = 'input';\n        this.focusable = false;\n        this.toastEnabled = false;\n        this.tooltipEnabled = false;\n        this.useBaseInput = state.useBaseInput ?? false;\n        this.keyDelegate = state.keyDelegate ?? null;\n        this.selectionOwner = state.selectionOwner ?? null;\n        this.wrapText = state.wrapText ?? false;\n        this.wrapLineHeight = state.wrapLineHeight ?? state.height;\n        this.wrappedLayout = null;\n        this.wrappedCaretAffinity = 'forward';\n        this.ownWrappedLabels = [];\n        this.readOnly = state.readOnly ?? false;\n        this.useExternalCaret = state.useExternalCaret ?? false;\n        this.caretColor = state.caretColor\n            ?? (this.useExternalCaret ? Palette.orange : [0.996, 0.384, 0.184, 1.0]);\n        this.onBlinkPhaseChange = state.onBlinkPhaseChange ?? null;\n        this.focusContainerOwner = state.focusContainerOwner;\n        this.renderText = state.renderText ?? true;\n        this.infoLabel = state.infoLabel ?? false;\n        this.infoLabelWhenFocused = state.infoLabelWhenFocused ?? false;\n        this.infoLabelText = state.infoLabelText ?? \"Info Label example.\";\n        this.infoLabelNode = null;\n        this.displayTransform = state.displayTransform ?? null;\n        this.displayFontSize = state.displayFontSize ?? state.fontSize;\n        const lineHeight = state.font?.fontData?.lineHeight;\n        const defaultDisplayTextYOffset = Number.isFinite(lineHeight) && lineHeight > 0\n            && Number.isFinite(this.displayFontSize) && this.displayFontSize > 0\n            ? (state.height - (lineHeight * this.displayFontSize)) * 0.5\n            : 0;\n        const defaultCaretTextYOffset = Number.isFinite(state.fontSize) && state.fontSize > 0\n            ? ((state.height - (state.fontSize + CARET_HEIGHT_EXTRA_PX)) * 0.5) - CARET_Y_OFFSET_PX\n            : 0;\n        this.paddingX = Math.max(0, state.paddingX ?? 0);\n        this.displayTextXOffset = state.displayTextXOffset ?? this.paddingX;\n        this.displayTextYOffset = state.displayTextYOffset ?? state.textYOffset ?? defaultDisplayTextYOffset;\n        this.displayFontColor = state.displayFontColor ?? Palette.white;\n        this.displaySyncSpans = Array.isArray(state.displaySyncSpans) ? state.displaySyncSpans : [];\n\n        this.inFocus = false\n        this.textInput = state.textInput ?? \"\"\n        this.onTextChange = state.onTextChange ?? null;\n        this._notifiedText = this.textInput;\n        this.visualHighlights = [];\n        this.activeVisualHighlightIndex = -1;\n        this.ownVisualHighlightTiles = [];\n        this._visibleText = this.textInput\n        this._displaySourcePrefixChars = 0;\n        this._displayText = this.textInput;\n        this.label = null;\n        this.caret = null;\n        this.textYOffset = state.textYOffset ?? defaultCaretTextYOffset;\n        this.cursorIndex = state.cursorIndex ?? 0\n        this.textY = this.height + state.fontSize\n        this.displayOffset = state.displayOffset ?? 0;\n        this.blinkCounter = 0;\n        this.blinkSpeed = 1.0;\n        this.caretVisibleHoldUntilS = -Infinity;\n        this._blinkWakeThink = null;\n        this.ownSelectionThink = null;\n        this._selectionLastThinkS = null;\n        this.cellID = state.cellID ?? -1 // temporary to support document\n        this.onEnterKey = state.onEnterKey ?? (() => {});\n        this.isSelecting = false;\n        this._selectionAutoScroll = 0;\n\n        this.highlight = null;\n        this.holdX = null;\n        this.selectionRange = [0, 0]\n        this.selectionAnchor = null;\n        this._ownsSceneDragCapture = false;\n        this._consumeTripleClickRelease = false;\n        this.#build();\n        this.#syncCursorTextPosition();\n    }\n\n    mutate(newState) {\n        const previousWidth = this.state.width;\n        const result = super.mutate(newState);\n        if (this.ownVisualHighlightTiles && ('width' in newState || 'height' in newState)) {\n            if (this.wrapText && this.state.width !== previousWidth) this.#syncDisplay();\n            else if (this.state.width !== previousWidth && this.activeVisualHighlightIndex >= 0 && currentFocusedInputCell() !== this) {\n                this.#syncDisplay();\n            } else this.#syncVisualHighlights();\n        }\n        if (this.infoLabel && this.state.width !== previousWidth) {\n            this.#syncInfoLabel();\n        }\n        return result;\n    }\n\n    recordingIdentity() {\n        return recordingInputLineIdentity(this.cellID, this.ownerDocumentView)\n            ?? super.recordingIdentity();\n    }\n\n    #updateSceneDragCapture(acquire) {\n        const scene = this.scene ?? null;\n        if (!scene) {\n            if (!acquire) {\n                this._ownsSceneDragCapture = false;\n            }\n            return;\n        }\n        const captureKey = 'input-cell';\n        if (acquire) {\n            if ((scene.dragCapture === null || scene.dragCapture === captureKey)\n                && (scene.pointerCaptureOwner === null || scene.pointerCaptureOwner === this)) {\n                scene.dragCapture = captureKey;\n                scene.pointerCaptureOwner = this;\n                this._ownsSceneDragCapture = true;\n            }\n            return;\n        }\n        if (this._ownsSceneDragCapture && scene.dragCapture === captureKey) {\n            scene.dragCapture = null;\n        }\n        if (scene.pointerCaptureOwner === this) {\n            scene.pointerCaptureOwner = null;\n        }\n        this._ownsSceneDragCapture = false;\n    }\n\n    // Editors may own ranges across multiple InputCells; ordinary controls keep local selection.\n    get #selectionOwner() {\n        return this.selectionOwner ?? this.ownerDocumentView;\n    }\n    get #usesDocumentSelection() {\n        return this.#selectionOwner?.usesDocumentSelection?.(this) === true;\n    }\n\n    _updateHighlight(index){\n        if (this.#usesDocumentSelection) {\n            this.#selectionOwner.selectSourceCellRange(this, this.holdX ?? index, index);\n            return;\n        }\n        const prev = this.highlight;\n        this.highlight = null;\n        if (prev?.parentNode === this) {\n            this.removeChild(prev)\n        }\n\n        const anchorIndex = this.holdX ?? index;\n        const startIndex = Math.min(anchorIndex, index);\n        const endIndex = Math.max(anchorIndex, index);\n        const cellWidth = Math.max(0, this.state.width ?? this.width ?? 0);\n        const contentLeft = Math.min(this.paddingX, cellWidth);\n        const contentRight = Math.max(contentLeft, cellWidth - this.paddingX);\n        const x = ewu.clamp(this.getPositionFromIndex(startIndex), contentLeft, contentRight);\n        // Clip both edges in cell coordinates. Clamping only the width lets a\n        // partially visible selection extend past the right side of its row.\n        const endX = ewu.clamp(this.getPositionFromIndex(endIndex), x, contentRight);\n        const width = endX - x;\n        this.highlight = new ui.Tile({\n            tileBatch: 'editor.selection',\n            width: width,\n            height: this.height,\n            x: x,\n            z: -0.3\n        });\n        this.appendChild(this.highlight)\n\n        this.selectionRange[0] = Math.min(anchorIndex, index);\n        this.selectionRange[1] = Math.max(anchorIndex, index);\n        this.selectionAnchor = anchorIndex;\n        this.blinkCounter = 0.0;\n        this.#notifySelectionChange();\n    }\n\n    /* Notify one external owner that the local selection projection changed. */\n    #notifySelectionChange() {\n        this.onSelectionChange?.(this);\n    }\n\n    _extendSelectionWhileDragging(delta) {\n        if (!this.isSelecting || this.holdX === null) {\n            this._selectionAutoScroll = 0;\n            return;\n        }\n\n        const local = this.getLocalMousePosition();\n        if (!local) {\n            return;\n        }\n\n        const width = this.state.width;\n        let direction = 0;\n        let overshoot = 0;\n\n        if (local[0] < 0) {\n            direction = -1;\n            overshoot = -local[0];\n        } else if (local[0] > width) {\n            direction = 1;\n            overshoot = local[0] - width;\n        } else {\n            this._selectionAutoScroll = 0;\n            return;\n        }\n\n        const charsPerSecond = Math.max(60, overshoot * 0.5);\n        this._selectionAutoScroll += charsPerSecond * delta;\n\n        if (this._selectionAutoScroll < 1) {\n            return;\n        }\n\n        const steps = Math.floor(this._selectionAutoScroll);\n        this._selectionAutoScroll -= steps;\n\n        if (steps === 0) {\n            return;\n        }\n\n        let newIndex = this.cursorIndex;\n        for (let step = 0; step < steps; step++) {\n            newIndex = direction < 0 ? previousCodepointIndex(this.textInput, newIndex) : nextCodepointIndex(this.textInput, newIndex);\n        }\n        newIndex = Math.max(0, Math.min(newIndex, this.textInput.length));\n\n        if (newIndex === this.cursorIndex) {\n            return;\n        }\n\n        this.cursorIndex = newIndex;\n        this.#syncDisplay();\n        this._updateHighlight(newIndex);\n    }\n\n    _onDetachNode(shared) {\n        this.#clearSelectionThink();\n        this.#updateSceneDragCapture(false);\n        super._onDetachNode(shared);\n        this.#clearBlinkWake();\n        this.inFocus = false;\n    }\n\n    /* Drop the stage-owned shared caret before subtree detach so recursive teardown never treats it as ordinary InputCell-owned structure. */\n    _onBeforeDetachNode(shared) {\n        super._onBeforeDetachNode(shared);\n        clearFocusTargetReferences(this);\n        if (!this.usesStageCaret()) {\n            return;\n        }\n        const caret = this.scene?.stage?.ownCaret ?? null;\n        if (caret?.parentNode !== this) {\n            return;\n        }\n        this.removeChild(caret);\n    }\n\n\n    /* The document projection uses Stage's one shared caret; ordinary controls own a CaretQuad. */\n    usesStageCaret() {\n        return this.useExternalCaret;\n    }\n    onPointerInput(event) {\n        this.sourceShiftClick = event?.has?.(\"SHIFT_KEY\") === true;\n        this.sourceAltClick = event?.has?.(\"ALT_KEY\") === true;\n        this.sourceCtrlClick = event?.has?.(\"CTRL_KEY\") === true;\n        const hasMouseUp = typeof event?.has === 'function' ? event.has('L_MOUSE_UP') : false;\n        const hasPointerCancel = typeof event?.has === 'function'\n            && (event.has('L_MOUSE_CANCEL') || event.has('POINTER_CANCEL') || event.has('WINDOW_BLUR'));\n        const pointerInput = hasPointerInput(event);\n        const hasTripleClick = typeof event?.has === 'function' && event.has('TRIPLE_CLICK');\n        if (this._consumeTripleClickRelease && hasMouseUp && !hasTripleClick) {\n            this._consumeTripleClickRelease = false;\n            this.#setSelecting(false);\n            return true;\n        }\n        if (hasPointerCancel) {\n            this._consumeTripleClickRelease = false;\n        }\n        /*\n         * Button normally ignores pointer input after its hover state clears.\n         * A live text selection deliberately retains scene capture, though, so\n         * held and release events must still reach this cell after the pointer\n         * leaves its row.\n         */\n        const ownsPointerCapture = this.isSelecting\n            && this.scene?.pointerCaptureOwner === this;\n        let consumed = false;\n        if (ownsPointerCapture) {\n            for (const pointerEvent of event ?? []) {\n                if (this.onInput(pointerEvent) === true) {\n                    consumed = true;\n                }\n            }\n        } else {\n            consumed = super.onPointerInput(event);\n        }\n        \n        if (this.isSelecting) {\n            consumed = true;\n        }   \n        else if(!consumed && pointerInput) {\n            this.removeHighlight()\n        }\n\n        if (hasMouseUp || hasPointerCancel) {\n            this.#setSelecting(false);\n        }\n\n        return consumed;\n    }\n\n    /* Keep the live drag-selection loop explicit by arming or cancelling one scheduled follow-up chain. */\n    #setSelecting(next) {\n        if (this.isSelecting === next) {\n            return;\n        }\n        this.isSelecting = next;\n        if (!next) {\n            this.#updateSceneDragCapture(false);\n            this._selectionAutoScroll = 0;\n            this.#clearSelectionThink();\n            return;\n        }\n        this.#updateSceneDragCapture(true);\n        this._selectionLastThinkS = null;\n        this.#scheduleSelectionThink();\n    }\n\n    /* Cancel one pending drag-selection follow-up when the drag ends or the node detaches. */\n    #clearSelectionThink() {\n        if (this.ownSelectionThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownSelectionThink);\n        this.ownSelectionThink = null;\n    }\n\n    /* Advance drag-selection only while it is live, rearming the next frame explicitly rather than via automatic node polling. */\n    #scheduleSelectionThink() {\n        this.#clearSelectionThink();\n        if (!this.isSelecting || !this.scene) {\n            return;\n        }\n        this.ownSelectionThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), ({ now_s }) => {\n            this.ownSelectionThink = null;\n            if (!Mouse.leftDown) {\n                this.#setSelecting(false);\n                return;\n            }\n            const last = this._selectionLastThinkS ?? (now_s - this.sceneFrameStepS());\n            this._selectionLastThinkS = now_s;\n            if (this.isSelecting) {\n                this._extendSelectionWhileDragging(Math.max(0, now_s - last));\n                this.#scheduleSelectionThink();\n            }\n        });\n    }\n\n    removeHighlight() {\n        this.holdX = null;\n        this.#setSelecting(false);\n        this.selectionAnchor = null;\n        const prev = this.highlight;\n        this.highlight = null;\n        if (prev?.parentNode === this) {\n            this.removeChild(prev)\n        }\n        this.selectionRange = [0, 0];\n        this.#notifySelectionChange();\n    }\n\n    /* Render document-owned ranges without feeding the projection back into input state. */\n    syncDocumentSelection({ segments, carets }, primaryCol, visible) {\n        this.ownDocumentSelectionTiles ??= [];\n        this.ownDocumentCaretTiles ??= [];\n        const cellWidth = this.state.width ?? this.width;\n        const left = Math.min(this.paddingX, cellWidth);\n        const right = Math.max(left, cellWidth - this.paddingX);\n        const rects = (this.wrapText ? segments.flatMap(segment => this.wrappedLayout.selectionRects(segment))\n            .map(rect => ({ ...rect, z: -0.3, tileBatch: 'editor.selection' })) : segments.map(segment => {\n            const x = Math.max(left, Math.min(right, this.getPositionFromIndex(segment.start)));\n            const end = Math.max(x, Math.min(right, this.getPositionFromIndex(segment.end)));\n            return { x, y: 0, width: Math.min(right - x, end - x + (segment.newline ? 8 : 0)), height: this.height,\n                z: -0.3, tileBatch: 'editor.selection' };\n        }));\n        const caretRects = carets.filter(col => col !== primaryCol).map(col => ({\n            x: Math.max(left, Math.min(right - 2, this.getPositionFromIndex(col))),\n            y: this.wrapText ? this.wrappedLayout.point(col).y + this.textYOffset + CARET_Y_OFFSET_PX\n                : this.getCaretY(), width: 2, height: this.getCaretHeight(),\n            z: -0.4, color: [1, 1, 1, 1], tileBatch: 'editor.carets',\n        }));\n        for (const [nodes, layouts, shown] of [\n            [this.ownDocumentSelectionTiles, rects, true],\n            [this.ownDocumentCaretTiles, caretRects, visible],\n        ]) {\n            while (nodes.length > layouts.length) this.removeChild(nodes.pop());\n            for (let i = 0; i < layouts.length; i++) {\n                if (!nodes[i]) {\n                    nodes[i] = new ui.Tile(layouts[i]);\n                    this.appendChild(nodes[i]);\n                } else nodes[i].mutate(layouts[i]);\n                nodes[i].setVisibility(shown);\n            }\n        }\n    }\n\n    hasSelection(){\n        if (this.#usesDocumentSelection) return this.#selectionOwner.sourceCellHasSelection(this);\n        return this.selectionRange[0] !== this.selectionRange[1];\n    }\n\n    /* Restore one document-owned selection without replaying pointer input through the interactive path. */\n    syncSelectionRange(start, end) {\n        const lo = Math.max(0, Math.min(start, end));\n        const hi = Math.max(lo, Math.max(start, end));\n        this.#setSelecting(false);\n        this.cursorIndex = hi;\n        if (lo === hi) {\n            this.removeHighlight();\n            this.#syncDisplay();\n            return false;\n        }\n        this.holdX = lo;\n        this._updateHighlight(hi);\n        this.#syncDisplay();\n        return true;\n    }\n\n    onInput(event) {\n        if (this.#usesDocumentSelection\n            && ['L_MOUSE_DOWN', 'DOUBLE_CLICK', 'TRIPLE_CLICK'].includes(event)) {\n            if (!hasLocalPointerRowHit(this)) return false;\n            const index = this.getIndexFromInput();\n            if (this.sourceAltClick) return this.#selectionOwner.addSourceCaret(this, index);\n            if (this.sourceCtrlClick && !this.sourceShiftClick) {\n                return event === 'L_MOUSE_DOWN'\n                    ? this.#selectionOwner.beginAddSourceSelection(this, index) : true;\n            }\n            if (event === 'L_MOUSE_DOWN') return this.#selectionOwner.beginSourceSelection(this, index, this.sourceShiftClick);\n            const [start, end] = event === 'TRIPLE_CLICK'\n                ? [0, this.textInput.length] : wordRangeAtIndex(this.textInput, index);\n            return this.#selectionOwner.selectSourceCellRange(this, start, end);\n        }\n        if(event === \"L_MOUSE_DOWN\"){\n            const local = this.getLocalMousePosition?.() ?? null;\n            const hit = hasLocalPointerRowHit(this);\n            appendClickTraceEvent('click-hit', {\n                cell: inputCellLabel(this),\n                event,\n                local,\n                width: this.state.width ?? this.width ?? null,\n                height: this.state.height ?? this.height ?? null,\n                scene_picked_id: this.scene?.selectedIteractable ?? null,\n                node_id: this.id ?? null,\n                hit,\n                text_hit: hasLocalPointerDownHit(this),\n                ...pointerDiag(this),\n            });\n            if (!hit) {\n                return false;\n            }\n            const clickedIndex = this.getIndexFromInput();\n            appendClickTraceEvent('click-hit', {\n                cell: inputCellLabel(this),\n                action: 'activate_input_cell',\n                clicked_index: clickedIndex,\n                cursor_before: this.cursorIndex,\n            });\n            let activated = true;\n            if (this.focusContainerOwner?.activateInputCell) {\n                activated = this.focusContainerOwner.activateInputCell(this, clickedIndex) === true;\n            } else {\n                this.syncFocusVisual(true, 'pointer_activate');\n            }\n            if (!activated) {\n                return true;\n            }\n            this.holdX = clickedIndex;\n            this.cursorIndex = clickedIndex;\n            this.selectionRange = [clickedIndex, clickedIndex];\n            // Claim selection ownership before publishing the collapsed range.\n            // The document projection may otherwise briefly restore the prior\n            // drag cursor between this click and the next highlight update.\n            this.#setSelecting(true);\n            this.#notifySelectionChange();\n            this.onClickCell(clickedIndex);\n            \n            this.blinkCounter = 0.0;\n            return true;\n        }\n        if(event === \"L_MOUSE_DOWN_HOLD\" && this.isSelecting && this.holdX !== null){\n            const local = this.getLocalMousePosition();\n            if (!local) {\n                return true;\n            }\n            const [localX] = local;\n            const width = this.state.width ?? this.width ?? 0;\n            if (localX < 0 || localX > width) {\n                // When the pointer leaves horizontally we rely on the auto-scroll\n                // handler updating the selection, so skip the clamped re-snap.\n                return true;\n            }\n            const clickedIndex = this.getIndexFromInput();\n            \n            if (this.cursorIndex !== clickedIndex) {\n                this.cursorIndex = clickedIndex;\n                this.#syncDisplay(); \n            }\n            \n            this._updateHighlight(clickedIndex);\n        }\n\n        if(event === \"TRIPLE_CLICK\"){\n            if (!hasLocalPointerDownHit(this)) {\n                return false;\n            }\n            this.#setSelecting(false);\n            this.holdX = 0;\n            this.cursorIndex = this.textInput.length;\n            this._updateHighlight(this.textInput.length);\n            this._consumeTripleClickRelease = true;\n            return true;\n        }\n        else if(event === \"DOUBLE_CLICK\"){\n            if (!hasLocalPointerDownHit(this)) {\n                return false;\n            }\n            this.#setSelecting(false);\n            const [start, end] = wordRangeAtIndex(this.textInput, this.getIndexFromInput());\n            this.holdX = start;\n            this.cursorIndex = end;\n            this._updateHighlight(end);\n            return true;\n        }\n        else if(event === \"L_MOUSE_UP\"){\n            if (this._consumeTripleClickRelease) {\n                this._consumeTripleClickRelease = false;\n                this.#setSelecting(false);\n                return true;\n            }\n\n            this.#setSelecting(false);\n            return true;\n        }\n      \n        return false;\n    }\n\n    async copyToClipboard(text) {\n        if (!document.hasFocus()) {\n            return;\n        }\n        try {\n            await navigator.clipboard.writeText(text);\n        } catch (err) {\n            console.error('Failed to copy text: ', err);\n        } \n    }\n\n    /* Visual ranges never participate in editor selection or focus. */\n    setVisualHighlights(ranges, activeIndex = -1) {\n        if (!Number.isInteger(activeIndex) || activeIndex < -1 || activeIndex >= ranges.length) {\n            throw new Error(`InputCell active visual highlight outside ranges: index=${activeIndex} count=${ranges.length}.`);\n        }\n        for (const { index, span } of ranges) {\n            if (!Number.isInteger(index) || !Number.isInteger(span) || index < 0\n                || span <= 0 || index + span > this.textInput.length) {\n                throw new Error(`InputCell visual highlight outside text: index=${index} span=${span} length=${this.textInput.length}.`);\n            }\n        }\n        if (activeIndex === this.activeVisualHighlightIndex\n            && ranges.length === this.visualHighlights.length && ranges.every((range, i) =>\n            range.index === this.visualHighlights[i].index && range.span === this.visualHighlights[i].span)) return;\n        this.visualHighlights = ranges.map(({ index, span }) => ({ index, span }));\n        this.activeVisualHighlightIndex = activeIndex;\n        if (activeIndex >= 0 && currentFocusedInputCell() !== this) this.#syncDisplay();\n        else this.#syncVisualHighlights();\n        requestFrame('input_visual_highlights');\n    }\n\n    revealVisualRange(index, span) {\n        if (!Number.isInteger(index) || !Number.isInteger(span) || index < 0\n            || span <= 0 || index + span > this.textInput.length) {\n            throw new Error(`InputCell visual reveal outside text: index=${index} span=${span} length=${this.textInput.length}.`);\n        }\n        this.#syncDisplay(index, span);\n        requestFrame('input_visual_reveal');\n    }\n\n    #syncVisualHighlights() {\n        const left = Math.min(this.paddingX, this.state.width);\n        const right = Math.max(left, this.state.width - this.paddingX);\n        const rects = this.visualHighlights.map(({ index, span }, rangeIndex) => {\n            const x = Math.max(left, Math.min(right, this.getPositionFromIndex(index)));\n            const end = Math.max(x, Math.min(right, this.getPositionFromIndex(index + span)));\n            return { x, y: 0, width: end - x, height: this.height,\n                z: -0.2, color: rangeIndex === this.activeVisualHighlightIndex\n                    ? [...Palette.teal.slice(0, 3), 0.4] : [1, 1, 0, 0.4], tileBatch: 'editor.search',\n                material: translucentSolidTileMaterial() };\n        }).filter(rect => rect.width > 0);\n        while (this.ownVisualHighlightTiles.length > rects.length) this.removeChild(this.ownVisualHighlightTiles.pop());\n        for (let i = 0; i < rects.length; i++) {\n            if (this.ownVisualHighlightTiles[i]) this.ownVisualHighlightTiles[i].mutate(rects[i]);\n            else {\n                const tile = new ui.Tile(rects[i]);\n                this.ownVisualHighlightTiles.push(tile);\n                this.appendChild(tile);\n            }\n        }\n    }\n\n    getPositionFromIndex(index) {\n        if (this.wrapText) return this.wrappedLayout.point(index, index === this.cursorIndex ? this.wrappedCaretAffinity : 'forward').x;\n        const displayText = this.#displayTextSpec();\n        const displayIndex = this.#displayIndexFromSourceIndex(index, displayText.sourcePrefixChars, displayText.displayText.length);\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        return this.displayTextXOffset + positionFromIndex(metrics.widths, displayIndex, displayText.displayText.length, this.displayOffset || 0);\n    }\n\n    /* Report the cursor in text units using the single-line `(line, col)` contract. */\n    cursorTextPosition() {\n        return {\n            line: 0,\n            col: this.cursorIndex,\n        };\n    }\n\n    /* Convert one text cursor position into local caret pixels for the stage-owned caret. */\n    cursorToLocalPoint(line = 0, col = this.cursorIndex) {\n        if (line !== 0) {\n            throw new Error(`InputCell.cursorToLocalPoint(${line}, ${col}): only line 0 is valid for a single-line InputCell.`);\n        }\n        const safeCol = Math.max(0, Math.min(col, this.textInput.length));\n        return {\n            x: this.getPositionFromIndex(safeCol),\n            y: this.wrapText ? this.wrappedLayout.point(safeCol, safeCol === this.cursorIndex ? this.wrappedCaretAffinity : 'forward').y + this.textYOffset + CARET_Y_OFFSET_PX\n                : this.getCaretY(),\n        };\n    }\n\n    /* Convert one local pick point back into the single-line text cursor contract. */\n    localPointToCursor(x, y) {\n        const width = this.state.width ?? this.width ?? 0;\n        const height = this.state.height ?? this.height ?? 0;\n        if (!Number.isFinite(x) || !Number.isFinite(y)) {\n            throw new Error('InputCell.localPointToCursor(...): expected finite local coordinates.');\n        }\n        if (y < 0 || y > height) {\n            throw new Error(`InputCell.localPointToCursor(...): local y ${y} is outside cell height ${height}.`);\n        }\n        if (this.wrapText) return { line: 0, col: this.wrappedLayout.hit(x, y) };\n        const displayText = this.#displayTextSpec();\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        const contentWidth = Math.max(0, width - this.displayTextXOffset - this.paddingX);\n        const clampedX = Math.max(0, Math.min(contentWidth, x - this.displayTextXOffset));\n        const startIdx = this.displayOffset || 0;\n        const endIdx = startIdx + this._visibleText.length;\n        const displayIndex = indexFromPixelX(metrics.widths, startIdx, endIdx, clampedX);\n        return {\n            line: 0,\n            col: this.#sourceIndexFromDisplayIndex(displayIndex, displayText.sourcePrefixChars),\n        };\n    }\n\n    /* Return the local pixel rect for the shared stage caret. */\n    caretPixelRect() {\n        const point = this.cursorToLocalPoint(0, this.cursorIndex);\n        return {\n            x: point.x,\n            y: point.y,\n            width: 2,\n            height: this.getCaretHeight(),\n        };\n    }\n\n    /* Build one focused caret-position crash bundle so impossible external-caret writes fail at source. */\n    #caretPositionDiag(index, x) {\n        const displayText = this.#displayTextSpec();\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        const widths = metrics?.widths ?? [];\n        const textLength = this.textInput.length;\n        const safeIndex = Math.max(0, Math.min(index, textLength));\n        const safeDisplayIndex = this.#displayIndexFromSourceIndex(safeIndex, displayText.sourcePrefixChars, displayText.displayText.length);\n        const offset = this.displayOffset || 0;\n        const width = this.state.width ?? this.width ?? 0;\n        return {\n            cell_id: this.cellID,\n            cursor_index: index,\n            safe_index: safeIndex,\n            display_cursor_index: safeDisplayIndex,\n            display_offset: offset,\n            display_text_x_offset: this.displayTextXOffset,\n            visible_text: this._visibleText,\n            visible_text_length: this._visibleText?.length ?? 0,\n            display_text: displayText.displayText,\n            display_source_prefix_chars: displayText.sourcePrefixChars,\n            text_length: textLength,\n            text_preview: this.textInput.slice(Math.max(0, safeIndex - 16), Math.min(textLength, safeIndex + 16)),\n            caret_x: x,\n            cell_width: width,\n            width_at_index: widths[safeDisplayIndex] ?? null,\n            width_at_offset: widths[offset] ?? null,\n            delta_from_offset: safeDisplayIndex >= offset && widths[safeDisplayIndex] !== undefined && widths[offset] !== undefined\n                ? widths[safeDisplayIndex] - widths[offset]\n                : null,\n            in_focus: this.inFocus,\n            use_external_caret: this.useExternalCaret,\n        };\n    }\n\n    getIndexFromInput() {\n        if (this.wrapText) {\n            const [x, y] = this.getLocalMousePosition();\n            const pick = this.wrappedLayout.pick(x, y);\n            this.wrappedCaretAffinity = pick.affinity;\n            return pick.index;\n        }\n        const displayText = this.#displayTextSpec();\n        if (!this._visibleText) {\n            return Math.min(displayText.sourcePrefixChars, this.textInput.length);\n        }\n\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        const startIdx = this.displayOffset || 0;\n        const endIdx = startIdx + this._visibleText.length;\n        const contentWidth = Math.max(0, this.state.width - this.displayTextXOffset - this.paddingX);\n        const targetPixelX = Math.max(0, Math.min(\n            contentWidth,\n            (this.state.width * this.getClickCoords()[0]) - this.displayTextXOffset,\n        ));\n        const displayIndex = indexFromPixelX(metrics.widths, startIdx, endIdx, targetPixelX);\n        return this.#sourceIndexFromDisplayIndex(displayIndex, displayText.sourcePrefixChars);\n\n    }\n\n\n    getClickCoords({ clamp = true } = {}) {\n        const local = this.getLocalMousePosition();\n        if (!local) {\n            return [0, 0];\n        }\n\n        const [width, height] = [this.state.width, this.state.height];\n\n        let normX = local[0] / width;\n        let normY = local[1] / height;\n\n        if (clamp) {\n            normX = Math.max(0, Math.min(1, normX));\n            normY = Math.max(0, Math.min(1, normY));\n        }\n\n        return [normX, normY];\n    }\n\n    //Dev custom override, mostly this is to support the puffbook know which cell user clicked\n    onClickCell(cursorIndex = this.cursorIndex) {\n    }\n\n    syncFocusVisual(focused, reason = null) {\n        const next = focused === true;\n        if (next && !this.scene) {\n            clearFocusTargetReferences(this);\n            return false;\n        }\n        if (this.inFocus === next) {\n            return false;\n        }\n        appendClickTraceEvent(next ? 'focus' : 'blur', {\n            cell: inputCellLabel(this),\n            cause: reason ?? null,\n            owner: this.focusContainerOwner?.focusContainerKind ?? this.focusContainerOwner?.constructor?.name ?? null,\n            cursor: this.cursorIndex,\n            text: this.textInput,\n        });\n        this.inFocus = next;\n        this.#syncInfoLabel();\n        if (next) {\n            this.#resetBlink('caret_focus');\n            this.scene?.stage?.syncFocusCaret?.();\n            return true;\n        }\n        this.removeHighlight();\n        this.#resetBlink('caret_blur');\n        if (reason !== null) {\n            this.ownerDocumentView?._onOwnedInputCellBlur?.(this, reason);\n        }\n        this.scene?.stage?.syncFocusCaret?.();\n        return true;\n    }\n\n    setFocus() {\n        if (this.focusContainerOwner?.activateInputCell) {\n            return this.focusContainerOwner.activateInputCell(this, this.cursorIndex);\n        }\n        return this.syncFocusVisual(true, 'legacy_focus');\n    }\n\n    static tabFocus(direction) {\n        const cell = currentFocusedInputCell();\n        if (!cell || !cell.focusContainerOwner) {\n            return false;\n        }\n        return cell.focusContainerOwner?.tabFocusInputCell?.(cell, direction) === true;\n    }\n\n    removeFocus(reason = null) {\n        if (reason === null) {\n            return false;\n        }\n        return this.syncFocusVisual(false, reason);\n    }\n\n    onKeyDown(event) {\n        if (!this.inFocus ) {\n            return false;\n        }\n        if (this.#usesDocumentSelection) {\n            return this.keyDelegate(event, this) === true;\n        }\n        if (event.key === 'Control' || event.key === 'Meta') {\n            return true;\n        }\n        if(event.ctrlKey || event.metaKey){\n            if (event.key?.toLowerCase() === 'a') {\n                this.holdX = this.#visibleCursorFloor();\n                this.cursorIndex = this.textInput.length;\n                this._updateHighlight(this.cursorIndex);\n                this.#syncCursorTextPosition();\n                this.#syncDisplay();\n                return true;\n            }\n            return false; // Let ctrl and cmd chords be handled by the browser for shortcuts\n        }\n        if (['Shift', 'Alt', 'AltGraph'].includes(event.key)) return true;\n        if (event.key === 'Tab' && !isSpaceTabKey(event)) return false;\n        if (event.altKey && event.key === 'Backspace' && typeof this.keyDelegate === 'function') return false;\n        if(event.key === \"copy\"){\n            if(this.selectionRange[0] !== this.selectionRange[1]){\n                const selectedText = this.textInput.substring(this.selectionRange[0], this.selectionRange[1]);\n                this.copyToClipboard(selectedText);\n            }\n            return true;\n        } else if(event.key === \"cut\"){\n            if(this.selectionRange[0] !== this.selectionRange[1]){\n                const selectedText = this.textInput.substring(this.selectionRange[0], this.selectionRange[1]);\n                this.copyToClipboard(selectedText);\n            }\n        }\n\n        const shiftSelecting = event.shiftKey === true;\n        const key = event.key;\n        if (key === 'Escape') {\n            return false;\n        }\n        const handlesSelection = shiftSelecting && ['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key);\n\n        const hasSelection = this.selectionRange[0] !== this.selectionRange[1];\n        const selStart = Math.min(this.selectionRange[0], this.selectionRange[1]);\n        const selEnd = Math.max(this.selectionRange[0], this.selectionRange[1]);\n        const cursorFloor = this.#visibleCursorFloor();\n\n        const originalCursor = this.cursorIndex;\n        let anchor = this.selectionAnchor;\n        if (hasSelection && anchor === null) {\n            anchor = (originalCursor === selStart) ? selEnd : selStart;\n        }\n        if (handlesSelection && anchor === null) {\n            anchor = originalCursor;\n        }\n\n        let delegateHandled = false;\n        let delegateResult = true;\n        if (typeof this.keyDelegate === 'function') {\n            const delegated = this.keyDelegate(event, this, this.cellID);\n            if (delegated !== false) {\n                delegateHandled = true;\n                delegateResult = delegated ?? true;\n            }\n        }\n\n        if (delegateHandled) {\n            let maintainSelection = false;\n            if (handlesSelection) {\n                const headIndex = this.cursorIndex;\n                const anchorIndex = anchor ?? originalCursor;\n                this.holdX = anchorIndex;\n                this._updateHighlight(headIndex);\n                if (this.selectionRange[0] === this.selectionRange[1]) {\n                    this.removeHighlight();\n                } else {\n                    maintainSelection = true;\n                }\n            } else {\n                this.removeHighlight();\n            }\n            if (!maintainSelection) {\n                this.selectionAnchor = null;\n            }\n            return delegateResult;\n        }\n\n        if (this.readOnly) {\n            this.removeHighlight();\n            return false;\n        }\n\n        // Prevent Alt, AltGr or Shift by itself from clearing the current selection.\n        let maintainSelection = ['Shift', 'Alt', 'AltGraph'].includes(key);\n\n        switch (key) {\n            case 'Enter':\n                // Dialog-like fields can accept on Enter without adding a\n                // second keyboard layer to the parent window.\n                this.onEnterKey();\n                break;\n            case 'ArrowLeft':\n                if (handlesSelection) {\n                    const anchorIndex = anchor ?? originalCursor;\n                    const newIndex = event.altKey\n                        ? moveCursorByWord(this.textInput, originalCursor, 'left')\n                        : Math.max(previousCodepointIndex(this.textInput, originalCursor), cursorFloor);\n                    this.holdX = anchorIndex;\n                    this.cursorIndex = Math.max(newIndex, cursorFloor);\n                    this._updateHighlight(this.cursorIndex);\n                    if (this.selectionRange[0] === this.selectionRange[1]) {\n                        this.removeHighlight();\n                        this.selectionAnchor = null;\n                    } else {\n                        maintainSelection = true;\n                    }\n                } else if (hasSelection) {\n                    this.cursorIndex = Math.max(selStart, cursorFloor);\n                } else {\n                    this.cursorIndex = Math.max(event.altKey\n                        ? moveCursorByWord(this.textInput, this.cursorIndex, 'left')\n                        : Math.max(previousCodepointIndex(this.textInput, this.cursorIndex), cursorFloor), cursorFloor);\n                }\n                break;\n            case 'ArrowRight':\n                if (handlesSelection) {\n                    const anchorIndex = anchor ?? originalCursor;\n                    const newIndex = event.altKey\n                        ? moveCursorByWord(this.textInput, originalCursor, 'right')\n                        : nextCodepointIndex(this.textInput, originalCursor);\n                    this.holdX = anchorIndex;\n                    this.cursorIndex = newIndex;\n                    this._updateHighlight(this.cursorIndex);\n                    if (this.selectionRange[0] === this.selectionRange[1]) {\n                        this.removeHighlight();\n                        this.selectionAnchor = null;\n                    } else {\n                        maintainSelection = true;\n                    }\n                } else if (hasSelection) {\n                    this.cursorIndex = selEnd;\n                } else {\n                    this.cursorIndex = event.altKey\n                        ? moveCursorByWord(this.textInput, this.cursorIndex, 'right')\n                        : nextCodepointIndex(this.textInput, this.cursorIndex);\n                }\n                break;\n            case 'ArrowUp':\n                break;\n            case 'ArrowDown':\n                break;\n            case 'Backspace':\n                if (hasSelection) {\n                    this.textInput =\n                        this.textInput.slice(0, selStart) +\n                        this.textInput.slice(selEnd);\n                    this.cursorIndex = selStart;\n                } else if (this.cursorIndex > cursorFloor) {\n                    const start = event.altKey\n                        ? previousCodepointIndex(this.textInput, this.cursorIndex)\n                        : spaceTabBackspaceStart(this.textInput, this.cursorIndex, cursorFloor);\n                    this.textInput =\n                        this.textInput.slice(0, start) +\n                        this.textInput.slice(this.cursorIndex);\n\n                    this.cursorIndex = start;\n                }\n                break;\n            case 'Delete':\n                if (hasSelection) {\n                    this.textInput =\n                        this.textInput.slice(0, selStart) +\n                        this.textInput.slice(selEnd);\n                    this.cursorIndex = selStart;\n                } else if (this.cursorIndex < this.textInput.length) {\n                    this.textInput =\n                        this.textInput.slice(0, this.cursorIndex) +\n                        this.textInput.slice(nextCodepointIndex(this.textInput, this.cursorIndex));\n                }\n                break;\n            case 'Home':\n                if (handlesSelection) {\n                    const anchorIndex = anchor ?? originalCursor;\n                    const newIndex = cursorFloor;\n                    this.holdX = anchorIndex;\n                    this.cursorIndex = newIndex;\n                    this._updateHighlight(this.cursorIndex);\n                    if (this.selectionRange[0] === this.selectionRange[1]) {\n                        this.removeHighlight();\n                        this.selectionAnchor = null;\n                    } else {\n                        maintainSelection = true;\n                    }\n                } else {\n                    this.cursorIndex = cursorFloor;\n                }\n                break;\n            case 'End':\n                if (handlesSelection) {\n                    const anchorIndex = anchor ?? originalCursor;\n                    const newIndex = this.textInput.length;\n                    this.holdX = anchorIndex;\n                    this.cursorIndex = newIndex;\n                    this._updateHighlight(this.cursorIndex);\n                    if (this.selectionRange[0] === this.selectionRange[1]) {\n                        this.removeHighlight();\n                        this.selectionAnchor = null;\n                    } else {\n                        maintainSelection = true;\n                    }\n                } else {\n                    this.cursorIndex = this.textInput.length;\n                }\n                break;\n            case 'Tab':\n            case 'paste':\n            {\n                const insertionPoint = hasSelection ? selStart : this.cursorIndex;\n                const trailingText = hasSelection\n                    ? this.textInput.slice(selEnd)\n                    : this.textInput.slice(this.cursorIndex);\n                const pasteText = key === 'Tab'\n                    ? SPACE_TAB_TEXT\n                    : normalizePasteText(event.clipboardData, { multiline: false });\n                this.textInput =\n                    this.textInput.slice(0, insertionPoint) +\n                    pasteText +\n                    trailingText;\n                this.cursorIndex = insertionPoint + pasteText.length;\n                break;\n            }\n            default:\n                const isCtrl = (event.ctrlKey || event.metaKey);\n                //Block any ctrlKey and Cmd (Mac)\n                if(isCtrl){\n                    break;\n                }\n\n                if (key.length === 1 ) { // Temporary filter for Shift/Alt/Ctrl\n                    const insertionPoint = hasSelection ? selStart : this.cursorIndex;\n                    const trailingText = hasSelection\n                        ? this.textInput.slice(selEnd)\n                        : this.textInput.slice(this.cursorIndex);\n                    this.textInput =\n                        this.textInput.slice(0, insertionPoint) +\n                        key +\n                        trailingText;\n\n                    this.cursorIndex = insertionPoint + 1;\n                }\n                break;\n        }\n\n        if (!maintainSelection) {\n            this.removeHighlight();\n        }\n\n        this.blinkCounter = 0.0;\n        this.#syncCursorTextPosition();\n        this.#syncDisplay();\n        return true;\n    }\n\n    /* Apply browser beforeinput text, including committed IME composition text. */\n    onBeforeInput(event) {\n        if (!this.inFocus || this.readOnly || !event || typeof event.inputType !== 'string') {\n            return false;\n        }\n        const [rangeStart, rangeEnd] = this.selectionRange;\n        const hasSelection = rangeStart !== rangeEnd;\n        let start = hasSelection ? Math.min(rangeStart, rangeEnd) : this.cursorIndex;\n        let end = hasSelection ? Math.max(rangeStart, rangeEnd) : this.cursorIndex;\n        let replacement = null;\n        switch (event.inputType) {\n            case 'insertText':\n            case 'insertCompositionText':\n            case 'insertFromComposition':\n            case 'insertFromPaste':\n                replacement = typeof event.data === 'string' ? event.data : '';\n                break;\n            case 'deleteContentBackward':\n                if (start !== end) {\n                    replacement = '';\n                } else if (start > this.#visibleCursorFloor()) {\n                    start = spaceTabBackspaceStart(this.textInput, start, this.#visibleCursorFloor());\n                    replacement = '';\n                }\n                break;\n            case 'deleteContentForward':\n                if (start !== end) {\n                    replacement = '';\n                } else if (end < this.textInput.length) {\n                    end = nextCodepointIndex(this.textInput, end);\n                    replacement = '';\n                }\n                break;\n            default:\n                return false;\n        }\n        if (replacement === null) {\n            return true;\n        }\n        this.textInput = this.textInput.slice(0, start) + replacement + this.textInput.slice(end);\n        this.cursorIndex = start + replacement.length;\n        this.removeHighlight();\n        this.selectionRange = [this.cursorIndex, this.cursorIndex];\n        this.#syncCursorTextPosition();\n        this.#syncDisplay();\n        return true;\n    }\n\n    /* Sync one authoritative document projection, including pure visual state flips that do not touch text bytes. */\n    syncFromDocument(newText, newCursorIndex = this.cursorIndex, opts = {}) {\n        const textChanged = typeof newText === 'string' && newText !== this.textInput;\n        if (textChanged) {\n            this.setVisualHighlights([]);\n            this.textInput = newText;\n        }\n        const nextDisplayFontColor = Array.isArray(opts.displayFontColor)\n            ? opts.displayFontColor\n            : this.displayFontColor;\n        const colorChanged = !sameColor(nextDisplayFontColor, this.displayFontColor);\n        this.displayFontColor = nextDisplayFontColor;\n        const nextDisplaySyncSpans = Array.isArray(opts.displaySyncSpans)\n            ? opts.displaySyncSpans\n            : this.displaySyncSpans;\n        const syncChanged = !sameSyncSpans(nextDisplaySyncSpans, this.displaySyncSpans);\n        this.displaySyncSpans = nextDisplaySyncSpans;\n\n        const cursorFloor = this.#usesDocumentSelection ? 0 : this.#visibleCursorFloor();\n        const clampedIndex = Math.max(cursorFloor, Math.min(newCursorIndex ?? cursorFloor, this.textInput.length));\n        const cursorChanged = clampedIndex !== this.cursorIndex;\n        if (!textChanged && !cursorChanged && !colorChanged && !syncChanged) {\n            return;\n        }\n        this.cursorIndex = clampedIndex;\n        this.#syncCursorTextPosition();\n        this.#syncDisplay();\n        if (this.inFocus && (textChanged || cursorChanged)) {\n            this.#resetBlink('caret_sync_document');\n            return;\n        }\n        requestFrame('input_cell_sync_document');\n    }\n\n    refreshDisplayStyle() {\n        this.#syncDisplay();\n        requestFrame('input_cell_refresh_display_style');\n    }\n\n    /* Restore a row's persisted horizontal viewport, then reconcile it with the authoritative caret. */\n    restoreDisplayOffset(offset) {\n        if (!Number.isInteger(offset) || offset < 0) {\n            throw new Error(`InputCell.restoreDisplayOffset(): expected a non-negative integer offset, got ${JSON.stringify(offset)}.`);\n        }\n        this.displayOffset = offset;\n        this.#syncDisplay();\n    }\n\n    hasVisibleCaret() {\n        if (!this.inFocus) {\n            return false;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        if (nowS < this.caretVisibleHoldUntilS) {\n            return true;\n        }\n        return this.blinkCounter < this.blinkSpeed * 0.5;\n    }\n\n    getCaretX() {\n        const displayIndex = this.#displayIndexFromSourceIndex(this.cursorIndex, this._displaySourcePrefixChars, this._displayText.length);\n        const x = this.getPositionFromIndex(this.cursorIndex);\n        if (!Number.isFinite(x)) {\n            throw new Error(`InputCell.getCaretX(): non-finite caret x ${JSON.stringify(this.#caretPositionDiag(this.cursorIndex, x))}`);\n        }\n        const width = this.state.width ?? this.width ?? 0;\n        if (x < -0.01 || x > width + 0.01) {\n            throw new Error(`InputCell.getCaretX(): caret x outside cell bounds ${JSON.stringify(this.#caretPositionDiag(this.cursorIndex, x))}`);\n        }\n        if (this.useExternalCaret && this.inFocus && (displayIndex > (this.displayOffset || 0)) && x <= 0) {\n            throw new Error(`InputCell.getCaretX(): suspicious non-positive external caret x ${JSON.stringify(this.#caretPositionDiag(this.cursorIndex, x))}`);\n        }\n        return x;\n    }\n\n    /* Keep caret geometry slightly lower and taller than the text top inset so it sits more centrally against glyphs. */\n    getCaretY() {\n        return (this.textYOffset ?? 0) + CARET_Y_OFFSET_PX\n            + (this.wrapText ? this.wrappedLayout.point(this.cursorIndex, this.wrappedCaretAffinity).y : 0);\n    }\n\n    /* Use one shared caret height rule for both local and external caret rendering. */\n    getCaretHeight() {\n        return (this.state.fontSize ?? 0) + CARET_HEIGHT_EXTRA_PX;\n    }\n\n    updateCaret(index = null) {\n        let cursorChanged = false;\n        if (index !== null) {\n            const nextIndex = Math.max(0, Math.min(index, this.textInput.length));\n            cursorChanged = nextIndex !== this.cursorIndex;\n            this.cursorIndex = nextIndex;\n            this.#syncCursorTextPosition();\n        }\n        if (cursorChanged) {\n            this.#syncDisplay();\n        }\n        this.#resetBlink('caret_reset');\n    }\n\n    /* Keep one retained-focus caret visibly present for a short grace window after an off-document click. */\n    pinCaretVisible(durationS = RETAINED_POINTER_CARET_HOLD_S) {\n        if (!this.inFocus || !this.scene) {\n            return false;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.caretVisibleHoldUntilS = Math.max(this.caretVisibleHoldUntilS, nowS + Math.max(0, durationS));\n        appendClickTraceEvent('caret-blink', {\n            action: 'pin_visible',\n            cell: inputCellLabel(this),\n            now_s: nowS,\n            hold_until_s: this.caretVisibleHoldUntilS,\n            blink_counter: this.blinkCounter,\n        });\n        this.blinkCounter = 0.0;\n        this.#syncCaret();\n        this.#scheduleBlinkWake();\n        this.#noteBlinkPhaseChange();\n        requestFrame('caret_pin_visible');\n        return true;\n    }\n\n    /* Drop any pending timed blink wake when focus or attachment state changes. */\n    #clearBlinkWake() {\n        if (this._blinkWakeThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this._blinkWakeThink);\n        this._blinkWakeThink = null;\n    }\n\n    /* Wake only when the caret is due to flip visible/invisible, which bounds idle cursor redraws. */\n    #scheduleBlinkWake() {\n        this.#clearBlinkWake();\n        if (!this.inFocus) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        const holdRemainingS = Math.max(0, this.caretVisibleHoldUntilS - nowS);\n        if (holdRemainingS > 0) {\n            appendClickTraceEvent('caret-blink', {\n                action: 'schedule_hold',\n                cell: inputCellLabel(this),\n                now_s: nowS,\n                hold_remaining_s: holdRemainingS,\n                blink_counter: this.blinkCounter,\n            });\n            this._blinkWakeThink = this.thinkAt(nowS + holdRemainingS, () => {\n                this._blinkWakeThink = null;\n                if (!this.inFocus) {\n                    return;\n                }\n                const wakeNowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n                appendClickTraceEvent('caret-blink', {\n                    action: 'wake_hold',\n                    cell: inputCellLabel(this),\n                    now_s: wakeNowS,\n                    hold_until_s: this.caretVisibleHoldUntilS,\n                    blink_counter: this.blinkCounter,\n                    visible: this.hasVisibleCaret(),\n                });\n                this.#syncCaret();\n                this.#noteBlinkPhaseChange();\n                this.#scheduleBlinkWake();\n            });\n            return;\n        }\n        const half = this.blinkSpeed * 0.5;\n        const delayS = this.hasVisibleCaret()\n            ? Math.max(0, half - this.blinkCounter)\n            : Math.max(0, this.blinkSpeed - this.blinkCounter);\n        appendClickTraceEvent('caret-blink', {\n            action: 'schedule',\n            cell: inputCellLabel(this),\n            now_s: nowS,\n            delay_s: delayS,\n            blink_counter: this.blinkCounter,\n            visible: this.hasVisibleCaret(),\n        });\n        this._blinkWakeThink = this.thinkAt(nowS + delayS, () => {\n            this._blinkWakeThink = null;\n            if (!this.inFocus) {\n                return;\n            }\n            const wakeNowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n            appendClickTraceEvent('caret-blink', {\n                action: 'wake',\n                cell: inputCellLabel(this),\n                now_s: wakeNowS,\n                before_counter: this.blinkCounter,\n                before_visible: this.hasVisibleCaret(),\n            });\n            this.blinkCounter = this.hasVisibleCaret()\n                ? half\n                : 0.0;\n            appendClickTraceEvent('caret-blink', {\n                action: 'after_wake',\n                cell: inputCellLabel(this),\n                now_s: wakeNowS,\n                blink_counter: this.blinkCounter,\n                visible: this.hasVisibleCaret(),\n            });\n            this.#syncCaret();\n            this.#noteBlinkPhaseChange();\n            this.#scheduleBlinkWake();\n        });\n    }\n\n    /* Reset caret blink to the visible phase and arm the next edge-triggered wake. */\n    #resetBlink(reason) {\n        this.blinkCounter = 0.0;\n        this.#syncCaret();\n        this.#scheduleBlinkWake();\n        this.#noteBlinkPhaseChange();\n        this.scene?.stage?.syncFocusCaret?.();\n        requestFrame(reason);\n    }\n\n    /* Notify one external-caret owner that the visible blink phase changed. */\n    #noteBlinkPhaseChange() {\n        if (typeof this.onBlinkPhaseChange === 'function') {\n            this.onBlinkPhaseChange(this);\n        }\n    }\n\n    #build() {\n        if (!this.useExternalCaret && !this.caret) {\n            this.caret = new CaretQuad({\n                width: 2,\n                height: this.getCaretHeight(),\n                color: this.caretColor,\n                z: -0.4,\n            });\n            this.caret.setVisibility(false);\n            this.appendChild(this.caret);\n        }\n        this.#syncDisplay();\n    }\n\n    #syncWrappedDisplay() {\n        if (!this.wrappedLayout || this.wrappedLayout.text !== this.textInput\n            || this.wrappedLayout.width !== this.state.width) {\n            this.wrappedLayout = new WrappedInputLayout(this.state.font, this.displayFontSize,\n                this.textInput, this.state.width, this.paddingX, this.wrapLineHeight);\n            super.mutate({ height: this.wrappedLayout.rows.length * this.wrapLineHeight });\n            const rows = this.renderText ? this.wrappedLayout.rows : [];\n            while (this.ownWrappedLabels.length > rows.length) this.removeChild(this.ownWrappedLabels.pop());\n            rows.forEach((row, i) => {\n                const text = this.textInput.slice(row.start, row.end);\n                let label = this.ownWrappedLabels[i];\n                if (!label) {\n                    label = new evilfont.MSDFText({ font: this.state.font, fontSize: this.displayFontSize,\n                        text, textBatching: 'volatile_local', z: -0.3,\n                        x: this.wrappedLayout.padding, y: this.displayTextYOffset + i * this.wrapLineHeight,\n                        fontColor: this.displayFontColor });\n                    this.ownWrappedLabels.push(label);\n                    this.appendChild(label);\n                } else {\n                    if (label.state.text !== text) label.setText(text);\n                    label.mutate({ x: this.wrappedLayout.padding, y: this.displayTextYOffset + i * this.wrapLineHeight });\n                }\n            });\n        }\n        this.displayOffset = 0;\n        this._visibleText = this._displayText = this.textInput;\n        this._displaySourcePrefixChars = 0;\n        this.#syncCaret();\n        this.scene?.stage?.syncFocusCaret?.();\n        if (this.textInput !== this._notifiedText) {\n            this._notifiedText = this.textInput;\n            this.onTextChange?.(this.textInput);\n        }\n    }\n\n    #syncDisplay(targetIndex = null, targetSpan = 0) {\n        if (this.wrapText) return this.#syncWrappedDisplay();\n        if (targetIndex === null) {\n            const active = currentFocusedInputCell() !== this ? this.visualHighlights[this.activeVisualHighlightIndex] : null;\n            targetIndex = active?.index ?? this.cursorIndex;\n            targetSpan = active?.span ?? 0;\n        }\n        const displayText = this.#displayTextSpec();\n        evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        if (this.textInput.length !== 0) {\n\n            const bounds = this.calculateDisplayBounds(targetIndex, targetSpan);\n            \n            this.displayOffset = bounds.displayOffset;\n            this._visibleText = bounds.visibleText;\n            this._displaySourcePrefixChars = displayText.sourcePrefixChars;\n            this._displayText = displayText.displayText;\n\n            if (!this.renderText) {\n                const prev = this.label;\n                this.label = null;\n                if (prev?.parentNode === this) {\n                    this.removeChild(prev);\n                }\n            } else if (!this.label) {\n                this.label = new evilfont.MSDFText({\n                    font: this.state.font,\n                    fontSize: this.displayFontSize,\n                    text: this._visibleText,\n                    textBatching: 'volatile_local',\n                    z: -0.3,\n                    x: this.displayTextXOffset,\n                    y: this.displayTextYOffset,\n                    fontColor: this.displayFontColor,\n                });\n                this.appendChild(this.label);\n            } else if (this.label.state.text !== this._visibleText) {\n                this.label.setText(this._visibleText);\n            }\n            if (this.label) {\n                const glyphColors = this.#visibleGlyphColors(this.label.state.text ?? this._visibleText ?? '');\n                this.label.mutate({\n                    fontSize: this.displayFontSize,\n                    x: this.displayTextXOffset,\n                    y: this.displayTextYOffset,\n                    fontColor: this.displayFontColor,\n                });\n                this.label.setGlyphColors(glyphColors);\n            }\n        } else {\n            const prev = this.label;\n            this.label = null;\n            if (prev?.parentNode === this) {\n                this.removeChild(prev);\n            }\n            this._visibleText = \"\";\n            this._displayText = \"\";\n            this._displaySourcePrefixChars = 0;\n            this.displayOffset = 0;\n        }\n\n        this.#syncInfoLabel();\n        this.#syncCaret();\n        this.#syncVisualHighlights();\n        this.scene?.stage?.syncFocusCaret?.();\n        if (this.textInput !== this._notifiedText) {\n            this._notifiedText = this.textInput;\n            this.onTextChange?.(this.textInput);\n        }\n    }\n\n    setInfoLabelText(text) {\n        if (text === this.infoLabelText) return;\n        this.infoLabelText = text;\n        this.#syncInfoLabel();\n        requestFrame('input_info_label');\n    }\n\n    /* Explanatory text is a display-only sibling, never input or caret content. */\n    #syncInfoLabel() {\n        const visible = this.infoLabel && this.textInput.length === 0\n            && (!this.inFocus || this.infoLabelWhenFocused);\n        if (!visible) {\n            this.infoLabelNode?.setVisibility(false);\n            return;\n        }\n        const maxWidth = Math.max(0, (this.state.width ?? 0) - this.displayTextXOffset - this.paddingX - 2);\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, this.infoLabelText);\n        const bounds = calculateDisplayBounds(metrics.widths, this.infoLabelText, 0, 0, maxWidth);\n        const style = {\n            font: this.state.font,\n            fontSize: this.displayFontSize,\n            text: bounds.visibleText,\n            textBatching: 'volatile_local',\n            x: this.displayTextXOffset,\n            y: this.displayTextYOffset,\n            z: -0.3,\n            fontColor: Palette.grey,\n        };\n        if (!this.infoLabelNode) {\n            this.infoLabelNode = new evilfont.MSDFText(style);\n            this.appendChild(this.infoLabelNode);\n        } else {\n            this.infoLabelNode.setText(bounds.visibleText);\n            this.infoLabelNode.mutate(style);\n        }\n        this.infoLabelNode.setVisibility(true);\n    }\n\n    /* Keep the explicit `(line, col)` cursor view in lock-step with the legacy scalar index. */\n    #syncCursorTextPosition() {\n        this.cursorLine = 0;\n        this.cursorCol = this.cursorIndex;\n    }\n\n    #syncCaret() {\n        if (this.useExternalCaret || !this.caret) {\n            return;\n        }\n        this.caret.setVisibility(this.hasVisibleCaret());\n        // A search viewport can leave the unfocused editor caret offscreen.\n        // Its geometry is reconciled when the input regains focus.\n        if (!this.inFocus) return;\n        this.caret.setLocalPosition(this.getCaretX(), this.getCaretY(), this.caret.localPosition()[2]);\n        this.caret.mutate({\n            height: this.getCaretHeight(),\n            width: 2,\n        });\n    }\n\n    /*\n        Helper to measure text to fit in cell bounds,\n        cursor position and \"camera\" position (the pasrt of text we see).\n    */\n    calculateDisplayBounds(targetIndex, targetSpan = 0) {\n        // Reserve room for the caret itself at the right edge.\n        const maxWidth = Math.max(0, (this.state.width ?? 0) - this.displayTextXOffset - this.paddingX - 2);\n        const displayText = this.#displayTextSpec();\n        const displayIndex = this.#displayIndexFromSourceIndex(targetIndex, displayText.sourcePrefixChars, displayText.displayText.length);\n        const metrics = evilfont.getTextAdvanceMetrics(this.state.font, this.displayFontSize, displayText.displayText);\n        if (targetSpan > 0) {\n            const displayEnd = this.#displayIndexFromSourceIndex(targetIndex + targetSpan,\n                displayText.sourcePrefixChars, displayText.displayText.length);\n            return calculateRangeDisplayBounds(metrics.widths, displayText.displayText,\n                displayIndex, displayEnd, this.displayOffset, maxWidth);\n        }\n        return calculateDisplayBounds(metrics.widths, displayText.displayText, displayIndex, this.displayOffset, maxWidth);\n    }\n\n    /* Resolve one source-to-display projection so hidden markdown leaders affect caret and clicks consistently. */\n    #displayTextSpec() {\n        if (typeof this.displayTransform !== 'function') {\n            return {\n                sourcePrefixChars: 0,\n                displayText: this.textInput,\n            };\n        }\n        return normalizeDisplayTransformResult(this.textInput, this.displayTransform(this.textInput));\n    }\n\n    /* Clip source-column sync spans onto evilfont's shaped glyph stream, skipping whitespace-only advances and glyphless fallbacks. */\n    #visibleGlyphColors(visibleText = this._visibleText ?? '') {\n        const text = typeof visibleText === 'string' ? visibleText : '';\n        if (text.length === 0 || !Array.isArray(this.displaySyncSpans) || this.displaySyncSpans.length === 0) {\n            return null;\n        }\n        const glyphs = this.state.font?.fontData?.glyphs ?? null;\n        if (!glyphs) {\n            return null;\n        }\n        const visibleStart = (this._displaySourcePrefixChars ?? 0) + (this.displayOffset ?? 0);\n        const baseColor = this.displayFontColor ?? Palette.white;\n        const out = [];\n        let wrote = false;\n        let localCol = 0;\n        for (const ch of text) {\n            const cp = ch.codePointAt(0);\n            const glyph = glyphForSymbol(this.state.font.fontData, cp);\n            const sourceStart = visibleStart + localCol;\n            const sourceEnd = sourceStart + ch.length;\n            localCol += ch.length;\n            if (!glyph?.planeBounds) {\n                continue;\n            }\n            let color = baseColor;\n            for (const span of this.displaySyncSpans) {\n                const spanColor = syncPhaseColor(span?.phase ?? null);\n                if (spanColor === null) {\n                    continue;\n                }\n                const spanStart = span.start_col ?? 0;\n                const spanEnd = span.end_col ?? 0;\n                if (sourceStart < spanEnd && sourceEnd > spanStart) {\n                    color = spanColor;\n                    wrote = true;\n                }\n            }\n            out.push(color[0] ?? 1.0, color[1] ?? 1.0, color[2] ?? 1.0, color[3] ?? 1.0);\n        }\n        return wrote ? Float32Array.from(out) : null;\n    }\n\n    /* Keep keyboard cursor motion out of hidden source leaders so visual caret position stays bijective with the visible text. */\n    #visibleCursorFloor() {\n        const displayText = this.#displayTextSpec();\n        return Math.max(0, Math.min(displayText.sourcePrefixChars ?? 0, this.textInput.length));\n    }\n\n    /* Collapse hidden source prefixes onto the visible display origin. */\n    #displayIndexFromSourceIndex(sourceIndex, prefixChars, displayLength) {\n        const safeSource = Math.max(0, Math.min(sourceIndex ?? 0, this.textInput.length));\n        return Math.max(0, Math.min(safeSource - prefixChars, displayLength));\n    }\n\n    /* Map visible-title clicks back into raw source coordinates after the hidden prefix. */\n    #sourceIndexFromDisplayIndex(displayIndex, prefixChars) {\n        const safeDisplay = Math.max(0, Math.min(displayIndex ?? 0, this._displayText.length));\n        return Math.max(0, Math.min(prefixChars + safeDisplay, this.textInput.length));\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* RegExp's Unicode case matching retains offsets in the original UTF-16 text.\n * Escape the query so punctuation is always literal. Queries are single-line. */\nexport function findPuffbookMatches(body, query) {\n    if (query === '' || /[\\r\\n]/u.test(query)) return [];\n    const pattern = new RegExp(query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'giu');\n    const matches = [];\n    let line = 0;\n    let lineStart = 0;\n    let newline = body.indexOf('\\n');\n    for (const match of body.matchAll(pattern)) {\n        while (newline >= 0 && newline < match.index) {\n            line++;\n            lineStart = newline + 1;\n            newline = body.indexOf('\\n', lineStart);\n        }\n        matches.push({ line, index: match.index - lineStart, span: match[0].length });\n    }\n    return matches;\n}\n\n/* A disposable read-only search projection. The document remains the source\n * authority; snapshots are discarded immediately when their token changes. */\nexport class PuffbookSearchSession {\n    constructor({ document, onResults, onReveal, onClosed }) {\n        this.document = document;\n        this.onResults = onResults;\n        this.onReveal = onReveal;\n        this.onClosed = onClosed;\n        this.query = '';\n        this.matches = [];\n        this.activeIndex = -1;\n        this.source = null;\n        this.error = null;\n        this.disposed = false;\n        this.loading = false;\n        this.requestedToken = null;\n        this.ownOnChange = () => this.refresh();\n        document.onChange(this.ownOnChange);\n        this.refresh();\n    }\n\n    refresh() {\n        if (this.disposed) return;\n        if (this.document.isClosed()) { this.onClosed(); return; }\n        const token = this.document.sourceTextToken();\n        if (token === this.requestedToken) return;\n        this.requestedToken = token;\n        this.source = null;\n        this.error = null;\n        this.matches = [];\n        this.activeIndex = -1;\n        this.onResults(this);\n        this.document.setSearchSourceDemand(null);\n        if (!this.loading) void this.#load();\n    }\n\n    async #load() {\n        this.loading = true;\n        try {\n            while (!this.disposed && this.source === null) {\n                const requested = this.requestedToken;\n                let source;\n                try {\n                    source = await this.document.completeSourceSnapshot();\n                } catch (error) {\n                    if (this.disposed) return;\n                    if (requested !== this.requestedToken) continue;\n                    this.error = error;\n                    this.onResults(this);\n                    return;\n                }\n                if (this.disposed) return;\n                if (source.token !== this.document.sourceTextToken() || requested !== this.requestedToken) continue;\n                this.source = source;\n                this.#match();\n            }\n        } finally { this.loading = false; }\n    }\n\n    setQuery(query) {\n        this.query = query;\n        if (this.error) {\n            this.requestedToken = null;\n            this.refresh();\n        } else this.#match();\n    }\n\n    #match() {\n        this.matches = this.source ? findPuffbookMatches(this.source.body, this.query) : [];\n        this.activeIndex = this.matches.length ? 0 : -1;\n        this.onResults(this);\n        if (this.activeIndex >= 0) this.onReveal(this.matches[0], this.source.token);\n        else this.document.setSearchSourceDemand(null);\n    }\n\n    navigate(direction) {\n        if (this.matches.length === 0) return;\n        this.activeIndex = (this.activeIndex + direction + this.matches.length) % this.matches.length;\n        this.onResults(this);\n        this.onReveal(this.matches[this.activeIndex], this.source.token);\n    }\n\n    dispose() {\n        if (this.disposed) return;\n        this.disposed = true;\n        this.document.offChange(this.ownOnChange);\n        this.document.setSearchSourceDemand(null);\n        this.source = null;\n        this.matches = [];\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { DialogPanel } from './dialog-panel.mjs';\nimport { InputCell } from './input-cell.mjs';\nimport { UIDialog } from './ui-dialog.mjs';\nimport { MSDFText } from '../evilfont/evilfont.mjs';\nimport { PuffbookSearchSession } from '../../puffbook-search.mjs';\nimport { Button } from './button.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { shapes } from './tile-shape.mjs';\nimport { materials } from './tile-material.mjs';\n\nconst PANEL_WIDTH = 384;\nconst PANEL_HEIGHT = 34;\nconst INPUT_HEIGHT = 28;\nconst INPUT_FONT_SIZE = 16;\nconst BUTTON_SIZE = 16;\nconst BUTTON_GAP = 8;\nconst INPUT_BUTTON_GAP = 12;\nconst BUTTON_COUNT_GAP = 15;\nconst CONTENT_Z = -0.3;\nconst QUERY_PLACEHOLDER = 'Find in puffbook';\nconst CONTROLS = [['upButton', 10], ['downButton', 11], ['clearButton', 3]];\n\nexport class SearchPuffbookPanel extends DialogPanel {\n    constructor({ font, documentView }) {\n        // With the dialog's 8px padding, the complete panel is 400 x 50px.\n        super({ name: 'search-puffbook', width: PANEL_WIDTH, height: PANEL_HEIGHT });\n        this.font = font;\n        this.documentView = documentView;\n    }\n\n    static open(documentView) {\n        return UIDialog.mount(documentView, {\n            panel: new SearchPuffbookPanel({ font: documentView.state.font, documentView }),\n            placement: 'hud',\n            hudAnchor: 'top_center',\n            y: 12,\n        });\n    }\n\n    build(dialog) {\n        CONTROLS.forEach(([key, iconID]) => {\n            this[key] = new Button({\n                name: `searchPuffbook_${key}`,\n                z: CONTENT_Z,\n                width: BUTTON_SIZE, height: BUTTON_SIZE,\n                iconID, iconSize: key === 'clearButton' ? [10, 10] : [14, 14], iconExpand: false,\n                iconColor: Palette.darkgrey, onHoverIconColor: Palette.white,\n                color: Palette.lightgrey, onHoverColor: Palette.charcoal,\n                shape: shapes.rounded({ cornerRadius: BUTTON_SIZE * 0.5 }),\n                material: materials.solid(),\n            });\n            this.appendChild(this[key]);\n        });\n        this.input = new InputCell({\n            name: 'searchPuffbookInput',\n            font: this.font,\n            fontSize: INPUT_FONT_SIZE,\n            x: 0,\n            width: this.state.width,\n            height: INPUT_HEIGHT,\n            y: (this.state.height - INPUT_HEIGHT) * 0.5,\n            focusContainerOwner: dialog,\n            infoLabel: true,\n            infoLabelWhenFocused: true,\n            infoLabelText: QUERY_PLACEHOLDER,\n            onTextChange: query => this.session.setQuery(query),\n            keyDelegate: event => {\n                if (event.key !== 'Enter' || event.isComposing) return false;\n                this.session.navigate(event.shiftKey ? -1 : 1);\n                return true;\n            },\n        });\n        this.appendChild(this.input);\n        dialog.registerInputField('query', this.input);\n        this.count = new MSDFText({\n            font: this.font, fontSize: 14, text: '...',\n            fontColor: Palette.white,\n            textBatching: 'volatile_local',\n            z: CONTENT_Z,\n        });\n        this.appendChild(this.count);\n        this.session = new PuffbookSearchSession({\n            document: this.documentView.state.doc,\n            onResults: session => this.#updateResults(session),\n            onReveal: (match, token) => this.documentView.revealSearchMatch(match, token),\n            onClosed: () => dialog.dismiss('document_closed'),\n        });\n        this.upButton.onInput = Button.onPrimaryRelease(() => this.session.navigate(-1));\n        this.downButton.onInput = Button.onPrimaryRelease(() => this.session.navigate(1));\n        this.clearButton.onInput = Button.onPrimaryRelease(() => {\n            this.input.removeHighlight();\n            this.input.syncFromDocument('', 0);\n            this.input.setFocus();\n        });\n    }\n\n    #updateResults(session) {\n        this.documentView.setSearchMatches(session.matches, session.source?.token ?? null, session.activeIndex);\n        this.count.setText(session.error ? 'Load failed' : session.source === null ? '...'\n            : `${session.activeIndex + 1}/${session.matches.length}`);\n        this.input.setInfoLabelText(session.error ? session.error.message : QUERY_PLACEHOLDER);\n        this.#layoutContent();\n    }\n\n    #layoutContent() {\n        const countX = this.state.width - this.count.width();\n        const controlsWidth = CONTROLS.length * BUTTON_SIZE + (CONTROLS.length - 1) * BUTTON_GAP;\n        const buttonsX = countX - BUTTON_COUNT_GAP - controlsWidth;\n        this.input.mutate({ width: buttonsX - INPUT_BUTTON_GAP });\n        CONTROLS.forEach(([key], index) => this[key].setLocalPosition([\n            buttonsX + index * (BUTTON_SIZE + BUTTON_GAP),\n            (this.state.height - BUTTON_SIZE) * 0.5,\n            CONTENT_Z,\n        ]));\n        this.count.setLocalPosition([\n            countX,\n            (this.state.height - this.count.height()) * 0.5,\n            CONTENT_Z,\n        ]);\n    }\n\n    onKeyDown(event) {\n        if (!event.ctrlKey || event.altKey || event.metaKey || event.shiftKey || event.isComposing) return false;\n        if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return false;\n        this.session.navigate(event.key === 'ArrowUp' ? -1 : 1);\n        return true;\n    }\n\n    onDismiss() {\n        this.session?.dispose();\n        this.documentView.setSearchMatches([]);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as ui from './evilui.mjs'\n\nexport class CloseButton extends ui.Button {\n\n    constructor(state) {\n        //Override button a square\n        state.width = state.width || 32\n        state.height = state.height ||32\n        state.color = [1, 0, 0, 1]\n        state.onHoverColor = [0.3255, 0.6157, 0.5961, 1.0]\n        state.iconID = 3\n        state.iconColor = [1, 1, 1, 1]\n        state.onHoverIconColor = [1, 1, 1, 1]\n\n        super(state)\n        this.nodeToFree = state.nodeToFree ?? null;\n        /*\n            I'm not sure we ever going to need this\n            but this is probably the only thing that\n            can go wrong.\n\n            idea: we could assume the nodeToFree\n            is allways the parent of this node?\n            Or maybe use it as backup.\n        */\n        if (this.nodeToFree === this.state.root) {\n            throw new Error(\"Node to Free should not be a root node.\")\n        }\n        if (!this.nodeToFree.parentNode) {\n            throw new Error(\"Attempting to link an orphan node to a Close Button, which is illegal.\")\n        }\n    }\n\n    onInput(event) {\n        if (!isActivationEvent(event)) {\n            return false;\n        }\n        if (this.nodeToFree) {\n            if (typeof this.nodeToFree.closeFocusContainer === 'function') {\n                this.nodeToFree.closeFocusContainer();\n                return true;\n            }\n            const target = this.nodeToFree.ownMount ?? this.nodeToFree;\n            target.parentNode?.removeChild(target);\n        }\n        return true;\n    }\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { normalizePasteText } from './clipboard-text.mjs';\nimport { moveCursorByWord } from './text-utils.mjs';\nimport { SPACE_TAB_TEXT, isSpaceTabKey, spaceTabBackspaceStart } from './space-tabs.mjs';\n\n/**\n    contentFunc is a function from the line number (b) to the text content of that line.\n    length is the number of lines in the document being edited.\n*/\nexport function decodeMultilineTextEditKeyDown(evt, cursor, contentFunc, length) {\n        if (length === 0) {\n            throw new Error(`decodeMultilineTextEditKeyDown: requires a document with at least one line.`);\n        }\n\n        let [b, c] = cursor;\n        b = Math.min(b, length - 1);\n        const curLine = contentFunc(b);\n        c = Math.min(c, curLine.length);\n\n        let edits = [];\n        switch (evt.key) {\n            case 'ArrowLeft':\n                if (c === 0 && b > 0) {\n                    b--;\n                    c = contentFunc(b).length;\n                } else {\n                    c = evt.altKey\n                        ? moveCursorByWord(curLine, c, 'left')\n                        : Math.max(c - 1, 0);\n                }\n                break;\n\n            case 'ArrowRight':\n                c = evt.altKey\n                    ? moveCursorByWord(curLine, c, 'right')\n                    : Math.min(c + 1, curLine.length);\n                break;\n\n            case 'ArrowUp':\n                b = Math.max(b - 1, 0);\n                break;\n\n            case 'ArrowDown':\n                b = Math.min(b + 1, length - 1);\n                break;\n\n            case 'Home':\n                c = 0;\n                break;\n\n            case 'paste':\n                {\n                    const clipboardText = normalizePasteText(evt.clipboardData, { multiline: true });\n                    if (!clipboardText) {\n                        break;\n                    }\n\n                    const pasteLines = clipboardText.split('\\n');\n                    const before = curLine.substring(0, c);\n                    const after = curLine.substring(c);\n\n                    if (pasteLines.length === 1) {\n                        const newContent = before + clipboardText + after;\n                        edits.push({\n                            type: 'replace',\n                            position: b,\n                            old_content: curLine,\n                            new_content: newContent,\n                        });\n                        c += clipboardText.length;\n                        break;\n                    }\n\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: curLine,\n                        new_content: before + pasteLines[0],\n                    });\n\n                    let insertPos = b + 1;\n                    for (let i = 1; i < pasteLines.length; i++) {\n                        const isLast = i === pasteLines.length - 1;\n                        const lineText = isLast ? pasteLines[i] + after : pasteLines[i];\n                        edits.push({\n                            type: 'add',\n                            position: insertPos,\n                            old_content: null,\n                            new_content: lineText,\n                        });\n                        insertPos++;\n                    }\n\n                    b = insertPos - 1;\n                    c = pasteLines[pasteLines.length - 1].length;\n                }\n                break;\n            case 'Tab':\n                if (isSpaceTabKey(evt)) {\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: curLine,\n                        new_content: curLine.substring(0, c) + SPACE_TAB_TEXT + curLine.substring(c),\n                    });\n                    c += SPACE_TAB_TEXT.length;\n                }\n                break;\n            case 'End':\n                c = curLine.length;\n                break;\n\n            case 'Enter':\n                // Shift-Enter is the \"step down\" variant: keep the current line\n                // intact and always open a blank line below it, even from the\n                // start or middle of the line. This is an affordance for\n                // Jupyter users who have muscle memory for Shift-Enter as\n                // \"Run\". PUFF already runs implicitly, so we keep the\n                // navigation effect instead.\n                if (evt.shiftKey) {\n                    edits.push({\n                        type: 'add',\n                        position: b + 1,\n                        old_content: null,\n                        new_content: '',\n                    });\n                    b++;\n                    c = 0;\n                    break;\n                }\n\n                // Keep these cases explicit. They read a little longer, but they\n                // match the user-visible rule for where the blank line should\n                // appear and where the cursor should land next.\n                if (c === 0 && curLine.length === 0) {\n                    edits.push({\n                        type: 'add',\n                        position: b + 1,\n                        old_content: null,\n                        new_content: '',\n                    });\n                    b++;\n                } else if (c === 0) {\n                    edits.push({\n                        type: 'add',\n                        position: b,\n                        old_content: null,\n                        new_content: '',\n                    });\n                    b++;\n                } else if (c === curLine.length) {\n                    edits.push({\n                        type: 'add',\n                        position: b + 1,\n                        old_content: null,\n                        new_content: '',\n                    });\n                    b++;\n                } else {\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: curLine,\n                        new_content: curLine.substring(0, c),\n                    });\n                    edits.push({\n                        type: 'add',\n                        position: b + 1,\n                        old_content: null,\n                        new_content: curLine.substring(c),\n                    });\n                    b++;\n                }\n                c = 0;\n                break;\n\n            case 'Delete':\n                if (c < curLine.length) {\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: null,\n                        new_content: curLine.substring(0, c) + curLine.substring(c + 1),\n                    });\n                }\n                break;\n\n            case 'Backspace':\n                if (c == 0) {                // Join to previous line\n                    if (b == 0) {\n                        break;  // (Disallow creating zero-line documents)\n                    }\n\n                    // Reuse the lower line object so its output state stays\n                    // attached while we merge upward.\n                    const prevLine = contentFunc(b - 1);\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: prevLine,\n                        new_content: prevLine + curLine,\n                    });\n                    edits.push({\n                        type: 'remove',\n                        position: b - 1,\n                        old_content: prevLine,\n                        new_content: null,\n                    });\n                    b--;\n                    c = prevLine.length;\n\n                } else {                     // Delete mid-line character\n                    const start = evt.ctrlKey || evt.metaKey || evt.altKey\n                        ? c - 1\n                        : spaceTabBackspaceStart(curLine, c);\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: curLine,\n                        new_content: curLine.substring(0, start) + curLine.substring(c)\n                    });\n                    c = start;\n                }\n                break;\n\n            default:\n                if (evt.key.length == 1) {  // Insert one character\n                    edits.push({\n                        type: 'replace',\n                        position: b,\n                        old_content: curLine,\n                        new_content: curLine.substring(0, c) + evt.key + curLine.substring(c)\n                    });\n                    c++;\n                }\n                break;\n        }\n\n        return [edits, [b, c]];\n    }\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\n\nconst DEFAULT_GAP = 6;\n\nexport class LabelledIcon extends ui.Placeholder {\n    ownBacking = null;\n    ownIcon = null;\n    ownLabel = null;\n\n    constructor(state = {}) {\n        if (!state.font) {\n            throw new Error('LabelledIcon requires a font.');\n        }\n        super({\n            iconWidth: 64,\n            iconHeight: 64,\n            iconColor: [1, 1, 1, 1],\n            iconTrimTop: 0,\n            iconTrimBottom: 0,\n            labelText: '',\n            labelFontSize: 16,\n            labelColor: [1, 1, 1, 1],\n            gap: DEFAULT_GAP,\n            labelOffsetY: 0,\n            labelPosition: 'below',\n            backgroundColor: null,\n            paddingX: 0,\n            paddingY: 0,\n            ...state,\n        });\n\n        this.ownBacking = new ui.Tile({\n            z: this.state.backgroundZ ?? 0.0,\n            color: this.state.backgroundColor ?? [0, 0, 0, 0],\n            visible: Array.isArray(this.state.backgroundColor),\n        });\n        this.appendChild(this.ownBacking);\n\n        this.ownIcon = new ui.Icon({\n            width: this.state.iconWidth,\n            height: this.state.iconHeight,\n            z: this.state.iconZ ?? -0.1,\n            iconID: this.state.iconID ?? null,\n            color: this.state.iconColor,\n        });\n        this.appendChild(this.ownIcon);\n\n        this.ownLabel = new evilfont.MSDFText({\n            font: this.state.font,\n            fontSize: this.state.labelFontSize,\n            text: this.state.labelText,\n            // Badges fade and toggle independently. A node-local batch keeps one\n            // hidden sibling from lending stale glyph colour/opacity buffers to it.\n            textBatching: 'volatile_local',\n            z: this.state.labelZ ?? -0.1,\n            fontColor: this.state.labelColor,\n        });\n        this.appendChild(this.ownLabel);\n\n        this.#syncLayout();\n    }\n\n    /* Reflow the icon/label stack and publish one authoritative outer extent for parent layout helpers. */\n    #syncLayout() {\n        const labelLayout = evilfont.MSDFText.measureFromState({\n            font: this.state.font,\n            fontSize: this.state.labelFontSize,\n            text: this.state.labelText,\n        });\n        const iconWidth = this.state.iconWidth;\n        const iconHeight = this.state.iconHeight;\n        const trimTop = this.state.iconTrimTop ?? 0;\n        const trimBottom = this.state.iconTrimBottom ?? 0;\n        if (!Number.isFinite(trimTop) || trimTop < 0 || !Number.isFinite(trimBottom) || trimBottom < 0) {\n            throw new Error('LabelledIcon requires non-negative finite icon trims.');\n        }\n        if (trimTop + trimBottom >= iconHeight) {\n            throw new Error('LabelledIcon icon trims must leave positive effective icon height.');\n        }\n        const iconVisualHeight = iconHeight - trimTop - trimBottom;\n        const labelAbove = this.state.labelPosition === 'above';\n        if (!labelAbove && this.state.labelPosition !== 'below') {\n            throw new Error(`LabelledIcon labelPosition must be 'above' or 'below'.`);\n        }\n        const labelGap = this.state.labelText ? this.state.gap : 0;\n        const labelTop = labelAbove\n            ? (this.state.labelOffsetY ?? 0)\n            : iconVisualHeight + labelGap + (this.state.labelOffsetY ?? 0);\n        const iconTop = labelAbove\n            ? (this.state.labelText ? labelLayout.height + labelGap : 0)\n            : 0;\n        const contentWidth = Math.max(iconWidth, labelLayout.width);\n        const contentHeight = labelAbove\n            ? iconTop + iconVisualHeight\n            : this.state.labelText ? Math.max(iconVisualHeight, labelTop + labelLayout.height) : iconVisualHeight;\n        const paddingX = this.state.paddingX ?? 0;\n        const paddingY = this.state.paddingY ?? 0;\n        const width = contentWidth + paddingX * 2;\n        const height = contentHeight + paddingY * 2;\n\n        this.width = width;\n        this.height = height;\n        this.state.width = width;\n        this.state.height = height;\n\n        this.ownBacking.mutate({\n            width,\n            height,\n            color: this.state.backgroundColor ?? [0, 0, 0, 0],\n        });\n        this.ownBacking.setVisibility(Array.isArray(this.state.backgroundColor));\n\n        this.ownIcon.mutate({\n            width: iconWidth,\n            height: iconHeight,\n            iconID: this.state.iconID ?? null,\n            color: this.state.iconColor,\n        });\n        this.ownIcon.setLocalPosition([\n            paddingX + (contentWidth - iconWidth) * 0.5,\n            paddingY + iconTop - trimTop,\n            this.ownIcon.localPosition()[2],\n        ]);\n\n        this.ownLabel.mutate({\n            fontSize: this.state.labelFontSize,\n            fontColor: this.state.labelColor,\n        });\n        this.ownLabel.setText(this.state.labelText);\n        this.ownLabel.setLocalPosition([\n            paddingX + (contentWidth - labelLayout.width) * 0.5,\n            paddingY + labelTop,\n            this.ownLabel.localPosition()[2],\n        ]);\n    }\n\n    /* Forward icon/label state changes through one surface and keep the centred layout closed afterwards. */\n    mutate(newState) {\n        super.mutate(newState);\n        this.#syncLayout();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { noteProgramReady, warnProgramPending } from './gl-program-wait.mjs';\n\nexport class Polygon extends ui.Tile {\n    constructor(state) {\n        super(state);\n\n        this.mesh = this.state.mesh;\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.polygon');\n        shared.progWait = null;\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vshader = 'lib/evilui/forward';\n            const fshader = 'lib/evilui/solid';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.polygon', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(vshader + '.vs.glsl', fshader + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                const name = shared.nodes?.[0]?.state?.name ?? shared.resourceKey ?? 'Polygon';\n                console.warn(`Shader ${vshader} failed to link. ${name} will not render.`);\n            }\n        })();  // fire-and-forget\n\n\n    }\n\n    getMesh() {\n        if (!this.mesh) {\n            console.error(\"POLYGON mesh is invalid.\")\n            return;\n        }\n        return this.mesh\n    }\n\n    _onReleaseNode(gl, shared) {\n        deleteBufferInfo(gl, this.ownGlBufferInfo);\n        this.ownGlBufferInfo = null;\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        shared.ownGlProgram = null;\n    }\n\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        if (status) status.response = ui.RENDER_STATUS.LOADING;\n        const nodes = shared.nodes.filter(node => node.computedVisible !== false);\n        if (nodes.length < 1) {\n            if (status) status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        if (!shared.ownGlProgram) {\n            const n = nodes.length;\n            warnProgramPending(shared, 'Polygon batch', ` (nodes=${n})`);\n            return;\n        }\n        noteProgramReady(shared, 'Polygon batch');\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n\n        twgl.setUniforms(borGlProgram, {\n            u_time: t,\n            u_viewMatrix: viewMatrix,\n            u_projectionMatrix: projectionMatrix\n        });\n\n        for (const node of nodes) {\n            const pose = node._batchPose?.(shared.scene);\n            if (!pose) {\n                throw new Error(`${node.state?.name ?? node.constructor?.name ?? 'Polygon'} reached draw without a live batch pose.`);\n            }\n\n            // Batch\n            if (!node.ownGlBufferInfo) {\n                node.ownGlBufferInfo = gpuDiagWithResourceOrigin('polygon.node_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n                    position: node.getMesh()\n                }));\n            }\n\n            twgl.setBuffersAndAttributes(gl, borGlProgram, node.ownGlBufferInfo);\n\n            twgl.setUniforms(borGlProgram, {\n                u_matrix: pose.worldMatrix,\n                u_resolution: [node.state.width, node.state.height],\n                u_color: [\n                    node.state.color[0],\n                    node.state.color[1],\n                    node.state.color[2],\n                    (node.state.color[3] ?? 1.0) * (pose.opacity ?? 1.0),\n                ]\n            });\n\n            twgl.drawBufferInfo(gl, node.ownGlBufferInfo);\n        }\n\n        if (status) status.response = ui.RENDER_STATUS.READY;\n    \n    }\n\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Format} from './format-types';\nimport {FetchLike, TransformBatches} from './types';\nimport {ReadableFile} from './lib/files/file';\n\n// LOADERS\n\n/**\n * Core Loader Options\n */\nexport type StrictLoaderOptions = {\n  core?: {\n    /** Base URL for resolving relative paths */\n    baseUrl?: string;\n    /** fetch options or a custom fetch function */\n    fetch?: typeof fetch | FetchLike | RequestInit | null;\n    /** Do not throw on errors */\n    nothrow?: boolean;\n\n    /** loader selection, search first for supplied mimeType */\n    mimeType?: string;\n    /** loader selection, provide fallback mimeType is server does not provide */\n    fallbackMimeType?: string;\n    /** loader selection, avoid searching registered loaders */\n    ignoreRegisteredLoaders?: boolean;\n\n    // general\n    /** Experimental: Supply a logger to the parser */\n    log?: any;\n\n    // batched parsing\n\n    /** Size of each batch. `auto` matches batches to size of incoming chunks */\n    batchSize?: number | 'auto';\n    /** Minimal amount of time between batches */\n    batchDebounceMs?: number;\n    /** Stop loading after a given number of rows (compare SQL limit clause) */\n    limit?: 0;\n    /** Experimental: Stop loading after reaching */\n    _limitMB?: 0;\n    /** Generate metadata batches */\n    metadata?: boolean;\n    /** Transforms to run on incoming batches */\n    transforms?: TransformBatches[];\n\n    // module loading\n\n    /** Force to load WASM libraries from local file system in NodeJS or from loaders.gl CDN in a web browser */\n    useLocalLibraries?: boolean;\n\n    // workers\n\n    /** CDN load workers from */\n    CDN?: string | null;\n    /** Set to `false` to disable workers */\n    worker?: boolean;\n    /** Number of concurrent workers (per loader) on desktop browser */\n    maxConcurrency?: number;\n    /** Number of concurrent workers (per loader) on mobile browsers */\n    maxMobileConcurrency?: number;\n    /** Set to `false` to prevent reuse workers */\n    reuseWorkers?: boolean;\n    /** Whether to use workers under Node.js (experimental) */\n    _nodeWorkers?: boolean;\n    /** set to 'test' to run local worker */\n    _workerType?: string;\n  };\n\n  /** Any additional JS libraries */\n  modules?: Record<string, unknown>;\n\n  // Accept other keys (loader options objects, e.g. `options.csv`, `options.json` ...)\n  [loaderId: string]: Record<string, unknown> | undefined;\n};\n\n/**\n * Core Loader Options\n */\nexport type LoaderOptions = {\n  core?: StrictLoaderOptions['core'];\n  modules?: StrictLoaderOptions['modules'];\n\n  // Deprecated top-level aliases for core options\n  /** @deprecated Use options.core.baseUrl */\n  baseUri?: string;\n  /** @deprecated Use options.core.fetch */\n  fetch?: typeof fetch | FetchLike | RequestInit | null;\n  /** @deprecated Use options.core.mimeType */\n  mimeType?: string;\n  /** @deprecated Use options.core.fallbackMimeType */\n  fallbackMimeType?: string;\n  /** @deprecated Use options.core.ignoreRegisteredLoaders */\n  ignoreRegisteredLoaders?: boolean;\n  /** @deprecated Use options.core.nothrow */\n  nothrow?: boolean;\n  /** @deprecated Use options.core.log */\n  log?: any;\n  /** @deprecated Use options.core.useLocalLibraries */\n  useLocalLibraries?: boolean;\n  /** @deprecated Use options.core.CDN */\n  CDN?: string | null;\n  /** @deprecated Use options.core.worker */\n  worker?: boolean;\n  /** @deprecated Use options.core.maxConcurrency */\n  maxConcurrency?: number;\n  /** @deprecated Use options.core.maxMobileConcurrency */\n  maxMobileConcurrency?: number;\n  /** @deprecated Use options.core.reuseWorkers */\n  reuseWorkers?: boolean;\n  /** @deprecated Use options.core._nodeWorkers */\n  _nodeWorkers?: boolean;\n  /** @deprecated Use options.core._workerType */\n  _workerType?: string;\n  /** @deprecated Use options.core._workerType */\n  _worker?: string;\n  /** @deprecated Use options.core.limit */\n  limit?: 0;\n  /** @deprecated Use options.core._limitMB */\n  _limitMB?: 0;\n  /** @deprecated Use options.core.batchSize */\n  batchSize?: number | 'auto';\n  /** @deprecated Use options.core.batchDebounceMs */\n  batchDebounceMs?: number;\n  /** @deprecated Use options.core.metadata */\n  metadata?: boolean;\n  /** @deprecated Use options.core.transforms */\n  transforms?: TransformBatches[];\n\n  // Accept other keys (loader options objects, e.g. `options.csv`, `options.json` ...)\n  [loaderId: string]: unknown;\n};\n\ntype PreloadOptions = {\n  [key: string]: unknown;\n};\n\n/**\n * A worker loader definition that can be used with `@loaders.gl/core` functions\n */\nexport type Loader<DataT = any, BatchT = any, LoaderOptionsT = StrictLoaderOptions> = Format & {\n  /** The result type of this loader  */\n  dataType?: DataT;\n  /** The batched result type of this loader  */\n  batchType?: BatchT;\n\n  /** Default Options */\n  options: LoaderOptionsT;\n  /** Deprecated Options */\n  deprecatedOptions?: Record<string, string | Record<string, string>>;\n  /** Version should be injected by build tools */\n  version: string;\n  /** A boolean, or a URL */\n  worker?: string | boolean;\n  // end Worker\n\n  /** Human readable name */\n  name: string;\n  /** id should be the same as the field used in LoaderOptions */\n  id: string;\n  /** module is used to generate worker threads, need to be the module directory name */\n  module: string;\n  /** Which category does this loader belong to */\n  category?: string;\n  /** File extensions that are potential matches with this loader. */\n  extensions: string[];\n  /** MIMETypes that indicate a match with this loader. @note Some MIMETypes are generic and supported by many loaders */\n  mimeTypes: string[];\n  /** Is the input of this loader binary */\n  binary?: boolean;\n  /** Is the input of this loader text */\n  text?: boolean;\n\n  /** Test some initial bytes of content to see if this loader might be a match */\n  tests?: (((ArrayBuffer: ArrayBuffer) => boolean) | ArrayBuffer | string)[];\n\n  /** @deprecated */\n  supported?: boolean;\n  /** @deprecated */\n  testText?: (string: string) => boolean;\n};\n\n/**\n * A \"bundled\" loader definition that can be used with `@loaders.gl/core` functions\n * If a worker loader is supported it will also be supported.\n */\nexport type LoaderWithParser<\n  DataT = any,\n  BatchT = any,\n  LoaderOptionsT = StrictLoaderOptions\n> = Loader<DataT, BatchT, LoaderOptionsT> & {\n  /** Perform actions before load. @deprecated Not officially supported. */\n  preload?: Preload;\n  /** Parse asynchronously and atomically from an arraybuffer */\n  parse: (\n    arrayBuffer: ArrayBuffer,\n    options?: LoaderOptionsT,\n    context?: LoaderContext\n  ) => Promise<DataT>;\n  /** Parse asynchronously and atomically from a random access \"file like\" input */\n  parseFile?: (\n    file: ReadableFile,\n    options?: LoaderOptionsT,\n    context?: LoaderContext\n  ) => Promise<DataT>;\n  /** Parse synchronously and atomically from an arraybuffer */\n  parseSync?: (\n    arrayBuffer: ArrayBuffer,\n    options?: LoaderOptionsT,\n    context?: LoaderContext\n  ) => DataT;\n  /** Parse batches of data from an iterator (e.g. fetch stream), return an iterator that yield parsed batches. */\n  parseInBatches?: (\n    iterator:\n      | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n      | Iterable<ArrayBufferLike | ArrayBufferView>,\n    options?: LoaderOptionsT,\n    context?: LoaderContext\n  ) => AsyncIterable<BatchT>;\n  /** For random access, file like sources, source that don't integrate with fetch. */\n  parseFileInBatches?: (\n    file: ReadableFile,\n    options?: LoaderOptionsT,\n    context?: LoaderContext\n  ) => AsyncIterable<BatchT>;\n\n  /** Parse atomically from a string asynchronously */\n  parseText?: (text: string, options?: LoaderOptionsT, context?: LoaderContext) => Promise<DataT>;\n  /** Parse atomically from a string synchronously */\n  parseTextSync?: (text: string, options?: LoaderOptionsT, context?: LoaderContext) => DataT;\n};\n\n/**\n * A Loader context is provided as a third parameters to a loader object's\n * parse functions when that loader is called by other loaders rather then\n * directly by the application.\n *\n * - The context object allows the subloaders to be aware of the parameters and\n *   options that the application provided in the top level call.\n * - The context also providedsaccess to parse functions so that the subloader\n *   does not need to include the core module.\n * - In addition, the context's parse functions may also redirect loads from worker\n *   threads back to main thread.\n */\nexport type LoaderContext = {\n  /** Loader list provided to top-level loader call plus any sub loaders */\n  loaders?: Loader[] | null;\n  /** If URL is available.  */\n  url?: string;\n  /** the file name component of the URL (leading path and query string removed) */\n  filename?: string;\n  /** the directory name component of the URL (leading path excluding file name and query string) */\n  baseUrl?: string;\n  /** Query string (characters after `?`) */\n  queryString?: string;\n\n  /** Provides access to any application overrides of fetch() */\n  fetch: typeof fetch | FetchLike;\n\n  /** TBD */\n  response?: Response;\n\n  /**\n   * Parse function for subloaders. Avoids importing `core`. In workers, may redirect to main thread\n   */\n  _parse: (\n    arrayBuffer: ArrayBuffer,\n    loaders?: Loader | Loader[] | LoaderOptions,\n    options?: LoaderOptions,\n    context?: LoaderContext\n  ) => Promise<any>;\n\n  /**\n   * ParseSync function. Avoids importing `core`. In workers, may redirect to main thread\n   * @deprecated Do not call directly, use `parseSyncFromContext` instead\n   */\n  _parseSync?: (\n    arrayBuffer: ArrayBuffer,\n    loaders?: Loader | Loader[] | LoaderOptions,\n    options?: LoaderOptions,\n    context?: LoaderContext\n  ) => any;\n\n  /**\n   * ParseInBatches function. Avoids importing `core`.\n   * @deprecated Do not call directly, use `parseInBatchesFromContext` instead\n   */\n  _parseInBatches?: (\n    iterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer> | Response,\n    loaders?: Loader | Loader[] | LoaderOptions,\n    options?: LoaderOptions,\n    context?: LoaderContext\n  ) => AsyncIterable<any> | Promise<AsyncIterable<any>>;\n};\n\n// type Parse = (\n//   arrayBuffer: ArrayBuffer,\n//   options?: LoaderOptions,\n//   context?: LoaderContext\n// ) => Promise<any>;\n// type ParseSync = (\n//   arrayBuffer: ArrayBuffer,\n//   options?: LoaderOptions,\n//   context?: LoaderContext\n// ) => any;\n// type ParseText = (text: string, options?: LoaderOptions) => Promise<any>;\n// type ParseTextSync = (text: string, options?: LoaderOptions) => any;\n// type ParseInBatches = (\n//   iterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n//   options?: LoaderOptions,\n//   context?: LoaderContext\n// ) => AsyncIterable<any>;\n// type ParseFileInBatches = (\n//   file: Blob,\n//   options?: LoaderOptions,\n//   context?: LoaderContext\n// ) => AsyncIterable<any>;\n\ntype Preload = (url: string, options?: PreloadOptions) => any;\n\n/** Typescript helper to extract options type from a loader type */\nexport type LoaderOptionsType<T = Loader> =\n  T extends Loader<unknown, unknown, infer Options> ? Options : never;\n/** Typescript helper to extract data type from a loader type */\nexport type LoaderReturnType<T = Loader> =\n  T extends Loader<infer Return, unknown, unknown> ? Return : never;\n/** Typescript helper to extract batch type from a loader type */\nexport type LoaderBatchType<T = Loader> =\n  T extends Loader<unknown, infer Batch, unknown> ? Batch : never;\n\n/** Typescript helper to extract options type from an array of loader types */\nexport type LoaderArrayOptionsType<LoadersT extends Loader[] = Loader[]> =\n  LoadersT[number]['options'];\n/** Typescript helper to extract data type from a loader type */\nexport type LoaderArrayReturnType<LoadersT extends Loader[] = Loader[]> =\n  LoadersT[number]['dataType'];\n/** Typescript helper to extract batch type from a loader type */\nexport type LoaderArrayBatchType<LoadersT extends Loader[] = Loader[]> =\n  LoadersT[number]['batchType'];\n\n/**\n * Parses `data` asynchronously using the supplied loader, parse function provided via the loader context\n */\nexport async function parseFromContext<\n  LoaderT extends Loader,\n  OptionsT extends StrictLoaderOptions = LoaderOptionsType<LoaderT>\n>(\n  data: ArrayBuffer,\n  loader: LoaderT,\n  options: OptionsT | undefined,\n  context: LoaderContext\n): Promise<LoaderReturnType<LoaderT>>;\n\n/**\n * Parses `data` asynchronously by matching one of the supplied loader\n */\nexport async function parseFromContext(\n  data: ArrayBuffer,\n  loaders: Loader[],\n  options: LoaderOptions | undefined,\n  context: LoaderContext\n): Promise<unknown>;\n\n/**\n * Parses `data` using a specified loader\n * @param data\n * @param loaders\n * @param options\n * @param context\n */\n// implementation signature\nexport async function parseFromContext(\n  data: ArrayBuffer,\n  loaders: Loader | Loader[],\n  options: LoaderOptions | undefined,\n  context: LoaderContext\n): Promise<unknown> {\n  return context._parse(data, loaders, options, context);\n}\n\n/**\n * Parses `data` synchronously using the specified loader, parse function provided via the loader context\n */\nexport function parseSyncFromContext<\n  LoaderT extends Loader,\n  OptionsT extends StrictLoaderOptions = LoaderOptionsType<LoaderT>\n>(\n  data: ArrayBuffer,\n  loader: LoaderT,\n  options: OptionsT | undefined,\n  context: LoaderContext\n): LoaderReturnType<LoaderT> {\n  if (!context._parseSync) {\n    throw new Error('parseSync');\n  }\n  return context._parseSync(data, loader, options, context);\n}\n\n/**\n * Parses `data` synchronously using a specified loader, parse function provided via the loader context\n */\nexport async function parseInBatchesFromContext<\n  LoaderT extends Loader,\n  OptionsT extends StrictLoaderOptions = LoaderOptionsType<LoaderT>\n>(\n  data: Iterable<ArrayBuffer> | AsyncIterable<ArrayBuffer> | Response,\n  loader: LoaderT,\n  options: OptionsT | undefined,\n  context: LoaderContext\n): Promise<AsyncIterable<LoaderBatchType<LoaderT>>> {\n  if (!context._parseInBatches) {\n    throw new Error('parseInBatches');\n  }\n  return context._parseInBatches(data, loader, options, context);\n}\n", "/**\n * Throws an `Error` with the optional `message` if `condition` is falsy\n * @note Replacement for the external assert method to reduce bundle size\n */\nexport function assert(condition: any, message?: string): void {\n  if (!condition) {\n    throw new Error(message || 'loader assertion failed.');\n  }\n}\n", "// Purpose: include this in your module to avoid\n// dependencies on micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n  self: typeof self !== 'undefined' && self,\n  window: typeof window !== 'undefined' && window,\n  global: typeof global !== 'undefined' && global,\n  document: typeof document !== 'undefined' && document\n};\n\ntype obj = {[key: string]: any};\nconst self_: obj = globals.self || globals.window || globals.global || {};\nconst window_: obj = globals.window || globals.self || globals.global || {};\nconst global_: obj = globals.global || globals.self || globals.window || {};\nconst document_: obj = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in a browser */\nexport const isBrowser: boolean =\n  // @ts-ignore process does not exist on browser\n  Boolean(typeof process !== 'object' || String(process) !== '[object process]' || process.browser);\n\n/** true if running in a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n// Extract node major version\nconst matches =\n  typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n/** Major Node version (as a number) */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n", "// Do not name these variables the same as the global objects - will break bundling\nconst global_ = globalThis;\nconst window_ = globalThis as unknown as Window;\nconst document_ = globalThis.document || ({} as Document);\nconst process_ = globalThis.process || {};\nconst console_ = globalThis.console;\nconst navigator_ = globalThis.navigator || ({} as Navigator);\n\nexport {\n  global_ as global,\n  global_ as self,\n  window_ as window,\n  document_ as document,\n  process_ as process,\n  console_ as console,\n  navigator_ as navigator\n};\n", "// based on https://github.com/cheton/is-electron\n// https://github.com/electron/electron/issues/2288\n/* eslint-disable complexity */\nexport function isElectron(mockUserAgent?: string): boolean {\n  // Renderer process\n  // @ts-expect-error\n  if (typeof window !== 'undefined' && window.process?.type === 'renderer') {\n    return true;\n  }\n  // Main process\n  // eslint-disable-next-line\n  if (typeof process !== 'undefined' && Boolean(process.versions?.['electron'])) {\n    return true;\n  }\n  // Detect the user agent when the `nodeIntegration` option is set to true\n  const realUserAgent = typeof navigator !== 'undefined' && navigator.userAgent;\n  const userAgent = mockUserAgent || realUserAgent;\n  return Boolean(userAgent && userAgent.indexOf('Electron') >= 0);\n}\n", "// This function is needed in initialization stages,\n// make sure it can be imported in isolation\n\nimport {isElectron} from './is-electron';\n\n/** Check if in browser by duck-typing Node context */\nexport function isBrowser(): boolean {\n  const isNode =\n    // @ts-expect-error\n    typeof process === 'object' && String(process) === '[object process]' && !process?.browser;\n  return !isNode || isElectron();\n}\n", "// Extract injected version from package.json (injected by babel plugin)\n// @ts-expect-error\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'untranspiled source';\n\n// ENVIRONMENT\nexport {self, window, global, document, process, console} from './lib/globals';\nexport {isBrowser} from './lib/is-browser';\nexport {getBrowser, isMobile} from './lib/get-browser';\nexport {isElectron} from './lib/is-electron';\n\n// ENVIRONMENT'S ASSERT IS 5-15KB, SO WE PROVIDE OUR OWN\nexport {assert} from './utils/assert';\n\n// TODO - wish we could just export a constant\n// export const isBrowser = checkIfBrowser();\n", "export default function assert(condition: unknown, message?: string): asserts condition {\n  if (!condition) {\n    throw new Error(message || 'Assertion failed');\n  }\n}\n", "// probe.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport assert from '../utils/assert';\n\n/**\n * Get logLevel from first argument:\n * - log(logLevel, message, args) => logLevel\n * - log(message, args) => 0\n * - log({logLevel, ...}, message, args) => logLevel\n * - log({logLevel, message, args}) => logLevel\n */\nexport function normalizeLogLevel(logLevel: unknown): number {\n  if (!logLevel) {\n    return 0;\n  }\n  let resolvedLevel;\n\n  switch (typeof logLevel) {\n    case 'number':\n      resolvedLevel = logLevel;\n      break;\n\n    case 'object':\n      // Backward compatibility\n      // TODO - deprecate `priority`\n      // @ts-expect-error\n      resolvedLevel = logLevel.logLevel || logLevel.priority || 0;\n      break;\n\n    default:\n      return 0;\n  }\n  // 'log level must be a number'\n  assert(Number.isFinite(resolvedLevel) && resolvedLevel >= 0);\n\n  return resolvedLevel;\n}\n\n/**\n * \"Normalizes\" the various argument patterns into an object with known types\n * - log(logLevel, message, args) => {logLevel, message, args}\n * - log(message, args) => {logLevel: 0, message, args}\n * - log({logLevel, ...}, message, args) => {logLevel, message, args}\n * - log({logLevel, message, args}) => {logLevel, message, args}\n */\nexport function normalizeArguments(opts: {\n  logLevel;\n  message;\n  collapsed?: boolean;\n  args?: IArguments | any[] | undefined;\n  opts?;\n}): NormalizedArguments {\n  const {logLevel, message} = opts;\n  opts.logLevel = normalizeLogLevel(logLevel);\n\n  // We use `arguments` instead of rest parameters (...args) because IE\n  // does not support the syntax. Rest parameters is transpiled to code with\n  // perf impact. Doing it here instead avoids constructing args when logging is\n  // disabled.\n  // TODO - remove when/if IE support is dropped\n  const args: any[] = opts.args ? Array.from(opts.args) : [];\n  // args should only contain arguments that appear after `message`\n  // eslint-disable-next-line no-empty\n  while (args.length && args.shift() !== message) {}\n\n  switch (typeof logLevel) {\n    case 'string':\n    case 'function':\n      if (message !== undefined) {\n        args.unshift(message);\n      }\n      opts.message = logLevel;\n      break;\n\n    case 'object':\n      Object.assign(opts, logLevel);\n      break;\n\n    default:\n  }\n\n  // Resolve functions into strings by calling them\n  if (typeof opts.message === 'function') {\n    opts.message = opts.message();\n  }\n  const messageType = typeof opts.message;\n  // 'log message must be a string' or object\n  assert(messageType === 'string' || messageType === 'object');\n\n  // original opts + normalized opts + opts arg + fixed up message\n  return Object.assign(opts, {args}, opts.opts);\n}\nexport type NormalizedArguments = {\n  logLevel: number;\n  message: any;\n  args: any[];\n  tag?: unknown;\n  method?: Function;\n  once?: boolean;\n  total?: number;\n  delta?: number;\n  [key: string]: any;\n};\n", "// probe.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Logger, LogFunction} from './logger';\nimport {NormalizedArguments, normalizeArguments, normalizeLogLevel} from './log-utils';\n\nconst noop = () => {};\n\nexport type NormalizedLogArguments = NormalizedArguments;\ntype LogType = 'log' | 'info' | 'once' | 'warn' | 'error' | 'table' | 'group' | 'groupEnd' | 'time';\n\ntype LogOptions = Partial<NormalizedLogArguments>;\n\n/**\n * Base logger that implements log level handling and once de-duplication.\n * Concrete loggers implement `_emit` to perform actual output.\n */\nexport abstract class BaseLog implements Logger {\n  userData: Record<string, unknown> = {};\n\n  protected _level: number;\n  protected _onceCache = new Set<unknown>();\n\n  constructor({level = 0}: {level?: number} = {}) {\n    this._level = level;\n  }\n\n  set level(newLevel: number) {\n    this.setLevel(newLevel);\n  }\n\n  get level(): number {\n    return this.getLevel();\n  }\n\n  setLevel(level: number): this {\n    this._level = level;\n    return this;\n  }\n\n  getLevel(): number {\n    return this._level;\n  }\n\n  // Unconditional logging\n\n  warn(message: string, ...args: unknown[]): LogFunction {\n    return this._log('warn', 0, message, args, {once: true});\n  }\n\n  error(message: string, ...args: unknown[]): LogFunction {\n    return this._log('error', 0, message, args);\n  }\n\n  // Conditional logging\n\n  log(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('log', logLevel, message, args);\n  }\n\n  info(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('info', logLevel, message, args);\n  }\n\n  once(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('once', logLevel, message, args, {once: true});\n  }\n\n  protected _log(\n    type: LogType,\n    logLevel: unknown,\n    message: unknown,\n    args: unknown[],\n    options: LogOptions = {}\n  ): LogFunction {\n    const normalized = normalizeArguments({\n      logLevel,\n      message,\n      args: this._buildArgs(logLevel, message, args),\n      opts: options\n    });\n\n    return this._createLogFunction(type, normalized, options);\n  }\n\n  protected _buildArgs(logLevel: unknown, message: unknown, args: unknown[]): unknown[] {\n    return [logLevel, message, ...args];\n  }\n\n  protected _createLogFunction(\n    type: LogType,\n    normalized: NormalizedLogArguments,\n    options: LogOptions\n  ): LogFunction {\n    if (!this._shouldLog(normalized.logLevel)) {\n      return noop;\n    }\n\n    const tag = this._getOnceTag(options.tag ?? normalized.tag ?? normalized.message);\n    if ((options.once || normalized.once) && tag !== undefined) {\n      if (this._onceCache.has(tag)) {\n        return noop;\n      }\n      this._onceCache.add(tag);\n    }\n\n    return this._emit(type, normalized);\n  }\n\n  protected _shouldLog(logLevel: unknown): boolean {\n    return this.getLevel() >= normalizeLogLevel(logLevel);\n  }\n\n  protected _getOnceTag(tag: unknown): unknown {\n    if (tag === undefined) {\n      return undefined;\n    }\n    try {\n      return typeof tag === 'string' ? tag : String(tag);\n    } catch {\n      return undefined;\n    }\n  }\n\n  /** Create the actual log function for this logger implementation. */\n  protected abstract _emit(type: LogType, normalized: NormalizedLogArguments): LogFunction;\n}\n\nexport {noop};\n", "// probe.gl, MIT license\n\nexport type StorageType = 'sessionStorage' | 'localStorage';\n\nfunction getStorage(type: StorageType): Storage | null {\n  try {\n    const storage: Storage = window[type];\n    const x = '__storage_test__';\n    storage.setItem(x, x);\n    storage.removeItem(x);\n    return storage;\n  } catch (e) {\n    return null;\n  }\n}\n\n// Store keys in local storage via simple interface\nexport class LocalStorage<Configuration extends {}> {\n  storage: Storage | null;\n  id: string;\n  config: Required<Configuration>;\n\n  constructor(\n    id: string,\n    defaultConfig: Required<Configuration>,\n    type: StorageType = 'sessionStorage'\n  ) {\n    this.storage = getStorage(type);\n    this.id = id;\n    this.config = defaultConfig;\n    this._loadConfiguration();\n  }\n\n  getConfiguration(): Required<Configuration> {\n    return this.config;\n  }\n\n  setConfiguration(configuration: Configuration): void {\n    Object.assign(this.config, configuration);\n    if (this.storage) {\n      const serialized = JSON.stringify(this.config);\n      this.storage.setItem(this.id, serialized);\n    }\n  }\n\n  // Get config from persistent store, if available\n  _loadConfiguration() {\n    let configuration = {};\n    if (this.storage) {\n      const serializedConfiguration = this.storage.getItem(this.id);\n      configuration = serializedConfiguration ? JSON.parse(serializedConfiguration) : {};\n    }\n    Object.assign(this.config, configuration);\n    return this;\n  }\n}\n", "// probe.gl, MIT license\n\nexport type FormatValueOptions = {\n  isInteger?: boolean;\n  maxElts?: number;\n  size?: number;\n};\n\n/**\n * Format time\n */\nexport function formatTime(ms: number): string {\n  let formatted;\n  if (ms < 10) {\n    formatted = `${ms.toFixed(2)}ms`;\n  } else if (ms < 100) {\n    formatted = `${ms.toFixed(1)}ms`;\n  } else if (ms < 1000) {\n    formatted = `${ms.toFixed(0)}ms`;\n  } else {\n    formatted = `${(ms / 1000).toFixed(2)}s`;\n  }\n  return formatted;\n}\n\nexport function leftPad(string: string, length: number = 8): string {\n  const padLength = Math.max(length - string.length, 0);\n  return `${' '.repeat(padLength)}${string}`;\n}\n\nexport function rightPad(string: string, length: number = 8): string {\n  const padLength = Math.max(length - string.length, 0);\n  return `${string}${' '.repeat(padLength)}`;\n}\n\nexport function formatValue(v: unknown, options: FormatValueOptions = {}): string {\n  const EPSILON = 1e-16;\n  const {isInteger = false} = options;\n  if (Array.isArray(v) || ArrayBuffer.isView(v)) {\n    return formatArrayValue(v, options);\n  }\n  if (!Number.isFinite(v)) {\n    return String(v);\n  }\n  // @ts-expect-error\n  if (Math.abs(v) < EPSILON) {\n    return isInteger ? '0' : '0.';\n  }\n  if (isInteger) {\n    // @ts-expect-error\n    return v.toFixed(0);\n  }\n  // @ts-expect-error\n  if (Math.abs(v) > 100 && Math.abs(v) < 10000) {\n    // @ts-expect-error\n    return v.toFixed(0);\n  }\n  // @ts-expect-error\n  const string = v.toPrecision(2);\n  const decimal = string.indexOf('.0');\n  return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n\n/** Helper to formatValue */\nfunction formatArrayValue(v: any, options: FormatValueOptions) {\n  const {maxElts = 16, size = 1} = options;\n  let string = '[';\n  for (let i = 0; i < v.length && i < maxElts; ++i) {\n    if (i > 0) {\n      string += `,${i % size === 0 ? ' ' : ''}`;\n    }\n    string += formatValue(v[i], options);\n  }\n  const terminator = v.length > maxElts ? '...' : ']';\n  return `${string}${terminator}`;\n}\n", "import {isBrowser} from '@probe.gl/env';\n\nexport enum COLOR {\n  BLACK = 30,\n  RED = 31,\n  GREEN = 32,\n  YELLOW = 33,\n  BLUE = 34,\n  MAGENTA = 35,\n  CYAN = 36,\n  WHITE = 37,\n\n  BRIGHT_BLACK = 90,\n  BRIGHT_RED = 91,\n  BRIGHT_GREEN = 92,\n  BRIGHT_YELLOW = 93,\n  BRIGHT_BLUE = 94,\n  BRIGHT_MAGENTA = 95,\n  BRIGHT_CYAN = 96,\n  BRIGHT_WHITE = 97\n}\n\nconst BACKGROUND_INCREMENT = 10;\n\nfunction getColor(color: string | COLOR): number {\n  if (typeof color !== 'string') {\n    return color;\n  }\n  color = color.toUpperCase();\n  return COLOR[color] || COLOR.WHITE;\n}\n\nexport function addColor(\n  string: string,\n  color: string | COLOR,\n  background?: string | COLOR\n): string {\n  if (!isBrowser && typeof string === 'string') {\n    if (color) {\n      const colorCode = getColor(color);\n      string = `\\u001b[${colorCode}m${string}\\u001b[39m`;\n    }\n    if (background) {\n      // background colors values are +10\n      const colorCode = getColor(background);\n      string = `\\u001b[${colorCode + BACKGROUND_INCREMENT}m${string}\\u001b[49m`;\n    }\n  }\n  return string;\n}\n", "// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * Binds the \"this\" argument of all functions on a class instance to the instance\n * @param obj - class instance (typically a react component)\n */\nexport function autobind(obj: object, predefined = ['constructor']): void {\n  const proto = Object.getPrototypeOf(obj);\n  const propNames = Object.getOwnPropertyNames(proto);\n\n  const object = obj as Record<string, unknown>;\n  for (const key of propNames) {\n    const value = object[key];\n    if (typeof value === 'function') {\n      if (!predefined.find((name) => key === name)) {\n        object[key] = value.bind(obj);\n      }\n    }\n  }\n}\n", "// probe.gl, MIT license\n\nimport {window, process, isBrowser} from '@probe.gl/env';\n\n/** Get best timer available. */\nexport function getHiResTimestamp() {\n  let timestamp;\n  if (isBrowser() && window.performance) {\n    timestamp = window?.performance?.now?.();\n  } else if ('hrtime' in process) {\n    // @ts-ignore\n    const timeParts = process?.hrtime?.();\n    timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n  } else {\n    timestamp = Date.now();\n  }\n\n  return timestamp;\n}\n", "// probe.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-console,prefer-rest-params */\nimport {VERSION, isBrowser} from '@probe.gl/env';\nimport {LogFunction} from './logger';\nimport {BaseLog, NormalizedLogArguments, noop} from './base-log';\nimport {LocalStorage} from '../utils/local-storage';\nimport {formatTime, leftPad} from '../utils/formatters';\nimport {addColor} from '../utils/color';\nimport {autobind} from '../utils/autobind';\nimport assert from '../utils/assert';\nimport {getHiResTimestamp} from '../utils/hi-res-timestamp';\n\n/** \"Global\" log configuration settings */\ntype ProbeLogConfiguration = {\n  enabled?: boolean;\n  level?: number;\n  [key: string]: unknown;\n};\n\ntype Table = Record<string, any>;\n\n// Instrumentation in other packages may override console methods, so preserve them here\nconst originalConsole = {\n  debug: isBrowser() ? console.debug || console.log : console.log,\n  log: console.log,\n  info: console.info,\n  warn: console.warn,\n  error: console.error\n};\n\nconst DEFAULT_LOG_CONFIGURATION: Required<ProbeLogConfiguration> = {\n  enabled: true,\n  level: 0\n};\n\n/** A console wrapper */\n\nexport class ProbeLog extends BaseLog {\n  static VERSION = VERSION;\n\n  id: string;\n  VERSION: string = VERSION;\n  _startTs: number = getHiResTimestamp();\n  _deltaTs: number = getHiResTimestamp();\n  _storage: LocalStorage<Record<string, ProbeLogConfiguration>>;\n  override userData = {};\n\n  // TODO - fix support from throttling groups\n  LOG_THROTTLE_TIMEOUT: number = 0; // Time before throttled messages are logged again\n\n  constructor({id} = {id: ''}) {\n    super({level: 0});\n    this.id = id;\n    this.userData = {};\n    this._storage = new LocalStorage<Record<string, ProbeLogConfiguration>>(\n      `__probe-${this.id}__`,\n      {[this.id]: DEFAULT_LOG_CONFIGURATION}\n    );\n\n    this.timeStamp(`${this.id} started`);\n\n    autobind(this);\n    Object.seal(this);\n  }\n\n  isEnabled(): boolean {\n    return this._getConfiguration().enabled;\n  }\n\n  override getLevel(): number {\n    return this._getConfiguration().level;\n  }\n\n  /** @return milliseconds, with fractions */\n  getTotal(): number {\n    return Number((getHiResTimestamp() - this._startTs).toPrecision(10));\n  }\n\n  /** @return milliseconds, with fractions */\n  getDelta(): number {\n    return Number((getHiResTimestamp() - this._deltaTs).toPrecision(10));\n  }\n\n  /** @deprecated use logLevel */\n  set priority(newPriority: number) {\n    this.level = newPriority;\n  }\n\n  /** @deprecated use logLevel */\n  get priority(): number {\n    return this.level;\n  }\n\n  /** @deprecated use logLevel */\n  getPriority(): number {\n    return this.level;\n  }\n\n  // Configure\n\n  enable(enabled: boolean = true): this {\n    this._updateConfiguration({enabled});\n    return this;\n  }\n\n  override setLevel(level: number): this {\n    this._updateConfiguration({level});\n    return this;\n  }\n\n  /** return the current status of the setting */\n  get(setting: string): any {\n    return this._getConfiguration()[setting];\n  }\n\n  // update the status of the setting\n  set(setting: string, value: any): void {\n    this._updateConfiguration({[setting]: value});\n  }\n\n  /** Logs the current settings as a table */\n  settings(): void {\n    if (console.table) {\n      console.table(this._storage.config);\n    } else {\n      console.log(this._storage.config);\n    }\n  }\n\n  // Unconditional logging\n\n  assert(condition: unknown, message?: string): asserts condition {\n    if (!condition) {\n      throw new Error(message || 'Assertion failed');\n    }\n  }\n\n  /** Warn, but only once, no console flooding */\n  override warn(message: string, ...args: unknown[]): LogFunction;\n  override warn(message: string, ...args: unknown[]): LogFunction {\n    return this._log('warn', 0, message, args, {\n      method: originalConsole.warn,\n      once: true\n    });\n  }\n\n  /** Print an error */\n  override error(message: string, ...args: unknown[]): LogFunction;\n  override error(message: string, ...args: unknown[]): LogFunction {\n    return this._log('error', 0, message, args, {\n      method: originalConsole.error\n    });\n  }\n\n  /** Print a deprecation warning */\n  deprecated(oldUsage: string, newUsage: string): LogFunction {\n    return this.warn(`\\`${oldUsage}\\` is deprecated and will be removed \\\nin a later version. Use \\`${newUsage}\\` instead`);\n  }\n\n  /** Print a removal warning */\n  removed(oldUsage: string, newUsage: string): LogFunction {\n    return this.error(`\\`${oldUsage}\\` has been removed. Use \\`${newUsage}\\` instead`);\n  }\n\n  // Conditional logging\n\n  /** Log to a group */\n  probe(logLevel, message?, ...args: unknown[]): LogFunction;\n  probe(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('log', logLevel, message, args, {\n      method: originalConsole.log,\n      time: true,\n      once: true\n    });\n  }\n\n  /** Log a debug message */\n  override log(logLevel, message?, ...args: unknown[]): LogFunction;\n  override log(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('log', logLevel, message, args, {\n      method: originalConsole.debug\n    });\n  }\n\n  /** Log a normal message */\n  override info(logLevel, message?, ...args: unknown[]): LogFunction;\n  override info(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('info', logLevel, message, args, {method: console.info});\n  }\n\n  /** Log a normal message, but only once, no console flooding */\n  override once(logLevel, message?, ...args: unknown[]): LogFunction;\n  override once(logLevel, message?, ...args: unknown[]): LogFunction {\n    return this._log('once', logLevel, message, args, {\n      method: originalConsole.debug || originalConsole.info,\n      once: true\n    });\n  }\n\n  /** Logs an object as a table */\n  table(logLevel, table?, columns?): LogFunction {\n    if (table) {\n      return this._log('table', logLevel, table, (columns && [columns]) || [], {\n        method: console.table || noop,\n        tag: getTableHeader(table)\n      });\n    }\n    return noop;\n  }\n\n  time(logLevel, message) {\n    return this._log('time', logLevel, message, [], {\n      method: console.time ? console.time : console.info\n    });\n  }\n\n  timeEnd(logLevel, message) {\n    return this._log('time', logLevel, message, [], {\n      method: console.timeEnd ? console.timeEnd : console.info\n    });\n  }\n\n  timeStamp(logLevel, message?) {\n    return this._log('time', logLevel, message, [], {\n      method: console.timeStamp || noop\n    });\n  }\n\n  group(logLevel, message, opts = {collapsed: false}) {\n    const method = (opts.collapsed ? console.groupCollapsed : console.group) || console.info;\n    return this._log('group', logLevel, message, [], {method});\n  }\n\n  groupCollapsed(logLevel, message, opts = {}) {\n    return this.group(logLevel, message, Object.assign({}, opts, {collapsed: true}));\n  }\n\n  groupEnd(logLevel) {\n    return this._log('groupEnd', logLevel, '', [], {\n      method: console.groupEnd || noop\n    });\n  }\n\n  // EXPERIMENTAL\n\n  withGroup(logLevel: number, message: string, func: Function): void {\n    this.group(logLevel, message)();\n\n    try {\n      func();\n    } finally {\n      this.groupEnd(logLevel)();\n    }\n  }\n\n  trace(): void {\n    if (console.trace) {\n      console.trace();\n    }\n  }\n\n  protected override _shouldLog(logLevel: unknown): boolean {\n    return this.isEnabled() && super._shouldLog(logLevel);\n  }\n\n  protected override _emit(_type: string, normalized: NormalizedLogArguments): LogFunction {\n    const method = normalized.method;\n    assert(method);\n\n    normalized.total = this.getTotal();\n    normalized.delta = this.getDelta();\n    // reset delta timer\n    this._deltaTs = getHiResTimestamp();\n\n    const message = decorateMessage(this.id, normalized.message, normalized);\n\n    // Bind console function so that it can be called after being returned\n    return method.bind(console, message, ...normalized.args);\n  }\n\n  _getConfiguration(): Required<ProbeLogConfiguration> {\n    if (!this._storage.config[this.id]) {\n      this._updateConfiguration(DEFAULT_LOG_CONFIGURATION);\n    }\n\n    // @ts-expect-error guaranteed to be defined\n    return this._storage.config[this.id];\n  }\n\n  _updateConfiguration(configuration: ProbeLogConfiguration): void {\n    const currentConfiguration = this._storage.config[this.id] || {\n      ...DEFAULT_LOG_CONFIGURATION\n    };\n    this._storage.setConfiguration({\n      [this.id]: {...currentConfiguration, ...configuration}\n    });\n  }\n}\n\nfunction decorateMessage(id, message, opts) {\n  if (typeof message === 'string') {\n    const time = opts.time ? leftPad(formatTime(opts.total)) : '';\n    message = opts.time ? `${id}: ${time}  ${message}` : `${id}: ${message}`;\n    message = addColor(message, opts.color, opts.background);\n  }\n  return message;\n}\n\nfunction getTableHeader(table: Table): string {\n  for (const key in table) {\n    for (const title in table[key]) {\n      return title || 'untitled';\n    }\n  }\n  return 'empty';\n}\n\nexport {normalizeArguments} from './log-utils';\nexport {normalizeLogLevel} from './log-utils';\n", "// @ts-nocheck\n/* eslint-disable */\nglobalThis.probe = {};\n", "import {ProbeLog} from './loggers/probe-log';\n\n// DEFAULT EXPORT IS A LOG INSTANCE\nexport default new ProbeLog({id: '@probe.gl/log'});\n\n// LOGGING\nexport type {Logger} from './loggers/logger';\nexport {ProbeLog, ProbeLog as Log} from './loggers/probe-log';\nexport {ConsoleLog} from './loggers/console-log';\nexport {BaseLog} from './loggers/base-log';\nexport type {MemoryLogMessage} from './loggers/memory-log';\nexport {MemoryLog} from './loggers/memory-log';\n\n// UTILITIES\nexport {COLOR} from './utils/color';\nexport {addColor} from './utils/color';\nexport {leftPad, rightPad} from './utils/formatters';\nexport {autobind} from './utils/autobind';\nexport {LocalStorage} from './utils/local-storage';\nexport {getHiResTimestamp} from './utils/hi-res-timestamp';\n\nimport './init';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Log} from '@probe.gl/log';\n\n// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nconst version = VERSION[0] >= '0' && VERSION[0] <= '9' ? `v${VERSION}` : '';\n\n// Make sure we set the global variable\nfunction createLog() {\n  const log = new Log({id: 'loaders.gl'});\n\n  globalThis.loaders ||= {};\n  globalThis.loaders.log = log;\n  globalThis.loaders.version = version;\n\n  globalThis.probe ||= {};\n  globalThis.probe.loaders = log;\n\n  return log;\n}\n\nexport const log = createLog();\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type {Readable} from 'stream';\n\n/** Minimal shape for Node.js Buffer-like values */\ntype NodeBufferLike = {buffer: ArrayBufferLike; isBuffer: true};\n\n/** Minimal shape for Node.js writable streams */\ntype NodeWritableStream = {\n  end: (...args: unknown[]) => unknown;\n  write: (...args: unknown[]) => unknown;\n  writable: boolean;\n};\n\n/** Minimal shape for WritableStream-like DOM implementations */\ntype WritableDOMStreamLike = WritableStream | {abort: () => unknown; getWriter: () => unknown};\n\n/** A DOM or Node readable stream */\nexport type ReadableStreamType = ReadableStream | Readable;\n\n/** Checks whether a value is a boolean */\nconst isBoolean = (value: unknown): value is boolean => typeof value === 'boolean';\n\n/** Checks whether a value is a function */\nconst isFunction = (value: unknown): value is (...args: unknown[]) => unknown =>\n  typeof value === 'function';\n\n/** Checks whether a value is a non-null object */\nexport const isObject = (value: unknown): value is object =>\n  value !== null && typeof value === 'object';\n\n/** Checks whether a value is a plain object (created by the Object constructor) */\nexport const isPureObject = (value: unknown): value is Record<string, unknown> =>\n  isObject(value) && value.constructor === {}.constructor;\n\n/** Checks whether a value is an ArrayBuffer */\nexport const isArrayBuffer = (value: unknown): value is ArrayBuffer =>\n  typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer;\n\n/** Checks whether a value is an ArrayBuffer */\nexport const isSharedArrayBuffer = (value: unknown): value is SharedArrayBuffer =>\n  typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer;\n\n/** Checks whether a value is ArrayBuffer-like */\nexport const isArrayBufferLike = (value: unknown): value is ArrayBufferLike =>\n  isObject(value) &&\n  typeof (value as ArrayBufferLike).byteLength === 'number' &&\n  typeof (value as ArrayBufferLike).slice === 'function';\n\n/** Checks whether a value behaves like a promise */\nexport const isPromise = (value: unknown): value is Promise<unknown> =>\n  isObject(value) && 'then' in value && isFunction((value as {then: unknown}).then);\n\n/** Checks whether a value implements the iterable protocol */\nexport const isIterable = (value: unknown): value is Iterable<unknown> =>\n  Boolean(value) && isFunction((value as Iterable<unknown>)[Symbol.iterator]);\n\n/** Checks whether a value implements the async iterable protocol */\nexport const isAsyncIterable = (value: unknown): value is AsyncIterable<unknown> =>\n  Boolean(value) && isFunction((value as AsyncIterable<unknown>)[Symbol.asyncIterator]);\n\n/** Checks whether a value is an iterator (has a next function) */\nexport const isIterator = (value: unknown): value is Iterator<unknown> =>\n  Boolean(value) && isFunction((value as Iterator<unknown>).next);\n\n/** Checks whether a value is a fetch Response or a duck-typed equivalent */\nexport const isResponse = (value: unknown): value is Response =>\n  (typeof Response !== 'undefined' && value instanceof Response) ||\n  (isObject(value) &&\n    isFunction((value as {arrayBuffer?: unknown}).arrayBuffer) &&\n    isFunction((value as {text?: unknown}).text) &&\n    isFunction((value as {json?: unknown}).json));\n\n/** Checks whether a value is a File */\nexport const isFile = (value: unknown): value is File =>\n  typeof File !== 'undefined' && value instanceof File;\n\n/** Checks whether a value is a Blob */\nexport const isBlob = (value: unknown): value is Blob =>\n  typeof Blob !== 'undefined' && value instanceof Blob;\n\n/** Checks for Node.js Buffers without triggering bundlers to include the Buffer polyfill */\nexport const isBuffer = (value: unknown): value is NodeBufferLike =>\n  Boolean(\n    value &&\n    typeof value === 'object' &&\n    (value as Partial<NodeBufferLike>).isBuffer &&\n    'buffer' in (value as NodeBufferLike)\n  );\n\n/** Checks whether a value looks like a DOM WritableStream */\nexport const isWritableDOMStream = (value: unknown): value is WritableDOMStreamLike =>\n  isObject(value) &&\n  isFunction((value as WritableDOMStreamLike).abort) &&\n  isFunction((value as WritableDOMStreamLike).getWriter);\n\n/** Checks whether a value looks like a DOM ReadableStream */\nexport const isReadableDOMStream = (value: unknown): value is ReadableStream =>\n  (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream) ||\n  (isObject(value) &&\n    isFunction((value as ReadableStream).tee) &&\n    isFunction((value as ReadableStream).cancel) &&\n    isFunction((value as ReadableStream).getReader));\n// Not implemented in Firefox: && isFunction(x.pipeTo)\n\n/** Checks whether a value looks like a Node.js writable stream */\nexport const isWritableNodeStream = (value: unknown): value is NodeWritableStream =>\n  isObject(value) &&\n  isFunction((value as NodeWritableStream).end) &&\n  isFunction((value as NodeWritableStream).write) &&\n  isBoolean((value as NodeWritableStream).writable);\n\n/** Checks whether a value looks like a Node.js readable stream */\nexport const isReadableNodeStream = (value: unknown): value is Readable =>\n  isObject(value) &&\n  isFunction((value as Readable).read) &&\n  isFunction((value as Readable).pipe) &&\n  isBoolean((value as Readable).readable);\n\n/** Checks whether a value is any readable stream (DOM or Node.js) */\nexport const isReadableStream = (value: unknown): value is ReadableStreamType =>\n  isReadableDOMStream(value) || isReadableNodeStream(value);\n\n/** Checks whether a value is any writable stream (DOM or Node.js) */\nexport const isWritableStream = (value: unknown): value is WritableStream | NodeWritableStream =>\n  isWritableDOMStream(value) || isWritableNodeStream(value);\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport type RequiredOptions<T> = Required<{[K in keyof T]: Required<T[K]>}>;\n\nexport function getRequiredOptions<T>(options: T): RequiredOptions<T> {\n  return options as RequiredOptions<T>;\n}\n\n/**\n *\n * @param baseOptions Can be undefined, in which case a fresh options object will be minted\n * @param newOptions\n * @returns\n */\nexport function mergeOptions<OptionsT extends Record<string, unknown>>(\n  baseOptions: OptionsT | undefined,\n  newOptions: OptionsT\n): OptionsT {\n  return mergeOptionsRecursively(baseOptions || {}, newOptions) as OptionsT;\n}\n\nfunction mergeOptionsRecursively(\n  baseOptions: Record<string, unknown>,\n  newOptions: Record<string, unknown>,\n  level = 0\n): Record<string, unknown> {\n  // Sanity check (jest test runner overwrites the console object which can lead to infinite recursion)\n  if (level > 3) {\n    return newOptions;\n  }\n\n  const options = {...baseOptions};\n  for (const [key, newValue] of Object.entries(newOptions)) {\n    if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n      options[key] = mergeOptionsRecursively(\n        (options[key] as Record<string, unknown>) || {},\n        newOptions[key] as Record<string, unknown>,\n        level + 1\n      );\n      // Object.assign(options[key] as object, newOptions[key]);\n    } else {\n      options[key] = newOptions[key];\n    }\n  }\n  return options as Record<string, unknown>;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log} from '../log-utils/log';\n\n/**\n * Register application-imported modules\n * These modules are typically to big to bundle, or may have issues on some bundlers/environments\n */\nexport function registerJSModules(modules?: Record<string, any>): void {\n  globalThis.loaders ||= {};\n  globalThis.loaders.modules ||= {};\n  Object.assign(globalThis.loaders.modules, modules);\n}\n\n/**\n * Get a pre-registered application-imported module, warn if not present\n */\nexport function checkJSModule(name: string, caller: string): void {\n  const module = globalThis.loaders?.modules?.[name];\n  if (!module) {\n    log.warn(`${caller}: ${name} library not installed`)();\n  }\n}\n\n/**\n * Get a pre-registered application-imported module, throw if not present\n */\nexport function getJSModule<ModuleT = any>(name: string, caller: string): ModuleT {\n  const module = globalThis.loaders?.modules?.[name];\n  if (!module) {\n    throw new Error(`${caller}: ${name} library not installed`);\n  }\n  return module;\n}\n\n/**\n * Get a pre-registered application-imported module, return null if not present\n */\nexport function getJSModuleOrNull<ModuleT = any>(name: string): ModuleT | null {\n  const module = globalThis.loaders?.modules?.[name];\n  return module || null;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * NPM tag to use when loading modules from unpkg.com\n * 'beta' on beta branch, 'latest' on prod branch\n * @note Change between 'beta' and 'latest' depending on whether publishing alpha or prod releases\n * @todo - unpkg.com doesn't seem to have a `latest` specifier for alpha releases...\n */\nexport const NPM_TAG = 'latest';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NPM_TAG} from '../npm-tag';\n\n// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\ndeclare let __VERSION__: string;\n\nlet warningIssued = false;\n\nfunction getVersion() {\n  if (!globalThis._loadersgl_?.version) {\n    globalThis._loadersgl_ = globalThis._loadersgl_ || {};\n    // __VERSION__ is injected by babel-plugin-version-inline\n    if (typeof __VERSION__ === 'undefined' && !warningIssued) {\n      // eslint-disable-next-line\n      console.warn(\n        'loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.'\n      );\n      globalThis._loadersgl_.version = NPM_TAG;\n      warningIssued = true;\n    } else {\n      globalThis._loadersgl_.version = __VERSION__;\n    }\n  }\n\n  return globalThis._loadersgl_.version;\n}\n\nexport const VERSION = getVersion();\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\n\n/** Throws an `Error` with the optional `message` if `condition` is falsy */\nexport function assert(condition: any, message?: string): void {\n  if (!condition) {\n    throw new Error(message || 'loaders.gl assertion failed.');\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n  self: typeof self !== 'undefined' && self,\n  window: typeof window !== 'undefined' && window,\n  global: typeof global !== 'undefined' && global,\n  document: typeof document !== 'undefined' && document\n};\n\nconst self_: {[key: string]: any} = globals.self || globals.window || globals.global || {};\nconst window_: {[key: string]: any} = globals.window || globals.self || globals.global || {};\nconst global_: {[key: string]: any} = globals.global || globals.self || globals.window || {};\nconst document_: {[key: string]: any} = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in the browser, false if running in Node.js */\nexport const isBrowser: boolean =\n  // @ts-ignore process.browser\n  typeof process !== 'object' || String(process) !== '[object process]' || process.browser;\n\n/** true if running on a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n/** true if running on a mobile device */\nexport const isMobile: boolean =\n  typeof window !== 'undefined' && typeof window.orientation !== 'undefined';\n\n// Extract node major version\nconst matches =\n  typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n\n/** Version of Node.js if running under Node, otherwise 0 */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport WorkerThread from './worker-thread';\nimport {assert} from '../env-utils/assert';\n\n/**\n * Represents one Job handled by a WorkerPool or WorkerFarm\n */\nexport default class WorkerJob {\n  readonly name: string;\n  readonly workerThread: WorkerThread;\n  isRunning: boolean = true;\n  /** Promise that resolves when Job is done */\n  readonly result: Promise<any>;\n\n  private _resolve: (value: any) => void = () => {};\n  private _reject: (reason?: any) => void = () => {};\n\n  constructor(jobName: string, workerThread: WorkerThread) {\n    this.name = jobName;\n    this.workerThread = workerThread;\n    this.result = new Promise((resolve, reject) => {\n      this._resolve = resolve;\n      this._reject = reject;\n    });\n  }\n\n  /**\n   * Send a message to the job's worker thread\n   * @param data any data structure, ideally consisting mostly of transferrable objects\n   */\n  postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void {\n    this.workerThread.postMessage({\n      source: 'loaders.gl', // Lets worker ignore unrelated messages\n      type,\n      payload\n    });\n  }\n\n  /**\n   * Call to resolve the `result` Promise with the supplied value\n   */\n  done(value: any): void {\n    assert(this.isRunning);\n    this.isRunning = false;\n    this._resolve(value);\n  }\n\n  /**\n   * Call to reject the `result` Promise with the supplied error\n   */\n  error(error: Error): void {\n    assert(this.isRunning);\n    this.isRunning = false;\n    this._reject(error);\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Browser polyfill for Node.js built-in `worker_threads` module.\n * These fills are non-functional, and just intended to ensure that\n * `import 'worker_threads` doesn't break browser builds.\n * The replacement is done in package.json browser field\n */\nexport class NodeWorker {\n  terminate() {}\n}\n\nexport type {NodeWorker as NodeWorkerType};\n\nexport const parentPort = null;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {assert} from '../env-utils/assert';\n\nconst workerURLCache = new Map();\n\n/**\n * Creates a loadable URL from worker source or URL\n * that can be used to create `Worker` instances.\n * Due to CORS issues it may be necessary to wrap a URL in a small importScripts\n * @param props\n * @param props.source Worker source\n * @param props.url Worker URL\n * @returns loadable url\n */\nexport function getLoadableWorkerURL(props: {source?: string; url?: string}) {\n  assert((props.source && !props.url) || (!props.source && props.url)); // Either source or url must be defined\n\n  let workerURL = workerURLCache.get(props.source || props.url);\n  if (!workerURL) {\n    // Differentiate worker urls from worker source code\n    if (props.url) {\n      workerURL = getLoadableWorkerURLFromURL(props.url);\n      workerURLCache.set(props.url, workerURL);\n    }\n\n    if (props.source) {\n      workerURL = getLoadableWorkerURLFromSource(props.source);\n      workerURLCache.set(props.source, workerURL);\n    }\n  }\n\n  assert(workerURL);\n  return workerURL;\n}\n\n/**\n * Build a loadable worker URL from worker URL\n * @param url\n * @returns loadable URL\n */\nfunction getLoadableWorkerURLFromURL(url: string): string {\n  // A local script url, we can use it to initialize a Worker directly\n  if (!url.startsWith('http')) {\n    return url;\n  }\n\n  // A remote script, we need to use `importScripts` to load from different origin\n  const workerSource = buildScriptSource(url);\n  return getLoadableWorkerURLFromSource(workerSource);\n}\n\n/**\n * Build a loadable worker URL from worker source\n * @param workerSource\n * @returns loadable url\n */\nfunction getLoadableWorkerURLFromSource(workerSource: string): string {\n  const blob = new Blob([workerSource], {type: 'application/javascript'});\n  return URL.createObjectURL(blob);\n}\n\n/**\n * Per spec, worker cannot be initialized with a script from a different origin\n * However a local worker script can still import scripts from other origins,\n * so we simply build a wrapper script.\n *\n * @param workerUrl\n * @returns source\n */\nfunction buildScriptSource(workerUrl: string): string {\n  return `\\\ntry {\n  importScripts('${workerUrl}');\n} catch (error) {\n  console.error(error);\n  throw error;\n}`;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// NOTE - there is a copy of this function is both in core and loader-utils\n// core does not need all the utils in loader-utils, just this one.\n\n/**\n * Returns an array of Transferrable objects that can be used with postMessage\n * https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage\n * @param object data to be sent via postMessage\n * @param recursive - not for application use\n * @param transfers - not for application use\n * @returns a transfer list that can be passed to postMessage\n */\nexport function getTransferList(\n  object: any,\n  recursive: boolean = true,\n  transfers?: Set<any>\n): Transferable[] {\n  // Make sure that items in the transfer list is unique\n  const transfersSet = transfers || new Set();\n\n  if (!object) {\n    // ignore\n  } else if (isTransferable(object)) {\n    transfersSet.add(object);\n  } else if (isTransferable(object.buffer)) {\n    // Typed array\n    transfersSet.add(object.buffer);\n  } else if (ArrayBuffer.isView(object)) {\n    // object is a TypeArray viewing into a SharedArrayBuffer (not transferable)\n    // Do not iterate through the content in this case\n  } else if (recursive && typeof object === 'object') {\n    for (const key in object) {\n      // Avoid perf hit - only go one level deep\n      getTransferList(object[key], recursive, transfersSet);\n    }\n  }\n\n  // If transfers is defined, is internal recursive call\n  // Otherwise it's called by the user\n  return transfers === undefined ? Array.from(transfersSet) : [];\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Transferable\nfunction isTransferable(object: unknown) {\n  if (!object) {\n    return false;\n  }\n  if (object instanceof ArrayBuffer) {\n    return true;\n  }\n  if (typeof MessagePort !== 'undefined' && object instanceof MessagePort) {\n    return true;\n  }\n  if (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap) {\n    return true;\n  }\n  // @ts-ignore\n  if (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Recursively drop non serializable values like functions and regexps.\n * @param object\n */\nexport function getTransferListForWriter(object: object | null): object {\n  if (object === null) {\n    return {};\n  }\n  const clone = Object.assign({}, object);\n\n  Object.keys(clone).forEach((key) => {\n    // Typed Arrays and Arrays are passed with no change\n    if (\n      typeof object[key] === 'object' &&\n      !ArrayBuffer.isView(object[key]) &&\n      !(object[key] instanceof Array)\n    ) {\n      clone[key] = getTransferListForWriter(object[key]);\n    } else if (typeof clone[key] === 'function' || clone[key] instanceof RegExp) {\n      clone[key] = {};\n    } else {\n      clone[key] = object[key];\n    }\n  });\n\n  return clone;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NodeWorker, NodeWorkerType} from '../node/worker_threads';\nimport {isBrowser} from '../env-utils/globals';\nimport {assert} from '../env-utils/assert';\nimport {getLoadableWorkerURL} from '../worker-utils/get-loadable-worker-url';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n\nconst NOOP = () => {};\n\nexport type WorkerThreadProps = {\n  name: string;\n  source?: string;\n  url?: string;\n};\n\n/**\n * Represents one worker thread\n */\nexport default class WorkerThread {\n  readonly name: string;\n  readonly source: string | undefined;\n  readonly url: string | undefined;\n  terminated: boolean = false;\n  worker: Worker | NodeWorkerType;\n  onMessage: (message: any) => void;\n  onError: (error: Error) => void;\n\n  private _loadableURL: string = '';\n\n  /** Checks if workers are supported on this platform */\n  static isSupported(): boolean {\n    return (\n      (typeof Worker !== 'undefined' && isBrowser) ||\n      (typeof NodeWorker !== 'undefined' && !isBrowser)\n    );\n  }\n\n  constructor(props: WorkerThreadProps) {\n    const {name, source, url} = props;\n    assert(source || url); // Either source or url must be defined\n    this.name = name;\n    this.source = source;\n    this.url = url;\n    this.onMessage = NOOP;\n    this.onError = (error) => console.log(error); // eslint-disable-line\n\n    this.worker = isBrowser ? this._createBrowserWorker() : this._createNodeWorker();\n  }\n\n  /**\n   * Terminate this worker thread\n   * @note Can free up significant memory\n   */\n  destroy(): void {\n    this.onMessage = NOOP;\n    this.onError = NOOP;\n    this.worker.terminate(); // eslint-disable-line @typescript-eslint/no-floating-promises\n    this.terminated = true;\n  }\n\n  get isRunning() {\n    return Boolean(this.onMessage);\n  }\n\n  /**\n   * Send a message to this worker thread\n   * @param data any data structure, ideally consisting mostly of transferrable objects\n   * @param transferList If not supplied, calculated automatically by traversing data\n   */\n  postMessage(data: any, transferList?: any[]): void {\n    transferList = transferList || getTransferList(data);\n    // @ts-ignore\n    this.worker.postMessage(data, transferList);\n  }\n\n  // PRIVATE\n\n  /**\n   * Generate a standard Error from an ErrorEvent\n   * @param event\n   */\n  _getErrorFromErrorEvent(event: ErrorEvent): Error {\n    // Note Error object does not have the expected fields if loading failed completely\n    // https://developer.mozilla.org/en-US/docs/Web/API/Worker#Event_handlers\n    // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n    let message = 'Failed to load ';\n    message += `worker ${this.name} from ${this.url}. `;\n    if (event.message) {\n      message += `${event.message} in `;\n    }\n    // const hasFilename = event.filename && !event.filename.startsWith('blob:');\n    // message += hasFilename ? event.filename : this.source.slice(0, 100);\n    if (event.lineno) {\n      message += `:${event.lineno}:${event.colno}`;\n    }\n    return new Error(message);\n  }\n\n  /**\n   * Creates a worker thread on the browser\n   */\n  _createBrowserWorker(): Worker {\n    this._loadableURL = getLoadableWorkerURL({source: this.source, url: this.url});\n    const worker = new Worker(this._loadableURL, {name: this.name});\n\n    worker.onmessage = (event) => {\n      if (!event.data) {\n        this.onError(new Error('No data received'));\n      } else {\n        this.onMessage(event.data);\n      }\n    };\n    // This callback represents an uncaught exception in the worker thread\n    worker.onerror = (error: ErrorEvent): void => {\n      this.onError(this._getErrorFromErrorEvent(error));\n      this.terminated = true;\n    };\n    // TODO - not clear when this would be called, for now just log in case it happens\n    worker.onmessageerror = (event) => console.error(event); // eslint-disable-line\n\n    return worker;\n  }\n\n  /**\n   * Creates a worker thread in node.js\n   * @todo https://nodejs.org/api/async_hooks.html#async-resource-worker-pool\n   */\n  _createNodeWorker(): NodeWorkerType {\n    let worker: NodeWorkerType;\n    if (this.url) {\n      // Make sure relative URLs start with './'\n      const absolute = this.url.includes(':/') || this.url.startsWith('/');\n      const url = absolute ? this.url : `./${this.url}`;\n      const type = this.url.endsWith('.ts') || this.url.endsWith('.mjs') ? 'module' : 'commonjs';\n      // console.log('Starting work from', url);\n      // @ts-expect-error type is not known\n      worker = new NodeWorker(url, {eval: false, type});\n    } else if (this.source) {\n      worker = new NodeWorker(this.source, {eval: true});\n    } else {\n      throw new Error('no worker');\n    }\n    worker.on('message', (data) => {\n      // console.error('message', data);\n      this.onMessage(data);\n    });\n    worker.on('error', (error) => {\n      this.onError(error as Error);\n    });\n    worker.on('exit', (code) => {\n      // console.error('exit', code);\n    });\n    return worker;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {isMobile, isBrowser} from '../env-utils/globals';\nimport WorkerThread from './worker-thread';\nimport WorkerJob from './worker-job';\n\n/** WorkerPool onDebug Callback Parameters */\ntype OnDebugParameters = {\n  message: string;\n  worker: string;\n  name: string;\n  job: string;\n  backlog: number;\n  workerThread: WorkerThread;\n};\n\n/** WorkerPool Properties */\nexport type WorkerPoolProps = {\n  name?: string;\n  source?: string; // | Function;\n  url?: string;\n  maxConcurrency?: number;\n  maxMobileConcurrency?: number;\n  onDebug?: (options: OnDebugParameters) => any;\n  reuseWorkers?: boolean;\n};\n\n/** Private helper types */\ntype OnMessage = (job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload) => void;\ntype OnError = (job: WorkerJob, error: Error) => void;\n\ntype QueuedJob = {\n  name: string;\n  onMessage: OnMessage;\n  onError: OnError;\n  onStart: (value: any) => void; // Resolve job start promise\n};\n\n/**\n * Process multiple data messages with small pool of identical workers\n */\nexport default class WorkerPool {\n  name: string = 'unnamed';\n  source?: string; // | Function;\n  url?: string;\n  maxConcurrency: number = 1;\n  maxMobileConcurrency: number = 1;\n  onDebug: (options: OnDebugParameters) => any = () => {};\n  reuseWorkers: boolean = true;\n\n  private props: WorkerPoolProps = {};\n  private jobQueue: QueuedJob[] = [];\n  private idleQueue: WorkerThread[] = [];\n  private count = 0;\n  private isDestroyed = false;\n\n  /** Checks if workers are supported on this platform */\n  static isSupported(): boolean {\n    return WorkerThread.isSupported();\n  }\n\n  /**\n   * @param processor - worker function\n   * @param maxConcurrency - max count of workers\n   */\n  constructor(props: WorkerPoolProps) {\n    this.source = props.source;\n    this.url = props.url;\n    this.setProps(props);\n  }\n\n  /**\n   * Terminates all workers in the pool\n   * @note Can free up significant memory\n   */\n  destroy(): void {\n    // Destroy idle workers, active Workers will be destroyed on completion\n    this.idleQueue.forEach((worker) => worker.destroy());\n    this.isDestroyed = true;\n  }\n\n  setProps(props: WorkerPoolProps) {\n    this.props = {...this.props, ...props};\n\n    if (props.name !== undefined) {\n      this.name = props.name;\n    }\n    if (props.maxConcurrency !== undefined) {\n      this.maxConcurrency = props.maxConcurrency;\n    }\n    if (props.maxMobileConcurrency !== undefined) {\n      this.maxMobileConcurrency = props.maxMobileConcurrency;\n    }\n    if (props.reuseWorkers !== undefined) {\n      this.reuseWorkers = props.reuseWorkers;\n    }\n    if (props.onDebug !== undefined) {\n      this.onDebug = props.onDebug;\n    }\n  }\n\n  async startJob(\n    name: string,\n    onMessage: OnMessage = (job, type, data) => job.done(data),\n    onError: OnError = (job, error) => job.error(error)\n  ): Promise<WorkerJob> {\n    // Promise resolves when thread starts working on this job\n    const startPromise = new Promise<WorkerJob>((onStart) => {\n      // Promise resolves when thread completes or fails working on this job\n      this.jobQueue.push({name, onMessage, onError, onStart});\n      return this;\n    });\n    this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n    return await startPromise;\n  }\n\n  // PRIVATE\n\n  /**\n   * Starts first queued job if worker is available or can be created\n   * Called when job is started and whenever a worker returns to the idleQueue\n   */\n  async _startQueuedJob(): Promise<void> {\n    if (!this.jobQueue.length) {\n      return;\n    }\n\n    const workerThread = this._getAvailableWorker();\n    if (!workerThread) {\n      return;\n    }\n\n    // We have a worker, dequeue and start the job\n    const queuedJob = this.jobQueue.shift();\n    if (queuedJob) {\n      // Emit a debug event\n      // @ts-ignore\n      this.onDebug({\n        message: 'Starting job',\n        name: queuedJob.name,\n        workerThread,\n        backlog: this.jobQueue.length\n      });\n\n      // Create a worker job to let the app access thread and manage job completion\n      const job = new WorkerJob(queuedJob.name, workerThread);\n\n      // Set the worker thread's message handlers\n      workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);\n      workerThread.onError = (error) => queuedJob.onError(job, error);\n\n      // Resolve the start promise so that the app can start sending messages to worker\n      queuedJob.onStart(job);\n\n      // Wait for the app to signal that the job is complete, then return worker to queue\n      try {\n        await job.result;\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.error(`Worker exception: ${error}`);\n      } finally {\n        this.returnWorkerToQueue(workerThread);\n      }\n    }\n  }\n\n  /**\n   * Returns a worker to the idle queue\n   * Destroys the worker if\n   *  - pool is destroyed\n   *  - if this pool doesn't reuse workers\n   *  - if maxConcurrency has been lowered\n   * @param worker\n   */\n  returnWorkerToQueue(worker: WorkerThread) {\n    const shouldDestroyWorker =\n      // Workers on Node.js prevent the process from exiting.\n      // Until we figure out how to close them before exit, we always destroy them\n      !isBrowser ||\n      // If the pool is destroyed, there is no reason to keep the worker around\n      this.isDestroyed ||\n      // If the app has disabled worker reuse, any completed workers should be destroyed\n      !this.reuseWorkers ||\n      // If concurrency has been lowered, this worker might be surplus to requirements\n      this.count > this._getMaxConcurrency();\n\n    if (shouldDestroyWorker) {\n      worker.destroy();\n      this.count--;\n    } else {\n      this.idleQueue.push(worker);\n    }\n\n    if (!this.isDestroyed) {\n      this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n    }\n  }\n\n  /**\n   * Returns idle worker or creates new worker if maxConcurrency has not been reached\n   */\n  _getAvailableWorker(): WorkerThread | null {\n    // If a worker has completed and returned to the queue, it can be used\n    if (this.idleQueue.length > 0) {\n      return this.idleQueue.shift() || null;\n    }\n\n    // Create fresh worker if we haven't yet created the max amount of worker threads for this worker source\n    if (this.count < this._getMaxConcurrency()) {\n      this.count++;\n      const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;\n      return new WorkerThread({name, source: this.source, url: this.url});\n    }\n\n    // No worker available, have to wait\n    return null;\n  }\n\n  _getMaxConcurrency() {\n    return isMobile ? this.maxMobileConcurrency : this.maxConcurrency;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport WorkerPool from './worker-pool';\nimport WorkerThread from './worker-thread';\n\n/**\n * @param maxConcurrency - max count of workers\n * @param maxMobileConcurrency - max count of workers on mobile\n * @param maxConcurrency - max count of workers\n * @param reuseWorkers - if false, destroys workers when task is completed\n * @param onDebug - callback intended to allow application to log worker pool activity\n */\nexport type WorkerFarmProps = {\n  maxConcurrency?: number;\n  maxMobileConcurrency?: number;\n  reuseWorkers?: boolean;\n  onDebug?: () => void;\n};\n\nconst DEFAULT_PROPS: Required<WorkerFarmProps> = {\n  maxConcurrency: 3,\n  maxMobileConcurrency: 1,\n  reuseWorkers: true,\n  onDebug: () => {}\n};\n\n/**\n * Process multiple jobs with a \"farm\" of different workers in worker pools.\n */\nexport default class WorkerFarm {\n  private props: WorkerFarmProps;\n  private workerPools = new Map<string, WorkerPool>();\n  // singleton\n  private static _workerFarm?: WorkerFarm;\n\n  /** Checks if workers are supported on this platform */\n  static isSupported(): boolean {\n    return WorkerThread.isSupported();\n  }\n\n  /** Get the singleton instance of the global worker farm */\n  static getWorkerFarm(props: WorkerFarmProps = {}): WorkerFarm {\n    WorkerFarm._workerFarm = WorkerFarm._workerFarm || new WorkerFarm({});\n    WorkerFarm._workerFarm.setProps(props);\n    return WorkerFarm._workerFarm;\n  }\n\n  /** get global instance with WorkerFarm.getWorkerFarm() */\n  private constructor(props: WorkerFarmProps) {\n    this.props = {...DEFAULT_PROPS};\n    this.setProps(props);\n    /** @type Map<string, WorkerPool>} */\n    this.workerPools = new Map();\n  }\n\n  /**\n   * Terminate all workers in the farm\n   * @note Can free up significant memory\n   */\n  destroy(): void {\n    for (const workerPool of this.workerPools.values()) {\n      workerPool.destroy();\n    }\n    this.workerPools = new Map<string, WorkerPool>();\n  }\n\n  /**\n   * Set props used when initializing worker pools\n   * @param props\n   */\n  setProps(props: WorkerFarmProps): void {\n    this.props = {...this.props, ...props};\n    // Update worker pool props\n    for (const workerPool of this.workerPools.values()) {\n      workerPool.setProps(this._getWorkerPoolProps());\n    }\n  }\n\n  /**\n   * Returns a worker pool for the specified worker\n   * @param options - only used first time for a specific worker name\n   * @param options.name - the name of the worker - used to identify worker pool\n   * @param options.url -\n   * @param options.source -\n   * @example\n   *   const job = WorkerFarm.getWorkerFarm().getWorkerPool({name, url}).startJob(...);\n   */\n  getWorkerPool(options: {name: string; source?: string; url?: string}): WorkerPool {\n    const {name, source, url} = options;\n    let workerPool = this.workerPools.get(name);\n    if (!workerPool) {\n      workerPool = new WorkerPool({\n        name,\n        source,\n        url\n      });\n      workerPool.setProps(this._getWorkerPoolProps());\n      this.workerPools.set(name, workerPool);\n    }\n    return workerPool;\n  }\n\n  _getWorkerPoolProps() {\n    return {\n      maxConcurrency: this.props.maxConcurrency,\n      maxMobileConcurrency: this.props.maxMobileConcurrency,\n      reuseWorkers: this.props.reuseWorkers,\n      onDebug: this.props.onDebug\n    };\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject, WorkerOptions} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {isBrowser} from '../env-utils/globals';\nimport {VERSION} from '../env-utils/version';\nimport {NPM_TAG} from '../npm-tag';\n\n/**\n * Gets worker object's name (for debugging in Chrome thread inspector window)\n */\nexport function getWorkerName(worker: WorkerObject): string {\n  const warning = worker.version !== VERSION ? ` (worker-utils@${VERSION})` : '';\n  return `${worker.name}@${worker.version}${warning}`;\n}\n\n/**\n * Generate a worker URL based on worker object and options\n * @returns A URL to one of the following:\n * - a published worker on unpkg CDN\n * - a local test worker\n * - a URL provided by the user in options\n */\nexport function getWorkerURL(worker: WorkerObject, options: WorkerOptions = {}): string {\n  const workerOptions = options[worker.id] || {};\n\n  const workerFile = isBrowser ? `${worker.id}-worker.js` : `${worker.id}-worker-node.js`;\n\n  let url = workerOptions.workerUrl;\n\n  // HACK: Allow for non-nested workerUrl for the CompressionWorker.\n  // For the compression worker, workerOptions is currently not nested correctly. For most loaders,\n  // you'd have options within an object, i.e. `{mvt: {coordinates: ...}}` but the CompressionWorker\n  // puts options at the top level, not within a `compression` key (its `id`). For this reason, the\n  // above `workerOptions` will always be a string (i.e. `'gzip'`) for the CompressionWorker. To not\n  // break backwards compatibility, we allow the CompressionWorker to have options at the top level.\n  if (!url && worker.id === 'compression') {\n    url = options.workerUrl;\n  }\n\n  // If URL is test, generate local loaders.gl url\n  // @ts-ignore _workerType\n  const workerType = (options as any)._workerType || (options as any)?.core?._workerType;\n  if (workerType === 'test') {\n    if (isBrowser) {\n      url = `modules/${worker.module}/dist/${workerFile}`;\n    } else {\n      // In the test environment the ts-node loader requires TypeScript code\n      url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;\n    }\n  }\n\n  // If url override is not provided, generate a URL to published version on npm CDN unpkg.com\n  if (!url) {\n    // GENERATE\n    let version = worker.version;\n    // On master we need to load npm alpha releases published with the `beta` tag\n    if (version === 'latest') {\n      // throw new Error('latest worker version specified');\n      version = NPM_TAG;\n    }\n    const versionTag = version ? `@${version}` : '';\n    url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;\n  }\n\n  assert(url);\n\n  // Allow user to override location\n  return url;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\n/**\n * Check if worker is compatible with this library version\n * @param worker\n * @param libVersion\n * @returns `true` if the two versions are compatible\n */\nexport function validateWorkerVersion(\n  worker: WorkerObject,\n  coreVersion: string = VERSION\n): boolean {\n  assert(worker, 'no worker provided');\n\n  const workerVersion = worker.version;\n  if (!coreVersion || !workerVersion) {\n    return false;\n  }\n\n  // TODO enable when fix the __version__ injection\n  // const coreVersions = parseVersion(coreVersion);\n  // const workerVersions = parseVersion(workerVersion);\n  // assert(\n  //   coreVersion.major === workerVersion.major && coreVersion.minor <= workerVersion.minor,\n  //   `worker: ${worker.name} is not compatible. ${coreVersion.major}.${\n  //     coreVersion.minor\n  //   }+ is required.`\n  // );\n\n  return true;\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction parseVersion(version) {\n  const parts = version.split('.').map(Number);\n  return {major: parts[0], minor: parts[1]};\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* global importScripts */\nimport {isBrowser, isWorker} from '../env-utils/globals';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\nexport type LoadLibraryOptions<ModulesT extends Record<string, any> = Record<string, any>> = {\n  useLocalLibraries?: boolean;\n  CDN?: string | null;\n  modules?: ModulesT;\n  // Core must not be supplied\n  core?: never;\n};\n\ntype ExtractableLoadLibraryOptions<ModulesT extends Record<string, any> = Record<string, any>> = {\n  useLocalLibraries?: boolean;\n  CDN?: string | null;\n  modules?: ModulesT;\n  core?: {\n    useLocalLibraries?: boolean;\n    CDN?: string | null;\n  } | null;\n};\n\nconst loadLibraryPromises: Record<string, Promise<any>> = {}; // promises\n\nexport function extractLoadLibraryOptions<\n  ModulesT extends Record<string, any> = Record<string, any>\n>(options: ExtractableLoadLibraryOptions<ModulesT> = {}): LoadLibraryOptions<ModulesT> {\n  const useLocalLibraries = options.useLocalLibraries ?? options.core?.useLocalLibraries;\n  const CDN = options.CDN ?? options.core?.CDN;\n  const modules = options.modules;\n\n  return {\n    ...(useLocalLibraries !== undefined ? {useLocalLibraries} : {}),\n    ...(CDN !== undefined ? {CDN} : {}),\n    ...(modules !== undefined ? {modules} : {})\n  };\n}\n\n/**\n * Dynamically loads a library (\"module\")\n *\n * - wasm library: Array buffer is returned\n * - js library: Parse JS is returned\n *\n * Method depends on environment\n * - browser - script element is created and installed on document\n * - worker - eval is called on global context\n * - node - file is required\n *\n * @param libraryUrl\n * @param moduleName\n * @param options\n */\nexport async function loadLibrary(\n  libraryUrl: string,\n  moduleName: string | null = null,\n  options: LoadLibraryOptions = {},\n  libraryName: string | null = null\n): Promise<any> {\n  if (moduleName) {\n    libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);\n  }\n  // Ensure libraries are only loaded once\n\n  loadLibraryPromises[libraryUrl] =\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);\n  return await loadLibraryPromises[libraryUrl];\n}\n\n// TODO - sort out how to resolve paths for main/worker and dev/prod\nexport function getLibraryUrl(\n  library: string,\n  moduleName?: string,\n  options: LoadLibraryOptions = {},\n  libraryName: string | null = null\n): string {\n  if (options?.core) {\n    throw new Error('loadLibrary: options.core must be pre-normalized');\n  }\n\n  // Check if already a URL\n  if (!options.useLocalLibraries && library.startsWith('http')) {\n    return library;\n  }\n\n  libraryName = libraryName || library;\n\n  // Allow application to import and supply libraries through `options.modules`\n  // TODO - See js-module-utils in loader-utils\n  const modules = options.modules || {};\n  if (modules[libraryName]) {\n    return modules[libraryName];\n  }\n\n  // Load from local files, not from CDN scripts in Node.js\n  // TODO - needs to locate the modules directory when installed!\n  if (!isBrowser) {\n    return `modules/${moduleName}/dist/libs/${libraryName}`;\n  }\n\n  // In browser, load from external scripts\n  if (options.CDN) {\n    assert(options.CDN.startsWith('http'));\n    return `${options.CDN}/${moduleName}@${VERSION}/dist/libs/${libraryName}`;\n  }\n\n  // TODO - loading inside workers requires paths relative to worker script location...\n  if (isWorker) {\n    return `../src/libs/${libraryName}`;\n  }\n\n  return `modules/${moduleName}/src/libs/${libraryName}`;\n}\n\nasync function loadLibraryFromFile(libraryUrl: string): Promise<any> {\n  if (libraryUrl.endsWith('wasm')) {\n    return await loadAsArrayBuffer(libraryUrl);\n  }\n\n  if (!isBrowser) {\n    // TODO - Node doesn't yet support dynamic import from https URLs\n    // try {\n    //   return await import(libraryUrl);\n    // } catch (error) {\n    //   console.error(error);\n    // }\n    const {requireFromFile} = globalThis.loaders || {};\n    try {\n      const result = await requireFromFile?.(libraryUrl);\n      if (result || !libraryUrl.includes('/dist/libs/')) {\n        return result;\n      }\n      return await requireFromFile?.(libraryUrl.replace('/dist/libs/', '/src/libs/'));\n    } catch (error) {\n      if (libraryUrl.includes('/dist/libs/')) {\n        try {\n          return await requireFromFile?.(libraryUrl.replace('/dist/libs/', '/src/libs/'));\n        } catch {\n          // ignore\n        }\n      }\n      console.error(error); // eslint-disable-line no-console\n      return null;\n    }\n  }\n  if (isWorker) {\n    return importScripts(libraryUrl);\n  }\n  // TODO - fix - should be more secure than string parsing since observes CORS\n  // if (isBrowser) {\n  //   return await loadScriptFromFile(libraryUrl);\n  // }\n\n  const scriptSource = await loadAsText(libraryUrl);\n  return loadLibraryFromString(scriptSource, libraryUrl);\n}\n\n// TODO - Needs security audit...\n//  - Raw eval call\n//  - Potentially bypasses CORS\n// Upside is that this separates fetching and parsing\n// we could create a`LibraryLoader` or`ModuleLoader`\nfunction loadLibraryFromString(scriptSource: string, id: string): null | any {\n  if (!isBrowser) {\n    const {requireFromString} = globalThis.loaders || {};\n    return requireFromString?.(scriptSource, id);\n  }\n\n  if (isWorker) {\n    // Use lvalue trick to make eval run in global scope\n    eval.call(globalThis, scriptSource); // eslint-disable-line no-eval\n    // https://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript\n    // http://perfectionkills.com/global-eval-what-are-the-options/\n    return null;\n  }\n\n  const script = document.createElement('script');\n  script.id = id;\n  // most browsers like a separate text node but some throw an error. The second method covers those.\n  try {\n    script.appendChild(document.createTextNode(scriptSource));\n  } catch (e) {\n    script.text = scriptSource;\n  }\n  document.body.appendChild(script);\n  return null;\n}\n\nasync function loadAsArrayBuffer(url: string): Promise<ArrayBuffer> {\n  const {readFileAsArrayBuffer} = globalThis.loaders || {};\n  if (isBrowser || !readFileAsArrayBuffer || url.startsWith('http')) {\n    const response = await fetch(url);\n    return await response.arrayBuffer();\n  }\n  try {\n    return await readFileAsArrayBuffer(url);\n  } catch {\n    if (url.includes('/dist/libs/')) {\n      return await readFileAsArrayBuffer(url.replace('/dist/libs/', '/src/libs/'));\n    }\n    throw new Error(`Failed to load ArrayBuffer from ${url}`);\n  }\n}\n\n/**\n * Load a file from local file system\n * @param filename\n * @returns\n */\nasync function loadAsText(url: string): Promise<string> {\n  const {readFileAsText} = globalThis.loaders || {};\n  if (isBrowser || !readFileAsText || url.startsWith('http')) {\n    const response = await fetch(url);\n    return await response.text();\n  }\n  try {\n    return await readFileAsText(url);\n  } catch {\n    if (url.includes('/dist/libs/')) {\n      return await readFileAsText(url.replace('/dist/libs/', '/src/libs/'));\n    }\n    throw new Error(`Failed to load text from ${url}`);\n  }\n}\n\n/*\nasync function loadScriptFromFile(libraryUrl) {\n  const script = document.createElement('script');\n  script.src = libraryUrl;\n  return await new Promise((resolve, reject) => {\n    script.onload = data => {\n      resolve(data);\n    };\n    script.onerror = reject;\n  });\n}\n*/\n\n// TODO - technique for module injection into worker, from THREE.DracoLoader...\n/*\nfunction combineWorkerWithLibrary(worker, jsContent) {\n  var fn = wWorker.toString();\n  var body = [\n    '// injected',\n    jsContent,\n    '',\n    '// worker',\n    fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))\n  ].join('\\n');\n  this.workerSourceURL = URL.createObjectURL(new Blob([body]));\n}\n*/\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject} from './types';\nimport {VERSION} from './lib/env-utils/version';\n\n// TYPES\nexport type {\n  WorkerObject,\n  WorkerOptions,\n  // Protocol\n  WorkerMessage,\n  WorkerMessageType,\n  WorkerMessageData,\n  WorkerMessagePayload\n} from './types';\n\n// GENERAL UTILS\nexport {assert} from './lib/env-utils/assert';\nexport {isBrowser, isWorker} from './lib/env-utils/globals';\n\n// WORKER UTILS - TYPES\nexport {default as WorkerJob} from './lib/worker-farm/worker-job';\nexport {default as WorkerThread} from './lib/worker-farm/worker-thread';\n\n// WORKER FARMS\nexport {default as WorkerFarm} from './lib/worker-farm/worker-farm';\nexport {default as WorkerPool} from './lib/worker-farm/worker-pool';\nexport {default as WorkerBody} from './lib/worker-farm/worker-body';\n\n// PROCESS ON WORKER\nexport type {ProcessOnWorkerOptions} from './lib/worker-api/process-on-worker';\nexport {processOnWorker, canProcessOnWorker} from './lib/worker-api/process-on-worker';\nexport {createWorker} from './lib/worker-api/create-worker';\n\n// WORKER UTILS - EXPORTS\nexport {getWorkerURL} from './lib/worker-api/get-worker-url';\nexport {validateWorkerVersion} from './lib/worker-api/validate-worker-version';\nexport {getTransferList, getTransferListForWriter} from './lib/worker-utils/get-transfer-list';\n\n// LIBRARY UTILS\nexport {\n  extractLoadLibraryOptions,\n  getLibraryUrl,\n  loadLibrary,\n  type LoadLibraryOptions\n} from './lib/library-utils/library-utils';\n\n// PARSER UTILS\nexport {default as AsyncQueue} from './lib/async-queue/async-queue';\n\n// PROCESS UTILS\nexport {default as ChildProcessProxy} from './lib/process-utils/child-process-proxy';\n\n// WORKER OBJECTS\n\n/** A null worker to test that worker processing is functional */\nexport const NullWorker: WorkerObject = {\n  id: 'null',\n  name: 'null',\n  module: 'worker-utils',\n  version: VERSION,\n  options: {\n    null: {}\n  }\n};\n", "import {\n  WorkerJob,\n  WorkerMessageType,\n  WorkerMessagePayload,\n  isBrowser,\n  WorkerFarm,\n  getWorkerURL\n} from '@loaders.gl/worker-utils';\nimport type {Loader, LoaderOptions, LoaderContext} from '../../loader-types';\n\n/**\n * Determines if a loader can parse with worker\n * @param loader\n * @param options\n */\nexport function canParseWithWorker(loader: Loader, options?: LoaderOptions) {\n  if (!WorkerFarm.isSupported()) {\n    return false;\n  }\n\n  // Node workers are still experimental\n  const nodeWorkers = options?._nodeWorkers ?? options?.core?._nodeWorkers;\n  if (!isBrowser && !nodeWorkers) {\n    return false;\n  }\n\n  const useWorkers = options?.worker ?? options?.core?.worker;\n  return Boolean(loader.worker && useWorkers);\n}\n\n/**\n * this function expects that the worker function sends certain messages,\n * this can be automated if the worker is wrapper by a call to createLoaderWorker in @loaders.gl/loader-utils.\n */\nexport async function parseWithWorker(\n  loader: Loader,\n  data: any,\n  options?: LoaderOptions,\n  context?: LoaderContext,\n  parseOnMainThread?: (arrayBuffer: ArrayBuffer, options: {[key: string]: any}) => Promise<unknown>\n) {\n  const name = loader.id; // TODO\n  const url = getWorkerURL(loader, options);\n\n  const workerFarm = WorkerFarm.getWorkerFarm(options?.core);\n  const workerPool = workerFarm.getWorkerPool({name, url});\n\n  // options.log object contains functions which cannot be transferred\n  // context.fetch & context.parse functions cannot be transferred\n  // TODO - decide how to handle logging on workers\n  options = JSON.parse(JSON.stringify(options));\n  context = JSON.parse(JSON.stringify(context || {}));\n\n  const job = await workerPool.startJob(\n    'process-on-worker',\n    // @ts-expect-error\n    onMessage.bind(null, parseOnMainThread) // eslint-disable-line @typescript-eslint/no-misused-promises\n  );\n\n  job.postMessage('process', {\n    // @ts-ignore\n    input: data,\n    options,\n    context\n  });\n\n  const result = await job.result;\n  // TODO - what is going on here?\n  return await result.result;\n}\n\n/**\n * Handle worker's responses to the main thread\n * @param job\n * @param type\n * @param payload\n */\nasync function onMessage(\n  parseOnMainThread: (arrayBuffer: ArrayBuffer, options?: {[key: string]: any}) => Promise<void>,\n  job: WorkerJob,\n  type: WorkerMessageType,\n  payload: WorkerMessagePayload\n) {\n  switch (type) {\n    case 'done':\n      job.done(payload);\n      break;\n\n    case 'error':\n      job.error(new Error(payload.error));\n      break;\n\n    case 'process':\n      // Worker is asking for main thread to parseO\n      const {id, input, options} = payload;\n      try {\n        const result = await parseOnMainThread(input, options);\n        job.postMessage('done', {id, result});\n      } catch (error) {\n        const message = error instanceof Error ? error.message : 'unknown error';\n        job.postMessage('error', {id, error: message});\n      }\n      break;\n\n    default:\n      // eslint-disable-next-line\n      console.warn(`parse-with-worker unknown message ${type}`);\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Get the first characters from a binary file (interpret the first bytes as an ASCII string)\n * @param data\n * @param length\n * @returns\n */\nexport function getFirstCharacters(data: string | ArrayBuffer, length: number = 5): string {\n  if (typeof data === 'string') {\n    return data.slice(0, length);\n  } else if (ArrayBuffer.isView(data)) {\n    // Typed Arrays can have offsets into underlying buffer\n    return getMagicString(data.buffer, data.byteOffset, length);\n  } else if (data instanceof ArrayBuffer) {\n    const byteOffset = 0;\n    return getMagicString(data, byteOffset, length);\n  }\n  return '';\n}\n\n/**\n * Gets a magic string from a \"file\"\n * Typically used to check or detect file format\n * @param arrayBuffer\n * @param byteOffset\n * @param length\n * @returns\n */\nexport function getMagicString(\n  arrayBuffer: ArrayBufferLike,\n  byteOffset: number,\n  length: number\n): string {\n  if (arrayBuffer.byteLength <= byteOffset + length) {\n    return '';\n  }\n  const dataView = new DataView(arrayBuffer);\n  let magic = '';\n  for (let i = 0; i < length; i++) {\n    magic += String.fromCharCode(dataView.getUint8(byteOffset + i));\n  }\n  return magic;\n}\n", "import {getFirstCharacters} from '../binary-utils/get-first-characters';\n\n/**\n * Minimal JSON parser that throws more meaningful error messages\n */\nexport function parseJSON(string: string): any {\n  try {\n    return JSON.parse(string);\n  } catch (_) {\n    throw new Error(`Failed to parse JSON from data starting with \"${getFirstCharacters(string)}\"`);\n  }\n}\n", "import {TypedArray} from '../../types';\n\n/**\n * compare two binary arrays for equality\n * @param a\n * @param b\n * @param byteLength\n */\nexport function compareArrayBuffers(\n  arrayBuffer1: ArrayBufferLike,\n  arrayBuffer2: ArrayBufferLike,\n  byteLength?: number\n): boolean {\n  byteLength = byteLength || arrayBuffer1.byteLength;\n  if (arrayBuffer1.byteLength < byteLength || arrayBuffer2.byteLength < byteLength) {\n    return false;\n  }\n  const array1 = new Uint8Array(arrayBuffer1);\n  const array2 = new Uint8Array(arrayBuffer2);\n  for (let i = 0; i < array1.length; ++i) {\n    if (array1[i] !== array2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * Concatenate a sequence of ArrayBuffers from arguments\n * @return A concatenated ArrayBuffer\n */\nexport function concatenateArrayBuffers(...sources: (ArrayBuffer | Uint8Array)[]): ArrayBuffer {\n  return concatenateArrayBuffersFromArray(sources);\n}\n\n/**\n * Concatenate a sequence of ArrayBuffers from array\n * @return A concatenated ArrayBuffer\n */\nexport function concatenateArrayBuffersFromArray(\n  sources: (ArrayBuffer | Uint8Array)[]\n): ArrayBuffer {\n  // Make sure all inputs are wrapped in typed arrays\n  const sourceArrays = sources.map((source2) =>\n    source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2\n  );\n\n  // Get length of all inputs\n  const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);\n\n  // Allocate array with space for all inputs\n  const result = new Uint8Array(byteLength);\n\n  // Copy the subarrays\n  let offset = 0;\n  for (const sourceArray of sourceArrays) {\n    result.set(sourceArray, offset);\n    offset += sourceArray.byteLength;\n  }\n\n  // We work with ArrayBuffers, discard the typed array wrapper\n  return result.buffer;\n}\n\n/**\n * Concatenate arbitrary count of typed arrays\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays\n * @param - list of arrays. All arrays should be the same type\n * @return A concatenated TypedArray\n */\nexport function concatenateTypedArrays<T>(...typedArrays: T[]): T {\n  // @ts-ignore\n  const arrays = typedArrays as TypedArray[];\n  // @ts-ignore\n  const TypedArrayConstructor = (arrays && arrays.length > 1 && arrays[0].constructor) || null;\n  if (!TypedArrayConstructor) {\n    throw new Error(\n      '\"concatenateTypedArrays\" - incorrect quantity of arguments or arguments have incompatible data types'\n    );\n  }\n\n  const sumLength = arrays.reduce((acc, value) => acc + value.length, 0);\n  // @ts-ignore typescript does not like dynamic constructors\n  const result = new TypedArrayConstructor(sumLength);\n  let offset = 0;\n  for (const array of arrays) {\n    result.set(array, offset);\n    offset += array.length;\n  }\n  return result;\n}\n\n/**\n * Copy a view of an ArrayBuffer into new ArrayBuffer with byteOffset = 0\n * @param arrayBuffer\n * @param byteOffset\n * @param byteLength\n */\nexport function sliceArrayBuffer(\n  arrayBuffer: ArrayBufferLike,\n  byteOffset: number,\n  byteLength?: number\n): ArrayBuffer {\n  const subArray =\n    byteLength !== undefined\n      ? new Uint8Array(arrayBuffer).subarray(byteOffset, byteOffset + byteLength)\n      : new Uint8Array(arrayBuffer).subarray(byteOffset);\n  const arrayCopy = new Uint8Array(subArray);\n  return arrayCopy.buffer;\n}\n", "import {assert} from '../env-utils/assert';\n\n/**\n * Calculate new size of an arrayBuffer to be aligned to an n-byte boundary\n * This function increases `byteLength` by the minimum delta,\n * allowing the total length to be divided by `padding`\n * @param byteLength\n * @param padding\n */\nexport function padToNBytes(byteLength: number, padding: number): number {\n  assert(byteLength >= 0); // `Incorrect 'byteLength' value: ${byteLength}`\n  assert(padding > 0); // `Incorrect 'padding' value: ${padding}`\n  return (byteLength + (padding - 1)) & ~(padding - 1);\n}\n\n/**\n * Creates a new Uint8Array based on two different ArrayBuffers\n * @param targetBuffer The first buffer.\n * @param sourceBuffer The second buffer.\n * @return The new ArrayBuffer created out of the two.\n */\nexport function copyArrayBuffer(\n  targetBuffer: ArrayBuffer,\n  sourceBuffer: ArrayBuffer,\n  byteOffset: number,\n  byteLength: number = sourceBuffer.byteLength\n): ArrayBuffer {\n  const targetArray = new Uint8Array(targetBuffer, byteOffset, byteLength);\n  const sourceArray = new Uint8Array(sourceBuffer);\n  targetArray.set(sourceArray);\n  return targetBuffer;\n}\n\n/**\n * Copy from source to target at the targetOffset\n *\n * @param source - The data to copy\n * @param target - The destination to copy data into\n * @param targetOffset - The start offset into target to place the copied data\n * @returns the new offset taking into account proper padding\n */\nexport function copyToArray(source: ArrayBuffer | any, target: any, targetOffset: number): number {\n  let sourceArray;\n\n  if (source instanceof ArrayBuffer) {\n    sourceArray = new Uint8Array(source);\n  } else {\n    // Pack buffer onto the big target array\n    //\n    // 'source.data.buffer' could be a view onto a larger buffer.\n    // We MUST use this constructor to ensure the byteOffset and byteLength is\n    // set to correct values from 'source.data' and not the underlying\n    // buffer for target.set() to work properly.\n    const srcByteOffset = source.byteOffset;\n    const srcByteLength = source.byteLength;\n    // In gltf parser it is set as \"arrayBuffer\" instead of \"buffer\"\n    // https://github.com/visgl/loaders.gl/blob/1e3a82a0a65d7b6a67b1e60633453e5edda2960a/modules/gltf/src/lib/parse-gltf.js#L85\n    sourceArray = new Uint8Array(source.buffer || source.arrayBuffer, srcByteOffset, srcByteLength);\n  }\n\n  // Pack buffer onto the big target array\n  target.set(sourceArray, targetOffset);\n\n  return targetOffset + padToNBytes(sourceArray.byteLength, 4);\n}\n", "import {concatenateArrayBuffers} from '../binary-utils/array-buffer-utils';\n\n// GENERAL UTILITIES\n\n/**\n * Iterates over an {@link AsyncIterable} or {@link Iterable}, invoking `visitor` for each yielded\n * value without rewinding the iterator when exiting early. This enables the caller to continue\n * iterating in another loop after `visitor` signals cancellation.\n */\nexport async function forEach<TValue>(\n  iterable: AsyncIterable<TValue> | Iterable<TValue> | AsyncIterator<TValue>,\n  visitor: (value: TValue) => any\n) {\n  const iterator = toAsyncIterator(iterable);\n  // eslint-disable-next-line\n  while (true) {\n    const {done, value} = await iterator.next();\n    if (done) {\n      if (iterator.return) {\n        iterator.return();\n      }\n      return;\n    }\n    const cancel = visitor(value);\n    if (cancel) {\n      return;\n    }\n  }\n}\n\n/**\n * Concatenates all binary chunks yielded by an async or sync iterator.\n * Supports `ArrayBuffer`, typed array views, and `ArrayBufferLike` sources (e.g. `SharedArrayBuffer`).\n * This allows atomic parsers to operate on iterator inputs by materializing them into a single buffer.\n */\nexport async function concatenateArrayBuffersAsync(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>\n): Promise<ArrayBuffer> {\n  const arrayBuffers: ArrayBuffer[] = [];\n  for await (const chunk of asyncIterator) {\n    arrayBuffers.push(copyToArrayBuffer(chunk));\n  }\n  return concatenateArrayBuffers(...arrayBuffers);\n}\n\nexport async function concatenateStringsAsync(\n  asyncIterator: AsyncIterable<string> | Iterable<string>\n): Promise<string> {\n  const strings: string[] = [];\n  for await (const chunk of asyncIterator) {\n    strings.push(chunk);\n  }\n  return strings.join('');\n}\n\n/**\n * Normalizes binary chunk iterators to yield `ArrayBuffer` instances.\n * Accepts `ArrayBuffer`, `ArrayBufferView`, and `ArrayBufferLike` sources\n * (e.g. `SharedArrayBuffer`) and returns a copied `ArrayBuffer` for each chunk.\n */\nexport async function* toArrayBufferIterator(\n  asyncIterator:\n    | AsyncIterable<ArrayBufferLike | ArrayBufferView>\n    | Iterable<ArrayBufferLike | ArrayBufferView>\n): AsyncIterable<ArrayBuffer> {\n  for await (const chunk of asyncIterator) {\n    yield copyToArrayBuffer(chunk);\n  }\n}\n\nfunction copyToArrayBuffer(chunk: ArrayBufferLike | ArrayBufferView | ArrayBuffer): ArrayBuffer {\n  if (chunk instanceof ArrayBuffer) {\n    return chunk;\n  }\n\n  if (ArrayBuffer.isView(chunk)) {\n    const {buffer, byteOffset, byteLength} = chunk;\n    return copyFromBuffer(buffer, byteOffset, byteLength);\n  }\n\n  return copyFromBuffer(chunk as ArrayBufferLike);\n}\n\nfunction copyFromBuffer(\n  buffer: ArrayBufferLike,\n  byteOffset = 0,\n  byteLength = buffer.byteLength - byteOffset\n): ArrayBuffer {\n  const view = new Uint8Array(buffer, byteOffset, byteLength);\n  const copy = new Uint8Array(view.length);\n  copy.set(view);\n  return copy.buffer;\n}\n\nfunction toAsyncIterator<TValue>(\n  iterable: AsyncIterable<TValue> | Iterable<TValue> | AsyncIterator<TValue>\n): AsyncIterator<TValue> {\n  if (typeof iterable[Symbol.asyncIterator] === 'function') {\n    return iterable[Symbol.asyncIterator]();\n  }\n\n  if (typeof iterable[Symbol.iterator] === 'function') {\n    const iterator = iterable[Symbol.iterator]();\n    return iteratorToAsyncIterator(iterator);\n  }\n\n  return iterable as AsyncIterator<TValue>;\n}\n\nfunction iteratorToAsyncIterator<T>(iterator: Iterator<T>): AsyncIterator<T> {\n  return {\n    next(value?: any) {\n      return Promise.resolve(iterator.next(value));\n    },\n\n    return(value?: any) {\n      if (typeof iterator.return === 'function') {\n        return Promise.resolve(iterator.return(value));\n      }\n      return Promise.resolve({done: true, value});\n    },\n\n    throw(error?: any) {\n      if (typeof iterator.throw === 'function') {\n        return Promise.resolve(iterator.throw(error));\n      }\n      return Promise.reject(error);\n    }\n  };\n}\n", "// Simple file alias mechanisms for tests.\n\nlet pathPrefix = '';\nconst fileAliases: {[aliasPath: string]: string} = {};\n\n/*\n * Set a relative path prefix\n */\nexport function setPathPrefix(prefix: string): void {\n  pathPrefix = prefix;\n}\n\n/*\n * Get the relative path prefix\n */\nexport function getPathPrefix(): string {\n  return pathPrefix;\n}\n\n/**\n *\n * @param aliases\n *\n * Note: addAliases are an experimental export, they are only for testing of loaders.gl loaders\n * not intended as a generic aliasing mechanism\n */\nexport function addAliases(aliases: {[aliasPath: string]: string}): void {\n  Object.assign(fileAliases, aliases);\n}\n\n/**\n * Resolves aliases and adds path-prefix to paths\n */\nexport function resolvePath(filename: string): string {\n  for (const alias in fileAliases) {\n    if (filename.startsWith(alias)) {\n      const replacement = fileAliases[alias];\n      filename = filename.replace(alias, replacement);\n    }\n  }\n  if (!filename.startsWith('http://') && !filename.startsWith('https://')) {\n    filename = `${pathPrefix}${filename}`;\n  }\n  return filename;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Isolates Buffer references to ensure they are only bundled under Node.js (avoids big webpack polyfill)\n// this file is selected by the package.json \"browser\" field).\n\n/**\n * Convert Buffer to ArrayBuffer\n * Converts Node.js `Buffer` to `ArrayBuffer` (without triggering bundler to include Buffer polyfill on browser)\n * @todo better data type\n */\nexport function toArrayBuffer(buffer) {\n  return buffer;\n}\n\n/**\n * Convert (copy) ArrayBuffer to Buffer\n */\nexport function toBuffer(binaryData: ArrayBuffer | Buffer): Buffer {\n  throw new Error('Buffer not supported in browser');\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isSharedArrayBuffer} from '../javascript-utils/is-type';\nimport * as node from '../node/buffer';\n\n/**\n * Check for Node.js `Buffer` (without triggering bundler to include Buffer polyfill on browser)\n */\nexport function isBuffer(value: any): value is Buffer {\n  return value && typeof value === 'object' && value.isBuffer;\n}\n\n/**\n * Converts to Node.js `Buffer` (without triggering bundler to include Buffer polyfill on browser)\n * @todo better data type\n */\nexport function toBuffer(data: unknown): Buffer {\n  return node.toBuffer ? node.toBuffer(data as any) : (data as Buffer);\n}\n\n/**\n * Convert an object to an array buffer. Handles SharedArrayBuffers.\n */\nexport function toArrayBuffer(\n  data: Buffer | ArrayBufferLike | ArrayBufferView | string | Blob\n): ArrayBuffer {\n  // Note: Should be called first, Buffers can trigger other detections below\n  if (isBuffer(data)) {\n    return node.toArrayBuffer(data);\n  }\n\n  if (data instanceof ArrayBuffer) {\n    return data;\n  }\n\n  if (isSharedArrayBuffer(data)) {\n    return copyToArrayBuffer(data);\n  }\n\n  // Node Buffers look like Uint8Arrays (Check isBuffer first)\n  if (ArrayBuffer.isView(data)) {\n    // TODO - ArrayBufferLike type mess\n    const buffer = data.buffer as ArrayBuffer;\n    if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) {\n      return buffer;\n    }\n    return buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n  }\n\n  if (typeof data === 'string') {\n    const text = data;\n    const uint8Array = new TextEncoder().encode(text);\n    return uint8Array.buffer;\n  }\n\n  // HACK to support Blob polyfill\n  if (data && typeof data === 'object' && (data as any)._toArrayBuffer) {\n    return (data as any)._toArrayBuffer();\n  }\n\n  throw new Error('toArrayBuffer');\n}\n\n/** Ensure that SharedArrayBuffers are copied into ArrayBuffers */\nexport function ensureArrayBuffer(bufferSource: ArrayBufferLike | ArrayBufferView): ArrayBuffer {\n  if (bufferSource instanceof ArrayBuffer) {\n    return bufferSource;\n  }\n\n  if (isSharedArrayBuffer(bufferSource)) {\n    return copyToArrayBuffer(bufferSource);\n  }\n\n  const {buffer, byteOffset, byteLength} = bufferSource;\n  if (buffer instanceof ArrayBuffer && byteOffset === 0 && byteLength === buffer.byteLength) {\n    return buffer;\n  }\n  return copyToArrayBuffer(buffer, byteOffset, byteLength);\n}\n\n/** Copies an ArrayBuffer or a section of an ArrayBuffer to a new ArrayBuffer, handles SharedArrayBuffers */\nexport function copyToArrayBuffer(\n  buffer: ArrayBufferLike,\n  byteOffset = 0,\n  byteLength = buffer.byteLength - byteOffset\n): ArrayBuffer {\n  const view = new Uint8Array(buffer, byteOffset, byteLength);\n  const copy = new Uint8Array(view.length);\n  copy.set(view);\n  return copy.buffer;\n}\n\n/** Convert an object to an ArrayBufferView, handles SharedArrayBuffers */\nexport function toArrayBufferView(\n  data: ArrayBufferLike | ArrayBufferView\n): ArrayBuffer | ArrayBufferView {\n  if (ArrayBuffer.isView(data)) {\n    return data;\n  }\n\n  // Create a view to support ArrayBufferLike sources such as SharedArrayBuffer\n  return new Uint8Array(data);\n}\n", "// loaders.gl MIT license\n\nexport function getCWD() {\n  if (typeof process !== 'undefined' && typeof process.cwd !== 'undefined') {\n    return process.cwd();\n  }\n  const pathname = window.location?.pathname;\n  return pathname?.slice(0, pathname.lastIndexOf('/') + 1) || '';\n}\n", "// Beginning of a minimal implementation of the Node.js path API, that doesn't pull in big polyfills.\n\nimport {getCWD} from './get-cwd';\n\n/**\n * Replacement for Node.js path.filename\n * @param url\n */\nexport function filename(url: string): string {\n  const slashIndex = url ? url.lastIndexOf('/') : -1;\n  return slashIndex >= 0 ? url.substr(slashIndex + 1) : url;\n}\n\n/**\n * Replacement for Node.js path.dirname\n * @param url\n */\nexport function dirname(url: string): string {\n  const slashIndex = url ? url.lastIndexOf('/') : -1;\n  return slashIndex >= 0 ? url.substr(0, slashIndex) : '';\n}\n\n/**\n * Replacement for Node.js path.join\n * @param parts\n */\nexport function join(...parts: string[]): string {\n  const separator = '/';\n  parts = parts.map((part, index) => {\n    if (index) {\n      part = part.replace(new RegExp(`^${separator}`), '');\n    }\n    if (index !== parts.length - 1) {\n      part = part.replace(new RegExp(`${separator}$`), '');\n    }\n    return part;\n  });\n  return parts.join(separator);\n}\n\n/* eslint-disable no-continue */\n\n/**\n * https://nodejs.org/api/path.html#path_path_resolve_paths\n * @param paths A sequence of paths or path segments.\n * @return resolved path\n * Forked from BTOdell/path-resolve under MIT license\n * @see https://github.com/BTOdell/path-resolve/blob/master/LICENSE\n */\nexport function resolve(...components: string[]): string {\n  const paths: string[] = [];\n  for (let _i = 0; _i < components.length; _i++) {\n    paths[_i] = components[_i];\n  }\n  let resolvedPath = '';\n  let resolvedAbsolute = false;\n  let cwd: string | undefined;\n  for (let i = paths.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    let path: string | undefined;\n    if (i >= 0) {\n      path = paths[i];\n    } else {\n      if (cwd === undefined) {\n        cwd = getCWD();\n      }\n      path = cwd;\n    }\n    // Skip empty entries\n    if (path.length === 0) {\n      continue;\n    }\n    resolvedPath = `${path}/${resolvedPath}`;\n    resolvedAbsolute = path.charCodeAt(0) === SLASH;\n  }\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n  // Normalize the path (removes leading slash)\n  resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n  if (resolvedAbsolute) {\n    return `/${resolvedPath}`;\n  } else if (resolvedPath.length > 0) {\n    return resolvedPath;\n  }\n  return '.';\n}\n\nconst SLASH = 47;\nconst DOT = 46;\n\n/**\n * Resolves . and .. elements in a path with directory names\n * Forked from BTOdell/path-resolve under MIT license\n * @see https://github.com/BTOdell/path-resolve/blob/master/LICENSE\n */\n/* eslint-disable max-depth */\n// eslint-disable-next-line complexity, max-statements\nfunction normalizeStringPosix(path: string, allowAboveRoot: boolean): string {\n  let res = '';\n  let lastSlash = -1;\n  let dots = 0;\n  let code: number | undefined;\n  let isAboveRoot = false;\n\n  for (let i = 0; i <= path.length; ++i) {\n    if (i < path.length) {\n      code = path.charCodeAt(i);\n    } else if (code === SLASH) {\n      break;\n    } else {\n      code = SLASH;\n    }\n    if (code === SLASH) {\n      if (lastSlash === i - 1 || dots === 1) {\n        // NOOP\n      } else if (lastSlash !== i - 1 && dots === 2) {\n        if (\n          res.length < 2 ||\n          !isAboveRoot ||\n          res.charCodeAt(res.length - 1) !== DOT ||\n          res.charCodeAt(res.length - 2) !== DOT\n        ) {\n          if (res.length > 2) {\n            const start = res.length - 1;\n            let j = start;\n            for (; j >= 0; --j) {\n              if (res.charCodeAt(j) === SLASH) {\n                break;\n              }\n            }\n            if (j !== start) {\n              res = j === -1 ? '' : res.slice(0, j);\n              lastSlash = i;\n              dots = 0;\n              isAboveRoot = false;\n              continue;\n            }\n          } else if (res.length === 2 || res.length === 1) {\n            res = '';\n            lastSlash = i;\n            dots = 0;\n            isAboveRoot = false;\n            continue;\n          }\n        }\n        if (allowAboveRoot) {\n          if (res.length > 0) {\n            res += '/..';\n          } else {\n            res = '..';\n          }\n          isAboveRoot = true;\n        }\n      } else {\n        const slice = path.slice(lastSlash + 1, i);\n        if (res.length > 0) {\n          res += `/${slice}`;\n        } else {\n          res = slice;\n        }\n        isAboveRoot = false;\n      }\n      lastSlash = i;\n      dots = 0;\n    } else if (code === DOT && dots !== -1) {\n      ++dots;\n    } else {\n      dots = -1;\n    }\n  }\n  return res;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TYPES\n\nexport type {\n  // misc\n  DataType,\n  SyncDataType,\n  BatchableDataType,\n  TransformBatches,\n  // numeric array types\n  TypedArray,\n  BigTypedArray,\n  TypedArrayConstructor,\n  BigTypedArrayConstructor,\n  NumberArray,\n  NumericArray,\n  // fetch\n  FetchLike\n} from './types';\n\n// formats\n\nexport type {Format} from './format-types';\n\n// loaders\n\nexport type {\n  Loader,\n  LoaderWithParser,\n  LoaderContext,\n  StrictLoaderOptions,\n  LoaderOptions,\n  LoaderOptionsType,\n  LoaderReturnType,\n  LoaderBatchType,\n  LoaderArrayOptionsType,\n  LoaderArrayReturnType,\n  LoaderArrayBatchType\n} from './loader-types';\n\nexport {parseFromContext, parseSyncFromContext, parseInBatchesFromContext} from './loader-types';\n\n// writers\n\nexport type {\n  Writer,\n  WriterWithEncoder,\n  WriterOptions,\n  WriterOptionsType,\n  WriterDataType,\n  WriterBatchType\n} from './writer-types';\n\n// GENERAL UTILS\nexport {assert} from './lib/env-utils/assert';\nexport {\n  isBrowser,\n  isWorker,\n  nodeVersion,\n  self,\n  window,\n  global,\n  document\n} from './lib/env-utils/globals';\n\nexport {log} from './lib/log-utils/log';\n\nexport type {ReadableStreamType} from './lib/javascript-utils/is-type';\nexport {\n  isObject,\n  isPureObject,\n  isArrayBuffer,\n  isArrayBufferLike,\n  isPromise,\n  isIterable,\n  isAsyncIterable,\n  isIterator,\n  isResponse,\n  isFile,\n  isBlob,\n  isWritableDOMStream,\n  isReadableDOMStream,\n  isWritableNodeStream,\n  isReadableNodeStream,\n  isReadableStream,\n  isWritableStream\n} from './lib/javascript-utils/is-type';\n\n// Options and modules\nexport type {RequiredOptions} from './lib/option-utils/merge-options';\nexport {mergeOptions, getRequiredOptions} from './lib/option-utils/merge-options';\n\n// Modules (external libraries)\nexport {registerJSModules} from './lib/module-utils/js-module-utils';\nexport {checkJSModule, getJSModule, getJSModuleOrNull} from './lib/module-utils/js-module-utils';\n\n// LOADERS.GL-SPECIFIC WORKER UTILS\nexport {createLoaderWorker} from './lib/worker-loader-utils/create-loader-worker';\nexport {parseWithWorker, canParseWithWorker} from './lib/worker-loader-utils/parse-with-worker';\nexport {canEncodeWithWorker} from './lib/worker-loader-utils/encode-with-worker';\n\n// PARSER UTILS\nexport {parseJSON} from './lib/parser-utils/parse-json';\n\n// MEMORY COPY UTILS\nexport {\n  sliceArrayBuffer,\n  concatenateArrayBuffers,\n  concatenateArrayBuffersFromArray,\n  concatenateTypedArrays,\n  compareArrayBuffers\n} from './lib/binary-utils/array-buffer-utils';\nexport {padToNBytes, copyToArray, copyArrayBuffer} from './lib/binary-utils/memory-copy-utils';\nexport {\n  padStringToByteAlignment,\n  copyStringToDataView,\n  copyBinaryToDataView,\n  copyPaddedArrayBufferToDataView,\n  copyPaddedStringToDataView\n} from './lib/binary-utils/dataview-copy-utils';\nexport {getFirstCharacters, getMagicString} from './lib/binary-utils/get-first-characters';\n\n// ITERATOR UTILS\nexport {\n  makeTextEncoderIterator,\n  makeTextDecoderIterator,\n  makeLineIterator,\n  makeNumberedLineIterator\n} from './lib/iterators/text-iterators';\nexport {\n  forEach,\n  concatenateArrayBuffersAsync,\n  toArrayBufferIterator\n} from './lib/iterators/async-iteration';\n\n// REQUEST UTILS\nexport {default as RequestScheduler} from './lib/request-utils/request-scheduler';\n\n// PATH HELPERS\nexport {setPathPrefix, getPathPrefix, resolvePath} from './lib/path-utils/file-aliases';\nexport {addAliases as _addAliases} from './lib/path-utils/file-aliases';\n\n// MICRO LOADERS\nexport {JSONLoader} from './json-loader';\n\n// NODE support\n\n// Node.js emulation (can be used in browser)\n\n// Avoid direct use of `Buffer` which pulls in 50KB polyfill\nexport {\n  isBuffer,\n  toBuffer,\n  toArrayBuffer,\n  toArrayBufferView,\n  copyToArrayBuffer,\n  ensureArrayBuffer\n} from './lib/binary-utils/memory-conversion-utils';\n\n// Note.js wrappers (can be safely imported, but not used in browser)\n\n// Use instead of importing 'util' to avoid node dependencies\nexport {promisify1, promisify2} from './lib/node/promisify';\n\n// `path` replacement (avoids bundling big path polyfill)\nimport * as path from './lib/path-utils/path';\nexport {path};\n\n// Use instead of importing 'stream' to avoid node dependencies`\nimport * as stream from './lib/node/stream';\nexport {stream};\n\n// EXPERIMENTAL: FILE SYSTEMS\n\nexport type {ReadableFile, WritableFile, Stat} from './lib/files/file';\nexport {BlobFile} from './lib/files/blob-file';\nexport {HttpFile} from './lib/files/http-file';\nexport {NodeFileFacade as NodeFile} from './lib/files/node-file-facade';\n\nexport type {FileSystem, RandomAccessFileSystem} from './lib/filesystems/filesystem';\nexport {NodeFileSystemFacade as NodeFilesystem} from './lib/filesystems/node-filesystem-facade';\n\n// EXPERIMENTAL: DATA SOURCES\nexport type {Source, SourceArrayOptionsType, SourceArrayDataSourceType} from './source-types';\n\nexport type {DataSourceOptions} from './lib/sources/data-source';\nexport {DataSource} from './lib/sources/data-source';\n\nexport {ImageSource} from './lib/sources/image-source';\nexport type {ImageType} from './lib/sources/utils/image-type';\nexport type {ImageSourceMetadata} from './lib/sources/image-source';\nexport type {GetImageParameters} from './lib/sources/image-source';\n\nexport type {VectorSource} from './lib/sources/vector-source';\nexport type {VectorSourceMetadata} from './lib/sources/vector-source';\nexport type {GetFeaturesParameters} from './lib/sources/vector-source';\n\nexport type {TileSource} from './lib/sources/tile-source';\nexport type {TileSourceMetadata, GetTileParameters} from './lib/sources/tile-source';\nexport type {GetTileDataParameters} from './lib/sources/tile-source';\n\nexport type {ImageTileSource} from './lib/sources/image-tile-source';\n\nexport type {VectorTileSource} from './lib/sources/vector-tile-source';\nexport type {VectorTile} from './lib/sources/vector-tile-source';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport class FetchError extends Error {\n  constructor(message: string, info: {url: string; reason: string; response?: Response}) {\n    super(message);\n    this.reason = info.reason;\n    this.url = info.url;\n    this.response = info.response;\n  }\n  /** A best effort reason for why the fetch failed */\n  reason: string;\n  /** The URL that failed to load. Empty string if not available. */\n  url: string;\n  /** The Response object, if any. */\n  response?: Response;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TODO - build/integrate proper MIME type parsing\n// https://mimesniff.spec.whatwg.org/\n\nconst DATA_URL_PATTERN = /^data:([-\\w.]+\\/[-\\w.+]+)(;|,)/;\nconst MIME_TYPE_PATTERN = /^([-\\w.]+\\/[-\\w.+]+)/;\n\n/**\n * Compare two MIME types, case insensitively etc.\n * @param mimeType1\n * @param mimeType2\n * @returns true if the MIME types are equivalent\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#structure_of_a_mime_type\n */\nexport function compareMIMETypes(mimeType1: string, mimeType2: string): boolean {\n  if (mimeType1.toLowerCase() === mimeType2.toLowerCase()) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Remove extra data like `charset` from MIME types\n * @param mimeString\n * @returns A clean MIME type, or an empty string\n *\n * @todo - handle more advanced MIMETYpes, multiple types\n * @todo - extract charset etc\n */\nexport function parseMIMEType(mimeString: string): string {\n  // If resource is a data url, extract any embedded mime type\n  const matches = MIME_TYPE_PATTERN.exec(mimeString);\n  if (matches) {\n    return matches[1];\n  }\n  return mimeString;\n}\n\n/**\n * Extract MIME type from data URL\n *\n * @param mimeString\n * @returns A clean MIME type, or an empty string\n *\n * @todo - handle more advanced MIMETYpes, multiple types\n * @todo - extract charset etc\n */\nexport function parseMIMETypeFromURL(url: string): string {\n  // If resource is a data URL, extract any embedded mime type\n  const matches = DATA_URL_PATTERN.exec(url);\n  if (matches) {\n    return matches[1];\n  }\n  return '';\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst QUERY_STRING_PATTERN = /\\?.*/;\n\nexport function extractQueryString(url): string {\n  const matches = url.match(QUERY_STRING_PATTERN);\n  return matches && matches[0];\n}\n\nexport function stripQueryString(url): string {\n  return url.replace(QUERY_STRING_PATTERN, '');\n}\n\nexport function shortenUrlForDisplay(url: string): string {\n  if (url.length < 50) {\n    return url;\n  }\n  const urlEnd = url.slice(url.length - 15);\n  const urlStart = url.substr(0, 32);\n  return `${urlStart}...${urlEnd}`;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isResponse, isBlob} from '@loaders.gl/loader-utils';\nimport {parseMIMEType, parseMIMETypeFromURL} from './mime-type-utils';\nimport {stripQueryString} from './url-utils';\n\n/**\n * A loadable resource. Includes:\n * `Response`, `Blob` (`File` is a subclass), string URLs and data URLs\n */\nexport type Resource = Response | Blob | string;\n\n/**\n * Returns the URL associated with this resource.\n * The returned value may include a query string and need further processing.\n * If it cannot determine url, the corresponding value will be an empty string\n *\n * @todo string parameters are assumed to be URLs\n */\nexport function getResourceUrl(resource: unknown): string {\n  // If resource is a `Response`, it contains the information directly as a field\n  if (isResponse(resource)) {\n    return resource.url;\n  }\n\n  // If the resource is a Blob or a File (subclass of Blob)\n  if (isBlob(resource)) {\n    // File objects have a \"name\" property. Blob objects don't have any\n    // url (name) information\n    const fileName = 'name' in resource ? (resource as File).name : '';\n    return fileName || '';\n  }\n\n  if (typeof resource === 'string') {\n    return resource;\n  }\n\n  // Unknown\n  return '';\n}\n\n/**\n * Returns the URL associated with this resource.\n * The returned value may include a query string and need further processing.\n * If it cannot determine url, the corresponding value will be an empty string\n *\n * @todo string parameters are assumed to be URLs\n */\nexport function getResourceMIMEType(resource: unknown): string {\n  // If resource is a response, it contains the information directly\n  if (isResponse(resource)) {\n    const contentTypeHeader = resource.headers.get('content-type') || '';\n    const noQueryUrl = stripQueryString(resource.url);\n    return parseMIMEType(contentTypeHeader) || parseMIMETypeFromURL(noQueryUrl);\n  }\n\n  // If the resource is a Blob or a File (subclass of Blob)\n  if (isBlob(resource)) {\n    return resource.type || '';\n  }\n\n  if (typeof resource === 'string') {\n    return parseMIMETypeFromURL(resource);\n  }\n\n  // Unknown\n  return '';\n}\n\n/**\n  * Returns (approximate) content length for a resource if it can be determined.\n  * Returns -1 if content length cannot be determined.\n  * @param resource\n\n  * @note string parameters are NOT assumed to be URLs\n  */\nexport function getResourceContentLength(resource: unknown): number {\n  if (isResponse(resource)) {\n    const response = resource;\n    return response.headers['content-length'] || -1;\n  }\n  if (isBlob(resource)) {\n    const blob = resource;\n    return blob.size;\n  }\n  if (typeof resource === 'string') {\n    // TODO - handle data URL?\n    return resource.length;\n  }\n  if (resource instanceof ArrayBuffer) {\n    return resource.byteLength;\n  }\n  if (ArrayBuffer.isView(resource)) {\n    return resource.byteLength;\n  }\n  return -1;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isResponse} from '@loaders.gl/loader-utils';\nimport {FetchError} from '../fetch/fetch-error';\nimport {getResourceContentLength, getResourceUrl, getResourceMIMEType} from './resource-utils';\nimport {shortenUrlForDisplay} from './url-utils';\n\n/**\n * Returns a Response object\n * Adds content-length header when possible\n *\n * @param resource\n */\nexport async function makeResponse(resource: unknown): Promise<Response> {\n  if (isResponse(resource)) {\n    return resource;\n  }\n\n  // Add content-length header if possible\n  const headers: {[header: string]: string} = {};\n\n  const contentLength = getResourceContentLength(resource);\n  if (contentLength >= 0) {\n    headers['content-length'] = String(contentLength);\n  }\n\n  // `new Response(File)` does not preserve content-type and URL\n  // so we add them here\n  const url = getResourceUrl(resource);\n  const type = getResourceMIMEType(resource);\n  if (type) {\n    headers['content-type'] = type;\n  }\n\n  // Add a custom header with initial bytes if available\n  const initialDataUrl = await getInitialDataUrl(resource);\n  if (initialDataUrl) {\n    headers['x-first-bytes'] = initialDataUrl;\n  }\n\n  // TODO - is this the best way of handling strings?\n  // Maybe package as data URL instead?\n  if (typeof resource === 'string') {\n    // Convert to ArrayBuffer to avoid Response treating it as a URL\n    resource = new TextEncoder().encode(resource);\n  }\n\n  // Attempt to create a Response from the resource, adding headers and setting url\n  const response = new Response(resource as any, {headers});\n  // We can't control `Response.url` via constructor, use a property override to record URL.\n  Object.defineProperty(response, 'url', {value: url});\n  return response;\n}\n\n/**\n * Checks response status (async) and throws a helpful error message if status is not OK.\n * @param response\n */\nexport async function checkResponse(response: Response): Promise<void> {\n  if (!response.ok) {\n    const error = await getResponseError(response);\n    throw error;\n  }\n}\n\n/**\n * Checks response status (sync) and throws a helpful error message if status is not OK.\n * @param response\n */\nexport function checkResponseSync(response: Response): void {\n  if (!response.ok) {\n    let message = `${response.status} ${response.statusText}`;\n    message = message.length > 60 ? `${message.slice(0, 60)}...` : message;\n    throw new Error(message);\n  }\n}\n\n// HELPERS\n\nasync function getResponseError(response: Response): Promise<Error> {\n  const shortUrl = shortenUrlForDisplay(response.url);\n  let message = `Failed to fetch resource (${response.status}) ${response.statusText}: ${shortUrl}`;\n  message = message.length > 100 ? `${message.slice(0, 100)}...` : message;\n\n  const info = {\n    reason: response.statusText,\n    url: response.url,\n    response\n  };\n\n  // See if we got an error message in the body\n  try {\n    const contentType = response.headers.get('Content-Type');\n    info.reason =\n      !response.bodyUsed && contentType?.includes('application/json')\n        ? await response.json()\n        : await response.text();\n  } catch (error) {\n    // eslint forbids return in a finally statement, so we just catch here\n  }\n  return new FetchError(message, info);\n}\n\nasync function getInitialDataUrl(\n  resource: string | Blob | ArrayBuffer | unknown\n): Promise<string | null> {\n  const INITIAL_DATA_LENGTH = 5;\n  if (typeof resource === 'string') {\n    return `data:,${resource.slice(0, INITIAL_DATA_LENGTH)}`;\n  }\n  if (resource instanceof Blob) {\n    const blobSlice = resource.slice(0, 5);\n    return await new Promise((resolve) => {\n      const reader = new FileReader();\n      reader.onload = (event) => resolve(event?.target?.result as string);\n      reader.readAsDataURL(blobSlice);\n    });\n  }\n  if (resource instanceof ArrayBuffer) {\n    const slice = resource.slice(0, INITIAL_DATA_LENGTH);\n    const base64 = arrayBufferToBase64(slice);\n    return `data:base64,${base64}`;\n  }\n  return null;\n}\n\n// https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string\nfunction arrayBufferToBase64(buffer: ArrayBuffer): string {\n  let binary = '';\n  const bytes = new Uint8Array(buffer);\n  for (let i = 0; i < bytes.byteLength; i++) {\n    binary += String.fromCharCode(bytes[i]);\n  }\n  return btoa(binary);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\n// import {FetchError} from './fetch-error';\n\nexport function isNodePath(url: string): boolean {\n  return !isRequestURL(url) && !isDataURL(url);\n}\n\nexport function isRequestURL(url: string): boolean {\n  return url.startsWith('http:') || url.startsWith('https:');\n}\n\nexport function isDataURL(url: string): boolean {\n  return url.startsWith('data:');\n}\n\n/**\n * fetch API compatible function\n * - Supports fetching from Node.js local file system paths\n * - Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n  urlOrData: string | Blob,\n  fetchOptions?: RequestInit\n): Promise<Response> {\n  if (typeof urlOrData === 'string') {\n    const url = resolvePath(urlOrData);\n\n    // Support fetching from local file system\n    if (isNodePath(url)) {\n      if (globalThis.loaders?.fetchNode) {\n        return globalThis.loaders?.fetchNode(url, fetchOptions);\n      }\n      // throw new Error(\n      //   'fetchFile: globalThis.loaders.fetchNode not defined. Install @loaders.gl/polyfills'\n      // );\n    }\n\n    // Call global fetch\n    return await fetch(url, fetchOptions);\n  }\n\n  // TODO - should we still call fetch on non-URL inputs?\n  return await makeResponse(urlOrData);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// probe.gl Log compatible loggers\n\nimport {Log} from '@probe.gl/log';\n\nexport const probeLog = new Log({id: 'loaders.gl'});\n\ntype LogFunction = () => void;\n\n// Logs nothing\nexport class NullLog {\n  log(): LogFunction {\n    return () => {};\n  }\n  info(): LogFunction {\n    return () => {};\n  }\n  warn(): LogFunction {\n    return () => {};\n  }\n  error(): LogFunction {\n    return () => {};\n  }\n}\n\n// Logs to console\nexport class ConsoleLog {\n  console;\n\n  constructor() {\n    this.console = console; // eslint-disable-line\n  }\n  log(...args: unknown[]): LogFunction {\n    return this.console.log.bind(this.console, ...args);\n  }\n  info(...args: unknown[]): LogFunction {\n    return this.console.info.bind(this.console, ...args);\n  }\n  warn(...args: unknown[]): LogFunction {\n    return this.console.warn.bind(this.console, ...args);\n  }\n  error(...args: unknown[]): LogFunction {\n    return this.console.error.bind(this.console, ...args);\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport {isBrowser} from '@loaders.gl/loader-utils';\nimport {ConsoleLog} from './loggers';\n\nexport const DEFAULT_LOADER_OPTIONS: LoaderOptions = {\n  core: {\n    baseUrl: undefined,\n    // baseUrl\n    fetch: null,\n    mimeType: undefined,\n    fallbackMimeType: undefined,\n    ignoreRegisteredLoaders: undefined,\n    nothrow: false,\n    log: new ConsoleLog(), // A probe.gl compatible (`log.log()()` syntax) that just logs to console\n    useLocalLibraries: false,\n\n    CDN: 'https://unpkg.com/@loaders.gl',\n    worker: true, // By default, use worker if provided by loader.\n    maxConcurrency: 3, // How many worker instances should be created for each loader.\n    maxMobileConcurrency: 1, // How many worker instances should be created for each loader on mobile devices.\n    reuseWorkers: isBrowser, // By default reuse workers in browser (Node.js refuses to terminate if browsers are running)\n    _nodeWorkers: false, // By default do not support node workers\n    _workerType: '', // 'test' to use locally generated workers\n\n    limit: 0,\n    _limitMB: 0,\n    batchSize: 'auto',\n    batchDebounceMs: 0,\n    metadata: false, // TODO - currently only implemented for parseInBatches, adds initial metadata batch,\n    transforms: []\n  }\n};\n\nexport const REMOVED_LOADER_OPTIONS = {\n  // deprecated top-level alias\n  baseUri: 'core.baseUrl',\n  fetch: 'core.fetch',\n  mimeType: 'core.mimeType',\n  fallbackMimeType: 'core.fallbackMimeType',\n  ignoreRegisteredLoaders: 'core.ignoreRegisteredLoaders',\n  nothrow: 'core.nothrow',\n  log: 'core.log',\n  useLocalLibraries: 'core.useLocalLibraries',\n\n  CDN: 'core.CDN',\n  worker: 'core.worker',\n  maxConcurrency: 'core.maxConcurrency',\n  maxMobileConcurrency: 'core.maxMobileConcurrency',\n  reuseWorkers: 'core.reuseWorkers',\n  _nodeWorkers: 'core.nodeWorkers',\n  _workerType: 'core._workerType',\n  _worker: 'core._workerType',\n\n  limit: 'core.limit',\n  _limitMB: 'core._limitMB',\n  batchSize: 'core.batchSize',\n  batchDebounceMs: 'core.batchDebounceMs',\n  metadata: 'core.metadata',\n  transforms: 'core.transforms',\n\n  // Older deprecations\n  throws: 'nothrow',\n  dataType: '(no longer used)',\n  uri: 'core.baseUrl',\n\n  // Warn if fetch options are used on toplevel\n  method: 'core.fetch.method',\n  headers: 'core.fetch.headers',\n  body: 'core.fetch.body',\n  mode: 'core.fetch.mode',\n  credentials: 'core.fetch.credentials',\n  cache: 'core.fetch.cache',\n  redirect: 'core.fetch.redirect',\n  referrer: 'core.fetch.referrer',\n  referrerPolicy: 'core.fetch.referrerPolicy',\n  integrity: 'core.fetch.integrity',\n  keepalive: 'core.fetch.keepalive',\n  signal: 'core.fetch.signal'\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n  Loader,\n  LoaderOptions,\n  registerJSModules,\n  isPureObject,\n  isObject,\n  StrictLoaderOptions,\n  path\n} from '@loaders.gl/loader-utils';\nimport {probeLog, NullLog} from './loggers';\nimport {DEFAULT_LOADER_OPTIONS, REMOVED_LOADER_OPTIONS} from './option-defaults';\nimport {stripQueryString} from '../utils/url-utils';\n\nconst CORE_LOADER_OPTION_KEYS = [\n  'baseUrl',\n  'fetch',\n  'mimeType',\n  'fallbackMimeType',\n  'ignoreRegisteredLoaders',\n  'nothrow',\n  'log',\n  'useLocalLibraries',\n  'CDN',\n  'worker',\n  'maxConcurrency',\n  'maxMobileConcurrency',\n  'reuseWorkers',\n  '_nodeWorkers',\n  '_workerType',\n  'limit',\n  '_limitMB',\n  'batchSize',\n  'batchDebounceMs',\n  'metadata',\n  'transforms'\n] as const;\n\n/**\n * Global state for loaders.gl. Stored on `globalThis.loaders._state`\n */\ntype GlobalLoaderState = {\n  loaderRegistry: Loader[];\n  globalOptions: LoaderOptions;\n};\n\n/**\n * Helper for safely accessing global loaders.gl variables\n * Wraps initialization of global variable in function to defeat overly aggressive tree-shakers\n */\nexport function getGlobalLoaderState(): GlobalLoaderState {\n  // @ts-ignore\n  globalThis.loaders = globalThis.loaders || {};\n  // @ts-ignore\n  const {loaders} = globalThis;\n\n  // Add _state object to keep separate from modules added to globalThis.loaders\n  if (!loaders._state) {\n    loaders._state = {};\n  }\n  return loaders._state;\n}\n\n/**\n * Store global loader options on the global object to increase chances of cross loaders-version interoperability\n * NOTE: This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks\n * @returns global loader options merged with default loader options\n */\nexport function getGlobalLoaderOptions(): StrictLoaderOptions {\n  const state = getGlobalLoaderState();\n  // Ensure all default loader options from this library are mentioned\n  state.globalOptions = state.globalOptions || {\n    ...DEFAULT_LOADER_OPTIONS,\n    core: {...DEFAULT_LOADER_OPTIONS.core}\n  };\n  return normalizeLoaderOptions(state.globalOptions);\n}\n\n/**\n * Set global loader options\n * @param options\n */\nexport function setGlobalOptions(options: LoaderOptions): void {\n  const state = getGlobalLoaderState();\n  const globalOptions = getGlobalLoaderOptions();\n  // @ts-expect-error First param looks incorrect\n  state.globalOptions = normalizeOptionsInternal(globalOptions, options);\n  // Make sure any new modules are registered\n  registerJSModules(options.modules);\n}\n\n/**\n * Merges options with global opts and loader defaults, also injects baseUrl\n * @param options\n * @param loader\n * @param loaders\n * @param url\n */\nexport function normalizeOptions(\n  options: LoaderOptions,\n  loader: Loader,\n  loaders?: Loader[],\n  url?: string\n): StrictLoaderOptions {\n  loaders = loaders || [];\n  loaders = Array.isArray(loaders) ? loaders : [loaders];\n\n  validateOptions(options, loaders);\n  return normalizeLoaderOptions(normalizeOptionsInternal(loader, options, url));\n}\n\n/**\n * Returns a copy of the provided options with deprecated top-level core fields moved into `core`\n * and removed from the top level. This keeps global options from leaking deprecated aliases into\n * loader-specific option maps during normalization.\n */\nexport function normalizeLoaderOptions(options: LoaderOptions): StrictLoaderOptions {\n  const normalized = cloneLoaderOptions(options);\n  moveDeprecatedTopLevelOptionsToCore(normalized);\n  for (const key of CORE_LOADER_OPTION_KEYS) {\n    if (normalized.core && normalized.core[key] !== undefined) {\n      delete (normalized as Record<string, unknown>)[key];\n    }\n  }\n  if (normalized.core && normalized.core._workerType !== undefined) {\n    delete (normalized as any)._worker;\n  }\n  return normalized as StrictLoaderOptions;\n}\n\n// VALIDATE OPTIONS\n\n/**\n * Warn for unsupported options\n * @param options\n * @param loaders\n */\nfunction validateOptions(options: LoaderOptions, loaders: Loader[]): void {\n  // Check top level options\n  validateOptionsObject(options, null, DEFAULT_LOADER_OPTIONS, REMOVED_LOADER_OPTIONS, loaders);\n  for (const loader of loaders) {\n    // Get the scoped, loader specific options from the user supplied options\n    const idOptions: Record<string, unknown> =\n      ((options && options[loader.id]) as Record<string, unknown>) || {};\n\n    // Get scoped, loader specific default and deprecated options from the selected loader\n    const loaderOptions = (loader.options && loader.options[loader.id]) || {};\n    const deprecatedOptions =\n      (loader.deprecatedOptions && loader.deprecatedOptions[loader.id]) || {};\n\n    // Validate loader specific options\n    // @ts-ignore\n    validateOptionsObject(idOptions, loader.id, loaderOptions, deprecatedOptions, loaders);\n  }\n}\n\n// eslint-disable-next-line max-params, complexity\nfunction validateOptionsObject(\n  options: LoaderOptions,\n  id: string | null,\n  defaultOptions: Record<string, unknown>,\n  deprecatedOptions: Record<string, unknown>,\n  loaders: Loader[]\n): void {\n  const loaderName = id || 'Top level';\n  const prefix = id ? `${id}.` : '';\n\n  for (const key in options) {\n    // If top level option value is an object it could options for a loader, so ignore\n    const isSubOptions = !id && isObject(options[key]);\n    const isBaseUriOption = key === 'baseUri' && !id;\n    const isWorkerUrlOption = key === 'workerUrl' && id;\n    // <loader>.workerUrl requires special handling as it is now auto-generated and no longer specified as a default option.\n    if (!(key in defaultOptions) && !isBaseUriOption && !isWorkerUrlOption) {\n      // Issue deprecation warnings\n      if (key in deprecatedOptions) {\n        if (probeLog.level > 0) {\n          probeLog.warn(\n            `${loaderName} loader option \\'${prefix}${key}\\' no longer supported, use \\'${deprecatedOptions[key]}\\'`\n          )();\n        }\n      } else if (!isSubOptions) {\n        if (probeLog.level > 0) {\n          const suggestion = findSimilarOption(key, loaders);\n          probeLog.warn(\n            `${loaderName} loader option \\'${prefix}${key}\\' not recognized. ${suggestion}`\n          )();\n        }\n      }\n    }\n  }\n}\n\nfunction findSimilarOption(optionKey: string, loaders: Loader[]): string {\n  const lowerCaseOptionKey = optionKey.toLowerCase();\n  let bestSuggestion = '';\n  for (const loader of loaders) {\n    for (const key in loader.options) {\n      if (optionKey === key) {\n        return `Did you mean \\'${loader.id}.${key}\\'?`;\n      }\n      const lowerCaseKey = key.toLowerCase();\n      const isPartialMatch =\n        lowerCaseOptionKey.startsWith(lowerCaseKey) || lowerCaseKey.startsWith(lowerCaseOptionKey);\n      if (isPartialMatch) {\n        bestSuggestion = bestSuggestion || `Did you mean \\'${loader.id}.${key}\\'?`;\n      }\n    }\n  }\n  return bestSuggestion;\n}\n\nfunction normalizeOptionsInternal(\n  loader: Loader,\n  options: LoaderOptions,\n  url?: string\n): LoaderOptions {\n  const loaderDefaultOptions = loader.options || {};\n\n  const mergedOptions = {...loaderDefaultOptions};\n  if (loaderDefaultOptions.core) {\n    mergedOptions.core = {...loaderDefaultOptions.core};\n  }\n  moveDeprecatedTopLevelOptionsToCore(mergedOptions);\n\n  // LOGGING: options.log can be set to `null` to defeat logging\n  if (mergedOptions.core?.log === null) {\n    mergedOptions.core = {...mergedOptions.core, log: new NullLog()};\n  }\n\n  mergeNestedFields(mergedOptions, normalizeLoaderOptions(getGlobalLoaderOptions()));\n\n  const userOptions = normalizeLoaderOptions(options);\n  mergeNestedFields(mergedOptions, userOptions);\n\n  addUrlOptions(mergedOptions, url);\n  addDeprecatedTopLevelOptions(mergedOptions);\n\n  return mergedOptions;\n}\n\n// Merge nested options objects\nfunction mergeNestedFields(mergedOptions: LoaderOptions, options: LoaderOptions): void {\n  for (const key in options) {\n    // Check for nested options\n    // object in options => either no key in defaultOptions or object in defaultOptions\n    if (key in options) {\n      const value = options[key];\n      if (isPureObject(value) && isPureObject(mergedOptions[key])) {\n        mergedOptions[key] = {\n          ...(mergedOptions[key] as object),\n          ...(options[key] as object)\n        };\n      } else {\n        mergedOptions[key] = options[key];\n      }\n    }\n    // else: No need to merge nested opts, and the initial merge already copied over the nested options\n  }\n}\n\n/**\n * Harvest information from the url\n * @deprecated This is mainly there to support loaders that still resolve from options\n * TODO - extract extension?\n * TODO - extract query parameters?\n * TODO - should these be injected on context instead of options?\n */\nfunction addUrlOptions(options: LoaderOptions, url?: string): void {\n  if (!url) {\n    return;\n  }\n  const hasCoreBaseUrl = options.core?.baseUrl !== undefined;\n  if (!hasCoreBaseUrl) {\n    options.core ||= {};\n    options.core.baseUrl = path.dirname(stripQueryString(url));\n  }\n}\n\nfunction cloneLoaderOptions(options: LoaderOptions): LoaderOptions {\n  const clonedOptions = {...options};\n  if (options.core) {\n    clonedOptions.core = {...options.core};\n  }\n  return clonedOptions;\n}\n\nfunction moveDeprecatedTopLevelOptionsToCore(options: LoaderOptions): void {\n  if (options.baseUri !== undefined) {\n    options.core ||= {};\n    if (options.core.baseUrl === undefined) {\n      options.core.baseUrl = options.baseUri;\n    }\n  }\n\n  for (const key of CORE_LOADER_OPTION_KEYS) {\n    if ((options as Record<string, unknown>)[key] !== undefined) {\n      const coreOptions = (options.core = options.core || {});\n      const coreRecord = coreOptions as Record<string, unknown>;\n      // Treat deprecated top-level core options as aliases to `options.core`, but never override an explicitly\n      // provided `options.core` value.\n      if (coreRecord[key] === undefined) {\n        coreRecord[key] = (options as Record<string, unknown>)[key];\n      }\n    }\n  }\n\n  // Support the older internal `_worker` alias (used by some tests and integrations) for `_workerType`.\n  const workerTypeAlias = (options as any)._worker;\n  if (workerTypeAlias !== undefined) {\n    options.core ||= {};\n    if (options.core._workerType === undefined) {\n      options.core._workerType = workerTypeAlias;\n    }\n  }\n}\n\nfunction addDeprecatedTopLevelOptions(options: LoaderOptions): void {\n  const coreOptions = options.core as Record<string, unknown> | undefined;\n  if (!coreOptions) {\n    return;\n  }\n  for (const key of CORE_LOADER_OPTION_KEYS) {\n    if (coreOptions[key] !== undefined) {\n      (options as Record<string, unknown>)[key] = coreOptions[key];\n    }\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\n\nexport function isLoaderObject(loader?: any): boolean {\n  if (!loader) {\n    return false;\n  }\n\n  if (Array.isArray(loader)) {\n    loader = loader[0];\n  }\n\n  const hasExtensions = Array.isArray(loader?.extensions);\n\n  /* Now handled by types and worker loaders do not have these\n  let hasParser =\n    loader.parseTextSync ||\n    loader.parseSync ||\n    loader.parse ||\n    loader.parseStream || // TODO Remove, Replace with parseInBatches\n    loader.parseInBatches;\n  */\n\n  return hasExtensions;\n}\n\nexport function normalizeLoader(loader: Loader): Loader {\n  // This error is fairly easy to trigger by mixing up import statements etc\n  // So we make an exception and add a developer error message for this case\n  // To help new users from getting stuck here\n  assert(loader, 'null loader');\n  assert(isLoaderObject(loader), 'invalid loader');\n\n  // NORMALIZE [LOADER, OPTIONS] => LOADER\n\n  // If [loader, options], create a new loaders object with options merged in\n  let options;\n  if (Array.isArray(loader)) {\n    options = loader[1];\n    loader = loader[0];\n    loader = {\n      ...loader,\n      options: {...loader.options, ...options}\n    };\n  }\n\n  // NORMALIZE text and binary flags\n  // Ensure at least one of text/binary flags are properly set\n\n  // @ts-expect-error\n  if (loader?.parseTextSync || loader?.parseText) {\n    loader.text = true;\n  }\n\n  if (!loader.text) {\n    loader.binary = true;\n  }\n\n  return loader;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Loader} from '@loaders.gl/loader-utils';\nimport {normalizeLoader} from '../loader-utils/normalize-loader';\nimport {getGlobalLoaderState} from '../loader-utils/option-utils';\n\n/**\n * Store global registered loaders on the global object to increase chances of cross loaders-version interoperability\n * This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks\n */\nconst getGlobalLoaderRegistry = () => {\n  const state = getGlobalLoaderState();\n  state.loaderRegistry = state.loaderRegistry || [];\n  return state.loaderRegistry;\n};\n\n/**\n * Register a list of global loaders\n * @note Registration erases loader type information.\n * @deprecated It is recommended that applications manage loader registration. This function will likely be remove in loaders.gl v5\n */\nexport function registerLoaders(loaders: Loader[] | Loader) {\n  const loaderRegistry = getGlobalLoaderRegistry();\n\n  loaders = Array.isArray(loaders) ? loaders : [loaders];\n\n  for (const loader of loaders) {\n    const normalizedLoader = normalizeLoader(loader);\n    if (!loaderRegistry.find((registeredLoader) => normalizedLoader === registeredLoader)) {\n      // add to the beginning of the loaderRegistry, so the last registeredLoader get picked\n      loaderRegistry.unshift(normalizedLoader);\n    }\n  }\n}\n\n/**\n * @deprecated It is recommended that applications manage loader registration. This function will likely be remove in loaders.gl v5\n */\nexport function getRegisteredLoaders(): Loader[] {\n  return getGlobalLoaderRegistry();\n}\n\n/** @deprecated For testing only  */\nexport function _unregisterLoaders() {\n  const state = getGlobalLoaderState();\n  state.loaderRegistry = [];\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderContext, LoaderOptions, Loader, DataType} from '@loaders.gl/loader-utils';\nimport {\n  compareArrayBuffers,\n  path,\n  log,\n  isBlob,\n  ensureArrayBuffer,\n  isArrayBufferLike\n} from '@loaders.gl/loader-utils';\nimport {TypedArray} from '@loaders.gl/schema';\nimport {normalizeLoader} from '../loader-utils/normalize-loader';\nimport {normalizeLoaderOptions} from '../loader-utils/option-utils';\nimport {getResourceUrl, getResourceMIMEType} from '../utils/resource-utils';\nimport {compareMIMETypes} from '../utils/mime-type-utils';\nimport {getRegisteredLoaders} from './register-loaders';\nimport {stripQueryString} from '../utils/url-utils';\n\nconst EXT_PATTERN = /\\.([^.]+)$/;\n\n// TODO - Need a variant that peeks at streams for parseInBatches\n// TODO - Detect multiple matching loaders? Use heuristics to grade matches?\n// TODO - Allow apps to pass context to disambiguate between multiple matches (e.g. multiple .json formats)?\n\n/**\n * Find a loader that matches file extension and/or initial file content\n * Search the loaders array argument for a loader that matches url extension or initial data\n * Returns: a normalized loader\n * @param data data to assist\n * @param loaders\n * @param options\n * @param context used internally, applications should not provide this parameter\n */\nexport async function selectLoader(\n  data: DataType,\n  loaders: Loader[] | Loader = [],\n  options?: LoaderOptions,\n  context?: LoaderContext\n): Promise<Loader | null> {\n  if (!validHTTPResponse(data)) {\n    return null;\n  }\n\n  const normalizedOptions = normalizeLoaderOptions(options || {});\n  normalizedOptions.core ||= {};\n\n  if (data instanceof Response && mayContainText(data)) {\n    const text = await data.clone().text();\n    const textLoader = selectLoaderSync(\n      text,\n      loaders,\n      {...normalizedOptions, core: {...normalizedOptions.core, nothrow: true}},\n      context\n    );\n    if (textLoader) {\n      return textLoader;\n    }\n  }\n\n  // First make a sync attempt, disabling exceptions\n  let loader = selectLoaderSync(\n    data,\n    loaders,\n    {...normalizedOptions, core: {...normalizedOptions.core, nothrow: true}},\n    context\n  );\n  if (loader) {\n    return loader;\n  }\n\n  // For Blobs and Files, try to asynchronously read a small initial slice and test again with that\n  // to see if we can detect by initial content\n  if (isBlob(data)) {\n    data = await data.slice(0, 10).arrayBuffer();\n    loader = selectLoaderSync(data, loaders, normalizedOptions, context);\n  }\n\n  if (!loader && data instanceof Response && mayContainText(data)) {\n    const text = await data.clone().text();\n    loader = selectLoaderSync(text, loaders, normalizedOptions, context);\n  }\n\n  // no loader available\n  if (!loader && !normalizedOptions.core.nothrow) {\n    throw new Error(getNoValidLoaderMessage(data));\n  }\n\n  return loader;\n}\n\nfunction mayContainText(response: Response): boolean {\n  const mimeType = getResourceMIMEType(response);\n  return Boolean(\n    mimeType &&\n    (mimeType.startsWith('text/') || mimeType === 'application/json' || mimeType.endsWith('+json'))\n  );\n}\n\n/**\n * Find a loader that matches file extension and/or initial file content\n * Search the loaders array argument for a loader that matches url extension or initial data\n * Returns: a normalized loader\n * @param data data to assist\n * @param loaders\n * @param options\n * @param context used internally, applications should not provide this parameter\n */\nexport function selectLoaderSync(\n  data: DataType,\n  loaders: Loader[] | Loader = [],\n  options?: LoaderOptions,\n  context?: LoaderContext\n): Loader | null {\n  if (!validHTTPResponse(data)) {\n    return null;\n  }\n\n  const normalizedOptions = normalizeLoaderOptions(options || {});\n  normalizedOptions.core ||= {};\n\n  // eslint-disable-next-line complexity\n  // if only a single loader was provided (not as array), force its use\n  // TODO - Should this behavior be kept and documented?\n  if (loaders && !Array.isArray(loaders)) {\n    // TODO - remove support for legacy loaders\n    return normalizeLoader(loaders);\n  }\n\n  // Build list of candidate loaders that will be searched in order for a match\n  let candidateLoaders: Loader[] = [];\n  // First search supplied loaders\n  if (loaders) {\n    candidateLoaders = candidateLoaders.concat(loaders);\n  }\n  // Then fall back to registered loaders\n  if (!normalizedOptions.core.ignoreRegisteredLoaders) {\n    candidateLoaders.push(...getRegisteredLoaders());\n  }\n\n  // TODO - remove support for legacy loaders\n  normalizeLoaders(candidateLoaders);\n\n  const loader = selectLoaderInternal(data, candidateLoaders, normalizedOptions, context);\n\n  // no loader available\n  if (!loader && !normalizedOptions.core.nothrow) {\n    throw new Error(getNoValidLoaderMessage(data));\n  }\n\n  return loader;\n}\n\n/** Implements loaders selection logic */\n// eslint-disable-next-line complexity\nfunction selectLoaderInternal(\n  data: DataType,\n  loaders: Loader[],\n  options?: LoaderOptions,\n  context?: LoaderContext\n) {\n  const url = getResourceUrl(data);\n  const type = getResourceMIMEType(data);\n\n  const testUrl = stripQueryString(url) || context?.url;\n\n  let loader: Loader | null = null;\n  let reason: string = '';\n\n  // if options.mimeType is supplied, it takes precedence\n  if (options?.core?.mimeType) {\n    loader = findLoaderByMIMEType(loaders, options?.core?.mimeType);\n    reason = `match forced by supplied MIME type ${options?.core?.mimeType}`;\n  }\n\n  // Look up loader by url\n  loader = loader || findLoaderByUrl(loaders, testUrl);\n  reason = reason || (loader ? `matched url ${testUrl}` : '');\n\n  // Look up loader by mime type\n  loader = loader || findLoaderByMIMEType(loaders, type);\n  reason = reason || (loader ? `matched MIME type ${type}` : '');\n\n  // Look for loader via initial bytes (Note: not always accessible (e.g. Response, stream, async iterator)\n  // @ts-ignore Blob | Response\n  loader = loader || findLoaderByInitialBytes(loaders, data);\n  // @ts-ignore Blob | Response\n  reason = reason || (loader ? `matched initial data ${getFirstCharacters(data)}` : '');\n\n  // Look up loader by fallback mime type\n  if (options?.core?.fallbackMimeType) {\n    loader = loader || findLoaderByMIMEType(loaders, options?.core?.fallbackMimeType);\n    reason = reason || (loader ? `matched fallback MIME type ${type}` : '');\n  }\n\n  if (reason) {\n    log.log(1, `selectLoader selected ${loader?.name}: ${reason}.`);\n  }\n\n  return loader;\n}\n\n/** Check HTTP Response */\nfunction validHTTPResponse(data: unknown): boolean {\n  // HANDLE HTTP status\n  if (data instanceof Response) {\n    // 204 - NO CONTENT. This handles cases where e.g. a tile server responds with 204 for a missing tile\n    if (data.status === 204) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/** Generate a helpful message to help explain why loader selection failed. */\nfunction getNoValidLoaderMessage(data: DataType): string {\n  const url = getResourceUrl(data);\n  const type = getResourceMIMEType(data);\n\n  let message = 'No valid loader found (';\n  message += url ? `${path.filename(url)}, ` : 'no url provided, ';\n  message += `MIME type: ${type ? `\"${type}\"` : 'not provided'}, `;\n  // First characters are only accessible when called on data (string or arrayBuffer).\n  // @ts-ignore Blob | Response\n  const firstCharacters: string = data ? getFirstCharacters(data) : '';\n  message += firstCharacters ? ` first bytes: \"${firstCharacters}\"` : 'first bytes: not available';\n  message += ')';\n  return message;\n}\n\nfunction normalizeLoaders(loaders: Loader[]): void {\n  for (const loader of loaders) {\n    normalizeLoader(loader);\n  }\n}\n\n// TODO - Would be nice to support http://example.com/file.glb?parameter=1\n// E.g: x = new URL('http://example.com/file.glb?load=1'; x.pathname\nfunction findLoaderByUrl(loaders: Loader[], url?: string): Loader | null {\n  // Get extension\n  const match = url && EXT_PATTERN.exec(url);\n  const extension = match && match[1];\n  return extension ? findLoaderByExtension(loaders, extension) : null;\n}\n\nfunction findLoaderByExtension(loaders: Loader[], extension: string): Loader | null {\n  extension = extension.toLowerCase();\n\n  for (const loader of loaders) {\n    for (const loaderExtension of loader.extensions) {\n      if (loaderExtension.toLowerCase() === extension) {\n        return loader;\n      }\n    }\n  }\n  return null;\n}\n\nfunction findLoaderByMIMEType(loaders: Loader[], mimeType: string): Loader | null {\n  for (const loader of loaders) {\n    if (loader.mimeTypes?.some((mimeType1) => compareMIMETypes(mimeType, mimeType1))) {\n      return loader;\n    }\n\n    // Support referring to loaders using the \"unregistered tree\"\n    // https://en.wikipedia.org/wiki/Media_type#Unregistered_tree\n    if (compareMIMETypes(mimeType, `application/x.${loader.id}`)) {\n      return loader;\n    }\n  }\n  return null;\n}\n\nfunction findLoaderByInitialBytes(loaders: Loader[], data: string | ArrayBuffer): Loader | null {\n  if (!data) {\n    return null;\n  }\n\n  for (const loader of loaders) {\n    if (typeof data === 'string') {\n      if (testDataAgainstText(data, loader)) {\n        return loader;\n      }\n    } else if (ArrayBuffer.isView(data)) {\n      // Typed Arrays can have offsets into underlying buffer\n      if (testDataAgainstBinary(data.buffer, data.byteOffset, loader)) {\n        return loader;\n      }\n    } else if (data instanceof ArrayBuffer) {\n      const byteOffset = 0;\n      if (testDataAgainstBinary(data, byteOffset, loader)) {\n        return loader;\n      }\n    }\n    // TODO Handle streaming case (requires creating a new AsyncIterator)\n  }\n  return null;\n}\n\nfunction testDataAgainstText(data: string, loader: Loader): boolean {\n  if (loader.testText) {\n    return loader.testText(data);\n  }\n\n  const tests = Array.isArray(loader.tests) ? loader.tests : [loader.tests];\n  return tests.some((test) => data.startsWith(test as string));\n}\n\nfunction testDataAgainstBinary(data: ArrayBufferLike, byteOffset: number, loader: Loader): boolean {\n  const tests = Array.isArray(loader.tests) ? loader.tests : [loader.tests];\n  return tests.some((test) => testBinary(data, byteOffset, loader, test));\n}\n\nfunction testBinary(\n  data: ArrayBufferLike,\n  byteOffset: number,\n  loader: Loader,\n  test?: ArrayBuffer | string | ((b: ArrayBuffer) => boolean)\n): boolean {\n  if (isArrayBufferLike(test)) {\n    return compareArrayBuffers(test, data, test.byteLength);\n  }\n  switch (typeof test) {\n    case 'function':\n      return test(ensureArrayBuffer(data));\n\n    case 'string':\n      // Magic bytes check: If `test` is a string, check if binary data starts with that strings\n      const magic = getMagicString(data, byteOffset, test.length);\n      return test === magic;\n\n    default:\n      return false;\n  }\n}\n\nfunction getFirstCharacters(data: string | ArrayBuffer | TypedArray, length: number = 5) {\n  if (typeof data === 'string') {\n    return data.slice(0, length);\n  } else if (ArrayBuffer.isView(data)) {\n    // Typed Arrays can have offsets into underlying buffer\n    return getMagicString(data.buffer, data.byteOffset, length);\n  } else if (data instanceof ArrayBuffer) {\n    const byteOffset = 0;\n    return getMagicString(data, byteOffset, length);\n  }\n  return '';\n}\n\nfunction getMagicString(arrayBuffer: ArrayBufferLike, byteOffset: number, length: number): string {\n  if (arrayBuffer.byteLength < byteOffset + length) {\n    return '';\n  }\n  const dataView = new DataView(arrayBuffer);\n  let magic = '';\n  for (let i = 0; i < length; i++) {\n    magic += String.fromCharCode(dataView.getUint8(byteOffset + i));\n  }\n  return magic;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ensureArrayBuffer} from '@loaders.gl/loader-utils';\nimport type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 256 * 1024;\n\n/**\n * Returns an iterator that breaks a big string into chunks and yields them one-by-one as ArrayBuffers\n * @param blob string to iterate over\n * @param options\n * @param options.chunkSize\n */\nexport function* makeStringIterator(\n  string: string,\n  options?: IteratorOptions\n): Iterable<ArrayBuffer> {\n  const chunkSize = options?.chunkSize || DEFAULT_CHUNK_SIZE;\n\n  let offset = 0;\n  const textEncoder = new TextEncoder();\n  while (offset < string.length) {\n    // Create a chunk of the right size\n    const chunkLength = Math.min(string.length - offset, chunkSize);\n    const chunk = string.slice(offset, offset + chunkLength);\n    offset += chunkLength;\n\n    // yield an ArrayBuffer chunk\n    yield ensureArrayBuffer(textEncoder.encode(chunk));\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 256 * 1024;\n\n/**\n * Returns an iterator that breaks a big ArrayBuffer into chunks and yields them one-by-one\n * @param blob ArrayBuffer to iterate over\n * @param options\n * @param options.chunkSize\n */\nexport function* makeArrayBufferIterator(\n  arrayBuffer: ArrayBuffer,\n  options: IteratorOptions = {}\n): Iterable<ArrayBuffer> {\n  const {chunkSize = DEFAULT_CHUNK_SIZE} = options;\n\n  let byteOffset = 0;\n\n  while (byteOffset < arrayBuffer.byteLength) {\n    // Create a chunk of the right size\n    const chunkByteLength = Math.min(arrayBuffer.byteLength - byteOffset, chunkSize);\n    const chunk = new ArrayBuffer(chunkByteLength);\n\n    // Copy data from the big chunk\n    const sourceArray = new Uint8Array(arrayBuffer, byteOffset, chunkByteLength);\n    const chunkArray = new Uint8Array(chunk);\n    chunkArray.set(sourceArray);\n\n    // yield the chunk\n    byteOffset += chunkByteLength;\n    yield chunk;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024; // 1MB \u2014 biggest value that keeps UI responsive\n\n/**\n * Returns an iterator that breaks a big Blob into chunks and yields them one-by-one\n * @param blob Blob or File object\n * @param options\n * @param options.chunkSize\n */\nexport async function* makeBlobIterator(\n  blob: Blob,\n  options?: IteratorOptions\n): AsyncIterable<ArrayBuffer> {\n  const chunkSize = options?.chunkSize || DEFAULT_CHUNK_SIZE;\n\n  let offset = 0;\n  while (offset < blob.size) {\n    const end = offset + chunkSize;\n\n    const chunk = await blob.slice(offset, end).arrayBuffer();\n\n    offset = end;\n    yield chunk;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Readable} from 'stream';\nimport {isBrowser, toArrayBuffer} from '@loaders.gl/loader-utils';\n\nexport type StreamIteratorOptions = {\n  _streamReadAhead?: boolean;\n};\n\n/**\n * Returns an async iterable that reads from a stream (works in both Node.js and browsers)\n * @param stream stream to iterator over\n */\nexport function makeStreamIterator(\n  stream: ReadableStream | Readable,\n  options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n  return isBrowser\n    ? makeBrowserStreamIterator(stream as ReadableStream, options)\n    : makeNodeStreamIterator(stream as Readable, options);\n}\n\n/**\n * Returns an async iterable that reads from a DOM (browser) stream\n * @param stream stream to iterate from\n * @see https://jakearchibald.com/2017/async-iterators-and-generators/#making-streams-iterate\n */\nasync function* makeBrowserStreamIterator(\n  stream: ReadableStream,\n  options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n  // WhatWG: stream is supposed to have a `getIterator` method\n  // if (typeof stream.getIterator === 'function') {\n  //   return stream.getIterator();\n  // }\n  // if (typeof stream[Symbol.asyncIterator] === 'function') {\n  //   return makeToArrayBufferIterator(stream);\n  // }\n\n  // In the browser, we first need to get a lock on the stream\n  const reader = stream.getReader();\n\n  let nextBatchPromise: Promise<{done?: boolean; value?: Uint8Array}> | undefined;\n\n  try {\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      const currentBatchPromise = nextBatchPromise || reader.read();\n      // Issue a read for an additional batch, while we await the next batch\n      // Idea is to make fetching happen in parallel with processing / parsing\n      if (options?._streamReadAhead) {\n        nextBatchPromise = reader.read();\n      }\n      // Read from the stream\n      // value is a Uint8Array\n      const {done, value} = await currentBatchPromise;\n      // Exit if we're done\n      if (done) {\n        return;\n      }\n      // Else yield the chunk\n      yield toArrayBuffer(value);\n    }\n  } catch (error) {\n    // TODO - examples makes it look like this should always be called,\n    // but that generates exceptions so only call it if we do not reach the end\n    reader.releaseLock();\n  }\n}\n\n/**\n * Returns an async iterable that reads from a DOM (browser) stream\n * @param stream stream to iterate from\n * @note Requires Node.js >= 10\n */\nasync function* makeNodeStreamIterator(\n  stream: Readable,\n  options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n  // Hacky test for node version to ensure we don't call bad polyfills\n  // NODE 10+: stream is an asyncIterator\n  for await (const chunk of stream) {\n    yield toArrayBuffer(chunk); // Coerce each chunk to ArrayBuffer\n  }\n}\n/* TODO - remove NODE < 10\n * @see https://github.com/bustle/streaming-iterables, MIT license\n *\n  if (typeof stream[Symbol.asyncIterator] === 'function') {\n    return;\n  }\n\n  // TODO - check if is this ever used in Node 10+?\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    const data = stream.read();\n    if (data !== null) {\n      yield toArrayBuffer(data);\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n    if (stream._readableState?.ended) {\n      return;\n    }\n    await onceReadable(stream);\n  }\n\nasync function onceReadable(stream: Readable): Promise<any> {\n  return new Promise((resolve) => {\n    stream.once('readable', resolve);\n  });\n}\n  */\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ReadStream} from 'fs';\n\nimport {makeStringIterator} from './make-string-iterator';\nimport {makeArrayBufferIterator} from './make-array-buffer-iterator';\nimport {makeBlobIterator} from './make-blob-iterator';\nimport type {StreamIteratorOptions} from './make-stream-iterator';\nimport {makeStreamIterator} from './make-stream-iterator';\nimport {isBlob, isReadableStream, isResponse} from '@loaders.gl/loader-utils';\n\n/**\n * @param [options.chunkSize]\n */\nexport type IteratorOptions = StreamIteratorOptions & {\n  chunkSize?: number;\n};\n\n/**\n * Returns an iterator that breaks its input into chunks and yields them one-by-one.\n * @param data\n * @param options\n * @returns\n * This function can e.g. be used to enable data sources that can only be read atomically\n * (such as `Blob` and `File` via `FileReader`) to still be parsed in batches.\n */\nexport function makeIterator(\n  data: ArrayBuffer | string | Blob | Response | ReadableStream | ReadStream,\n  options?: IteratorOptions\n): AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer> {\n  if (typeof data === 'string') {\n    // Note: Converts string chunks to binary\n    return makeStringIterator(data, options);\n  }\n  if (data instanceof ArrayBuffer) {\n    return makeArrayBufferIterator(data, options);\n  }\n  if (isBlob(data)) {\n    return makeBlobIterator(data, options);\n  }\n  if (isReadableStream(data)) {\n    return makeStreamIterator(data, options);\n  }\n  if (isResponse(data)) {\n    const responseBody = data.body;\n    if (!responseBody) {\n      throw new Error('Readable stream not available on Response');\n    }\n    return makeStreamIterator(responseBody as ReadableStream, options);\n  }\n  throw new Error('makeIterator');\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n  DataType,\n  SyncDataType,\n  BatchableDataType,\n  Loader,\n  LoaderOptions\n} from '@loaders.gl/loader-utils';\nimport {\n  concatenateArrayBuffersAsync,\n  isPromise,\n  isResponse,\n  isReadableStream,\n  isAsyncIterable,\n  isIterable,\n  isIterator,\n  isBlob,\n  isBuffer,\n  isArrayBufferLike,\n  toArrayBuffer,\n  toArrayBufferView\n} from '@loaders.gl/loader-utils';\nimport {makeIterator} from '../../iterators/make-iterator/make-iterator';\nimport {checkResponse, makeResponse} from '../utils/response-utils';\n\nconst ERR_DATA = 'Cannot convert supplied data type';\n\n/**\n * Returns an {@link ArrayBuffer} or string from the provided data synchronously.\n * Supports `ArrayBuffer`, `ArrayBufferView`, and `ArrayBufferLike` (e.g. `SharedArrayBuffer`)\n * while preserving typed array view offsets.\n */\n// eslint-disable-next-line complexity\nexport function getArrayBufferOrStringFromDataSync(\n  data: SyncDataType,\n  loader: Loader,\n  options: LoaderOptions\n): ArrayBuffer | string {\n  if (loader.text && typeof data === 'string') {\n    return data;\n  }\n\n  if (isBuffer(data)) {\n    data = data.buffer;\n  }\n\n  if (isArrayBufferLike(data)) {\n    const bufferSource = toArrayBufferView(data);\n    if (loader.text && !loader.binary) {\n      const textDecoder = new TextDecoder('utf8');\n      return textDecoder.decode(bufferSource);\n    }\n    return toArrayBuffer(bufferSource);\n  }\n\n  throw new Error(ERR_DATA);\n}\n\n/**\n * Resolves the provided data into an {@link ArrayBuffer} or string asynchronously.\n * Accepts the full {@link DataType} surface including responses and async iterables.\n */\nexport async function getArrayBufferOrStringFromData(\n  data: DataType,\n  loader: Loader,\n  options: LoaderOptions\n): Promise<ArrayBuffer | string> {\n  if (typeof data === 'string' || isArrayBufferLike(data)) {\n    return getArrayBufferOrStringFromDataSync(data as SyncDataType, loader, options);\n  }\n\n  // Blobs and files are FileReader compatible\n  if (isBlob(data)) {\n    data = await makeResponse(data);\n  }\n\n  if (isResponse(data)) {\n    await checkResponse(data);\n    return loader.binary ? await data.arrayBuffer() : await data.text();\n  }\n\n  if (isReadableStream(data)) {\n    // @ts-expect-error TS2559 options type\n    data = makeIterator(data as ReadableStream, options);\n  }\n\n  if (isIterable(data) || isAsyncIterable(data)) {\n    // Assume arrayBuffer iterator - attempt to concatenate\n    return concatenateArrayBuffersAsync(data as AsyncIterable<ArrayBufferLike>);\n  }\n\n  throw new Error(ERR_DATA);\n}\n\n/**\n * Normalizes batchable inputs into async iterables for batch parsing flows.\n * Supports synchronous iterables, async iterables, fetch responses, readable streams, and\n * single binary chunks (including typed array views and `ArrayBufferLike` values).\n */\nexport async function getAsyncIterableFromData(\n  data: BatchableDataType,\n  options: LoaderOptions\n): Promise<\n  AsyncIterable<ArrayBufferLike | ArrayBufferView> | Iterable<ArrayBufferLike | ArrayBufferView>\n> {\n  if (isPromise(data)) {\n    data = await data;\n  }\n\n  if (isIterator(data)) {\n    return data as AsyncIterable<ArrayBuffer>;\n  }\n\n  if (isResponse(data)) {\n    // Note Since this function is not async, we currently can't load error message, just status\n    await checkResponse(data);\n    // TODO - bug in polyfill, body can be a Promise under Node.js\n    // eslint-disable-next-line @typescript-eslint/await-thenable\n    const body = await data.body;\n    if (!body) {\n      throw new Error(ERR_DATA);\n    }\n    return makeIterator(body, options as any);\n  }\n\n  if (isBlob(data) || isReadableStream(data)) {\n    return makeIterator(data as Blob | ReadableStream, options as any);\n  }\n\n  if (isAsyncIterable(data)) {\n    return data as AsyncIterable<ArrayBufferLike | ArrayBufferView>;\n  }\n\n  if (isIterable(data)) {\n    return data as Iterable<ArrayBufferLike | ArrayBufferView>;\n  }\n\n  // @ts-expect-error TODO - fix type mess\n  return getIterableFromData(data);\n}\n\n/**\n * Returns a readable stream for streaming loader inputs when available.\n */\nexport async function getReadableStream(data: BatchableDataType): Promise<ReadableStream> {\n  if (isReadableStream(data)) {\n    return data as ReadableStream;\n  }\n  if (isResponse(data)) {\n    // @ts-ignore\n    if (!data.body) {\n      throw new Error(ERR_DATA);\n    }\n    return data.body;\n  }\n  const response = await makeResponse(data);\n  // @ts-ignore\n  if (!response.body) {\n    throw new Error(ERR_DATA);\n  }\n  return response.body;\n}\n\n// HELPERS\n\nfunction getIterableFromData(data: string | ArrayBuffer | SharedArrayBuffer | ArrayBufferView) {\n  // generate an iterator that emits a single chunk\n  if (ArrayBuffer.isView(data)) {\n    return (function* oneChunk() {\n      yield toArrayBuffer(data);\n    })();\n  }\n\n  if (isArrayBufferLike(data)) {\n    return (function* oneChunk() {\n      yield toArrayBuffer(data);\n    })();\n  }\n\n  if (isIterator(data)) {\n    return data;\n  }\n\n  if (isIterable(data)) {\n    return data[Symbol.iterator]();\n  }\n\n  throw new Error(ERR_DATA);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderContext, LoaderOptions, FetchLike} from '@loaders.gl/loader-utils';\nimport {isObject} from '@loaders.gl/loader-utils';\nimport {fetchFile} from '../fetch/fetch-file';\nimport {getGlobalLoaderOptions} from './option-utils';\n\n/**\n * Gets the current fetch function from options and context\n * @param options\n * @param context\n */\nexport function getFetchFunction(\n  options?: LoaderOptions,\n  context?: Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>\n): FetchLike {\n  const globalOptions = getGlobalLoaderOptions();\n\n  const loaderOptions = options || globalOptions;\n  const fetchOption = loaderOptions.fetch ?? loaderOptions.core?.fetch;\n\n  // options.fetch can be a function\n  if (typeof fetchOption === 'function') {\n    return fetchOption;\n  }\n\n  // options.fetch can be an options object\n  if (isObject(fetchOption)) {\n    return (url) => fetchFile(url, fetchOption as RequestInit);\n  }\n\n  // else refer to context (from parent loader) if available\n  if (context?.fetch) {\n    return context?.fetch;\n  }\n\n  // else return the default fetch function\n  return fetchFile;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderContext, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport {getFetchFunction} from './get-fetch-function';\nimport {extractQueryString, stripQueryString} from '../utils/url-utils';\nimport {path} from '@loaders.gl/loader-utils';\n\n/** Properties for creating an updated context */\ntype LoaderContextProps = Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>;\n\n/**\n * \"sub\" loaders invoked by other loaders get a \"context\" injected on `this`\n * The context will inject core methods like `parse` and contain information\n * about loaders and options passed in to the top-level `parse` call.\n *\n * @param context\n * @param options\n * @param previousContext\n */\nexport function getLoaderContext(\n  context: LoaderContextProps,\n  options: StrictLoaderOptions,\n  parentContext: LoaderContext | null\n): LoaderContext {\n  // For recursive calls, we already have a context\n  // TODO - add any additional loaders to context?\n  if (parentContext) {\n    return parentContext;\n  }\n\n  const newContext: LoaderContext = {\n    fetch: getFetchFunction(options, context),\n    ...context\n  };\n\n  // Parse URLs so that subloaders can easily generate correct strings\n  if (newContext.url) {\n    const baseUrl = stripQueryString(newContext.url);\n    newContext.baseUrl = baseUrl;\n    newContext.queryString = extractQueryString(newContext.url);\n    newContext.filename = path.filename(baseUrl);\n    newContext.baseUrl = path.dirname(baseUrl);\n  }\n\n  // Recursive loading does not use single loader\n  if (!Array.isArray(newContext.loaders)) {\n    newContext.loaders = null;\n  }\n\n  return newContext;\n}\n\n// eslint-disable-next-line complexity\nexport function getLoadersFromContext(\n  loaders: Loader[] | Loader | undefined,\n  context?: LoaderContext\n): Loader | Loader[] | undefined {\n  // A single loader (non-array) indicates no selection desired. Force select.\n  if (loaders && !Array.isArray(loaders)) {\n    return loaders;\n  }\n\n  // Create a merged list\n  let candidateLoaders;\n  if (loaders) {\n    candidateLoaders = Array.isArray(loaders) ? loaders : [loaders];\n  }\n  if (context && context.loaders) {\n    const contextLoaders = Array.isArray(context.loaders) ? context.loaders : [context.loaders];\n    candidateLoaders = candidateLoaders ? [...candidateLoaders, ...contextLoaders] : contextLoaders;\n  }\n  // If no loaders, return null to look in globally registered loaders\n  return candidateLoaders && candidateLoaders.length ? candidateLoaders : undefined;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n  Loader,\n  LoaderContext,\n  LoaderOptions,\n  DataType,\n  LoaderWithParser,\n  LoaderOptionsType,\n  LoaderReturnType,\n  LoaderArrayOptionsType,\n  LoaderArrayReturnType,\n  StrictLoaderOptions\n} from '@loaders.gl/loader-utils';\nimport {\n  parseWithWorker,\n  canParseWithWorker,\n  mergeOptions,\n  isResponse\n} from '@loaders.gl/loader-utils';\nimport {assert, validateWorkerVersion} from '@loaders.gl/worker-utils';\nimport {isLoaderObject} from '../loader-utils/normalize-loader';\nimport {normalizeOptions} from '../loader-utils/option-utils';\nimport {getArrayBufferOrStringFromData} from '../loader-utils/get-data';\nimport {getLoaderContext, getLoadersFromContext} from '../loader-utils/loader-context';\nimport {getResourceUrl} from '../utils/resource-utils';\nimport {selectLoader} from './select-loader';\n\n// type LoaderArrayType<T> = T extends (infer Loader)[] ? LoaderOptionsType<Loader> : T\n\n/**\n * Parses `data` asynchronously using the supplied loader\n */\nexport async function parse<\n  LoaderT extends Loader,\n  OptionsT extends LoaderOptions = LoaderOptionsType<LoaderT>\n>(\n  data: DataType | Promise<DataType>,\n  loader: LoaderT,\n  options?: OptionsT,\n  context?: LoaderContext\n): Promise<LoaderReturnType<LoaderT>>;\n\n/**\n * Parses `data` asynchronously by matching one of the supplied loader\n */\nexport async function parse<\n  LoaderArrayT extends Loader[],\n  OptionsT extends LoaderOptions = LoaderArrayOptionsType<LoaderArrayT>\n>(\n  data: DataType | Promise<DataType>,\n  loaders: LoaderArrayT,\n  options?: OptionsT,\n  context?: LoaderContext\n): Promise<LoaderArrayReturnType<LoaderArrayT>>;\n\n/**\n * Parses data asynchronously by matching a pre-registered loader\n * @deprecated Loader registration is deprecated, use parse(data, loaders, options) instead\n */\nexport async function parse(\n  data: DataType | Promise<DataType>,\n  options?: LoaderOptions\n): Promise<unknown>;\n\n/**\n * Parses `data` using a specified loader\n * @param data\n * @param loaders\n * @param options\n * @param context\n */\n// implementation signature\nexport async function parse(\n  data: DataType | Promise<DataType>,\n  loaders?: Loader | Loader[] | LoaderOptions,\n  options?: LoaderOptions,\n  context?: LoaderContext\n): Promise<unknown> {\n  // Signature: parse(data, options, context | url)\n  // Uses registered loaders\n  if (loaders && !Array.isArray(loaders) && !isLoaderObject(loaders)) {\n    context = undefined; // context not supported in short signature\n    options = loaders as LoaderOptions;\n    loaders = undefined;\n  }\n\n  data = await data; // Resolve any promise\n  options = options || ({} as LoaderOptions); // Could be invalid...\n\n  // Extract a url for auto detection\n  const url = getResourceUrl(data);\n\n  // Chooses a loader (and normalizes it)\n  // Also use any loaders in the context, new loaders take priority\n  const typedLoaders = loaders as Loader | Loader[] | undefined;\n  const candidateLoaders = getLoadersFromContext(typedLoaders, context);\n  // todo hacky type cast\n  const loader = await selectLoader(data as ArrayBuffer, candidateLoaders, options);\n  // Note: if no loader was found, if so just return null\n  if (!loader) {\n    return null;\n  }\n\n  // Normalize options\n  // @ts-expect-error candidateLoaders\n  const strictOptions = normalizeOptions(options, loader, candidateLoaders, url); // Could be invalid...\n\n  // Get a context (if already present, will be unchanged)\n  context = getLoaderContext(\n    // @ts-expect-error\n    {url, _parse: parse, loaders: candidateLoaders},\n    strictOptions,\n    context || null\n  );\n\n  return await parseWithLoader(loader, data, strictOptions, context);\n}\n\n// TODO: support progress and abort\n// TODO - should accept loader.parseAsyncIterator and concatenate.\nasync function parseWithLoader(\n  loader: Loader,\n  data,\n  options: StrictLoaderOptions,\n  context: LoaderContext\n): Promise<unknown> {\n  validateWorkerVersion(loader);\n\n  options = mergeOptions(loader.options, options);\n\n  if (isResponse(data)) {\n    // Serialize to support passing the response to web worker\n    const {ok, redirected, status, statusText, type, url} = data;\n    const headers = Object.fromEntries(data.headers.entries());\n    // @ts-expect-error TODO - fix this\n    context.response = {headers, ok, redirected, status, statusText, type, url};\n  }\n\n  data = await getArrayBufferOrStringFromData(data, loader, options);\n\n  const loaderWithParser = loader as LoaderWithParser;\n\n  // First check for synchronous text parser, wrap results in promises\n  if (loaderWithParser.parseTextSync && typeof data === 'string') {\n    return loaderWithParser.parseTextSync(data, options, context);\n  }\n\n  // If we have a workerUrl and the loader can parse the given options efficiently in a worker\n  if (canParseWithWorker(loader, options)) {\n    return await parseWithWorker(loader, data, options, context, parse);\n  }\n\n  // Check for asynchronous parser\n  if (loaderWithParser.parseText && typeof data === 'string') {\n    return await loaderWithParser.parseText(data, options, context);\n  }\n\n  if (loaderWithParser.parse) {\n    return await loaderWithParser.parse(data, options, context);\n  }\n\n  // This should not happen, all sync loaders should also offer `parse` function\n  assert(!loaderWithParser.parseSync);\n\n  // TBD - If asynchronous parser not available, return null\n  throw new Error(`${loader.id} loader - no parser found and worker is disabled`);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DataType, TypedArray, TypedArrayConstructor, ArrayType} from '@loaders.gl/schema';\n\n/** Deduce column types from values */\nexport function getDataTypeFromValue(\n  value: unknown,\n  defaultNumberType: 'float32' = 'float32'\n): DataType {\n  if (value instanceof Date) {\n    return 'date-millisecond';\n  }\n  if (value instanceof Number) {\n    return defaultNumberType;\n  }\n  if (typeof value === 'string') {\n    return 'utf8';\n  }\n  if (value === null || value === 'undefined') {\n    return 'null';\n  }\n  return 'null';\n}\n\n/**\n * Deduces a simple data type \"descriptor from a typed array instance\n */\nexport function getDataTypeFromArray(array: ArrayType): {type: DataType; nullable: boolean} {\n  let type = getDataTypeFromTypedArray(array as TypedArray);\n  if (type !== 'null') {\n    return {type, nullable: false};\n  }\n  if (array.length > 0) {\n    type = getDataTypeFromValue(array[0]);\n    return {type, nullable: true};\n  }\n\n  return {type: 'null', nullable: true};\n}\n\n/**\n * Deduces a simple data type \"descriptor from a typed array instance\n */\nexport function getDataTypeFromTypedArray(array: TypedArray): DataType {\n  switch (array.constructor) {\n    case Int8Array:\n      return 'int8';\n    case Uint8Array:\n    case Uint8ClampedArray:\n      return 'uint8';\n    case Int16Array:\n      return 'int16';\n    case Uint16Array:\n      return 'uint16';\n    case Int32Array:\n      return 'int32';\n    case Uint32Array:\n      return 'uint32';\n    case Float32Array:\n      return 'float32';\n    case Float64Array:\n      return 'float64';\n    default:\n      return 'null';\n  }\n}\n\nexport function getArrayTypeFromDataType(\n  type: DataType,\n  nullable: boolean | undefined\n): TypedArrayConstructor | ArrayConstructor {\n  if (!nullable) {\n    switch (type) {\n      case 'int8':\n        return Int8Array;\n      case 'uint8':\n        return Uint8Array;\n      case 'int16':\n        return Int16Array;\n      case 'uint16':\n        return Uint16Array;\n      case 'int32':\n        return Int32Array;\n      case 'uint32':\n        return Uint32Array;\n      case 'float32':\n        return Float32Array;\n      case 'float64':\n        return Float64Array;\n      default:\n        break;\n    }\n  }\n\n  // if (typeof BigInt64Array !== 'undefined') {\n  //   TYPED_ARRAY_TO_TYPE.BigInt64Array = new Int64();\n  //   TYPED_ARRAY_TO_TYPE.BigUint64Array = new Uint64();\n  // }\n\n  return Array;\n}\n", "// Mesh category utilities\n// TODO - move to mesh category module, or to math.gl/geometry module\nimport {MeshAttributes} from '@loaders.gl/schema';\nimport {TypedArray} from '../../types/types';\n\ntype TypedArrays = {[key: string]: TypedArray};\n\n/**\n * Holds an axis aligned bounding box\n * TODO - make sure AxisAlignedBoundingBox in math.gl/culling understands this format (or change this format)\n */\ntype BoundingBox = [[number, number, number], [number, number, number]];\n\n/**\n * Get number of vertices in mesh\n * @param attributes\n */\nexport function getMeshSize(attributes: TypedArrays): number {\n  let size = 0;\n  for (const attributeName in attributes) {\n    const attribute = attributes[attributeName];\n    if (ArrayBuffer.isView(attribute)) {\n      // @ts-ignore DataView doesn't have BYTES_PER_ELEMENT\n      size += attribute.byteLength * attribute.BYTES_PER_ELEMENT;\n    }\n  }\n  return size;\n}\n\n/**\n * Get the (axis aligned) bounding box of a mesh\n * @param attributes\n * @returns array of two vectors representing the axis aligned bounding box\n */\n// eslint-disable-next-line complexity\nexport function getMeshBoundingBox(attributes: MeshAttributes): BoundingBox {\n  let minX = Infinity;\n  let minY = Infinity;\n  let minZ = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n  let maxZ = -Infinity;\n\n  const positions = attributes.POSITION ? attributes.POSITION.value : [];\n  const len = positions && positions.length;\n\n  for (let i = 0; i < len; i += 3) {\n    const x = positions[i];\n    const y = positions[i + 1];\n    const z = positions[i + 2];\n\n    minX = x < minX ? x : minX;\n    minY = y < minY ? y : minY;\n    minZ = z < minZ ? z : minZ;\n\n    maxX = x > maxX ? x : maxX;\n    maxY = y > maxY ? y : maxY;\n    maxZ = z > maxZ ? z : maxZ;\n  }\n  return [\n    [minX, minY, minZ],\n    [maxX, maxY, maxZ]\n  ];\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MeshAttribute, MeshAttributes, Schema, Field} from '@loaders.gl/schema';\nimport {getDataTypeFromTypedArray} from '../schema/data-type';\n\n/**\n * Create a schema for mesh attributes data\n * @param attributes\n * @param metadata\n * @returns\n */\nexport function deduceMeshSchema(\n  attributes: MeshAttributes,\n  metadata: Record<string, string> = {}\n): Schema {\n  const fields = deduceMeshFields(attributes);\n  return {fields, metadata};\n}\n\n/**\n * Create arrow-like schema field for mesh attribute\n * @param attributeName\n * @param attribute\n * @param optionalMetadata\n * @returns\n */\nexport function deduceMeshField(\n  name: string,\n  attribute: MeshAttribute,\n  optionalMetadata?: Record<string, string>\n): Field {\n  const type = getDataTypeFromTypedArray(attribute.value);\n  const metadata = optionalMetadata ? optionalMetadata : makeMeshAttributeMetadata(attribute);\n  return {\n    name,\n    type: {type: 'fixed-size-list', listSize: attribute.size, children: [{name: 'value', type}]},\n    nullable: false,\n    metadata\n  };\n}\n\n/**\n * Create fields array for mesh attributes\n * @param attributes\n * @returns\n */\nfunction deduceMeshFields(attributes: MeshAttributes): Field[] {\n  const fields: Field[] = [];\n  for (const attributeName in attributes) {\n    const attribute: MeshAttribute = attributes[attributeName];\n    fields.push(deduceMeshField(attributeName, attribute));\n  }\n  return fields;\n}\n\n/**\n * Make metadata by mesh attribute properties\n * @param attribute\n * @returns\n */\nexport function makeMeshAttributeMetadata(attribute: MeshAttribute): Record<string, string> {\n  const result: Record<string, string> = {};\n  if ('byteOffset' in attribute) {\n    result.byteOffset = attribute.byteOffset!.toString(10);\n  }\n  if ('byteStride' in attribute) {\n    result.byteStride = attribute.byteStride!.toString(10);\n  }\n  if ('normalized' in attribute) {\n    result.normalized = attribute.normalized!.toString();\n  }\n  return result;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Schema\nexport {getArrayTypeFromDataType} from './lib/schema/data-type';\n\n// Schema utils\nexport {\n  convertArrowToSchema,\n  convertSchemaToArrow,\n  // DETAILED FUNCTIONS\n  serializeArrowSchema,\n  deserializeArrowSchema,\n  serializeArrowMetadata,\n  deserializeArrowMetadata,\n  serializeArrowField,\n  deserializeArrowField,\n  serializeArrowType,\n  deserializeArrowType\n} from './lib/schema/convert-arrow-schema';\nexport {getDataTypeFromArray} from './lib/schema/data-type';\n\n// TABLE CATEGORY UTILS\n\nexport {deduceTableSchema} from './lib/schema/deduce-table-schema';\nexport {makeTableFromData} from './lib/table/tables/make-table';\nexport {makeTableFromBatches} from './lib/table/batches/make-table-from-batches';\n\nexport {convertTable} from './lib/table/tables/convert-table';\nexport {convertToObjectRow, convertToArrayRow} from './lib/table/tables/row-utils';\nexport {convertArrowToTable, convertTableToArrow} from './lib/table/tables/convert-arrow-table';\n\nexport {\n  makeTableBatchIterator,\n  makeBatchFromTable\n} from './lib/table/batches/make-table-batch-iterator';\nexport {\n  makeArrowTableBatchIterator,\n  makeArrowRecordBatchIterator\n} from './lib/table/batches/make-arrow-batch-iterator';\nexport {convertBatch, convertBatches} from './lib/table/batches/convert-batches';\n\nexport {\n  isArrayRowTable,\n  isObjectRowTable,\n  isColumnarTable,\n  isGeoJSONTable,\n  isArrowTable\n} from './lib/table/tables/table-types';\n\nexport {\n  isTable,\n  getTableLength,\n  getTableNumCols,\n  getTableCell,\n  getTableCellAt,\n  getTableRowShape,\n  getTableColumnIndex,\n  getTableColumnName,\n  getTableRowAsObject,\n  getTableRowAsArray,\n  makeRowIterator,\n  makeArrayRowIterator,\n  makeObjectRowIterator\n} from './lib/table/tables/table-accessors';\n\n// Table batch builders\n\nexport {TableBatchBuilder} from './lib/table/batch-builder/table-batch-builder';\nexport type {TableBatchAggregator} from './lib/table/batch-builder/table-batch-aggregator';\nexport {RowTableBatchAggregator} from './lib/table/batch-builder/row-table-batch-aggregator';\nexport {ColumnarTableBatchAggregator} from './lib/table/batch-builder/columnar-table-batch-aggregator';\n\nexport {ArrowLikeTable} from './lib/table/arrow-api/arrow-like-table';\n\n// MESH CATEGORY\n\nexport {getMeshSize, getMeshBoundingBox} from './lib/mesh/mesh-utils';\nexport {convertMeshToTable} from './lib/mesh/convert-mesh-to-table';\nexport {convertTableToMesh} from './lib/mesh/convert-table-to-mesh';\nexport {\n  deduceMeshSchema,\n  deduceMeshField,\n  makeMeshAttributeMetadata\n} from './lib/mesh/deduce-mesh-schema';\n\n// SCHEMA\nexport {\n  Schema as ArrowLikeSchema,\n  Field as ArrowLikeField,\n  DataType as ArrowLikeDataType\n  // Null,\n  // Binary,\n  // Bool,\n  // Int,\n  // Int8,\n  // Int16,\n  // Int32,\n  // Int64,\n  // Uint8,\n  // Uint16,\n  // Uint32,\n  // Uint64,\n  // Float,\n  // Float16,\n  // Float32,\n  // Float64,\n  // Utf8,\n  // Date,\n  // DateDay,\n  // DateMillisecond,\n  // Time,\n  // TimeMillisecond,\n  // TimeSecond,\n  // Timestamp,\n  // TimestampSecond,\n  // TimestampMillisecond,\n  // TimestampMicrosecond,\n  // TimestampNanosecond,\n  // Interval,\n  // IntervalDayTime,\n  // IntervalYearMonth,\n  // FixedSizeList,\n  // Struct\n} from './lib/table/arrow-api/index';\n\n// EXPERIMENTAL APIs\nexport {ArrowTableBuilder} from './lib/table/batch-builder/arrow-table-builder';\n\n// Schema utils\nexport {getTypeInfo} from './lib/table/arrow-api/get-type-info';\n\nexport {default as AsyncQueue} from './lib/utils/async-queue';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n  DataType,\n  Loader,\n  LoaderContext,\n  LoaderOptions,\n  LoaderOptionsType,\n  LoaderReturnType,\n  LoaderArrayOptionsType,\n  LoaderArrayReturnType\n} from '@loaders.gl/loader-utils';\nimport {isBlob} from '@loaders.gl/loader-utils';\nimport {isLoaderObject} from '../loader-utils/normalize-loader';\nimport {getFetchFunction} from '../loader-utils/get-fetch-function';\nimport {normalizeLoaderOptions} from '../loader-utils/option-utils';\n\nimport {parse} from './parse';\n\n/**\n * Parses `data` using a specified loader\n * Note: Load does duplicate a lot of parse.\n * it can also call fetchFile on string urls, which `parse` won't do.\n * @param data\n * @param loaders\n * @param options\n * @param context\n */\n\nexport async function load<\n  LoaderT extends Loader,\n  OptionsT extends LoaderOptions = LoaderOptionsType<LoaderT>\n>(\n  url: string | DataType,\n  loader: LoaderT,\n  options?: OptionsT,\n  context?: LoaderContext\n): Promise<LoaderReturnType<LoaderT>>;\n\nexport async function load<\n  LoaderArrayT extends Loader[],\n  OptionsT extends LoaderOptions = LoaderArrayOptionsType<LoaderArrayT>\n>(\n  url: string | DataType,\n  loaders: LoaderArrayT,\n  options?: OptionsT,\n  context?: LoaderContext\n): Promise<LoaderArrayReturnType<LoaderArrayT>>;\n\n/**\n * Loads data asynchronously by matching a pre-registered loader\n * @deprecated Loader registration is deprecated, use load(data, loaders, options) instead\n */\nexport async function load(\n  url: string | DataType,\n  loaders?: LoaderOptions,\n  context?: LoaderContext\n): Promise<unknown>;\n\n// export async function load(url: string | DataType, loaders: LoaderOptions): Promise<any>;\n\n// implementation signature\nexport async function load(\n  url: string | DataType,\n  loaders?: Loader[] | LoaderOptions,\n  options?: LoaderOptions | LoaderContext,\n  context?: LoaderContext\n): Promise<unknown> {\n  let resolvedLoaders: Loader | Loader[];\n  let resolvedOptions: LoaderOptions | undefined;\n\n  // Signature: load(url, options)\n  if (!Array.isArray(loaders) && !isLoaderObject(loaders)) {\n    resolvedLoaders = [];\n    resolvedOptions = loaders as LoaderOptions;\n    context = undefined; // context not supported in short signature\n  } else {\n    resolvedLoaders = loaders as Loader | Loader[];\n    resolvedOptions = options as LoaderOptions;\n  }\n\n  // Select fetch function\n  const fetch = getFetchFunction(resolvedOptions);\n\n  // at this point, `url` could be already loaded binary data\n  let data = url;\n  // url is a string, fetch the url\n  if (typeof url === 'string') {\n    data = await fetch(url);\n    // URL is Blob or File, fetchFile handles it (alt: we could generate ObjectURL here)\n  }\n\n  if (isBlob(url)) {\n    // The fetch response object will contain blob.name\n    // @ts-expect-error TODO - This may not work for overridden fetch functions\n    data = await fetch(url);\n  }\n\n  if (typeof url === 'string') {\n    const normalizedOptions = normalizeLoaderOptions(resolvedOptions || {});\n    if (!normalizedOptions.core?.baseUrl) {\n      resolvedOptions = {\n        ...resolvedOptions,\n        core: {\n          ...resolvedOptions?.core,\n          baseUrl: url\n        }\n      };\n    }\n  }\n\n  // Data is loaded (at least we have a `Response` object) so time to hand over to `parse`\n  // return await parse(data, loaders as Loader[], options);\n  return Array.isArray(resolvedLoaders)\n    ? await parse(data, resolvedLoaders, resolvedOptions) // loader array overload\n    : await parse(data, resolvedLoaders, resolvedOptions); // single loader overload\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// TYPES\nexport type {\n  Loader,\n  LoaderWithParser,\n  LoaderContext,\n  LoaderOptions,\n  Writer,\n  WriterOptions,\n  DataType,\n  SyncDataType,\n  BatchableDataType,\n  ReadableFile,\n  WritableFile,\n  Stat,\n  FileSystem,\n  RandomAccessFileSystem\n} from '@loaders.gl/loader-utils';\n\n// FILE READING AND WRITING\nexport {fetchFile} from './lib/fetch/fetch-file';\nexport {FetchError} from './lib/fetch/fetch-error';\n\nexport {readArrayBuffer} from './lib/fetch/read-array-buffer';\n// export {readFileSync} from './lib/fetch/read-file';\n// export {writeFile, writeFileSync} from './lib/fetch/write-file';\n\n// CONFIGURATION\nexport {setLoaderOptions, getLoaderOptions} from './lib/api/loader-options';\nexport {registerLoaders} from './lib/api/register-loaders';\nexport {selectLoader, selectLoaderSync} from './lib/api/select-loader';\n\n// LOADING (READING + PARSING)\nexport {parse} from './lib/api/parse';\nexport {parseSync} from './lib/api/parse-sync';\nexport {parseInBatches} from './lib/api/parse-in-batches';\n\nexport {load} from './lib/api/load';\nexport {loadInBatches} from './lib/api/load-in-batches';\n\n// ENCODING (ENCODING AND WRITING)\nexport {encodeTable, encodeTableAsText, encodeTableInBatches} from './lib/api/encode-table';\nexport {encode, encodeSync, encodeInBatches, encodeURLtoURL} from './lib/api/encode';\nexport {encodeText, encodeTextSync} from './lib/api/encode';\n\n// SERVICES AND SOURCES\nexport {createDataSource} from './lib/api/create-data-source';\nexport {selectSource as _selectSource} from './lib/api/select-source';\n\n// CORE UTILS SHARED WITH LOADERS (RE-EXPORTED FROM LOADER-UTILS)\nexport {setPathPrefix, getPathPrefix, resolvePath} from '@loaders.gl/loader-utils';\nexport {RequestScheduler} from '@loaders.gl/loader-utils';\n\n// ITERATOR UTILS\nexport {makeIterator} from './iterators/make-iterator/make-iterator';\nexport {makeStream} from './iterators/make-stream/make-stream';\n\n// CORE LOADERS\nexport {NullWorkerLoader, NullLoader} from './null-loader';\nexport {JSONLoader} from '@loaders.gl/loader-utils';\n\n// EXPERIMENTAL\nexport {fetchProgress as _fetchProgress} from './lib/progress/fetch-progress';\nexport {BrowserFileSystem as _BrowserFileSystem} from './lib/filesystems/browser-filesystem';\n\n// FOR TESTING\nexport {_unregisterLoaders} from './lib/api/register-loaders';\n\n//\n// TODO - MOVE TO LOADER-UTILS AND DEPRECATE IN CORE?\n//\n\nexport {isBrowser, isWorker, self, window, global, document} from '@loaders.gl/loader-utils';\nexport {assert} from '@loaders.gl/loader-utils';\nexport {forEach, concatenateArrayBuffersAsync} from '@loaders.gl/loader-utils';\n\nexport {\n  makeTextDecoderIterator,\n  makeTextEncoderIterator,\n  makeLineIterator,\n  makeNumberedLineIterator\n} from '@loaders.gl/loader-utils';\n\n// \"JAVASCRIPT\" UTILS - move to loader-utils?\nexport {\n  isPureObject,\n  isPromise,\n  isIterable,\n  isAsyncIterable,\n  isIterator,\n  isResponse,\n  isReadableStream,\n  isWritableStream\n} from '@loaders.gl/loader-utils';\n", "// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "import {isBrowser} from '@loaders.gl/loader-utils';\nimport type {ImageTypeEnum} from '../../types';\n\n// @ts-ignore TS2339: Property does not exist on type\nconst parseImageNode = globalThis.loaders?.parseImageNode;\n\nconst IMAGE_SUPPORTED = typeof Image !== 'undefined'; // NOTE: \"false\" positives if jsdom is installed\nconst IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== 'undefined';\nconst NODE_IMAGE_SUPPORTED = Boolean(parseImageNode);\nconst DATA_SUPPORTED = isBrowser ? true : NODE_IMAGE_SUPPORTED;\n\n/**\n * Checks if a loaders.gl image type is supported\n * @param type image type string\n */\nexport function isImageTypeSupported(type: string): boolean {\n  switch (type) {\n    case 'auto':\n      // Should only ever be false in Node.js, if polyfills have not been installed...\n      return IMAGE_BITMAP_SUPPORTED || IMAGE_SUPPORTED || DATA_SUPPORTED;\n\n    case 'imagebitmap':\n      return IMAGE_BITMAP_SUPPORTED;\n    case 'image':\n      return IMAGE_SUPPORTED;\n    case 'data':\n      return DATA_SUPPORTED;\n\n    default:\n      throw new Error(`@loaders.gl/images: image ${type} not supported in this environment`);\n  }\n}\n\n/**\n * Returns the \"most performant\" supported image type on this platform\n * @returns image type string\n */\nexport function getDefaultImageType(): ImageTypeEnum {\n  if (IMAGE_BITMAP_SUPPORTED) {\n    return 'imagebitmap';\n  }\n  if (IMAGE_SUPPORTED) {\n    return 'image';\n  }\n  if (DATA_SUPPORTED) {\n    return 'data';\n  }\n\n  // This should only happen in Node.js\n  throw new Error('Install \\'@loaders.gl/polyfills\\' to parse images under Node.js');\n}\n", "import type {ImageType, ImageTypeEnum, ImageDataType} from '../../types';\n\nexport function isImage(image: ImageType): boolean {\n  return Boolean(getImageTypeOrNull(image));\n}\n\nexport function deleteImage(image: ImageType): void {\n  switch (getImageType(image)) {\n    case 'imagebitmap':\n      (image as ImageBitmap).close();\n      break;\n    default:\n    // Nothing to do for images and image data objects\n  }\n}\n\nexport function getImageType(image: ImageType): ImageTypeEnum {\n  const format = getImageTypeOrNull(image);\n  if (!format) {\n    throw new Error('Not an image');\n  }\n  return format;\n}\n\nexport function getImageSize(image: ImageType): {width: number; height: number} {\n  return getImageData(image);\n}\n\nexport function getImageData(image: ImageType): ImageDataType | ImageData {\n  switch (getImageType(image)) {\n    case 'data':\n      return image as unknown as ImageData;\n\n    case 'image':\n    case 'imagebitmap':\n      // Extract the image data from the image via a canvas\n      const canvas = document.createElement('canvas');\n      // TODO - reuse the canvas?\n      const context = canvas.getContext('2d');\n      if (!context) {\n        throw new Error('getImageData');\n      }\n      // @ts-ignore\n      canvas.width = image.width;\n      // @ts-ignore\n      canvas.height = image.height;\n      // @ts-ignore\n      context.drawImage(image, 0, 0);\n      // @ts-ignore\n      return context.getImageData(0, 0, image.width, image.height);\n\n    default:\n      throw new Error('getImageData');\n  }\n}\n\n// PRIVATE\n\n// eslint-disable-next-line complexity\nfunction getImageTypeOrNull(image) {\n  if (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) {\n    return 'imagebitmap';\n  }\n  if (typeof Image !== 'undefined' && image instanceof Image) {\n    return 'image';\n  }\n  if (image && typeof image === 'object' && image.data && image.width && image.height) {\n    return 'data';\n  }\n  return null;\n}\n", "// SVG parsing has limitations, e.g:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n\nconst SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nconst SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\n\nexport function isSVG(url) {\n  return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\n\nexport function getBlobOrSVGDataUrl(arrayBuffer: ArrayBuffer, url?: string): Blob | string {\n  if (isSVG(url)) {\n    // Prepare a properly tagged data URL, and load using normal mechanism\n    const textDecoder = new TextDecoder();\n    let xmlText = textDecoder.decode(arrayBuffer);\n    // TODO Escape in browser to support e.g. Chinese characters\n    try {\n      if (typeof unescape === 'function' && typeof encodeURIComponent === 'function') {\n        xmlText = unescape(encodeURIComponent(xmlText));\n      }\n    } catch (error) {\n      throw new Error((error as Error).message);\n    }\n    // base64 encoding is safer. utf-8 fails in some browsers\n    const src = `data:image/svg+xml;base64,${btoa(xmlText)}`;\n    return src;\n  }\n  return getBlob(arrayBuffer, url);\n}\n\nexport function getBlob(arrayBuffer: ArrayBuffer, url?: string): Blob {\n  if (isSVG(url)) {\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n    // return new Blob([new Uint8Array(arrayBuffer)], {type: 'image/svg+xml'});\n    throw new Error('SVG cannot be parsed directly to imagebitmap');\n  }\n  // TODO - how to determine mime type? Param? Sniff here?\n  return new Blob([new Uint8Array(arrayBuffer)]); // MIME type not needed?\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport {getBlobOrSVGDataUrl} from './svg-utils';\n\n// Parses html image from array buffer\nexport async function parseToImage(\n  arrayBuffer: ArrayBuffer,\n  options: ImageLoaderOptions,\n  url?: string\n): Promise<HTMLImageElement> {\n  // Note: image parsing requires conversion to Blob (for createObjectURL).\n  // Potentially inefficient for not using `response.blob()` (and for File / Blob inputs)...\n  // But presumably not worth adding 'blob' flag to loader objects?\n\n  const blobOrDataUrl = getBlobOrSVGDataUrl(arrayBuffer, url);\n  const URL = self.URL || self.webkitURL;\n  const objectUrl = typeof blobOrDataUrl !== 'string' && URL.createObjectURL(blobOrDataUrl);\n  try {\n    return await loadToImage(objectUrl || blobOrDataUrl, options);\n  } finally {\n    if (objectUrl) {\n      URL.revokeObjectURL(objectUrl);\n    }\n  }\n}\n\nexport async function loadToImage(url, options): Promise<HTMLImageElement> {\n  const image = new Image();\n  image.src = url;\n\n  // The `image.onload()` callback does not guarantee that the image has been decoded\n  // so a main thread \"freeze\" can be incurred when using the image for the first time.\n  // `Image.decode()` returns a promise that completes when image is decoded.\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode\n  // Note: When calling `img.decode()`, we do not need to wait for `img.onload()`\n  // Note: `HTMLImageElement.decode()` is not available in Edge and IE11\n  if (options.image && options.image.decode && image.decode) {\n    await image.decode();\n    return image;\n  }\n\n  // Create a promise that tracks onload/onerror callbacks\n  return await new Promise((resolve, reject) => {\n    try {\n      image.onload = () => resolve(image);\n      image.onerror = (error) => {\n        const message = error instanceof Error ? error.message : 'error';\n        reject(new Error(message));\n      };\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport {isSVG, getBlob} from './svg-utils';\nimport {parseToImage} from './parse-to-image';\n\nlet imagebitmapOptionsSupported = true;\n\n/**\n * Asynchronously parses an array buffer into an ImageBitmap - this contains the decoded data\n * ImageBitmaps are supported on worker threads, but not supported on Edge, IE11 and Safari\n * https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap#Browser_compatibility\n *\n * TODO - createImageBitmap supports source rect (5 param overload), pass through?\n */\nexport async function parseToImageBitmap(\n  arrayBuffer: ArrayBuffer,\n  options: ImageLoaderOptions,\n  url?: string\n): Promise<ImageBitmap> {\n  let blob;\n\n  // Cannot parse SVG directly to ImageBitmap, parse to Image first\n  if (isSVG(url)) {\n    // Note: this only works on main thread\n    const image = await parseToImage(arrayBuffer, options, url);\n    blob = image;\n  } else {\n    // Create blob from the array buffer\n    blob = getBlob(arrayBuffer, url);\n  }\n\n  const imagebitmapOptions = (options && options.imagebitmap) as\n    | ImageBitmapOptions\n    | null\n    | undefined;\n\n  return await safeCreateImageBitmap(blob, imagebitmapOptions);\n}\n\n/**\n * Safely creates an imageBitmap with options\n * *\n * Firefox crashes if imagebitmapOptions is supplied\n * Avoid supplying if not provided or supported, remember if not supported\n */\nasync function safeCreateImageBitmap(\n  blob: Blob,\n  imagebitmapOptions: ImageBitmapOptions | null = null\n): Promise<ImageBitmap> {\n  if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) {\n    imagebitmapOptions = null;\n  }\n\n  if (imagebitmapOptions) {\n    try {\n      // @ts-ignore Options\n      return await createImageBitmap(blob, imagebitmapOptions);\n    } catch (error) {\n      console.warn(error); // eslint-disable-line\n      imagebitmapOptionsSupported = false;\n    }\n  }\n\n  return await createImageBitmap(blob);\n}\n\nfunction isEmptyObject(object: object | null | undefined) {\n  if (!object) {\n    return true;\n  }\n\n  for (const key in object) {\n    if (Object.prototype.hasOwnProperty.call(object, key)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// code adapted from https://github.com/sindresorhus/file-type under MIT license\n\n/**\n * Box is a container format that can contain a variety of media related files,\n * so we want to return information about which type of file is actually contained inside\n */\nexport type BoxFileType = {extension: string; mimeType: string};\n\n/**\n * Tests if a buffer is in ISO base media file format (ISOBMFF) @see https://en.wikipedia.org/wiki/ISO_base_media_file_format\n * (ISOBMFF is a media container standard based on the Apple QuickTime container format)\n */\nexport function getISOBMFFMediaType(buffer: Uint8Array): BoxFileType | null {\n  // Almost all ISO base media files start with `ftyp` box. (It's not required to be first, but it's recommended to be.)\n  if (!checkString(buffer, 'ftyp', 4)) {\n    return null;\n  }\n\n  // Extra check: test for 8859-1 printable characters (for simplicity, it's a mask which also catches one non-printable character).\n  if ((buffer[8] & 0x60) === 0x00) {\n    return null;\n  }\n\n  // `ftyp` box must contain a brand major identifier, which must consist of ISO 8859-1 printable characters.\n  return decodeMajorBrand(buffer);\n}\n\n/**\n * brands explained @see https://github.com/strukturag/libheif/issues/83\n * code adapted from @see https://github.com/sindresorhus/file-type/blob/main/core.js#L489-L492\n */\nexport function decodeMajorBrand(buffer: Uint8Array): BoxFileType | null {\n  const brandMajor = getUTF8String(buffer, 8, 12).replace('\\0', ' ').trim();\n\n  switch (brandMajor) {\n    case 'avif':\n    case 'avis':\n      return {extension: 'avif', mimeType: 'image/avif'};\n    default:\n      return null;\n  }\n  // We don't need these now, but they are easy to add\n  // case 'mif1':\n  //   return {extension: 'heic', mimeType: 'image/heif'};\n  // case 'msf1':\n  //   return {extension: 'heic', mimeType: 'image/heif-sequence'};\n  // case 'heic':\n  // case 'heix':\n  //   return {extension: 'heic', mimeType: 'image/heic'};\n  // case 'hevc':\n  // case 'hevx':\n  //   return {extension: 'heic', mimeType: 'image/heic-sequence'};\n  // case 'qt':\n  //   return {ext: 'mov', mime: 'video/quicktime'};\n  // case 'M4V':\n  // case 'M4VH':\n  // case 'M4VP':\n  //   return {ext: 'm4v', mime: 'video/x-m4v'};\n  // case 'M4P':\n  //   return {ext: 'm4p', mime: 'video/mp4'};\n  // case 'M4B':\n  //   return {ext: 'm4b', mime: 'audio/mp4'};\n  // case 'M4A':\n  //   return {ext: 'm4a', mime: 'audio/x-m4a'};\n  // case 'F4V':\n  //   return {ext: 'f4v', mime: 'video/mp4'};\n  // case 'F4P':\n  //   return {ext: 'f4p', mime: 'video/mp4'};\n  // case 'F4A':\n  //   return {ext: 'f4a', mime: 'audio/mp4'};\n  // case 'F4B':\n  //   return {ext: 'f4b', mime: 'audio/mp4'};\n  // case 'crx':\n  //   return {ext: 'cr3', mime: 'image/x-canon-cr3'};\n  // default:\n  // if (brandMajor.startsWith('3g')) {\n  //   if (brandMajor.startsWith('3g2')) {\n  //     return {ext: '3g2', mime: 'video/3gpp2'};\n  //   }\n  //   return {ext: '3gp', mime: 'video/3gpp'};\n  // }\n  // return {ext: 'mp4', mime: 'video/mp4'};\n}\n\n/** Interpret a chunk of bytes as a UTF8 string */\nfunction getUTF8String(array: Uint8Array, start: number, end: number): string {\n  return String.fromCharCode(...array.slice(start, end));\n}\n\nfunction stringToBytes(string: string): number[] {\n  return [...string].map((character) => character.charCodeAt(0));\n}\n\nfunction checkString(buffer: ArrayLike<number>, header: string, offset: number = 0): boolean {\n  const headerBytes = stringToBytes(header);\n\n  for (let i = 0; i < headerBytes.length; ++i) {\n    if (headerBytes[i] !== buffer[i + offset]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n", "// Attributions\n// * Based on binary-gltf-utils under MIT license: Copyright (c) 2016-17 Karl Cheng\n\nimport {getISOBMFFMediaType} from './parse-isobmff-binary';\n\n/** MIME type, width and height extracted from binary compressed image data */\nexport type BinaryImageMetadata = {\n  mimeType: string;\n  width: number;\n  height: number;\n};\n\nconst BIG_ENDIAN = false;\nconst LITTLE_ENDIAN = true;\n\n/**\n * Extracts `{mimeType, width and height}` from a memory buffer containing a known image format\n * Currently supports `image/png`, `image/jpeg`, `image/bmp` and `image/gif`.\n * @param binaryData: DataView | ArrayBuffer image file memory to parse\n * @returns metadata or null if memory is not a valid image file format layout.\n */\nexport function getBinaryImageMetadata(\n  binaryData: DataView | ArrayBuffer\n): BinaryImageMetadata | null {\n  const dataView = toDataView(binaryData);\n  return (\n    getPngMetadata(dataView) ||\n    getJpegMetadata(dataView) ||\n    getGifMetadata(dataView) ||\n    getBmpMetadata(dataView) ||\n    getISOBMFFMetadata(dataView)\n  );\n}\n\n// ISOBMFF\n\nfunction getISOBMFFMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n  const buffer = new Uint8Array(binaryData instanceof DataView ? binaryData.buffer : binaryData);\n  const mediaType = getISOBMFFMediaType(buffer);\n  if (!mediaType) {\n    return null;\n  }\n  return {\n    mimeType: mediaType.mimeType,\n    // TODO - decode width and height\n    width: 0,\n    height: 0\n  };\n}\n\n// PNG\n\nfunction getPngMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n  const dataView = toDataView(binaryData);\n  // Check file contains the first 4 bytes of the PNG signature.\n  const isPng = dataView.byteLength >= 24 && dataView.getUint32(0, BIG_ENDIAN) === 0x89504e47;\n  if (!isPng) {\n    return null;\n  }\n\n  // Extract size from a binary PNG file\n  return {\n    mimeType: 'image/png',\n    width: dataView.getUint32(16, BIG_ENDIAN),\n    height: dataView.getUint32(20, BIG_ENDIAN)\n  };\n}\n\n// GIF\n\n// Extract size from a binary GIF file\n// TODO: GIF is not this simple\nfunction getGifMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n  const dataView = toDataView(binaryData);\n  // Check first 4 bytes of the GIF signature (\"GIF8\").\n  const isGif = dataView.byteLength >= 10 && dataView.getUint32(0, BIG_ENDIAN) === 0x47494638;\n  if (!isGif) {\n    return null;\n  }\n\n  // GIF is little endian.\n  return {\n    mimeType: 'image/gif',\n    width: dataView.getUint16(6, LITTLE_ENDIAN),\n    height: dataView.getUint16(8, LITTLE_ENDIAN)\n  };\n}\n\n// BMP\n\n// TODO: BMP is not this simple\nexport function getBmpMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n  const dataView = toDataView(binaryData);\n  // Check magic number is valid (first 2 characters should be \"BM\").\n  // The mandatory bitmap file header is 14 bytes long.\n  const isBmp =\n    dataView.byteLength >= 14 &&\n    dataView.getUint16(0, BIG_ENDIAN) === 0x424d &&\n    dataView.getUint32(2, LITTLE_ENDIAN) === dataView.byteLength;\n\n  if (!isBmp) {\n    return null;\n  }\n\n  // BMP is little endian.\n  return {\n    mimeType: 'image/bmp',\n    width: dataView.getUint32(18, LITTLE_ENDIAN),\n    height: dataView.getUint32(22, LITTLE_ENDIAN)\n  };\n}\n\n// JPEG\n\n// Extract width and height from a binary JPEG file\nfunction getJpegMetadata(binaryData: DataView | ArrayBuffer): BinaryImageMetadata | null {\n  const dataView = toDataView(binaryData);\n  // Check file contains the JPEG \"start of image\" (SOI) marker\n  // followed by another marker.\n  const isJpeg =\n    dataView.byteLength >= 3 &&\n    dataView.getUint16(0, BIG_ENDIAN) === 0xffd8 &&\n    dataView.getUint8(2) === 0xff;\n\n  if (!isJpeg) {\n    return null;\n  }\n\n  const {tableMarkers, sofMarkers} = getJpegMarkers();\n\n  // Exclude the two byte SOI marker.\n  let i = 2;\n  while (i + 9 < dataView.byteLength) {\n    const marker = dataView.getUint16(i, BIG_ENDIAN);\n\n    // The frame that contains the width and height of the JPEG image.\n    if (sofMarkers.has(marker)) {\n      return {\n        mimeType: 'image/jpeg',\n        height: dataView.getUint16(i + 5, BIG_ENDIAN), // Number of lines\n        width: dataView.getUint16(i + 7, BIG_ENDIAN) // Number of pixels per line\n      };\n    }\n\n    // Miscellaneous tables/data preceding the frame header.\n    if (!tableMarkers.has(marker)) {\n      return null;\n    }\n\n    // Length includes size of length parameter but not the two byte header.\n    i += 2;\n    i += dataView.getUint16(i, BIG_ENDIAN);\n  }\n\n  return null;\n}\n\nfunction getJpegMarkers() {\n  // Tables/misc header markers.\n  // DQT, DHT, DAC, DRI, COM, APP_n\n  const tableMarkers = new Set([0xffdb, 0xffc4, 0xffcc, 0xffdd, 0xfffe]);\n  for (let i = 0xffe0; i < 0xfff0; ++i) {\n    tableMarkers.add(i);\n  }\n\n  // SOF markers and DHP marker.\n  // These markers are after tables/misc data.\n  const sofMarkers = new Set([\n    0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc5, 0xffc6, 0xffc7, 0xffc9, 0xffca, 0xffcb, 0xffcd, 0xffce,\n    0xffcf, 0xffde\n  ]);\n\n  return {tableMarkers, sofMarkers};\n}\n\n// TODO - move into image module?\nfunction toDataView(data) {\n  if (data instanceof DataView) {\n    return data;\n  }\n  if (ArrayBuffer.isView(data)) {\n    return new DataView(data.buffer);\n  }\n\n  // TODO: make these functions work for Node.js buffers?\n  // if (bufferToArrayBuffer) {\n  //   data = bufferToArrayBuffer(data);\n  // }\n\n  // Careful - Node Buffers will look like ArrayBuffers (keep after isBuffer)\n  if (data instanceof ArrayBuffer) {\n    return new DataView(data);\n  }\n  throw new Error('toDataView');\n}\n", "import type {ImageLoaderOptions} from '../../image-loader';\nimport type {ImageDataType} from '../../types';\nimport {assert} from '@loaders.gl/loader-utils';\nimport {getBinaryImageMetadata} from '../category-api/binary-image-api';\n\n// Note: These types should be consistent with loaders.gl/polyfills\n\ntype NDArray = {\n  shape: number[];\n  data: Uint8Array;\n  width: number;\n  height: number;\n  components: number;\n  layers: number[];\n};\n\ntype ParseImageNode = (arrayBuffer: ArrayBuffer, mimeType: string) => Promise<NDArray>;\n\n// Use polyfills if installed to parsed image using get-pixels\nexport async function parseToNodeImage(\n  arrayBuffer: ArrayBuffer,\n  options: ImageLoaderOptions\n): Promise<ImageDataType> {\n  const {mimeType} = getBinaryImageMetadata(arrayBuffer) || {};\n\n  // @ts-ignore\n  const parseImageNode: ParseImageNode = globalThis.loaders?.parseImageNode;\n  assert(parseImageNode); // '@loaders.gl/polyfills not installed'\n\n  // @ts-expect-error TODO should we throw error in this case?\n  return await parseImageNode(arrayBuffer, mimeType);\n}\n", "import type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\nimport type {ImageType} from '../../types';\nimport type {ImageLoaderOptions} from '../../image-loader';\nimport {isImageTypeSupported, getDefaultImageType} from '../category-api/image-type';\nimport {getImageData} from '../category-api/parsed-image-api';\nimport {parseToImage} from './parse-to-image';\nimport {parseToImageBitmap} from './parse-to-image-bitmap';\nimport {parseToNodeImage} from './parse-to-node-image';\n\n// Parse to platform defined image type (data on node, ImageBitmap or HTMLImage on browser)\n// eslint-disable-next-line complexity\nexport async function parseImage(\n  arrayBuffer: ArrayBuffer,\n  options?: ImageLoaderOptions,\n  context?: LoaderContext\n): Promise<ImageType> {\n  options = options || {};\n  const imageOptions = options.image || {};\n\n  // The user can request a specific output format via `options.image.type`\n  const imageType = imageOptions.type || 'auto';\n\n  const {url} = context || {};\n\n  // Note: For options.image.type === `data`, we may still need to load as `image` or `imagebitmap`\n  const loadType = getLoadableImageType(imageType);\n\n  let image;\n  switch (loadType) {\n    case 'imagebitmap':\n      image = await parseToImageBitmap(arrayBuffer, options, url);\n      break;\n    case 'image':\n      image = await parseToImage(arrayBuffer, options, url);\n      break;\n    case 'data':\n      // Node.js loads imagedata directly\n      image = await parseToNodeImage(arrayBuffer, options);\n      break;\n    default:\n      assert(false);\n  }\n\n  // Browser: if options.image.type === 'data', we can now extract data from the loaded image\n  if (imageType === 'data') {\n    image = getImageData(image);\n  }\n\n  return image;\n}\n\n// Get a loadable image type from image type\nfunction getLoadableImageType(type) {\n  switch (type) {\n    case 'auto':\n    case 'data':\n      // Browser: For image data we need still need to load using an image format\n      // Node: the default image type is `data`.\n      return getDefaultImageType();\n    default:\n      // Throw an error if not supported\n      isImageTypeSupported(type);\n      return type;\n  }\n}\n", "import type {LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport type {ImageType} from './types';\n// import type { ImageType } from '@loaders.gl/schema';\nimport {VERSION} from './lib/utils/version';\nimport {parseImage} from './lib/parsers/parse-image';\nimport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\nconst EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp', 'ico', 'svg', 'avif'];\nconst MIME_TYPES = [\n  'image/png',\n  'image/jpeg',\n  'image/gif',\n  'image/webp',\n  'image/avif',\n  'image/bmp',\n  'image/vnd.microsoft.icon',\n  'image/svg+xml'\n];\n\nexport type ImageLoaderOptions = StrictLoaderOptions & {\n  image?: {\n    type?: 'auto' | 'data' | 'imagebitmap' | 'image';\n    decode?: boolean;\n    imagebitmap?: ImageBitmapOptions;\n  };\n};\n\nconst DEFAULT_IMAGE_LOADER_OPTIONS: ImageLoaderOptions = {\n  image: {\n    type: 'auto',\n    decode: true // if format is HTML\n  }\n  // imagebitmap: {} - passes (platform dependent) parameters to ImageBitmap constructor\n};\n\n/**\n * Loads a platform-specific image type\n * Note: This type can be used as input data to WebGL texture creation\n */\nexport const ImageLoader = {\n  dataType: null as unknown as ImageType,\n  batchType: null as never,\n  id: 'image',\n  module: 'images',\n  name: 'Images',\n  version: VERSION,\n  mimeTypes: MIME_TYPES,\n  extensions: EXTENSIONS,\n  parse: parseImage,\n  // TODO: byteOffset, byteLength;\n  tests: [(arrayBuffer) => Boolean(getBinaryImageMetadata(new DataView(arrayBuffer)))],\n  options: DEFAULT_IMAGE_LOADER_OPTIONS\n} as const satisfies LoaderWithParser<ImageType, never, ImageLoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isBrowser} from '@loaders.gl/loader-utils';\n\nconst MIME_TYPES = [\n  'image/png',\n  'image/jpeg',\n  'image/gif',\n  'image/webp',\n  'image/avif',\n  'image/tiff',\n  // TODO - what is the correct type for SVG\n  'image/svg',\n  'image/svg+xml',\n  'image/bmp',\n  'image/vnd.microsoft.icon'\n];\n\n/** Only one round of tests is performed */\nconst mimeTypeSupportedPromise: Promise<Set<string>> | null = null;\n\n/** Run-time browser detection of file formats requires async tests for most precise results */\nexport async function getSupportedImageFormats(): Promise<Set<string>> {\n  if (mimeTypeSupportedPromise) {\n    return await mimeTypeSupportedPromise;\n  }\n\n  const supportedMimeTypes = new Set<string>();\n  for (const mimeType of MIME_TYPES) {\n    const supported = isBrowser\n      ? await checkBrowserImageFormatSupportAsync(mimeType)\n      : checkNodeImageFormatSupport(mimeType);\n    if (supported) {\n      supportedMimeTypes.add(mimeType);\n    }\n  }\n\n  return supportedMimeTypes;\n}\n\n/** Cache sync values for speed */\nconst mimeTypeSupportedSync: {[mimeType: string]: boolean} = {};\n\n/**\n * Check if image MIME type is supported. Result is cached to avoid repeated tests.\n */\nexport function isImageFormatSupported(mimeType: string): boolean {\n  if (mimeTypeSupportedSync[mimeType] === undefined) {\n    const supported = isBrowser\n      ? checkBrowserImageFormatSupport(mimeType)\n      : checkNodeImageFormatSupport(mimeType);\n    mimeTypeSupportedSync[mimeType] = supported;\n  }\n  return mimeTypeSupportedSync[mimeType];\n}\n\n/**\n * Checks that polyfills are installed and that mimeType is supported by polyfills\n * @todo Ideally polyfills should declare what formats they support, instead of storing that data here.\n */\nfunction checkNodeImageFormatSupport(mimeType: string): boolean {\n  const NODE_FORMAT_SUPPORT = ['image/png', 'image/jpeg', 'image/gif'];\n  const imageFormatsNode = globalThis.loaders?.imageFormatsNode || NODE_FORMAT_SUPPORT;\n  const parseImageNode = globalThis.loaders?.parseImageNode;\n  return Boolean(parseImageNode) && imageFormatsNode.includes(mimeType);\n}\n\n/** Checks image format support synchronously.\n * @note Unreliable, fails on AVIF\n */\nfunction checkBrowserImageFormatSupport(mimeType: string): boolean {\n  switch (mimeType) {\n    case 'image/avif': // Will fail\n    case 'image/webp':\n      return testBrowserImageFormatSupport(mimeType);\n    default:\n      return true;\n  }\n}\n\nconst TEST_IMAGE = {\n  'image/avif':\n    'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=',\n  // Lossy test image. Support for lossy images doesn't guarantee support for all WebP images.\n  'image/webp': 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'\n};\n\n/** Checks WebP and AVIF support asynchronously */\nasync function checkBrowserImageFormatSupportAsync(mimeType: string): Promise<boolean> {\n  const dataURL = TEST_IMAGE[mimeType];\n  return dataURL ? await testBrowserImageFormatSupportAsync(dataURL) : true;\n}\n\n/**\n * Checks browser synchronously\n * Checks if toDataURL supports the mimeType.\n * @note Imperfect testOn Chrome this is true for WebP but not for AVIF\n */\nfunction testBrowserImageFormatSupport(mimeType: string): boolean {\n  try {\n    const element = document.createElement('canvas');\n    const dataURL = element.toDataURL(mimeType);\n    return dataURL.indexOf(`data:${mimeType}`) === 0;\n  } catch {\n    // Probably Safari...\n    return false;\n  }\n}\n\n// Check WebPSupport asynchronously\nasync function testBrowserImageFormatSupportAsync(testImageDataURL: string): Promise<boolean> {\n  return new Promise((resolve) => {\n    const image = new Image();\n    image.src = testImageDataURL;\n    image.onload = () => resolve(image.height > 0);\n    image.onerror = () => resolve(false);\n  });\n}\n", "// TYPES\nexport type {ImageDataType, ImageType, ImageTypeEnum} from './types';\nexport type {ImageLoaderOptions} from './image-loader';\n\n// LOADERS AND WRITERS\nexport {ImageLoader} from './image-loader';\nexport {ImageWriter} from './image-writer';\n\n// IMAGE CATEGORY API\n\n// Binary Image API\nexport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\n// Parsed Image API\nexport {isImageTypeSupported, getDefaultImageType} from './lib/category-api/image-type';\n\nexport {\n  isImage,\n  getImageType,\n  getImageSize,\n  getImageData\n} from './lib/category-api/parsed-image-api';\n\n// EXPERIMENTAL\nexport {getSupportedImageFormats} from './lib/category-api/image-format';\nexport {isImageFormatSupported} from './lib/category-api/image-format';\n\n// REMOVED\n/** @deprecated Temporary placeholder to prevent builds from breaking */\nexport function loadImage() {\n  throw new Error('loadImage has moved to @loaders.gl/textures');\n}\n", "// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport function assert(condition: unknown, message?: string): void {\n  if (!condition) {\n    throw new Error(message || 'assert failed: gltf');\n  }\n}\n", "export const COMPONENTS = {\n  SCALAR: 1,\n  VEC2: 2,\n  VEC3: 3,\n  VEC4: 4,\n  MAT2: 4,\n  MAT3: 9,\n  MAT4: 16\n};\n\nexport const BYTES = {\n  5120: 1, // BYTE\n  5121: 1, // UNSIGNED_BYTE\n  5122: 2, // SHORT\n  5123: 2, // UNSIGNED_SHORT\n  5125: 4, // UNSIGNED_INT\n  5126: 4 // FLOAT\n};\n\n// ENUM LOOKUP\n\nexport function getBytesFromComponentType(componentType) {\n  return BYTES[componentType];\n}\n\nexport function getSizeFromAccessorType(type) {\n  return COMPONENTS[type];\n}\n\nexport function getGLEnumFromSamplerParameter(parameter) {\n  const GL_TEXTURE_MAG_FILTER = 0x2800;\n  const GL_TEXTURE_MIN_FILTER = 0x2801;\n  const GL_TEXTURE_WRAP_S = 0x2802;\n  const GL_TEXTURE_WRAP_T = 0x2803;\n\n  const PARAMETER_MAP = {\n    magFilter: GL_TEXTURE_MAG_FILTER,\n    minFilter: GL_TEXTURE_MIN_FILTER,\n    wrapS: GL_TEXTURE_WRAP_S,\n    wrapT: GL_TEXTURE_WRAP_T\n  };\n\n  return PARAMETER_MAP[parameter];\n}\n", "import {assert} from '../utils/assert';\n\nimport type {GLTFPostprocessed} from '../types/gltf-postprocessed-schema';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\n\n/**\n * Memory needed to store texture and all mipmap levels 1 + 1/4 + 1/16 + 1/64 + ...\n * Minimum 1.33, but due to GPU layout may be 1.5\n */\nconst MIPMAP_FACTOR = 1.33;\n\nconst TYPES = ['SCALAR', 'VEC2', 'VEC3', 'VEC4'];\n\ntype TypedArrayConstructor =\n  | Int8ArrayConstructor\n  | Uint8ArrayConstructor\n  | Int16ArrayConstructor\n  | Uint16ArrayConstructor\n  | Int32ArrayConstructor\n  | Uint32ArrayConstructor\n  | Float32ArrayConstructor\n  | Float64ArrayConstructor;\n\nconst ARRAY_CONSTRUCTOR_TO_WEBGL_CONSTANT: [TypedArrayConstructor, number][] = [\n  [Int8Array, 5120],\n  [Uint8Array, 5121],\n  [Int16Array, 5122],\n  [Uint16Array, 5123],\n  [Uint32Array, 5125],\n  [Float32Array, 5126],\n  [Float64Array, 5130]\n];\nconst ARRAY_TO_COMPONENT_TYPE = new Map<TypedArrayConstructor, number>(\n  ARRAY_CONSTRUCTOR_TO_WEBGL_CONSTANT\n);\n\nconst ATTRIBUTE_TYPE_TO_COMPONENTS = {\n  SCALAR: 1,\n  VEC2: 2,\n  VEC3: 3,\n  VEC4: 4,\n  MAT2: 4,\n  MAT3: 9,\n  MAT4: 16\n};\n\nconst ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE = {\n  5120: 1,\n  5121: 1,\n  5122: 2,\n  5123: 2,\n  5125: 4,\n  5126: 4\n};\n\nconst ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY = {\n  5120: Int8Array,\n  5121: Uint8Array,\n  5122: Int16Array,\n  5123: Uint16Array,\n  5125: Uint32Array,\n  5126: Float32Array\n};\n\nexport function getAccessorTypeFromSize(size) {\n  const type = TYPES[size - 1];\n  return type || TYPES[0];\n}\n\nexport function getComponentTypeFromArray(typedArray) {\n  const componentType = ARRAY_TO_COMPONENT_TYPE.get(typedArray.constructor);\n  if (!componentType) {\n    throw new Error('Illegal typed array');\n  }\n  return componentType;\n}\n\nexport function getAccessorArrayTypeAndLength(accessor, bufferView) {\n  const ArrayType = ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[accessor.componentType];\n  const components = ATTRIBUTE_TYPE_TO_COMPONENTS[accessor.type];\n  const bytesPerComponent = ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE[accessor.componentType];\n  const length = accessor.count * components;\n  const byteLength = accessor.count * components * bytesPerComponent;\n  assert(byteLength >= 0 && byteLength <= bufferView.byteLength);\n  const componentByteSize = BYTES[accessor.componentType];\n  const numberOfComponentsInElement = COMPONENTS[accessor.type];\n  return {ArrayType, length, byteLength, componentByteSize, numberOfComponentsInElement};\n}\n\n/**\n * Calculate the GPU memory used by a GLTF tile, for both buffer and texture memory\n * @param gltf - the gltf content of a GLTF tile\n * @returns - total memory usage in bytes\n */\nexport function getMemoryUsageGLTF(gltf: GLTFPostprocessed): number {\n  let {images, bufferViews} = gltf;\n  images = images || [];\n  bufferViews = bufferViews || [];\n  const imageBufferViews = images.map((i) => i.bufferView);\n  bufferViews = bufferViews.filter((view) => !imageBufferViews.includes(view as any));\n\n  const bufferMemory = bufferViews.reduce((acc, view) => acc + view.byteLength, 0);\n\n  // Assume each pixel of the texture is 4 channel with mimmaps (which add 33%)\n  // TODO correctly handle compressed textures\n  const pixelCount = images.reduce((acc, image) => {\n    // @ts-ignore\n    const {width, height} = (image as any).image;\n    return acc + width * height;\n  }, 0);\n  return bufferMemory + Math.ceil(4 * pixelCount * MIPMAP_FACTOR);\n}\n", "// TODO - GLTFScenegraph should use these\nimport {assert} from '../utils/assert';\nimport type {TypedArray} from '@loaders.gl/schema';\nimport type {GLTF, GLTFExternalBuffer, GLTFAccessor} from '../types/gltf-types';\nimport {getAccessorArrayTypeAndLength} from './gltf-utils';\n\n// accepts buffer view index or buffer view object\n// returns a `Uint8Array`\nexport function getTypedArrayForBufferView(json, buffers, bufferViewIndex) {\n  const bufferView = json.bufferViews[bufferViewIndex];\n  assert(bufferView);\n\n  // Get hold of the arrayBuffer\n  const bufferIndex = bufferView.buffer;\n  const binChunk = buffers[bufferIndex];\n  assert(binChunk);\n\n  const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;\n  return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);\n}\n\n// accepts accessor index or accessor object\n// returns a `Uint8Array`\nexport function getTypedArrayForImageData(json, buffers, imageIndex) {\n  const image = json.images[imageIndex];\n  const bufferViewIndex = json.bufferViews[image.bufferView];\n  return getTypedArrayForBufferView(json, buffers, bufferViewIndex);\n}\n\n/**\n * Gets data pointed by the accessor.\n * @param json - json part of gltf content of a GLTF tile.\n * @param buffers - Array containing buffers of data.\n * @param accessor - accepts accessor index or accessor object.\n * @returns {TypedArray} Typed array with type matching the type of data poited by the accessor.\n */\n// eslint-disable-next-line complexity\nexport function getTypedArrayForAccessor(\n  json: GLTF,\n  buffers: GLTFExternalBuffer[],\n  accessor: GLTFAccessor | number\n): TypedArray {\n  const gltfAccessor = typeof accessor === 'number' ? json.accessors?.[accessor] : accessor;\n  if (!gltfAccessor) {\n    throw new Error(`No gltf accessor ${JSON.stringify(accessor)}`);\n  }\n  const bufferView = json.bufferViews?.[gltfAccessor.bufferView || 0];\n  if (!bufferView) {\n    throw new Error(`No gltf buffer view for accessor ${bufferView}`);\n  }\n  // Get `arrayBuffer` the `bufferView` looks at\n  const {arrayBuffer, byteOffset: bufferByteOffset} = buffers[bufferView.buffer];\n  // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n  const byteOffset =\n    (bufferByteOffset || 0) + (gltfAccessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n  // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n  const {ArrayType, length, componentByteSize, numberOfComponentsInElement} =\n    getAccessorArrayTypeAndLength(gltfAccessor, bufferView);\n  // 'length' is a whole number of components of all elements in the buffer pointed by the accessor\n  // Multiplier to calculate the address of the element in the arrayBuffer\n  const elementByteSize = componentByteSize * numberOfComponentsInElement;\n  const elementAddressScale = bufferView.byteStride || elementByteSize;\n  // Creare an array of component's type where all components (not just elements) will reside\n  if (typeof bufferView.byteStride === 'undefined' || bufferView.byteStride === elementByteSize) {\n    // No iterleaving\n    const result: TypedArray = new ArrayType(arrayBuffer, byteOffset, length);\n    return result;\n  }\n  // Iterleaving\n  const result: TypedArray = new ArrayType(length);\n  for (let i = 0; i < gltfAccessor.count; i++) {\n    const values = new ArrayType(\n      arrayBuffer,\n      byteOffset + i * elementAddressScale,\n      numberOfComponentsInElement\n    );\n    result.set(values, i * numberOfComponentsInElement);\n  }\n  return result;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n  GLTF,\n  GLTFScene,\n  GLTFNode,\n  GLTFMesh,\n  GLTFSkin,\n  GLTFMaterial,\n  GLTFAccessor,\n  GLTFSampler,\n  GLTFTexture,\n  GLTFImage,\n  GLTFBuffer,\n  GLTFBufferView\n} from '../types/gltf-json-schema';\n\nimport {getBinaryImageMetadata} from '@loaders.gl/images';\nimport {padToNBytes, copyToArray} from '@loaders.gl/loader-utils';\nimport {assert} from '../utils/assert';\nimport {getAccessorTypeFromSize, getComponentTypeFromArray} from '../gltf-utils/gltf-utils';\n\nimport {getTypedArrayForAccessor as _getTypedArrayForAccessor} from '../gltf-utils/get-typed-array';\n\ntype Extension = {[key: string]: any};\n\nfunction makeDefaultGLTFJson(): GLTF {\n  return {\n    asset: {\n      version: '2.0',\n      generator: 'loaders.gl'\n    },\n    buffers: [],\n    extensions: {},\n    extensionsRequired: [],\n    extensionsUsed: []\n  };\n}\n\n/**\n * Class for structured access to GLTF data\n */\nexport class GLTFScenegraph {\n  // internal\n  gltf: GLTFWithBuffers;\n  sourceBuffers: any[];\n  byteLength: number;\n\n  // TODO - why is this not GLTFWithBuffers - what happens to images?\n  constructor(gltf?: {json: GLTF; buffers?: any[]; images?: any[]}) {\n    // Declare locally so\n\n    this.gltf = {\n      json: gltf?.json || makeDefaultGLTFJson(),\n      buffers: gltf?.buffers || [],\n      images: gltf?.images || []\n    };\n    this.sourceBuffers = [];\n    this.byteLength = 0;\n\n    // Initialize buffers\n    if (this.gltf.buffers && this.gltf.buffers[0]) {\n      this.byteLength = this.gltf.buffers[0].byteLength;\n      this.sourceBuffers = [this.gltf.buffers[0]];\n    }\n  }\n\n  // Accessors\n\n  get json(): GLTF {\n    return this.gltf.json;\n  }\n\n  getApplicationData(key: string): unknown {\n    // TODO - Data is already unpacked by GLBParser\n    const data = this.json[key];\n    return data;\n  }\n\n  getExtraData(key: string): unknown {\n    // TODO - Data is already unpacked by GLBParser\n    const extras = (this.json.extras || {}) as Record<string, unknown>;\n    return extras[key];\n  }\n\n  hasExtension(extensionName: string): boolean {\n    const isUsedExtension = this.getUsedExtensions().find((name) => name === extensionName);\n    const isRequiredExtension = this.getRequiredExtensions().find((name) => name === extensionName);\n    return typeof isUsedExtension === 'string' || typeof isRequiredExtension === 'string';\n  }\n\n  getExtension<T = Extension>(extensionName: string): T | null {\n    const isExtension = this.getUsedExtensions().find((name) => name === extensionName);\n    const extensions = this.json.extensions || {};\n    return isExtension ? (extensions[extensionName] as T) : null;\n  }\n\n  getRequiredExtension<T = Extension>(extensionName: string): T | null {\n    const isRequired = this.getRequiredExtensions().find((name) => name === extensionName);\n    return isRequired ? this.getExtension(extensionName) : null;\n  }\n\n  getRequiredExtensions(): string[] {\n    return this.json.extensionsRequired || [];\n  }\n\n  getUsedExtensions(): string[] {\n    return this.json.extensionsUsed || [];\n  }\n\n  getRemovedExtensions(): string[] {\n    return (this.json.extensionsRemoved || []) as string[];\n  }\n\n  getObjectExtension<T = Extension>(object: {[key: string]: any}, extensionName: string): T | null {\n    const extensions = object.extensions || {};\n    return extensions[extensionName];\n  }\n\n  getScene(index: number): GLTFScene {\n    return this.getObject('scenes', index) as GLTFScene;\n  }\n\n  getNode(index: number): GLTFNode {\n    return this.getObject('nodes', index) as GLTFNode;\n  }\n\n  getSkin(index: number): GLTFSkin {\n    return this.getObject('skins', index) as GLTFSkin;\n  }\n\n  getMesh(index: number): GLTFMesh {\n    return this.getObject('meshes', index) as GLTFMesh;\n  }\n\n  getMaterial(index: number): GLTFMaterial {\n    return this.getObject('materials', index) as GLTFMaterial;\n  }\n\n  getAccessor(index: number): GLTFAccessor {\n    return this.getObject('accessors', index) as GLTFAccessor;\n  }\n\n  // getCamera(index: number): object | null {\n  //   return null; // TODO: fix thi: object  as null;\n  // }\n\n  getTexture(index: number): GLTFTexture {\n    return this.getObject('textures', index) as GLTFTexture;\n  }\n\n  getSampler(index: number): GLTFSampler {\n    return this.getObject('samplers', index) as GLTFSampler;\n  }\n\n  getImage(index: number): GLTFImage {\n    return this.getObject('images', index) as GLTFImage;\n  }\n\n  getBufferView(index: number | object): GLTFBufferView {\n    return this.getObject('bufferViews', index) as GLTFBufferView;\n  }\n\n  getBuffer(index: number): GLTFBuffer {\n    return this.getObject('buffers', index) as GLTFBuffer;\n  }\n\n  getObject(array: string, index: number | object): Record<string, unknown> {\n    // check if already resolved\n    if (typeof index === 'object') {\n      return index as Record<string, unknown>;\n    }\n    const object = this.json[array] && (this.json[array] as {}[])[index];\n    if (!object) {\n      throw new Error(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line\n    }\n    return object as Record<string, unknown>;\n  }\n\n  /**\n   * Accepts buffer view index or buffer view object\n   * @returns a `Uint8Array`\n   */\n  getTypedArrayForBufferView(bufferView: number | object): Uint8Array {\n    bufferView = this.getBufferView(bufferView);\n    // @ts-ignore\n    const bufferIndex = bufferView.buffer;\n\n    // Get hold of the arrayBuffer\n    // const buffer = this.getBuffer(bufferIndex);\n    const binChunk = this.gltf.buffers[bufferIndex];\n    assert(binChunk);\n\n    // @ts-ignore\n    const byteOffset = (bufferView.byteOffset || 0) + binChunk.byteOffset;\n    // @ts-ignore\n    return new Uint8Array(binChunk.arrayBuffer, byteOffset, bufferView.byteLength);\n  }\n\n  /** Accepts accessor index or accessor object\n   * @returns a typed array with type that matches the types\n   */\n  getTypedArrayForAccessor(accessor: number | object): any {\n    // @ts-ignore\n    const gltfAccessor = this.getAccessor(accessor);\n    return _getTypedArrayForAccessor(this.gltf.json, this.gltf.buffers, gltfAccessor);\n  }\n\n  /** accepts accessor index or accessor object\n   * returns a `Uint8Array`\n   */\n  getTypedArrayForImageData(image: number | object): Uint8Array {\n    // @ts-ignore\n    image = this.getAccessor(image);\n    // @ts-ignore\n    const bufferView = this.getBufferView(image.bufferView);\n    const buffer = this.getBuffer(bufferView.buffer);\n    // @ts-ignore\n    const arrayBuffer = buffer.data;\n\n    const byteOffset = bufferView.byteOffset || 0;\n    return new Uint8Array(arrayBuffer, byteOffset, bufferView.byteLength);\n  }\n\n  // MODIFERS\n\n  /**\n   * Add an extra application-defined key to the top-level data structure\n   */\n  addApplicationData(key: string, data: object): GLTFScenegraph {\n    this.json[key] = data;\n    return this;\n  }\n\n  /**\n   * `extras` - Standard GLTF field for storing application specific data\n   */\n  addExtraData(key: string, data: object): GLTFScenegraph {\n    this.json.extras = this.json.extras || {};\n    (this.json.extras as Record<string, unknown>)[key] = data;\n    return this;\n  }\n\n  addObjectExtension(object: object, extensionName: string, data: object): GLTFScenegraph {\n    // @ts-ignore\n    object.extensions = object.extensions || {};\n    // TODO - clobber or merge?\n    // @ts-ignore\n    object.extensions[extensionName] = data;\n    this.registerUsedExtension(extensionName);\n    return this;\n  }\n\n  setObjectExtension(object: any, extensionName: string, data: object): void {\n    const extensions = object.extensions || {};\n    extensions[extensionName] = data;\n    // TODO - add to usedExtensions...\n  }\n\n  removeObjectExtension(object: any, extensionName: string): void {\n    const extensions = object?.extensions || {};\n\n    if (extensions[extensionName]) {\n      this.json.extensionsRemoved = this.json.extensionsRemoved || [];\n      const extensionsRemoved = this.json.extensionsRemoved as string[];\n      if (!extensionsRemoved.includes(extensionName)) {\n        extensionsRemoved.push(extensionName);\n      }\n    }\n\n    delete extensions[extensionName];\n  }\n\n  /**\n   * Add to standard GLTF top level extension object, mark as used\n   */\n  addExtension(extensionName: string, extensionData: object = {}): object {\n    assert(extensionData);\n    this.json.extensions = this.json.extensions || {};\n    this.json.extensions[extensionName] = extensionData;\n    this.registerUsedExtension(extensionName);\n    return extensionData;\n  }\n\n  /**\n   * Standard GLTF top level extension object, mark as used and required\n   */\n  addRequiredExtension(extensionName, extensionData: object = {}): object {\n    assert(extensionData);\n    this.addExtension(extensionName, extensionData);\n    this.registerRequiredExtension(extensionName);\n    return extensionData;\n  }\n\n  /**\n   * Add extensionName to list of used extensions\n   */\n  registerUsedExtension(extensionName: string): void {\n    this.json.extensionsUsed = this.json.extensionsUsed || [];\n    if (!this.json.extensionsUsed.find((ext) => ext === extensionName)) {\n      this.json.extensionsUsed.push(extensionName);\n    }\n  }\n\n  /**\n   * Add extensionName to list of required extensions\n   */\n  registerRequiredExtension(extensionName: string): void {\n    this.registerUsedExtension(extensionName);\n    this.json.extensionsRequired = this.json.extensionsRequired || [];\n    if (!this.json.extensionsRequired.find((ext) => ext === extensionName)) {\n      this.json.extensionsRequired.push(extensionName);\n    }\n  }\n\n  /**\n   * Removes an extension from the top-level list\n   */\n  removeExtension(extensionName: string): void {\n    if (this.json.extensions?.[extensionName]) {\n      this.json.extensionsRemoved = this.json.extensionsRemoved || [];\n      const extensionsRemoved = this.json.extensionsRemoved as string[];\n      if (!extensionsRemoved.includes(extensionName)) {\n        extensionsRemoved.push(extensionName);\n      }\n    }\n    if (this.json.extensions) {\n      delete this.json.extensions[extensionName];\n    }\n    if (this.json.extensionsRequired) {\n      this._removeStringFromArray(this.json.extensionsRequired, extensionName);\n    }\n    if (this.json.extensionsUsed) {\n      this._removeStringFromArray(this.json.extensionsUsed, extensionName);\n    }\n  }\n\n  /**\n   *  Set default scene which is to be displayed at load time\n   */\n  setDefaultScene(sceneIndex: number): void {\n    this.json.scene = sceneIndex;\n  }\n\n  /**\n   * @todo: add more properties for scene initialization:\n   *   name`, `extensions`, `extras`\n   *   https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-scene\n   */\n  addScene(scene: {nodeIndices: number[]}): number {\n    const {nodeIndices} = scene;\n    this.json.scenes = this.json.scenes || [];\n    this.json.scenes.push({nodes: nodeIndices});\n    return this.json.scenes.length - 1;\n  }\n\n  /**\n   * @todo: add more properties for node initialization:\n   *   `name`, `extensions`, `extras`, `camera`, `children`, `skin`, `rotation`, `scale`, `translation`, `weights`\n   *   https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#node\n   */\n  addNode(node: {meshIndex: number; matrix?: number[]}): number {\n    const {meshIndex, matrix} = node;\n    this.json.nodes = this.json.nodes || [];\n    const nodeData = {mesh: meshIndex};\n    if (matrix) {\n      // @ts-ignore\n      nodeData.matrix = matrix;\n    }\n    this.json.nodes.push(nodeData);\n    return this.json.nodes.length - 1;\n  }\n\n  /** Adds a mesh to the json part */\n  addMesh(mesh: {attributes: object; indices?: object; material?: number; mode?: number}): number {\n    const {attributes, indices, material, mode = 4} = mesh;\n    const accessors = this._addAttributes(attributes);\n\n    const glTFMesh = {\n      primitives: [\n        {\n          attributes: accessors,\n          mode\n        }\n      ]\n    };\n\n    if (indices) {\n      const indicesAccessor = this._addIndices(indices);\n      // @ts-ignore\n      glTFMesh.primitives[0].indices = indicesAccessor;\n    }\n\n    if (Number.isFinite(material)) {\n      // @ts-ignore\n      glTFMesh.primitives[0].material = material;\n    }\n\n    this.json.meshes = this.json.meshes || [];\n    this.json.meshes.push(glTFMesh);\n    return this.json.meshes.length - 1;\n  }\n\n  addPointCloud(attributes: object): number {\n    // @ts-ignore\n    const accessorIndices = this._addAttributes(attributes);\n\n    const glTFMesh = {\n      primitives: [\n        {\n          attributes: accessorIndices,\n          mode: 0 // GL.POINTS\n        }\n      ]\n    };\n\n    this.json.meshes = this.json.meshes || [];\n    this.json.meshes.push(glTFMesh);\n    return this.json.meshes.length - 1;\n  }\n\n  /**\n   * Adds a binary image. Builds glTF \"JSON metadata\" and saves buffer reference\n   * Buffer will be copied into BIN chunk during \"pack\"\n   * Currently encodes as glTF image\n   * @param imageData\n   * @param mimeType\n   */\n  addImage(imageData: any, mimeTypeOpt?: string): number {\n    // If image is referencing a bufferView instead of URI, mimeType must be defined:\n    //   https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#images\n    //   \"a reference to a bufferView; in that case mimeType must be defined.\"\n    const metadata = getBinaryImageMetadata(imageData);\n    const mimeType = mimeTypeOpt || metadata?.mimeType;\n\n    const bufferViewIndex = this.addBufferView(imageData);\n\n    const glTFImage = {\n      bufferView: bufferViewIndex,\n      mimeType\n    };\n\n    this.json.images = this.json.images || [];\n    this.json.images.push(glTFImage);\n    return this.json.images.length - 1;\n  }\n\n  /**\n   * Add one untyped source buffer, create a matching glTF `bufferView`, and return its index\n   * @param buffer\n   */\n  addBufferView(buffer: any, bufferIndex = 0, byteOffset = this.byteLength): number {\n    const byteLength = buffer.byteLength;\n    assert(Number.isFinite(byteLength));\n\n    // Add this buffer to the list of buffers to be written to the body.\n    this.sourceBuffers = this.sourceBuffers || [];\n    this.sourceBuffers.push(buffer);\n\n    const glTFBufferView = {\n      buffer: bufferIndex,\n      // Write offset from the start of the binary body\n      byteOffset,\n      byteLength\n    };\n\n    // We've now added the contents to the body, so update the total length\n    // Every sub-chunk needs to be 4-byte align ed\n    this.byteLength += padToNBytes(byteLength, 4);\n\n    // Add a bufferView indicating start and length of this binary sub-chunk\n    this.json.bufferViews = this.json.bufferViews || [];\n    this.json.bufferViews.push(glTFBufferView);\n    return this.json.bufferViews.length - 1;\n  }\n\n  /**\n   * Adds an accessor to a bufferView\n   * @param bufferViewIndex\n   * @param accessor\n   */\n  addAccessor(bufferViewIndex: number, accessor: object): number {\n    const glTFAccessor = {\n      bufferView: bufferViewIndex,\n      // @ts-ignore\n      type: getAccessorTypeFromSize(accessor.size),\n      // @ts-ignore\n      componentType: accessor.componentType,\n      // @ts-ignore\n      count: accessor.count,\n      // @ts-ignore\n      max: accessor.max,\n      // @ts-ignore\n      min: accessor.min\n    };\n\n    this.json.accessors = this.json.accessors || [];\n    this.json.accessors.push(glTFAccessor);\n    return this.json.accessors.length - 1;\n  }\n\n  /**\n   * Add a binary buffer. Builds glTF \"JSON metadata\" and saves buffer reference\n   * Buffer will be copied into BIN chunk during \"pack\"\n   * Currently encodes buffers as glTF accessors, but this could be optimized\n   * @param sourceBuffer\n   * @param accessor\n   */\n  addBinaryBuffer(sourceBuffer: any, accessor: object = {size: 3}): number {\n    const bufferViewIndex = this.addBufferView(sourceBuffer);\n    // @ts-ignore\n    let minMax = {min: accessor.min, max: accessor.max};\n    if (!minMax.min || !minMax.max) {\n      // @ts-ignore\n      minMax = this._getAccessorMinMax(sourceBuffer, accessor.size);\n    }\n\n    const accessorDefaults = {\n      // @ts-ignore\n      size: accessor.size,\n      componentType: getComponentTypeFromArray(sourceBuffer),\n      // @ts-ignore\n      count: Math.round(sourceBuffer.length / accessor.size),\n      min: minMax.min,\n      max: minMax.max\n    };\n\n    return this.addAccessor(bufferViewIndex, Object.assign(accessorDefaults, accessor));\n  }\n\n  /**\n   * Adds a texture to the json part\n   * @todo: add more properties for texture initialization\n   * `sampler`, `name`, `extensions`, `extras`\n   * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#texture\n   */\n  addTexture(texture: {imageIndex: number}): number {\n    const {imageIndex} = texture;\n    const glTFTexture = {\n      source: imageIndex\n    };\n\n    this.json.textures = this.json.textures || [];\n    this.json.textures.push(glTFTexture);\n    return this.json.textures.length - 1;\n  }\n\n  /** Adds a material to the json part */\n  addMaterial(pbrMaterialInfo: Object): number {\n    this.json.materials = this.json.materials || [];\n    this.json.materials.push(pbrMaterialInfo);\n    return this.json.materials.length - 1;\n  }\n\n  /** Pack the binary chunk */\n  createBinaryChunk(): void {\n    // Allocate total array\n    const totalByteLength = this.byteLength;\n    const arrayBuffer = new ArrayBuffer(totalByteLength);\n    const targetArray = new Uint8Array(arrayBuffer);\n\n    // Copy each array into\n    let dstByteOffset = 0;\n    for (const sourceBuffer of this.sourceBuffers || []) {\n      dstByteOffset = copyToArray(sourceBuffer, targetArray, dstByteOffset);\n    }\n\n    // Update the glTF BIN CHUNK byte length\n    if (this.json?.buffers?.[0]) {\n      this.json.buffers[0].byteLength = totalByteLength;\n    } else {\n      this.json.buffers = [{byteLength: totalByteLength}];\n    }\n\n    // Save generated arrayBuffer\n    this.gltf.binary = arrayBuffer;\n\n    // Put arrayBuffer to sourceBuffers for possible additional writing data in the chunk\n    this.sourceBuffers = [arrayBuffer];\n    this.gltf.buffers = [{arrayBuffer, byteOffset: 0, byteLength: arrayBuffer.byteLength}];\n  }\n\n  // PRIVATE\n\n  _removeStringFromArray(array, string) {\n    let found = true;\n    while (found) {\n      const index = array.indexOf(string);\n      if (index > -1) {\n        array.splice(index, 1);\n      } else {\n        found = false;\n      }\n    }\n  }\n\n  /**\n   * Add attributes to buffers and create `attributes` object which is part of `mesh`\n   */\n  _addAttributes(attributes = {}) {\n    const result = {};\n    for (const attributeKey in attributes) {\n      const attributeData = attributes[attributeKey];\n      const attrName = this._getGltfAttributeName(attributeKey);\n      const accessor = this.addBinaryBuffer(attributeData.value, attributeData);\n      result[attrName] = accessor;\n    }\n    return result;\n  }\n\n  /**\n   * Add indices to buffers\n   */\n  _addIndices(indices) {\n    return this.addBinaryBuffer(indices, {size: 1});\n  }\n\n  /**\n   * Deduce gltf specific attribue name from input attribute name\n   */\n  _getGltfAttributeName(attributeName) {\n    switch (attributeName.toLowerCase()) {\n      case 'position':\n      case 'positions':\n      case 'vertices':\n        return 'POSITION';\n      case 'normal':\n      case 'normals':\n        return 'NORMAL';\n      case 'color':\n      case 'colors':\n        return 'COLOR_0';\n      case 'texcoord':\n      case 'texcoords':\n        return 'TEXCOORD_0';\n      default:\n        return attributeName;\n    }\n  }\n\n  /**\n   * Calculate `min` and `max` arrays of accessor according to spec:\n   * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#reference-accessor\n   */\n  _getAccessorMinMax(buffer, size) {\n    const result = {min: null, max: null};\n    if (buffer.length < size) {\n      return result;\n    }\n    // @ts-ignore\n    result.min = [];\n    // @ts-ignore\n    result.max = [];\n    const initValues = buffer.subarray(0, size);\n    for (const value of initValues) {\n      // @ts-ignore\n      result.min.push(value);\n      // @ts-ignore\n      result.max.push(value);\n    }\n\n    for (let index = size; index < buffer.length; index += size) {\n      for (let componentIndex = 0; componentIndex < size; componentIndex++) {\n        // @ts-ignore\n        result.min[0 + componentIndex] = Math.min(\n          // @ts-ignore\n          result.min[0 + componentIndex],\n          buffer[index + componentIndex]\n        );\n        // @ts-ignore\n        result.max[0 + componentIndex] = Math.max(\n          // @ts-ignore\n          result.max[0 + componentIndex],\n          buffer[index + componentIndex]\n        );\n      }\n    }\n    return result;\n  }\n}\n", "/**\n * loaders.gl, MIT license\n *\n * Shared code for 3DTiles extensions:\n * * EXT_feature_metadata\n * * EXT_mesh_features\n * * EXT_structural_metadata\n */\n\nimport type {GLTFTextureInfoMetadata, GLTFMeshPrimitive} from '../../types/gltf-json-schema';\nimport type {BigTypedArray, TypedArray} from '@loaders.gl/schema';\nimport type {ImageType} from '@loaders.gl/images';\n\nimport {GLTFScenegraph} from '../../api/gltf-scenegraph';\nimport {getComponentTypeFromArray} from '../../gltf-utils/gltf-utils';\nimport {getImageData} from '@loaders.gl/images';\nimport {ensureArrayBuffer} from '@loaders.gl/loader-utils';\n\nfunction emod(n: number): number {\n  return ((n % 1) + 1) % 1;\n}\n\nexport type NumericComponentType =\n  | 'INT8'\n  | 'UINT8'\n  | 'INT16'\n  | 'UINT16'\n  | 'INT32'\n  | 'UINT32'\n  | 'INT64'\n  | 'UINT64'\n  | 'FLOAT32'\n  | 'FLOAT64';\n\nconst ATTRIBUTE_TYPE_TO_COMPONENTS = {\n  SCALAR: 1,\n  VEC2: 2,\n  VEC3: 3,\n  VEC4: 4,\n  MAT2: 4,\n  MAT3: 9,\n  MAT4: 16,\n  BOOLEAN: 1,\n  STRING: 1,\n  ENUM: 1\n};\n\nconst ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY = {\n  INT8: Int8Array,\n  UINT8: Uint8Array,\n  INT16: Int16Array,\n  UINT16: Uint16Array,\n  INT32: Int32Array,\n  UINT32: Uint32Array,\n  INT64: BigInt64Array,\n  UINT64: BigUint64Array,\n  FLOAT32: Float32Array,\n  FLOAT64: Float64Array\n};\n\nconst ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE = {\n  INT8: 1,\n  UINT8: 1,\n  INT16: 2,\n  UINT16: 2,\n  INT32: 4,\n  UINT32: 4,\n  INT64: 8,\n  UINT64: 8,\n  FLOAT32: 4,\n  FLOAT64: 8\n};\n\nexport function getArrayElementByteSize(attributeType, componentType): number {\n  return (\n    ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE[componentType] *\n    ATTRIBUTE_TYPE_TO_COMPONENTS[attributeType]\n  );\n}\n\n/**\n * Gets offset array from `arrayOffsets` or `stringOffsets`.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param bufferViewIndex - Buffer view index\n * @param offsetType - The type of values in `arrayOffsets` or `stringOffsets`.\n * @param numberOfElements - The number of elements in each property array.\n * @returns Array of values offsets. The number of offsets in the array is equal to `numberOfElements` plus one.\n */\nexport function getOffsetsForProperty(\n  scenegraph: GLTFScenegraph,\n  bufferViewIndex: number,\n  offsetType: 'UINT8' | 'UINT16' | 'UINT32' | 'UINT64' | string,\n  numberOfElements: number\n): TypedArray | null {\n  if (\n    offsetType !== 'UINT8' &&\n    offsetType !== 'UINT16' &&\n    offsetType !== 'UINT32' &&\n    offsetType !== 'UINT64'\n  ) {\n    return null;\n  }\n  const arrayOffsetsBytes = scenegraph.getTypedArrayForBufferView(bufferViewIndex);\n  const arrayOffsets = convertRawBufferToMetadataArray(\n    arrayOffsetsBytes,\n    'SCALAR', // offsets consist of ONE component\n    offsetType,\n    numberOfElements + 1 // The number of offsets is equal to the property table `count` plus one.\n  );\n\n  // We don't support BigInt offsets at the moment. It requires additional logic and potential issues in Safari\n  if (arrayOffsets instanceof BigInt64Array || arrayOffsets instanceof BigUint64Array) {\n    return null;\n  }\n  return arrayOffsets;\n}\n\n/**\n * Converts raw bytes that are in the buffer to an array of the type defined by the schema.\n * @param data - Raw bytes in the buffer.\n * @param attributeType - SCALAR, VECN, MATN.\n * @param componentType - Type of the component in elements, e.g. 'UINT8' or 'FLOAT32'.\n * @param elementCount - Number of elements in the array. Default value is 1.\n * @returns Data array\n */\nexport function convertRawBufferToMetadataArray(\n  data: Uint8Array,\n  attributeType: string,\n  componentType: NumericComponentType,\n  elementCount: number = 1\n): BigTypedArray {\n  const numberOfComponents = ATTRIBUTE_TYPE_TO_COMPONENTS[attributeType];\n  const ArrayType = ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[componentType];\n  const size = ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE[componentType];\n  const length = elementCount * numberOfComponents;\n  const byteLength = length * size;\n  let buffer = data.buffer;\n  let offset = data.byteOffset;\n  if (offset % size !== 0) {\n    const bufferArray = new Uint8Array(buffer);\n    buffer = bufferArray.slice(offset, offset + byteLength).buffer;\n    offset = 0;\n  }\n  return new ArrayType(ensureArrayBuffer(buffer), offset, length);\n}\n\n/**\n * Processes data encoded in the texture associated with the primitive.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param textureInfo - Reference to the texture where extension data are stored.\n * @param primitive - Primitive object in the mesh.\n * @returns Array of data taken. Null if data can't be taken from the texture.\n */\nexport function getPrimitiveTextureData(\n  scenegraph: GLTFScenegraph,\n  textureInfo: GLTFTextureInfoMetadata,\n  primitive: GLTFMeshPrimitive\n): number[] {\n  /*\n    texture.index is an index for the \"textures\" array.\n    The texture object referenced by this index looks like this:\n    {\n    \"sampler\": 0,\n    \"source\": 0\n    }\n    \"sampler\" is an index for the \"samplers\" array\n    \"source\" is an index for the \"images\" array that contains data stored in rgba channels of the image.\n\n    texture.texCoord is a number-suffix (like 1) for an attribute like \"TEXCOORD_1\" in meshes.primitives\n    The value of \"TEXCOORD_1\" is an accessor that is used to get coordinates.\n    These coordinates are being used to get data from the image.\n    \n    Default for texture.texCoord is 0\n    @see https://github.com/CesiumGS/glTF/blob/3d-tiles-next/specification/2.0/schema/textureInfo.schema.json\n  */\n  const texCoordAccessorKey = `TEXCOORD_${textureInfo.texCoord || 0}`;\n  const texCoordAccessorIndex = primitive.attributes[texCoordAccessorKey];\n  const textureCoordinates: TypedArray = scenegraph.getTypedArrayForAccessor(texCoordAccessorIndex);\n\n  const json = scenegraph.gltf.json;\n  const textureIndex: number = textureInfo.index;\n  const imageIndex = json.textures?.[textureIndex]?.source;\n  if (typeof imageIndex !== 'undefined') {\n    const mimeType = json.images?.[imageIndex]?.mimeType;\n    const parsedImage = scenegraph.gltf.images?.[imageIndex];\n    // Checking for width is to prevent handling Un-processed images (e.g. [analyze] stage, where loadImages option is set to false)\n    if (parsedImage && typeof parsedImage.width !== 'undefined') {\n      const textureData: number[] = [];\n      for (let index = 0; index < textureCoordinates.length; index += 2) {\n        const value = getImageValueByCoordinates(\n          parsedImage,\n          mimeType,\n          textureCoordinates,\n          index,\n          textureInfo.channels\n        );\n        textureData.push(value);\n      }\n      return textureData;\n    }\n  }\n  return [];\n}\n\n/**\n * Puts property data to attributes.\n * It creates corresponding buffer, bufferView and accessor\n * so the data can be accessed like regular data stored in buffers.\n * @param scenegraph - Scenegraph object.\n * @param attributeName - Name of the attribute.\n * @param propertyData - Property data to store.\n * @param featureTable - Array where unique data from the property data are being stored.\n * @param primitive - Primitive object.\n */\nexport function primitivePropertyDataToAttributes(\n  scenegraph: GLTFScenegraph,\n  attributeName: string,\n  propertyData: number[],\n  featureTable: number[],\n  primitive: GLTFMeshPrimitive\n): void {\n  // No reason to create an empty buffer if there is no property data to store.\n  if (!propertyData?.length) {\n    return;\n  }\n  /*\n    featureTable will contain unique values, e.g.\n    propertyData = [24, 35, 28, 24]\n    featureTable = [24, 35, 28]\n    featureIndices will contain indices that refer featureTextureTable, e.g.\n    featureIndices = [0, 1, 2, 0]\n  */\n  const featureIndices: number[] = [];\n  for (const texelData of propertyData) {\n    let index = featureTable.findIndex((item) => item === texelData);\n    if (index === -1) {\n      index = featureTable.push(texelData) - 1;\n    }\n    featureIndices.push(index);\n  }\n  const typedArray = new Uint32Array(featureIndices);\n  const bufferIndex =\n    scenegraph.gltf.buffers.push({\n      arrayBuffer: typedArray.buffer,\n      byteOffset: typedArray.byteOffset,\n      byteLength: typedArray.byteLength\n    }) - 1;\n  const bufferViewIndex = scenegraph.addBufferView(typedArray, bufferIndex, 0);\n  const accessorIndex = scenegraph.addAccessor(bufferViewIndex, {\n    size: 1,\n    componentType: getComponentTypeFromArray(typedArray),\n    count: typedArray.length\n  });\n  primitive.attributes[attributeName] = accessorIndex;\n}\n\n/**\n * Gets the value from the texture by coordinates provided.\n * @param parsedImage - Image where the data are stored.\n * @param mimeType - MIME type.\n * @param textureCoordinates - uv coordinates to access data in the image.\n * @param index - Index of uv coordinates in the array textureCoordinates.\n * @param channels - Image channels where data are stored.\n *  Channels of an RGBA texture are numbered 0..3 respectively.\n *  For Ext_mesh_features and EXT_strucural_metadata the channels default is [0]\n *  @see https://github.com/CesiumGS/glTF/blob/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features/schema/featureIdTexture.schema.json\n *  @see https://github.com/CesiumGS/glTF/blob/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata/schema/propertyTexture.property.schema.json\n * @returns Value taken from the image.\n */\nfunction getImageValueByCoordinates(\n  parsedImage: ImageType,\n  mimeType: string | undefined,\n  textureCoordinates: TypedArray,\n  index: number,\n  channels: number[] | string = [0]\n) {\n  const CHANNELS_MAP = {\n    r: {offset: 0, shift: 0},\n    g: {offset: 1, shift: 8},\n    b: {offset: 2, shift: 16},\n    a: {offset: 3, shift: 24}\n  };\n\n  const u = textureCoordinates[index];\n  const v = textureCoordinates[index + 1];\n\n  let components = 1;\n  if (mimeType && (mimeType.indexOf('image/jpeg') !== -1 || mimeType.indexOf('image/png') !== -1))\n    components = 4;\n  const offset = coordinatesToOffset(u, v, parsedImage, components);\n  let value: number = 0;\n  for (const c of channels) {\n    /*\n    According to the EXT_feature_metadata extension specification:\n      Channels are labeled by rgba and are swizzled with a string of 1-4 characters.\n    According to the EXT_mesh_features extension specification:\n      The channels array contains non-negative integer values corresponding to channels of the source texture that the feature ID consists of.\n      Channels of an RGBA texture are numbered 0\u20133 respectively.\n    Function getImageValueByCoordinates is used to process both extensions. \n    So, there should be possible to get the element of CHANNELS_MAP by either index (0, 1, 2, 3) or key (r, g, b, a).\n    */\n    const map = typeof c === 'number' ? Object.values(CHANNELS_MAP)[c] : CHANNELS_MAP[c];\n    const imageOffset = offset + map.offset;\n    const imageData = getImageData(parsedImage);\n    if (imageData.data.length <= imageOffset) {\n      throw new Error(`${imageData.data.length} <= ${imageOffset}`);\n    }\n    const imageValue = imageData.data[imageOffset];\n    value |= imageValue << map.shift;\n  }\n  return value;\n}\n\n/**\n * Retrieves the offset in the image where the data are stored.\n * @param u - u-coordinate.\n * @param v - v-coordinate.\n * @param parsedImage - Image where the data are stored.\n * @param componentsCount - Number of components the data consists of.\n * @returns Offset in the image where the data are stored.\n */\nfunction coordinatesToOffset(\n  u: number,\n  v: number,\n  parsedImage: any,\n  componentsCount: number = 1\n): number {\n  const w = parsedImage.width;\n  const iX = emod(u) * (w - 1);\n  const indX = Math.round(iX);\n\n  const h = parsedImage.height;\n  const iY = emod(v) * (h - 1);\n  const indY = Math.round(iY);\n  const components = parsedImage.components ? parsedImage.components : componentsCount;\n  // components is a number of channels in the image\n  const offset = (indY * w + indX) * components;\n  return offset;\n}\n\n/**\n * Parses variable-length array data.\n * In this case every value of the property in the table will be an array\n * of arbitrary length.\n * @param valuesData - Values in a flat typed array.\n * @param numberOfElements - Number of rows in the property table.\n * @param arrayOffsets - Offsets of nested arrays in the flat values array.\n * @param valuesDataBytesLength - Data byte length.\n * @param valueSize - Value size in bytes.\n * @returns Array of typed arrays.\n */\nexport function parseVariableLengthArrayNumeric(\n  valuesData: BigTypedArray,\n  numberOfElements: number,\n  arrayOffsets: TypedArray,\n  valuesDataBytesLength: number,\n  valueSize: number\n): BigTypedArray[] {\n  const attributeValueArray: BigTypedArray[] = [];\n  for (let index = 0; index < numberOfElements; index++) {\n    const arrayOffset = arrayOffsets[index];\n    const arrayByteSize = arrayOffsets[index + 1] - arrayOffsets[index];\n    if (arrayByteSize + arrayOffset > valuesDataBytesLength) {\n      break;\n    }\n    const typedArrayOffset = arrayOffset / valueSize;\n    const elementCount = arrayByteSize / valueSize;\n    attributeValueArray.push(valuesData.slice(typedArrayOffset, typedArrayOffset + elementCount));\n  }\n  return attributeValueArray;\n}\n\n/**\n * Parses fixed-length array data.\n * In this case every value of the property in the table will be an array\n * of constant length equal to `arrayCount`.\n * @param valuesData - Values in a flat typed array.\n * @param numberOfElements - Number of rows in the property table.\n * @param arrayCount - Nested arrays length.\n * @returns Array of typed arrays.\n */\nexport function parseFixedLengthArrayNumeric(\n  valuesData: BigTypedArray,\n  numberOfElements: number,\n  arrayCount: number\n): BigTypedArray[] {\n  const attributeValueArray: BigTypedArray[] = [];\n  for (let index = 0; index < numberOfElements; index++) {\n    const elementOffset = index * arrayCount;\n    attributeValueArray.push(valuesData.slice(elementOffset, elementOffset + arrayCount));\n  }\n  return attributeValueArray;\n}\n\n/**\n * Decodes properties of string type from binary source.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param valuesDataBytes - Data taken from values property of the property table property.\n * @param arrayOffsets - Offsets for variable-length arrays. It's null for fixed-length arrays or scalar types.\n * @param stringOffsets - Index of the buffer view containing offsets for strings. It should be available for string type.\n * @returns String property values\n */\nexport function getPropertyDataString(\n  numberOfElements: number,\n  valuesDataBytes: Uint8Array,\n  arrayOffsets: TypedArray | null,\n  stringOffsets: TypedArray | null\n): string[] | string[][] {\n  if (arrayOffsets) {\n    // TODO: implement it as soon as we have the corresponding tileset\n    throw new Error('Not implemented - arrayOffsets for strings is specified');\n  }\n\n  if (stringOffsets) {\n    const stringsArray: string[] = [];\n    const textDecoder = new TextDecoder('utf8');\n\n    let stringOffset = 0;\n    for (let index = 0; index < numberOfElements; index++) {\n      const stringByteSize = stringOffsets[index + 1] - stringOffsets[index];\n\n      if (stringByteSize + stringOffset <= valuesDataBytes.length) {\n        const stringData = valuesDataBytes.subarray(stringOffset, stringByteSize + stringOffset);\n        const stringAttribute = textDecoder.decode(stringData);\n\n        stringsArray.push(stringAttribute);\n        stringOffset += stringByteSize;\n      }\n    }\n\n    return stringsArray;\n  }\n  return [];\n}\n", "// GLTF EXTENSION: EXT_mesh_features\n// https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features\n/* eslint-disable camelcase */\nimport type {NumericArray} from '@loaders.gl/loader-utils';\nimport type {GLTF, GLTFMeshPrimitive} from '../types/gltf-json-schema';\nimport {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFWriterOptions} from '../../gltf-writer';\nimport type {\n  GLTF_EXT_mesh_features,\n  GLTF_EXT_mesh_features_featureId\n} from '../types/gltf-ext-mesh-features-schema';\n\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {getPrimitiveTextureData} from './utils/3d-tiles-utils';\nimport {getComponentTypeFromArray} from '../gltf-utils/gltf-utils';\n\nconst EXT_MESH_FEATURES_NAME = 'EXT_mesh_features';\nexport const name = EXT_MESH_FEATURES_NAME;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions): Promise<void> {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  decodeExtMeshFeatures(scenegraph, options);\n}\n\nexport function encode(gltfData: {json: GLTF}, options: GLTFWriterOptions): {json: GLTF} {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  encodeExtMeshFeatures(scenegraph, options);\n  scenegraph.createBinaryChunk();\n  return scenegraph.gltf;\n}\n\n/**\n * Decodes feature metadata from extension.\n * @param {GLTFScenegraph} scenegraph - Instance of the class for structured access to GLTF data.\n * @param {GLTFLoaderOptions} options - GLTFLoader options.\n */\nfunction decodeExtMeshFeatures(scenegraph: GLTFScenegraph, options: GLTFLoaderOptions): void {\n  const json = scenegraph.gltf.json;\n  if (!json.meshes) {\n    return;\n  }\n\n  // Iterate through all meshes/primitives.\n  for (const mesh of json.meshes) {\n    for (const primitive of mesh.primitives) {\n      processMeshPrimitiveFeatures(scenegraph, primitive, options);\n    }\n  }\n}\n\n/**\n * Takes data from EXT_mesh_features and store it in 'data' property of featureIds.\n * If combined with EXT_structural_metadata, corresponding data are taken from the property tables of that extension.\n * @param {GLTFScenegraph} scenegraph - Instance of the class for structured access to GLTF data.\n * @param {GLTFMeshPrimitive} primitive - Primitive that contains extensions.\n * @param {GLTFLoaderOptions} options - GLTFLoader options.\n */\nfunction processMeshPrimitiveFeatures(\n  scenegraph: GLTFScenegraph,\n  primitive: GLTFMeshPrimitive,\n  options: GLTFLoaderOptions\n): void {\n  // Processing of mesh primitive features requires buffers to be loaded.\n  if (!options?.gltf?.loadBuffers) {\n    return;\n  }\n\n  const extension = primitive.extensions?.[EXT_MESH_FEATURES_NAME] as GLTF_EXT_mesh_features;\n  const featureIds: GLTF_EXT_mesh_features_featureId[] = extension?.featureIds;\n\n  if (!featureIds) {\n    return;\n  }\n\n  for (const featureId of featureIds) {\n    let featureIdData: NumericArray;\n    // Process \"Feature ID by Vertex\"\n    if (typeof featureId.attribute !== 'undefined') {\n      const accessorKey = `_FEATURE_ID_${featureId.attribute}`;\n      const accessorIndex = primitive.attributes[accessorKey];\n      featureIdData = scenegraph.getTypedArrayForAccessor(accessorIndex);\n    }\n\n    // Process \"Feature ID by Texture Coordinates\"\n    else if (typeof featureId.texture !== 'undefined' && options?.gltf?.loadImages) {\n      featureIdData = getPrimitiveTextureData(scenegraph, featureId.texture, primitive);\n    }\n\n    // Process \"Feature ID by Index\"\n    else {\n      /*\n      When both featureId.attribute and featureId.texture are undefined,\n      then the feature ID value for each vertex is given implicitly, via the index of the vertex.\n      In this case, the featureCount must match the number of vertices of the mesh primitive.\n      */\n      // TODO: At the moment of writing we don't have a tileset with the data of that kind. Implement it later.\n      featureIdData = [];\n    }\n\n    featureId.data = featureIdData;\n  }\n}\n\n/*\n  Encoding data\n*/\n\nfunction encodeExtMeshFeatures(scenegraph: GLTFScenegraph, options: GLTFWriterOptions) {\n  const meshes = scenegraph.gltf.json.meshes;\n  if (!meshes) {\n    return;\n  }\n\n  // Iterate through all meshes/primitives.\n  for (const mesh of meshes) {\n    for (const primitive of mesh.primitives) {\n      encodeExtMeshFeaturesForPrimitive(scenegraph, primitive);\n    }\n  }\n}\n\n/**\n * Creates ExtMeshFeatures, creates a featureId containing feature ids provided.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param primitive - target primitive instance that will contain the extension\n * @param featureIdArray - Array of feature id\n * @param propertyTableIndex - index of the property table created by the ExtStructuralMetadata (optional).\n */\nexport function createExtMeshFeatures(\n  scenegraph: GLTFScenegraph,\n  primitive: GLTFMeshPrimitive,\n  featureIdArray: NumericArray,\n  propertyTableIndex?: number\n) {\n  if (!primitive.extensions) {\n    primitive.extensions = {};\n  }\n  let extension = primitive.extensions[EXT_MESH_FEATURES_NAME] as GLTF_EXT_mesh_features;\n  if (!extension) {\n    extension = {featureIds: []};\n    primitive.extensions[EXT_MESH_FEATURES_NAME] = extension;\n  }\n\n  const {featureIds} = extension;\n  const featureId: GLTF_EXT_mesh_features_featureId = {\n    featureCount: featureIdArray.length,\n    propertyTable: propertyTableIndex,\n    data: featureIdArray\n  };\n  featureIds.push(featureId);\n\n  scenegraph.addObjectExtension(primitive, EXT_MESH_FEATURES_NAME, extension);\n}\n\n/**\n * Encodes a feature ID set to extension.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param primitive - Primitive that the data encoded belongs to.\n * @see https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features\n */\nfunction encodeExtMeshFeaturesForPrimitive(\n  scenegraph: GLTFScenegraph,\n  primitive: GLTFMeshPrimitive\n) {\n  const extension = primitive.extensions?.[EXT_MESH_FEATURES_NAME] as GLTF_EXT_mesh_features;\n  if (!extension) {\n    return;\n  }\n  const featureIds: GLTF_EXT_mesh_features_featureId[] = extension.featureIds;\n  featureIds.forEach((featureId, elementIndex) => {\n    if (featureId.data) {\n      const {accessorKey, index} = createAccessorKey(primitive.attributes);\n      const typedArray = new Uint32Array(featureId.data as NumericArray);\n\n      // Clean up featureId object.\n      // Everything that could come from the original extension in case of round-trip decode/encode operations should be deleted.\n      // We need make sure the featureId object is clean.\n      featureIds[elementIndex] = {\n        featureCount: typedArray.length,\n        propertyTable: featureId.propertyTable,\n        attribute: index\n      };\n\n      scenegraph.gltf.buffers.push({\n        arrayBuffer: typedArray.buffer,\n        byteOffset: typedArray.byteOffset,\n        byteLength: typedArray.byteLength\n      });\n\n      const bufferViewIndex = scenegraph.addBufferView(typedArray);\n      const accessorIndex = scenegraph.addAccessor(bufferViewIndex, {\n        size: 1,\n        componentType: getComponentTypeFromArray(typedArray),\n        count: typedArray.length\n      });\n      primitive.attributes[accessorKey] = accessorIndex;\n    }\n  });\n}\n\n/**\n * Creates an accessor key for the attribute array provided.\n * The generated key has a suffix (number) that is the next consequtive in the list of existing accessors.\n * @param attributes - attribute array\n * @returns accessor key and the key suffix (number) used in the key.\n */\nfunction createAccessorKey(attributes: {[k: string]: number}) {\n  const prefix = '_FEATURE_ID_';\n  // Search for all \"_FEATURE_ID_n\" attribures in the primitive provided if any.\n  // If there are some, e.g. \"_FEATURE_ID_0\", \"_FEATURE_ID_1\",\n  // we will add a new one with the name \"_FEATURE_ID_2\"\n  const attrs = Object.keys(attributes).filter((item) => item.indexOf(prefix) === 0);\n  let max = -1;\n  for (const a of attrs) {\n    const n = Number(a.substring(prefix.length));\n    if (n > max) {\n      max = n;\n    }\n  }\n  max++;\n  const accessorKey = `${prefix}${max}`;\n  return {accessorKey, index: max};\n}\n", "// GLTF EXTENSION: EXT_structural_metadata\n// https://github.com/CesiumGS/glTF/blob/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata\n/* eslint-disable camelcase */\nimport type {BigTypedArray, TypedArray} from '@loaders.gl/schema';\nimport type {GLTF, GLTFTextureInfoMetadata, GLTFMeshPrimitive} from '../types/gltf-json-schema';\nimport type {\n  GLTF_EXT_structural_metadata_Schema,\n  GLTF_EXT_structural_metadata_ClassProperty,\n  GLTF_EXT_structural_metadata_Enum,\n  GLTF_EXT_structural_metadata_EnumValue,\n  GLTF_EXT_structural_metadata_PropertyTable,\n  GLTF_EXT_structural_metadata_GLTF,\n  GLTF_EXT_structural_metadata_PropertyTexture,\n  GLTF_EXT_structural_metadata_PropertyTable_Property,\n  GLTF_EXT_structural_metadata_Primitive,\n  GLTF_EXT_structural_metadata_Class\n} from '../types/gltf-ext-structural-metadata-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFWriterOptions} from '../../gltf-writer';\n\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {\n  convertRawBufferToMetadataArray,\n  getPrimitiveTextureData,\n  primitivePropertyDataToAttributes,\n  getArrayElementByteSize,\n  NumericComponentType,\n  getOffsetsForProperty,\n  parseVariableLengthArrayNumeric,\n  parseFixedLengthArrayNumeric,\n  getPropertyDataString\n} from './utils/3d-tiles-utils';\nimport {ensureArrayBuffer} from '@loaders.gl/loader-utils';\n\nconst EXT_STRUCTURAL_METADATA_NAME = 'EXT_structural_metadata';\nexport const name = EXT_STRUCTURAL_METADATA_NAME;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions): Promise<void> {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  decodeExtStructuralMetadata(scenegraph, options);\n}\n\nexport function encode(gltfData: {json: GLTF}, options: GLTFWriterOptions) {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  encodeExtStructuralMetadata(scenegraph, options);\n  scenegraph.createBinaryChunk();\n  return scenegraph.gltf;\n}\n\n/*\n// Example of the extension.\n// See more info at https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata\nconst extensions = {\n  \"extensions\": {\n    \"EXT_structural_metadata\": {\n      \"schema\": {\n        \"classes\": {\n          \"tree\": {\n            \"name\": \"Tree\",\n            \"description\": \"Woody, perennial plant.\",\n            \"properties\": {\n              \"species\": {\n                \"description\": \"Type of tree.\",\n                \"type\": \"ENUM\",\n                \"enumType\": \"speciesEnum\",\n                \"required\": true\n              },\n              \"age\": {\n                \"description\": \"The age of the tree, in years\",\n                \"type\": \"SCALAR\",\n                \"componentType\": \"UINT8\",\n                \"required\": true\n              }\n            }\n          }\n        },\n        \"enums\": {\n          \"speciesEnum\": {\n            \"name\": \"Species\",\n            \"description\": \"An example enum for tree species.\",\n            // valueType is not defined here. Default is \"UINT16\"\n            \"values\": [\n              { \"name\": \"Unspecified\", \"value\": 0 },\n              { \"name\": \"Oak\", \"value\": 1 }\n            ]\n          }\n        }\n      },\n      \"propertyTables\": [{\n        \"name\": \"tree_survey_2021-09-29\",\n        \"class\": \"tree\",\n        \"count\": 10,  // The number of elements in each property array (in `species`, in `age`).\n        \"properties\": {\n          \"species\": {\n            \"values\": 0, // It's an index of the buffer view containing property values.\n          },\n          \"age\": {\n            \"values\": 1\n          }\n        }\n      }]\n    }\n  }\n}\n*/\n\n/**\n * Decodes feature metadata from extension.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param options - GLTFLoader options.\n */\nfunction decodeExtStructuralMetadata(scenegraph: GLTFScenegraph, options: GLTFLoaderOptions): void {\n  // Decoding metadata involves buffers processing.\n  // So, if buffers have not been loaded, there is no reason to process metadata.\n  if (!options.gltf?.loadBuffers) {\n    return;\n  }\n  const extension: GLTF_EXT_structural_metadata_GLTF | null = scenegraph.getExtension(\n    EXT_STRUCTURAL_METADATA_NAME\n  );\n  if (!extension) {\n    return;\n  }\n\n  if (options.gltf?.loadImages) {\n    decodePropertyTextures(scenegraph, extension);\n  }\n\n  decodePropertyTables(scenegraph, extension);\n}\n\n/**\n * Processes the data stored in the textures\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param extension - Top-level extension.\n */\nfunction decodePropertyTextures(\n  scenegraph: GLTFScenegraph,\n  extension: GLTF_EXT_structural_metadata_GLTF\n): void {\n  const propertyTextures = extension.propertyTextures;\n  const json = scenegraph.gltf.json;\n  if (propertyTextures && json.meshes) {\n    // Iterate through all meshes/primitives.\n    for (const mesh of json.meshes) {\n      for (const primitive of mesh.primitives) {\n        processPrimitivePropertyTextures(scenegraph, propertyTextures, primitive, extension);\n      }\n    }\n  }\n}\n\n/**\n * Processes the data stored in the property tables.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param extension - Top-level extension.\n */\nfunction decodePropertyTables(\n  scenegraph: GLTFScenegraph,\n  extension: GLTF_EXT_structural_metadata_GLTF\n): void {\n  const schema = extension.schema;\n  if (!schema) {\n    return;\n  }\n  const schemaClasses = schema.classes;\n  const propertyTables = extension.propertyTables;\n  if (schemaClasses && propertyTables) {\n    for (const schemaName in schemaClasses) {\n      const propertyTable = findPropertyTableByClass(propertyTables, schemaName);\n      if (propertyTable) {\n        processPropertyTable(scenegraph, schema, propertyTable);\n      }\n    }\n  }\n}\n\n/**\n * Finds the property table by class name.\n * @param propertyTables - propertyTable definition taken from the top-level extension.\n * @param schemaClassName - class name in the extension schema.\n */\nfunction findPropertyTableByClass(\n  propertyTables: GLTF_EXT_structural_metadata_PropertyTable[],\n  schemaClassName: string\n): GLTF_EXT_structural_metadata_PropertyTable | null {\n  for (const propertyTable of propertyTables) {\n    if (propertyTable.class === schemaClassName) {\n      return propertyTable;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Takes data from property textures reffered by the primitive.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param propertyTextures - propertyTexture definition taken from the top-level extention.\n * @param primitive - Primitive object.\n * @param extension - Top-level extension.\n */\nfunction processPrimitivePropertyTextures(\n  scenegraph: GLTFScenegraph,\n  propertyTextures: GLTF_EXT_structural_metadata_PropertyTexture[],\n  primitive: GLTFMeshPrimitive,\n  extension: GLTF_EXT_structural_metadata_GLTF\n): void {\n  if (!propertyTextures) {\n    return;\n  }\n  const primitiveExtension: GLTF_EXT_structural_metadata_Primitive = primitive.extensions?.[\n    EXT_STRUCTURAL_METADATA_NAME\n  ] as GLTF_EXT_structural_metadata_Primitive;\n  const primitivePropertyTextureIndices = primitiveExtension?.propertyTextures;\n  if (!primitivePropertyTextureIndices) {\n    return;\n  }\n\n  for (const primitivePropertyTextureIndex of primitivePropertyTextureIndices) {\n    const propertyTexture = propertyTextures[primitivePropertyTextureIndex];\n    processPrimitivePropertyTexture(scenegraph, propertyTexture, primitive, extension);\n  }\n}\n\n/**\n * Takes property data from the texture pointed by the primitive and appends them to `exension.data`.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param propertyTexture - propertyTexture definition taken from the top-level extension.\n * @param primitive - Primitive object.\n * @param extension - Top-level extension.\n */\nfunction processPrimitivePropertyTexture(\n  scenegraph: GLTFScenegraph,\n  propertyTexture: GLTF_EXT_structural_metadata_PropertyTexture,\n  primitive: GLTFMeshPrimitive,\n  extension: GLTF_EXT_structural_metadata_GLTF\n): void {\n  if (!propertyTexture.properties) {\n    return;\n  }\n\n  if (!extension.dataAttributeNames) {\n    extension.dataAttributeNames = [];\n  }\n\n  /* Iterate through all properties defined in propertyTexture, e.g. \"speed\" and \"direction\":\n    {\n      \"class\": \"wind\",\n      \"properties\": {\n        \"speed\": {\n          \"index\": 0,\n          \"texCoord\": 0,\n          \"channels\": [0]\n        },\n        \"direction\": {\n          \"index\": 0,\n          \"texCoord\": 0,\n          \"channels\": [1, 2]\n        }\n      }\n    }\n  */\n  const className = propertyTexture.class;\n  for (const propertyName in propertyTexture.properties) {\n    // propertyName has values like \"speed\", \"direction\"\n    // Make attributeName as a combination of the class name and the propertyName like \"wind_speed\" or \"wind_direction\"\n    const attributeName = `${className}_${propertyName}`;\n    const textureInfoTopLevel: GLTFTextureInfoMetadata | undefined =\n      propertyTexture.properties?.[propertyName];\n    if (!textureInfoTopLevel) {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n\n    // The data taken from all meshes/primitives (the same property, e.g. \"speed\" or \"direction\") will be combined into one array and saved in textureInfoTopLevel.data\n    // Initially textureInfoTopLevel.data will be initialized with an empty array.\n    if (!textureInfoTopLevel.data) {\n      textureInfoTopLevel.data = [];\n    }\n    const featureTextureTable: number[] = textureInfoTopLevel.data as number[];\n\n    const propertyData: number[] | null = getPrimitiveTextureData(\n      scenegraph,\n      textureInfoTopLevel,\n      primitive\n    );\n    if (propertyData === null) {\n      // eslint-disable-next-line no-continue\n      continue;\n    }\n    primitivePropertyDataToAttributes(\n      scenegraph,\n      attributeName,\n      propertyData,\n      featureTextureTable,\n      primitive\n    );\n    textureInfoTopLevel.data = featureTextureTable;\n    extension.dataAttributeNames.push(attributeName);\n  }\n}\n\n/**\n * Navigates through all properies in the property table, gets properties data,\n * and put the data to `propertyTable.data` as an array.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param schema - schema object.\n * @param propertyTable - propertyTable definition taken from the top-level extension.\n */\nfunction processPropertyTable(\n  scenegraph: GLTFScenegraph,\n  schema: GLTF_EXT_structural_metadata_Schema,\n  propertyTable: GLTF_EXT_structural_metadata_PropertyTable\n): void {\n  const schemaClass = schema.classes?.[propertyTable.class];\n  if (!schemaClass) {\n    throw new Error(\n      `Incorrect data in the EXT_structural_metadata extension: no schema class with name ${propertyTable.class}`\n    );\n  }\n\n  const numberOfElements = propertyTable.count; // `propertyTable.count` is a number of elements in each property array.\n\n  for (const propertyName in schemaClass.properties) {\n    const classProperty = schemaClass.properties[propertyName];\n    const propertyTableProperty: GLTF_EXT_structural_metadata_PropertyTable_Property | undefined =\n      propertyTable.properties?.[propertyName];\n\n    if (propertyTableProperty) {\n      // Getting all elements (`numberOfElements`) of the array in the `propertyTableProperty`\n      const data = getPropertyDataFromBinarySource(\n        scenegraph,\n        schema,\n        classProperty,\n        numberOfElements,\n        propertyTableProperty\n      );\n      propertyTableProperty.data = data;\n    }\n  }\n}\n\n/**\n * Decodes a propertyTable column from binary source based on property type.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param schema - Schema object.\n * @param classProperty - class property object.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param propertyTableProperty - propertyTable's property metadata.\n * @returns {string[] | number[] | string[][] | number[][]}\n */\nfunction getPropertyDataFromBinarySource(\n  scenegraph: GLTFScenegraph,\n  schema: GLTF_EXT_structural_metadata_Schema,\n  classProperty: GLTF_EXT_structural_metadata_ClassProperty,\n  numberOfElements: number,\n  propertyTableProperty: GLTF_EXT_structural_metadata_PropertyTable_Property\n): string[] | BigTypedArray | string[][] | BigTypedArray[] {\n  let data: string[] | BigTypedArray | string[][] | BigTypedArray[] = [];\n  const valuesBufferView = propertyTableProperty.values;\n  const valuesDataBytes: Uint8Array = scenegraph.getTypedArrayForBufferView(valuesBufferView);\n\n  const arrayOffsets = getArrayOffsetsForProperty(\n    scenegraph,\n    classProperty,\n    propertyTableProperty,\n    numberOfElements\n  );\n  const stringOffsets = getStringOffsetsForProperty(\n    scenegraph,\n    propertyTableProperty,\n    numberOfElements\n  );\n\n  switch (classProperty.type) {\n    case 'SCALAR':\n    case 'VEC2':\n    case 'VEC3':\n    case 'VEC4':\n    case 'MAT2':\n    case 'MAT3':\n    case 'MAT4': {\n      data = getPropertyDataNumeric(classProperty, numberOfElements, valuesDataBytes, arrayOffsets);\n      break;\n    }\n    case 'BOOLEAN': {\n      // TODO: implement it as soon as we have the corresponding tileset\n      throw new Error(`Not implemented - classProperty.type=${classProperty.type}`);\n    }\n    case 'STRING': {\n      data = getPropertyDataString(numberOfElements, valuesDataBytes, arrayOffsets, stringOffsets);\n      break;\n    }\n    case 'ENUM': {\n      data = getPropertyDataENUM(\n        schema,\n        classProperty,\n        numberOfElements,\n        valuesDataBytes,\n        arrayOffsets\n      );\n      break;\n    }\n    default:\n      throw new Error(`Unknown classProperty type ${classProperty.type}`);\n  }\n\n  return data;\n}\n\n/**\n * Parses propertyTable.property.arrayOffsets that are offsets of sub-arrays in a flatten array of values.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param classProperty - class property object.\n * @param propertyTableProperty - propertyTable's property metadata.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @returns Typed array with offset values.\n * @see https://github.com/CesiumGS/glTF/blob/2976f1183343a47a29e4059a70961371cd2fcee8/extensions/2.0/Vendor/EXT_structural_metadata/schema/propertyTable.property.schema.json#L21\n */\nfunction getArrayOffsetsForProperty(\n  scenegraph: GLTFScenegraph,\n  classProperty: GLTF_EXT_structural_metadata_ClassProperty,\n  propertyTableProperty: GLTF_EXT_structural_metadata_PropertyTable_Property,\n  numberOfElements: number\n): TypedArray | null {\n  if (\n    classProperty.array &&\n    // `count` is a number of array elements. May only be defined when `array` is true.\n    // If `count` is NOT defined, it's a VARIABLE-length array\n    typeof classProperty.count === 'undefined' &&\n    // `arrayOffsets` is an index of the buffer view containing offsets for variable-length arrays.\n    typeof propertyTableProperty.arrayOffsets !== 'undefined'\n  ) {\n    // Data are in a VARIABLE-length array\n    return getOffsetsForProperty(\n      scenegraph,\n      propertyTableProperty.arrayOffsets,\n      propertyTableProperty.arrayOffsetType || 'UINT32',\n      numberOfElements\n    );\n  }\n  return null;\n}\n\n/**\n * Parses propertyTable.property.stringOffsets.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param propertyTableProperty - propertyTable's property metadata.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @returns Typed array with offset values.\n * @see https://github.com/CesiumGS/glTF/blob/2976f1183343a47a29e4059a70961371cd2fcee8/extensions/2.0/Vendor/EXT_structural_metadata/schema/propertyTable.property.schema.json#L29C10-L29C23\n */\nfunction getStringOffsetsForProperty(\n  scenegraph: GLTFScenegraph,\n  propertyTableProperty: GLTF_EXT_structural_metadata_PropertyTable_Property,\n  numberOfElements: number\n): TypedArray | null {\n  if (\n    typeof propertyTableProperty.stringOffsets !== 'undefined' // `stringOffsets` is an index of the buffer view containing offsets for strings.\n  ) {\n    // Data are in a FIXED-length array\n    return getOffsetsForProperty(\n      scenegraph,\n      propertyTableProperty.stringOffsets,\n      propertyTableProperty.stringOffsetType || 'UINT32',\n      numberOfElements\n    );\n  }\n  return null;\n}\n\n/**\n * Decodes properties of SCALAR, VEC-N, MAT-N types from binary sourse.\n * @param classProperty - class property object.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param valuesDataBytes - Data taken from values property of the property table property.\n * @param arrayOffsets - Offsets for variable-length arrays. It's null for fixed-length arrays or scalar types.\n * @returns Property values in a typed array or in an array of typed arrays.\n */\nfunction getPropertyDataNumeric(\n  classProperty: GLTF_EXT_structural_metadata_ClassProperty,\n  numberOfElements: number,\n  valuesDataBytes: Uint8Array,\n  arrayOffsets: TypedArray | null\n): BigTypedArray | BigTypedArray[] {\n  const isArray = classProperty.array;\n  const arrayCount = classProperty.count;\n\n  const elementSize = getArrayElementByteSize(classProperty.type, classProperty.componentType);\n  const elementCount = valuesDataBytes.byteLength / elementSize;\n\n  let valuesData: BigTypedArray;\n  if (classProperty.componentType) {\n    valuesData = convertRawBufferToMetadataArray(\n      valuesDataBytes,\n      classProperty.type,\n      // The datatype of the element's components. Only applicable to `SCALAR`, `VECN`, and `MATN` types.\n      classProperty.componentType as NumericComponentType,\n      elementCount\n    );\n  } else {\n    // The spec doesn't provide any info what to do if componentType is not set.\n    valuesData = valuesDataBytes;\n  }\n\n  if (isArray) {\n    if (arrayOffsets) {\n      // VARIABLE-length array\n      return parseVariableLengthArrayNumeric(\n        valuesData,\n        numberOfElements,\n        arrayOffsets,\n        valuesDataBytes.length,\n        elementSize\n      );\n    }\n    if (arrayCount) {\n      // FIXED-length array\n      return parseFixedLengthArrayNumeric(valuesData, numberOfElements, arrayCount);\n    }\n    return [];\n  }\n\n  return valuesData;\n}\n\n/**\n * Decodes properties of enum type from binary source.\n * @param schema - Schema object.\n * @param classProperty - Class property object.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param valuesDataBytes - Data taken from values property of the property table property.\n * @param arrayOffsets - Offsets for variable-length arrays. It's null for fixed-length arrays or scalar types.\n * @returns Strings array of nested strings array.\n */\nfunction getPropertyDataENUM(\n  schema: GLTF_EXT_structural_metadata_Schema,\n  classProperty: GLTF_EXT_structural_metadata_ClassProperty,\n  numberOfElements: number,\n  valuesDataBytes: Uint8Array,\n  arrayOffsets: TypedArray | null\n): string[] | string[][] {\n  const enumType = classProperty.enumType;\n  // Enum ID as declared in the `enums` dictionary. Required when `type` is `ENUM`.\n  if (!enumType) {\n    throw new Error(\n      'Incorrect data in the EXT_structural_metadata extension: classProperty.enumType is not set for type ENUM'\n    );\n  }\n\n  const enumEntry: GLTF_EXT_structural_metadata_Enum | undefined = schema.enums?.[enumType];\n  if (!enumEntry) {\n    throw new Error(\n      `Incorrect data in the EXT_structural_metadata extension: schema.enums does't contain ${enumType}`\n    );\n  }\n\n  const enumValueType = enumEntry.valueType || 'UINT16';\n  const elementSize = getArrayElementByteSize(classProperty.type, enumValueType);\n  const elementCount = valuesDataBytes.byteLength / elementSize;\n  let valuesData: BigTypedArray | null = convertRawBufferToMetadataArray(\n    valuesDataBytes,\n    classProperty.type,\n    enumValueType,\n    elementCount\n  );\n  if (!valuesData) {\n    valuesData = valuesDataBytes;\n  }\n\n  if (classProperty.array) {\n    if (arrayOffsets) {\n      // VARIABLE-length array\n      return parseVariableLengthArrayENUM({\n        valuesData,\n        numberOfElements,\n        arrayOffsets,\n        valuesDataBytesLength: valuesDataBytes.length,\n        elementSize,\n        enumEntry\n      });\n    }\n\n    const arrayCount = classProperty.count;\n    if (arrayCount) {\n      // FIXED-length array\n      return parseFixedLengthArrayENUM(valuesData, numberOfElements, arrayCount, enumEntry);\n    }\n    return [];\n  }\n\n  // Single value (not an array)\n  return getEnumsArray(valuesData, 0, numberOfElements, enumEntry);\n}\n\n/**\n * Parses variable length nested ENUM arrays.\n * @param params.valuesData - Values in a flat typed array.\n * @param params.numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param params.arrayOffsets - Offsets for variable-length arrays. It's null for fixed-length arrays or scalar types.\n * @param params.valuesDataBytesLength - Byte length of values array.\n * @param params.elementSize - Single element byte size.\n * @param params.enumEntry - Enums dictionary.\n * @returns Nested strings array.\n */\nfunction parseVariableLengthArrayENUM(params: {\n  valuesData: BigTypedArray;\n  numberOfElements: number;\n  arrayOffsets: TypedArray;\n  valuesDataBytesLength: number;\n  elementSize: number;\n  enumEntry: GLTF_EXT_structural_metadata_Enum;\n}): string[][] {\n  const {\n    valuesData,\n    numberOfElements,\n    arrayOffsets,\n    valuesDataBytesLength,\n    elementSize,\n    enumEntry\n  } = params;\n  const attributeValueArray: string[][] = [];\n  for (let index = 0; index < numberOfElements; index++) {\n    const arrayOffset = arrayOffsets[index];\n    const arrayByteSize = arrayOffsets[index + 1] - arrayOffsets[index];\n    if (arrayByteSize + arrayOffset > valuesDataBytesLength) {\n      break;\n    }\n\n    const typedArrayOffset = arrayOffset / elementSize;\n    const elementCount = arrayByteSize / elementSize;\n    const array: string[] = getEnumsArray(valuesData, typedArrayOffset, elementCount, enumEntry);\n    attributeValueArray.push(array);\n  }\n  return attributeValueArray;\n}\n\n/**\n * Parses fixed length ENUM arrays.\n * @param valuesData - Values in a flat typed array.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param arrayCount - Nested arrays length.\n * @param enumEntry - Enums dictionary.\n * @returns Nested strings array.\n */\nfunction parseFixedLengthArrayENUM(\n  valuesData: BigTypedArray,\n  numberOfElements: number,\n  arrayCount: number,\n  enumEntry: GLTF_EXT_structural_metadata_Enum\n): string[][] {\n  const attributeValueArray: string[][] = [];\n  for (let index = 0; index < numberOfElements; index++) {\n    const elementOffset = arrayCount * index;\n    const array: string[] = getEnumsArray(valuesData, elementOffset, arrayCount, enumEntry);\n    attributeValueArray.push(array);\n  }\n  return attributeValueArray;\n}\n\n/**\n * Parses ENUM values into a string array.\n * @param valuesData - Values in a flat typed array.\n * @param offset - Offset to start parse from.\n * @param count - Values length to parse.\n * @param enumEntry - Enums dictionary.\n * @returns Array of strings with parsed ENUM names.\n */\nfunction getEnumsArray(\n  valuesData: BigTypedArray,\n  offset: number,\n  count: number,\n  enumEntry: GLTF_EXT_structural_metadata_Enum\n): string[] {\n  const array: string[] = [];\n  for (let i = 0; i < count; i++) {\n    // At the moment we don't support BigInt. It requires additional calculations logic\n    // and might be an issue in Safari\n    if (valuesData instanceof BigInt64Array || valuesData instanceof BigUint64Array) {\n      array.push('');\n    } else {\n      const value = valuesData[offset + i];\n\n      const enumObject = getEnumByValue(enumEntry, value);\n      if (enumObject) {\n        array.push(enumObject.name);\n      } else {\n        array.push('');\n      }\n    }\n  }\n  return array;\n}\n\n/**\n * Looks up ENUM whose `value` property matches the specified number in the parameter `value`.\n * @param {GLTF_EXT_structural_metadata_Enum} enumEntry - ENUM entry containing the array of possible enums.\n * @param {number} value - The value of the ENUM to locate.\n * @returns {GLTF_EXT_structural_metadata_EnumValue | null} ENUM matcihng the specified value or null of no ENUM object was found.\n */\nfunction getEnumByValue(\n  enumEntry: GLTF_EXT_structural_metadata_Enum,\n  value: number\n): GLTF_EXT_structural_metadata_EnumValue | null {\n  for (const enumValue of enumEntry.values) {\n    if (enumValue.value === value) {\n      return enumValue;\n    }\n  }\n\n  return null;\n}\n\n/*\n  Encoding data\n*/\n\nexport interface PropertyAttribute {\n  name: string;\n  elementType: string;\n  componentType?: string;\n  values: number[] | string[];\n}\n\nconst SCHEMA_CLASS_ID_DEFAULT = 'schemaClassId';\n\nfunction encodeExtStructuralMetadata(scenegraph: GLTFScenegraph, options: GLTFWriterOptions) {\n  const extension: GLTF_EXT_structural_metadata_GLTF | null = scenegraph.getExtension(\n    EXT_STRUCTURAL_METADATA_NAME\n  );\n  if (!extension) {\n    return;\n  }\n  if (extension.propertyTables) {\n    for (const table of extension.propertyTables) {\n      const classId = table.class;\n      const schemaClass = extension.schema?.classes?.[classId];\n      if (table.properties && schemaClass) {\n        encodeProperties(table, schemaClass, scenegraph);\n      }\n    }\n  }\n}\n\nfunction encodeProperties(\n  table: GLTF_EXT_structural_metadata_PropertyTable,\n  schemaClass: GLTF_EXT_structural_metadata_Class,\n  scenegraph: GLTFScenegraph\n) {\n  for (const propertyName in table.properties) {\n    const data = table.properties[propertyName].data;\n    if (data) {\n      const classProperty = schemaClass.properties[propertyName];\n      if (classProperty) {\n        const tableProperty = createPropertyTableProperty(\n          data as number[] | string[],\n          classProperty,\n          scenegraph\n        );\n        // Override table property that came with \"data\"\n        table.properties[propertyName] = tableProperty;\n      }\n    }\n  }\n}\n\n/**\n * Creates ExtStructuralMetadata, creates the schema and creates a property table containing feature data provided.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param propertyAttributes - property attributes\n * @param classId - classId to use for encoding metadata.\n * @returns Index of the table created.\n */\nexport function createExtStructuralMetadata(\n  scenegraph: GLTFScenegraph,\n  propertyAttributes: PropertyAttribute[],\n  classId: string = SCHEMA_CLASS_ID_DEFAULT\n): number {\n  let extension: GLTF_EXT_structural_metadata_GLTF | null = scenegraph.getExtension(\n    EXT_STRUCTURAL_METADATA_NAME\n  );\n  if (!extension) {\n    extension = scenegraph.addExtension(EXT_STRUCTURAL_METADATA_NAME);\n  }\n\n  extension.schema = createSchema(propertyAttributes, classId, extension.schema);\n  const table = createPropertyTable(propertyAttributes, classId, extension.schema);\n  if (!extension.propertyTables) {\n    extension.propertyTables = [];\n  }\n\n  return extension.propertyTables.push(table) - 1; // index of the table\n}\n\nfunction createSchema(\n  propertyAttributes: PropertyAttribute[],\n  classId: string,\n  schemaToUpdate?: GLTF_EXT_structural_metadata_Schema\n): GLTF_EXT_structural_metadata_Schema {\n  const schema: GLTF_EXT_structural_metadata_Schema = schemaToUpdate ?? {\n    id: 'schema_id'\n  };\n  const schemaClass: GLTF_EXT_structural_metadata_Class = {\n    properties: {}\n  };\n  for (const attribute of propertyAttributes) {\n    const classProperty: GLTF_EXT_structural_metadata_ClassProperty = {\n      type: attribute.elementType,\n      componentType: attribute.componentType\n    };\n    schemaClass.properties[attribute.name] = classProperty;\n  }\n\n  schema.classes = {};\n  schema.classes[classId] = schemaClass;\n  return schema;\n}\n\nfunction createPropertyTable(\n  propertyAttributes: PropertyAttribute[],\n  classId: string,\n  schema: GLTF_EXT_structural_metadata_Schema\n): GLTF_EXT_structural_metadata_PropertyTable {\n  const table: GLTF_EXT_structural_metadata_PropertyTable = {\n    class: classId,\n    count: 0\n  };\n  // count is a number of rows in the table\n  let count = 0;\n  const schemaClass = schema.classes?.[classId];\n\n  for (const attribute of propertyAttributes) {\n    if (count === 0) {\n      count = attribute.values.length;\n    }\n\n    // The number of elements in all propertyAttributes must be the same\n    if (count !== attribute.values.length && attribute.values.length) {\n      throw new Error('Illegal values in attributes');\n    }\n\n    const classProperty = schemaClass?.properties[attribute.name];\n    if (classProperty) {\n      // const tableProperty = createPropertyTableProperty(attribute, classProperty, scenegraph);\n      if (!table.properties) {\n        table.properties = {};\n      }\n      // values is a required field. Its real value will be set while encoding data\n      table.properties[attribute.name] = {values: 0, data: attribute.values};\n    }\n  }\n\n  table.count = count;\n  return table;\n}\n\nfunction createPropertyTableProperty(\n  // attribute: PropertyAttribute,\n  values: number[] | string[],\n  classProperty: GLTF_EXT_structural_metadata_ClassProperty,\n  scenegraph: GLTFScenegraph\n): GLTF_EXT_structural_metadata_PropertyTable_Property {\n  const prop: GLTF_EXT_structural_metadata_PropertyTable_Property = {values: 0};\n\n  if (classProperty.type === 'STRING') {\n    const {stringData, stringOffsets} = createPropertyDataString(values as string[]);\n    prop.stringOffsets = createBufferView(stringOffsets, scenegraph);\n    prop.values = createBufferView(stringData, scenegraph);\n  } else if (classProperty.type === 'SCALAR' && classProperty.componentType) {\n    const data = createPropertyDataScalar(values as number[], classProperty.componentType);\n    prop.values = createBufferView(data, scenegraph);\n  }\n\n  return prop;\n}\n\nconst COMPONENT_TYPE_TO_ARRAY_CONSTRUCTOR = {\n  INT8: Int8Array,\n  UINT8: Uint8Array,\n  INT16: Int16Array,\n  UINT16: Uint16Array,\n  INT32: Int32Array,\n  UINT32: Uint32Array,\n  INT64: Int32Array,\n  UINT64: Uint32Array,\n  FLOAT32: Float32Array,\n  FLOAT64: Float64Array\n};\n\nfunction createPropertyDataScalar(array: number[], componentType: string): TypedArray {\n  const numberArray: number[] = [];\n  for (const value of array) {\n    numberArray.push(Number(value));\n  }\n  const Construct = COMPONENT_TYPE_TO_ARRAY_CONSTRUCTOR[componentType];\n  if (!Construct) {\n    throw new Error('Illegal component type');\n  }\n  return new Construct(numberArray);\n}\n\nfunction createPropertyDataString(strings: string[]): {\n  stringData: TypedArray;\n  stringOffsets: TypedArray;\n} {\n  const utf8Encode = new TextEncoder();\n  const arr: Uint8Array[] = [];\n  let len = 0;\n  for (const str of strings) {\n    const uint8Array = utf8Encode.encode(str);\n    len += uint8Array.length;\n    arr.push(uint8Array);\n  }\n  const strArray = new Uint8Array(len);\n  const strOffsets: number[] = [];\n  let offset = 0;\n  for (const str of arr) {\n    strArray.set(str, offset);\n    strOffsets.push(offset);\n    offset += str.length;\n  }\n  strOffsets.push(offset); // The last offset represents the byte offset after the last string.\n  const stringOffsetsTypedArray = new Uint32Array(strOffsets); // Its length = len+1\n  return {stringData: strArray, stringOffsets: stringOffsetsTypedArray};\n}\n\nfunction createBufferView(typedArray: TypedArray, scenegraph: GLTFScenegraph): number {\n  scenegraph.gltf.buffers.push({\n    arrayBuffer: ensureArrayBuffer(typedArray.buffer),\n    byteOffset: typedArray.byteOffset,\n    byteLength: typedArray.byteLength\n  });\n  return scenegraph.addBufferView(typedArray);\n}\n", "/* eslint-disable camelcase */\nimport type {GLTF, GLTFTextureInfoMetadata} from '../../types/gltf-json-schema';\nimport type {\n  GLTF_EXT_feature_metadata_Class,\n  GLTF_EXT_feature_metadata_ClassProperty,\n  GLTF_EXT_feature_metadata_FeatureTable,\n  GLTF_EXT_feature_metadata_FeatureTableProperty,\n  GLTF_EXT_feature_metadata_FeatureTexture,\n  GLTF_EXT_feature_metadata_GLTF,\n  GLTF_EXT_feature_metadata_TextureAccessor,\n  GLTF_EXT_feature_metadata_Schema\n} from '../../types/gltf-ext-feature-metadata-schema';\nimport type {BigTypedArray, TypedArray} from '@loaders.gl/schema';\nimport {GLTFScenegraph} from '../../api/gltf-scenegraph';\nimport {GLTFMeshPrimitive} from '../../types/gltf-json-schema';\nimport {GLTFLoaderOptions} from '../../../gltf-loader';\nimport {\n  convertRawBufferToMetadataArray,\n  getPrimitiveTextureData,\n  primitivePropertyDataToAttributes,\n  getArrayElementByteSize,\n  NumericComponentType,\n  getOffsetsForProperty,\n  parseVariableLengthArrayNumeric,\n  parseFixedLengthArrayNumeric,\n  getPropertyDataString\n} from '../utils/3d-tiles-utils';\n\n/** Extension name */\nconst EXT_FEATURE_METADATA_NAME = 'EXT_feature_metadata';\nexport const name = EXT_FEATURE_METADATA_NAME;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions): Promise<void> {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  decodeExtFeatureMetadata(scenegraph, options);\n}\n\n/**\n * Decodes feature metadata from extension.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param options - GLTFLoader options.\n */\nfunction decodeExtFeatureMetadata(scenegraph: GLTFScenegraph, options: GLTFLoaderOptions): void {\n  // Decoding metadata involves buffers processing.\n  // So, if buffers have not been loaded, there is no reason to process metadata.\n  if (!options.gltf?.loadBuffers) {\n    return;\n  }\n  const extension: GLTF_EXT_feature_metadata_GLTF | null =\n    scenegraph.getExtension(EXT_FEATURE_METADATA_NAME);\n  if (!extension) {\n    return;\n  }\n\n  if (options.gltf?.loadImages) {\n    decodePropertyTextures(scenegraph, extension);\n  }\n\n  decodePropertyTables(scenegraph, extension);\n}\n\n/**\n * Processes the data stored in the textures\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param extension - Top-level extension.\n */\nfunction decodePropertyTextures(\n  scenegraph: GLTFScenegraph,\n  extension: GLTF_EXT_feature_metadata_GLTF\n): void {\n  const schema = extension.schema;\n  if (!schema) {\n    return;\n  }\n  const schemaClasses = schema.classes;\n\n  const {featureTextures} = extension;\n  if (schemaClasses && featureTextures) {\n    for (const schemaName in schemaClasses) {\n      const schemaClass = schemaClasses[schemaName];\n      const featureTexture = findFeatureTextureByClass(featureTextures, schemaName);\n\n      if (featureTexture) {\n        handleFeatureTextureProperties(scenegraph, featureTexture, schemaClass);\n      }\n    }\n  }\n}\n\n/**\n * Processes the data stored in the property tables.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param extension - Top-level extension.\n */\nfunction decodePropertyTables(\n  scenegraph: GLTFScenegraph,\n  extension: GLTF_EXT_feature_metadata_GLTF\n): void {\n  const schema = extension.schema;\n  if (!schema) {\n    return;\n  }\n  const schemaClasses = schema.classes;\n  const propertyTables = extension.featureTables;\n  if (schemaClasses && propertyTables) {\n    for (const schemaName in schemaClasses) {\n      const propertyTable = findPropertyTableByClass(propertyTables, schemaName);\n      if (propertyTable) {\n        processPropertyTable(scenegraph, schema, propertyTable);\n      }\n    }\n  }\n}\n\n/**\n * Finds the property table by class name.\n * @param propertyTables - propertyTable definition taken from the top-level extension.\n * @param schemaClassName - class name in the extension schema.\n */\nfunction findPropertyTableByClass(\n  propertyTables: {[key: string]: GLTF_EXT_feature_metadata_FeatureTable},\n  schemaClassName: string\n): GLTF_EXT_feature_metadata_FeatureTable | null {\n  for (const propertyTableName in propertyTables) {\n    const propertyTable = propertyTables[propertyTableName];\n    if (propertyTable.class === schemaClassName) {\n      return propertyTable;\n    }\n  }\n\n  return null;\n}\n\nfunction findFeatureTextureByClass(\n  featureTextures: {[key: string]: GLTF_EXT_feature_metadata_FeatureTexture},\n  schemaClassName: string\n): GLTF_EXT_feature_metadata_FeatureTexture | null {\n  for (const featureTexturesName in featureTextures) {\n    const featureTable = featureTextures[featureTexturesName];\n\n    if (featureTable.class === schemaClassName) {\n      return featureTable;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Navigates through all properies in the property table, gets properties data,\n * and put the data to `propertyTable.data` as an array.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param schema - schema object.\n * @param propertyTable - propertyTable definition taken from the top-level extension.\n */\nfunction processPropertyTable(\n  scenegraph: GLTFScenegraph,\n  schema: GLTF_EXT_feature_metadata_Schema,\n  propertyTable: GLTF_EXT_feature_metadata_FeatureTable\n): void {\n  // Though 'class' is not required by spec, it doesn't make any scence when it's not provided.\n  // So, bale out here.\n  if (!propertyTable.class) {\n    return;\n  }\n\n  const schemaClass = schema.classes?.[propertyTable.class];\n  if (!schemaClass) {\n    throw new Error(\n      `Incorrect data in the EXT_structural_metadata extension: no schema class with name ${propertyTable.class}`\n    );\n  }\n\n  const numberOfElements = propertyTable.count; // `propertyTable.count` is a number of elements in each property array.\n\n  for (const propertyName in schemaClass.properties) {\n    const classProperty = schemaClass.properties[propertyName];\n    const propertyTableProperty: GLTF_EXT_feature_metadata_FeatureTableProperty | undefined =\n      propertyTable.properties?.[propertyName];\n\n    if (propertyTableProperty) {\n      // Getting all elements (`numberOfElements`) of the array in the `propertyTableProperty`\n      const data = getPropertyDataFromBinarySource(\n        scenegraph,\n        schema,\n        classProperty,\n        numberOfElements,\n        propertyTableProperty\n      );\n      propertyTableProperty.data = data;\n    }\n  }\n}\n\n/**\n * Navigates through all properies in feature texture and gets properties data.\n * Data will be stored in featureTexture.properties[propertyName].data.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param featureTexture\n * @param schemaClass\n */\nfunction handleFeatureTextureProperties(\n  scenegraph: GLTFScenegraph,\n  featureTexture: GLTF_EXT_feature_metadata_FeatureTexture,\n  schemaClass: GLTF_EXT_feature_metadata_Class\n): void {\n  const attributeName = featureTexture.class;\n\n  for (const propertyName in schemaClass.properties) {\n    const featureTextureProperty = featureTexture?.properties?.[propertyName];\n\n    if (featureTextureProperty) {\n      const data = getPropertyDataFromTexture(scenegraph, featureTextureProperty, attributeName);\n      featureTextureProperty.data = data;\n    }\n  }\n}\n\n/**\n * Decodes properties from binary sourse based on property type.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param schemaProperty\n * @param numberOfFeatures\n * @param featureTableProperty\n */\nfunction getPropertyDataFromBinarySource(\n  scenegraph: GLTFScenegraph,\n  schema: GLTF_EXT_feature_metadata_Schema,\n  classProperty: GLTF_EXT_feature_metadata_ClassProperty,\n  numberOfFeatures: number,\n  featureTableProperty: GLTF_EXT_feature_metadata_FeatureTableProperty\n): string[] | BigTypedArray | string[][] | BigTypedArray[] {\n  let data: string[] | BigTypedArray | string[][] | BigTypedArray[] = [];\n  const bufferView = featureTableProperty.bufferView;\n  const dataArray: Uint8Array = scenegraph.getTypedArrayForBufferView(bufferView);\n\n  const arrayOffsets = getArrayOffsetsForProperty(\n    scenegraph,\n    classProperty,\n    featureTableProperty,\n    numberOfFeatures\n  );\n  const stringOffsets = getStringOffsetsForProperty(\n    scenegraph,\n    classProperty,\n    featureTableProperty,\n    numberOfFeatures\n  );\n\n  if (classProperty.type === 'STRING' || classProperty.componentType === 'STRING') {\n    data = getPropertyDataString(numberOfFeatures, dataArray, arrayOffsets, stringOffsets);\n  } else if (isNumericProperty(classProperty)) {\n    data = getPropertyDataNumeric(classProperty, numberOfFeatures, dataArray, arrayOffsets);\n  }\n\n  return data;\n}\n\n/**\n * Parses propertyTable.property.arrayOffsets that are offsets of sub-arrays in a flatten array of values.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param classProperty - class property object.\n * @param propertyTableProperty - propertyTable's property metadata.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @returns Typed array with offset values.\n * @see https://github.com/CesiumGS/glTF/blob/2976f1183343a47a29e4059a70961371cd2fcee8/extensions/2.0/Vendor/EXT_structural_metadata/schema/propertyTable.property.schema.json#L21\n */\nfunction getArrayOffsetsForProperty(\n  scenegraph: GLTFScenegraph,\n  classProperty: GLTF_EXT_feature_metadata_ClassProperty,\n  propertyTableProperty: GLTF_EXT_feature_metadata_FeatureTableProperty,\n  numberOfElements: number\n): TypedArray | null {\n  /*\n   If ARRAY is used, then componentType must also be specified.\n   ARRAY is a fixed-length array when componentCount is defined, and variable-length otherwise.\n*/\n  if (\n    classProperty.type === 'ARRAY' &&\n    // `componentCount` is a number of fixed-length array elements.\n    // If `componentCount` is NOT defined, it's a VARIABLE-length array\n    typeof classProperty.componentCount === 'undefined' &&\n    // `arrayOffsetBufferView` is an index of the buffer view containing offsets for variable-length arrays.\n    typeof propertyTableProperty.arrayOffsetBufferView !== 'undefined'\n  ) {\n    // Data are in a VARIABLE-length array\n    return getOffsetsForProperty(\n      scenegraph,\n      propertyTableProperty.arrayOffsetBufferView,\n      propertyTableProperty.offsetType || 'UINT32', // offsetType is used both for stringOffsetBufferView and arrayOffsetBufferView\n      numberOfElements\n    );\n  }\n  return null;\n}\n\n/**\n * Parses featureTable.property.stringOffsetBufferView.\n * String offsets is an array of offsets of strings in the united array of characters.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param propertyTableProperty - propertyTable's property metadata.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @returns Typed array of offset values. The number of offsets in the array is equal to `numberOfElements` plus one.\n * @see https://github.com/CesiumGS/glTF/blob/c38f7f37e894004353c15cd0481bc5b7381ce841/extensions/2.0/Vendor/EXT_feature_metadata/schema/featureTable.property.schema.json#L50C10-L50C32\n */\nfunction getStringOffsetsForProperty(\n  scenegraph: GLTFScenegraph,\n  classProperty: GLTF_EXT_feature_metadata_ClassProperty,\n  propertyTableProperty: GLTF_EXT_feature_metadata_FeatureTableProperty,\n  numberOfElements: number\n): TypedArray | null {\n  if (\n    typeof propertyTableProperty.stringOffsetBufferView !== 'undefined' // `stringOffsetBufferView` is an index of the buffer view containing offsets for strings.\n  ) {\n    // Data are in a FIXED-length array\n    return getOffsetsForProperty(\n      scenegraph,\n      propertyTableProperty.stringOffsetBufferView,\n      propertyTableProperty.offsetType || 'UINT32', // offsetType is used both for stringOffsetBufferView and arrayOffsetBufferView\n      numberOfElements\n    );\n  }\n  return null;\n}\n\n/**\n * Checks if the feature table property is of numeric type.\n * @param schemaPropertyType - feature table property\n * @returns true if property is numeric, else - false\n */\nfunction isNumericProperty(schemaProperty: GLTF_EXT_feature_metadata_ClassProperty): boolean {\n  const types = [\n    'UINT8',\n    'INT16',\n    'UINT16',\n    'INT32',\n    'UINT32',\n    'INT64',\n    'UINT64',\n    'FLOAT32',\n    'FLOAT64'\n  ];\n  return (\n    types.includes(schemaProperty.type) ||\n    (typeof schemaProperty.componentType !== 'undefined' &&\n      types.includes(schemaProperty.componentType))\n  );\n}\n\n/**\n * Decodes properties of numeric types from binary sourse.\n * @param classProperty - class property object.\n * @param numberOfElements - The number of elements in each property array that propertyTableProperty contains. It's a number of rows in the table.\n * @param valuesDataBytes - Data taken from values property of the property table property.\n * @param arrayOffsets - Offsets for variable-length arrays. It's null for fixed-length arrays or scalar types.\n * @returns Property values in a typed array or in an array of typed arrays.\n */\nfunction getPropertyDataNumeric(\n  classProperty: GLTF_EXT_feature_metadata_ClassProperty,\n  numberOfElements: number,\n  valuesDataBytes: Uint8Array,\n  arrayOffsets: TypedArray | null\n): BigTypedArray | BigTypedArray[] {\n  const isArray = classProperty.type === 'ARRAY';\n  const arrayCount = classProperty.componentCount;\n\n  /*\n  We are getting Numeric data. So,\n    the component type can be one of NumericComponentType,\n    the attribute type should be 'SCALAR'\n  */\n  const attributeType = 'SCALAR';\n  const componentType = classProperty.componentType || classProperty.type;\n  const elementSize = getArrayElementByteSize(attributeType, componentType);\n  const elementCount = valuesDataBytes.byteLength / elementSize;\n\n  const valuesData: BigTypedArray = convertRawBufferToMetadataArray(\n    valuesDataBytes,\n    attributeType,\n    componentType as NumericComponentType,\n    elementCount\n  );\n\n  if (isArray) {\n    if (arrayOffsets) {\n      // VARIABLE-length array\n      return parseVariableLengthArrayNumeric(\n        valuesData,\n        numberOfElements,\n        arrayOffsets,\n        valuesDataBytes.length,\n        elementSize\n      );\n    }\n    if (arrayCount) {\n      // FIXED-length array\n      return parseFixedLengthArrayNumeric(valuesData, numberOfElements, arrayCount);\n    }\n    return [];\n  }\n\n  return valuesData;\n}\n\n/**\n * Gets properties from texture associated with all mesh primitives.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param featureTextureProperty\n * @param attributeName\n * @returns Feature texture data\n */\nfunction getPropertyDataFromTexture(\n  scenegraph: GLTFScenegraph,\n  featureTextureProperty: GLTF_EXT_feature_metadata_TextureAccessor,\n  attributeName: string\n): number[] {\n  const json = scenegraph.gltf.json;\n  if (!json.meshes) {\n    return [];\n  }\n  const featureTextureTable: number[] = [];\n  for (const mesh of json.meshes) {\n    for (const primitive of mesh.primitives) {\n      processPrimitiveTextures(\n        scenegraph,\n        attributeName,\n        featureTextureProperty,\n        featureTextureTable,\n        primitive\n      );\n    }\n  }\n  return featureTextureTable;\n}\n\n/**\n * Processes data encoded in the texture associated with the primitive. This data will be accessible through the attributes.\n * @param scenegraph - Instance of the class for structured access to GLTF data.\n * @param attributeName\n * @param featureTextureProperty\n * @param featureTextureTable\n * @param primitive\n */\nfunction processPrimitiveTextures(\n  scenegraph: GLTFScenegraph,\n  attributeName: string,\n  featureTextureProperty: GLTF_EXT_feature_metadata_TextureAccessor,\n  featureTextureTable: number[],\n  primitive: GLTFMeshPrimitive\n): void {\n  const textureInfoTopLevel: GLTFTextureInfoMetadata = {\n    channels: featureTextureProperty.channels,\n    ...featureTextureProperty.texture\n  };\n  const propertyData: number[] | null = getPrimitiveTextureData(\n    scenegraph,\n    textureInfoTopLevel,\n    primitive\n  );\n  if (!propertyData) {\n    return;\n  }\n  primitivePropertyDataToAttributes(\n    scenegraph,\n    attributeName,\n    propertyData,\n    featureTextureTable,\n    primitive\n  );\n}\n", "// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {registerJSModules, getJSModuleOrNull} from '@loaders.gl/loader-utils';\nimport {loadLibrary, LoadLibraryOptions} from '@loaders.gl/worker-utils';\n\nexport const BASIS_EXTERNAL_LIBRARIES = {\n  /** Basis transcoder, javascript wrapper part */\n  TRANSCODER: 'basis_transcoder.js',\n  /** Basis transcoder, compiled web assembly part */\n  TRANSCODER_WASM: 'basis_transcoder.wasm',\n  /** Basis encoder, javascript wrapper part */\n  ENCODER: 'basis_encoder.js',\n  /** Basis encoder, compiled web assembly part */\n  ENCODER_WASM: 'basis_encoder.wasm'\n};\n\nlet loadBasisTranscoderPromise;\n\n/**\n * Loads wasm transcoder module\n * @param options\n * @returns {BasisFile} promise\n */\nexport async function loadBasisTranscoderModule(options: LoadLibraryOptions) {\n  registerJSModules(options.modules);\n  const basis = getJSModuleOrNull('basis');\n  if (basis) {\n    return basis;\n  }\n\n  loadBasisTranscoderPromise ||= loadBasisTranscoder(options);\n  return await loadBasisTranscoderPromise;\n}\n\n/**\n * Loads wasm transcoder module\n * @param options\n * @returns {BasisFile} promise\n */\nasync function loadBasisTranscoder(options: LoadLibraryOptions) {\n  let BASIS = null;\n  let wasmBinary = null;\n\n  [BASIS, wasmBinary] = await Promise.all([\n    await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, 'textures', options),\n    await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, 'textures', options)\n  ]);\n\n  // Depends on how import happened...\n  // @ts-ignore TS2339: Property does not exist on type\n  BASIS = BASIS || globalThis.BASIS;\n  return await initializeBasisTranscoderModule(BASIS, wasmBinary);\n}\n\n/**\n * Initialize wasm transcoder module\n * @param BasisModule - js part of the module\n * @param wasmBinary - wasm part of the module\n * @returns {BasisFile} promise\n */\nfunction initializeBasisTranscoderModule(BasisModule, wasmBinary) {\n  const options: {wasmBinary?} = {};\n\n  if (wasmBinary) {\n    options.wasmBinary = wasmBinary;\n  }\n\n  return new Promise((resolve) => {\n    // if you try to return BasisModule the browser crashes!\n    BasisModule(options).then((module) => {\n      const {BasisFile, initializeBasis} = module;\n      initializeBasis();\n      resolve({BasisFile});\n    });\n  });\n}\n\nlet loadBasisEncoderPromise;\n\n/**\n * Loads wasm encoder module\n * @param options\n * @returns {BasisFile, KTX2File} promise\n */\nexport async function loadBasisEncoderModule(options: LoadLibraryOptions) {\n  const modules = options.modules || {};\n  if (modules.basisEncoder) {\n    return modules.basisEncoder;\n  }\n\n  loadBasisEncoderPromise = loadBasisEncoderPromise || loadBasisEncoder(options);\n  return await loadBasisEncoderPromise;\n}\n\n/**\n * Loads wasm encoder module\n * @param options\n * @returns {BasisFile, KTX2File} promise\n */\nasync function loadBasisEncoder(options: LoadLibraryOptions) {\n  let BASIS_ENCODER = null;\n  let wasmBinary = null;\n\n  [BASIS_ENCODER, wasmBinary] = await Promise.all([\n    await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER, 'textures', options),\n    await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, 'textures', options)\n  ]);\n\n  // Depends on how import happened...\n  // @ts-ignore TS2339: Property does not exist on type\n  BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;\n  return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);\n}\n\n/**\n * Initialize wasm transcoder module\n * @param BasisEncoderModule - js part of the module\n * @param wasmBinary - wasm part of the module\n * @returns {BasisFile, KTX2File} promise\n */\nfunction initializeBasisEncoderModule(BasisEncoderModule, wasmBinary) {\n  const options: {wasmBinary?} = {};\n\n  if (wasmBinary) {\n    options.wasmBinary = wasmBinary;\n  }\n\n  return new Promise((resolve) => {\n    // if you try to return BasisModule the browser crashes!\n    BasisEncoderModule(options).then((module) => {\n      const {BasisFile, KTX2File, initializeBasis, BasisEncoder} = module;\n      initializeBasis();\n      resolve({BasisFile, KTX2File, BasisEncoder});\n    });\n  });\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable camelcase */\n\n// Core WebGL texture formats\nexport const GL_RGB = 0x1907;\nexport const GL_RGBA = 0x1908;\nexport const GL_RGBA4 = 0x8056;\nexport const GL_RGB5_A1 = 0x8057;\nexport const GL_RGBA8 = 0x8058;\nexport const GL_RGB565 = 0x8d62;\nexport const GL_RGBA32F = 0x8814;\n\n// WEBGL_compressed_texture_s3tc\nexport const GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83f0;\nexport const GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83f1;\nexport const GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83f2;\nexport const GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83f3;\n\n// WEBGL_compressed_texture_es3\nexport const GL_COMPRESSED_R11_EAC = 0x9270;\nexport const GL_COMPRESSED_SIGNED_R11_EAC = 0x9271;\nexport const GL_COMPRESSED_RG11_EAC = 0x9272;\nexport const GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273;\nexport const GL_COMPRESSED_RGB8_ETC2 = 0x9274;\nexport const GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9275;\nexport const GL_COMPRESSED_SRGB8_ETC2 = 0x9276;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9277;\nexport const GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9278;\nexport const GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9279;\n\n// WEBGL_compressed_texture_pvrtc\nexport const GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8c00;\nexport const GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8c01;\nexport const GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8c02;\nexport const GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8c03;\n\n// WEBGL_compressed_texture_etc1\nexport const GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8d64;\n\n// WEBGL_compressed_texture_atc\nexport const GL_COMPRESSED_RGB_ATC_WEBGL = 0x8c92;\nexport const GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8c93;\nexport const GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87ee;\n\n// WEBGL_compressed_texture_astc\nexport const GL_COMPRESSED_RGBA_ASTC_4x4_KHR = 0x93b0;\nexport const GL_COMPRESSED_RGBA_ASTC_5x4_KHR = 0x93b1;\nexport const GL_COMPRESSED_RGBA_ASTC_5x5_KHR = 0x93b2;\nexport const GL_COMPRESSED_RGBA_ASTC_6x5_KHR = 0x93b3;\nexport const GL_COMPRESSED_RGBA_ASTC_6x6_KHR = 0x93b4;\nexport const GL_COMPRESSED_RGBA_ASTC_8x5_KHR = 0x93b5;\nexport const GL_COMPRESSED_RGBA_ASTC_8x6_KHR = 0x93b6;\nexport const GL_COMPRESSED_RGBA_ASTC_8x8_KHR = 0x93b7;\nexport const GL_COMPRESSED_RGBA_ASTC_10x5_KHR = 0x93b8;\nexport const GL_COMPRESSED_RGBA_ASTC_10x6_KHR = 0x93b9;\nexport const GL_COMPRESSED_RGBA_ASTC_10x8_KHR = 0x93ba;\nexport const GL_COMPRESSED_RGBA_ASTC_10x10_KHR = 0x93bb;\nexport const GL_COMPRESSED_RGBA_ASTC_12x10_KHR = 0x93bc;\nexport const GL_COMPRESSED_RGBA_ASTC_12x12_KHR = 0x93bd;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR = 0x93d0;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR = 0x93d1;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR = 0x93d2;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR = 0x93d3;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR = 0x93d4;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR = 0x93d5;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR = 0x93d6;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR = 0x93d7;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR = 0x93d8;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR = 0x93d9;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR = 0x93da;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR = 0x93db;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR = 0x93dc;\nexport const GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR = 0x93dd;\n\n// EXT_texture_compression_rgtc\nexport const GL_COMPRESSED_RED_RGTC1_EXT = 0x8dbb;\nexport const GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8dbc;\nexport const GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8dbd;\nexport const GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8dbe;\n\n// EXT_texture_compression_bptc\nexport const GL_COMPRESSED_RGBA_BPTC_UNORM_EXT = 0x8e8c;\nexport const GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT = 0x8e8d;\nexport const GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT = 0x8e8e;\nexport const GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT = 0x8e8f;\n\n// WEBGL_compressed_texture_s3tc_srgb\nexport const GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8c4c;\nexport const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8c4d;\nexport const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8c4e;\nexport const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8c4f;\n\nexport const GL_EXTENSIONS_CONSTANTS = {\n  RGB: GL_RGB,\n  RGBA: GL_RGBA,\n  RGBA4: GL_RGBA4,\n  RGB5_A1: GL_RGB5_A1,\n  RGBA8: GL_RGBA8,\n  RGB565: GL_RGB565,\n  RGBA32F: GL_RGBA32F,\n  COMPRESSED_RGB_S3TC_DXT1_EXT: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,\n  COMPRESSED_RGBA_S3TC_DXT1_EXT: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,\n  COMPRESSED_RGBA_S3TC_DXT3_EXT: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,\n  COMPRESSED_RGBA_S3TC_DXT5_EXT: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,\n  COMPRESSED_R11_EAC: GL_COMPRESSED_R11_EAC,\n  COMPRESSED_SIGNED_R11_EAC: GL_COMPRESSED_SIGNED_R11_EAC,\n  COMPRESSED_RG11_EAC: GL_COMPRESSED_RG11_EAC,\n  COMPRESSED_SIGNED_RG11_EAC: GL_COMPRESSED_SIGNED_RG11_EAC,\n  COMPRESSED_RGB8_ETC2: GL_COMPRESSED_RGB8_ETC2,\n  COMPRESSED_RGBA8_ETC2_EAC: GL_COMPRESSED_RGBA8_ETC2_EAC,\n  COMPRESSED_SRGB8_ETC2: GL_COMPRESSED_SRGB8_ETC2,\n  COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,\n  COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,\n  COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\n  COMPRESSED_RGB_PVRTC_4BPPV1_IMG: GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n  COMPRESSED_RGB_PVRTC_2BPPV1_IMG: GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,\n  COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n  COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,\n  COMPRESSED_RGB_ETC1_WEBGL: GL_COMPRESSED_RGB_ETC1_WEBGL,\n  COMPRESSED_RGB_ATC_WEBGL: GL_COMPRESSED_RGB_ATC_WEBGL,\n  COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,\n  COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL,\n  COMPRESSED_RGBA_ASTC_4x4_KHR: GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\n  COMPRESSED_RGBA_ASTC_5x4_KHR: GL_COMPRESSED_RGBA_ASTC_5x4_KHR,\n  COMPRESSED_RGBA_ASTC_5x5_KHR: GL_COMPRESSED_RGBA_ASTC_5x5_KHR,\n  COMPRESSED_RGBA_ASTC_6x5_KHR: GL_COMPRESSED_RGBA_ASTC_6x5_KHR,\n  COMPRESSED_RGBA_ASTC_6x6_KHR: GL_COMPRESSED_RGBA_ASTC_6x6_KHR,\n  COMPRESSED_RGBA_ASTC_8x5_KHR: GL_COMPRESSED_RGBA_ASTC_8x5_KHR,\n  COMPRESSED_RGBA_ASTC_8x6_KHR: GL_COMPRESSED_RGBA_ASTC_8x6_KHR,\n  COMPRESSED_RGBA_ASTC_8x8_KHR: GL_COMPRESSED_RGBA_ASTC_8x8_KHR,\n  COMPRESSED_RGBA_ASTC_10x5_KHR: GL_COMPRESSED_RGBA_ASTC_10x5_KHR,\n  COMPRESSED_RGBA_ASTC_10x6_KHR: GL_COMPRESSED_RGBA_ASTC_10x6_KHR,\n  COMPRESSED_RGBA_ASTC_10x8_KHR: GL_COMPRESSED_RGBA_ASTC_10x8_KHR,\n  COMPRESSED_RGBA_ASTC_10x10_KHR: GL_COMPRESSED_RGBA_ASTC_10x10_KHR,\n  COMPRESSED_RGBA_ASTC_12x10_KHR: GL_COMPRESSED_RGBA_ASTC_12x10_KHR,\n  COMPRESSED_RGBA_ASTC_12x12_KHR: GL_COMPRESSED_RGBA_ASTC_12x12_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,\n  COMPRESSED_RED_RGTC1_EXT: GL_COMPRESSED_RED_RGTC1_EXT,\n  COMPRESSED_SIGNED_RED_RGTC1_EXT: GL_COMPRESSED_SIGNED_RED_RGTC1_EXT,\n  COMPRESSED_RED_GREEN_RGTC2_EXT: GL_COMPRESSED_RED_GREEN_RGTC2_EXT,\n  COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT,\n  COMPRESSED_RGBA_BPTC_UNORM_EXT: GL_COMPRESSED_RGBA_BPTC_UNORM_EXT,\n  COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT,\n  COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT,\n  COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT,\n  COMPRESSED_SRGB_S3TC_DXT1_EXT: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,\n  COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,\n  COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,\n  COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,\n  // Deprecated legacy aliases with non-standard ASTC casing.\n  COMPRESSED_RGBA_ASTC_4X4_KHR: GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\n  COMPRESSED_RGBA_ASTC_5X4_KHR: GL_COMPRESSED_RGBA_ASTC_5x4_KHR,\n  COMPRESSED_RGBA_ASTC_5X5_KHR: GL_COMPRESSED_RGBA_ASTC_5x5_KHR,\n  COMPRESSED_RGBA_ASTC_6X5_KHR: GL_COMPRESSED_RGBA_ASTC_6x5_KHR,\n  COMPRESSED_RGBA_ASTC_6X6_KHR: GL_COMPRESSED_RGBA_ASTC_6x6_KHR,\n  COMPRESSED_RGBA_ASTC_8X5_KHR: GL_COMPRESSED_RGBA_ASTC_8x5_KHR,\n  COMPRESSED_RGBA_ASTC_8X6_KHR: GL_COMPRESSED_RGBA_ASTC_8x6_KHR,\n  COMPRESSED_RGBA_ASTC_8X8_KHR: GL_COMPRESSED_RGBA_ASTC_8x8_KHR,\n  COMPRESSED_RGBA_ASTC_10X5_KHR: GL_COMPRESSED_RGBA_ASTC_10x5_KHR,\n  COMPRESSED_RGBA_ASTC_10X6_KHR: GL_COMPRESSED_RGBA_ASTC_10x6_KHR,\n  COMPRESSED_RGBA_ASTC_10X8_KHR: GL_COMPRESSED_RGBA_ASTC_10x8_KHR,\n  COMPRESSED_RGBA_ASTC_10X10_KHR: GL_COMPRESSED_RGBA_ASTC_10x10_KHR,\n  COMPRESSED_RGBA_ASTC_12X10_KHR: GL_COMPRESSED_RGBA_ASTC_12x10_KHR,\n  COMPRESSED_RGBA_ASTC_12X12_KHR: GL_COMPRESSED_RGBA_ASTC_12x12_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,\n  COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR\n} as const;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {GPUTextureFormat, TextureFormat} from '@loaders.gl/schema';\n\nconst BROWSER_PREFIXES = ['', 'WEBKIT_', 'MOZ_'];\n\nconst WEBGL_TEXTURE_FORMATS: {[key: string]: TextureFormat[]} = {\n  /* eslint-disable camelcase */\n  WEBGL_compressed_texture_s3tc: [\n    'bc1-rgb-unorm-webgl',\n    'bc1-rgba-unorm',\n    'bc2-rgba-unorm',\n    'bc3-rgba-unorm'\n  ],\n  WEBGL_compressed_texture_s3tc_srgb: [\n    'bc1-rgb-unorm-srgb-webgl',\n    'bc1-rgba-unorm-srgb',\n    'bc2-rgba-unorm-srgb',\n    'bc3-rgba-unorm-srgb'\n  ],\n  EXT_texture_compression_rgtc: ['bc4-r-unorm', 'bc4-r-snorm', 'bc5-rg-unorm', 'bc5-rg-snorm'],\n  EXT_texture_compression_bptc: [\n    'bc6h-rgb-ufloat',\n    'bc6h-rgb-float',\n    'bc7-rgba-unorm',\n    'bc7-rgba-unorm-srgb'\n  ],\n  WEBGL_compressed_texture_etc1: ['etc1-rgb-unorm-webgl'],\n  WEBGL_compressed_texture_etc: [\n    'etc2-rgb8unorm',\n    'etc2-rgb8unorm-srgb',\n    'etc2-rgb8a1unorm',\n    'etc2-rgb8a1unorm-srgb',\n    'etc2-rgba8unorm',\n    'etc2-rgba8unorm-srgb',\n    'eac-r11unorm',\n    'eac-r11snorm',\n    'eac-rg11unorm',\n    'eac-rg11snorm'\n  ],\n  WEBGL_compressed_texture_pvrtc: [\n    'pvrtc-rgb4unorm-webgl',\n    'pvrtc-rgba4unorm-webgl',\n    'pvrtc-rgb2unorm-webgl',\n    'pvrtc-rgba2unorm-webgl'\n  ],\n  WEBGL_compressed_texture_atc: [\n    'atc-rgb-unorm-webgl',\n    'atc-rgba-unorm-webgl',\n    'atc-rgbai-unorm-webgl'\n  ],\n  WEBGL_compressed_texture_astc: [\n    'astc-4x4-unorm',\n    'astc-4x4-unorm-srgb',\n    'astc-5x4-unorm',\n    'astc-5x4-unorm-srgb',\n    'astc-5x5-unorm',\n    'astc-5x5-unorm-srgb',\n    'astc-6x5-unorm',\n    'astc-6x5-unorm-srgb',\n    'astc-6x6-unorm',\n    'astc-6x6-unorm-srgb',\n    'astc-8x5-unorm',\n    'astc-8x5-unorm-srgb',\n    'astc-8x6-unorm',\n    'astc-8x6-unorm-srgb',\n    'astc-8x8-unorm',\n    'astc-8x8-unorm-srgb',\n    'astc-10x5-unorm',\n    'astc-10x5-unorm-srgb',\n    'astc-10x6-unorm',\n    'astc-10x6-unorm-srgb',\n    'astc-10x8-unorm',\n    'astc-10x8-unorm-srgb',\n    'astc-10x10-unorm',\n    'astc-10x10-unorm-srgb',\n    'astc-12x10-unorm',\n    'astc-12x10-unorm-srgb',\n    'astc-12x12-unorm',\n    'astc-12x12-unorm-srgb'\n  ]\n  /* eslint-enable camelcase */\n};\n\nconst GPU_TEXTURE_FORMATS: {[key in GPUTextureFormat]: TextureFormat[]} = {\n  dxt: ['bc1-rgb-unorm-webgl', 'bc1-rgba-unorm', 'bc2-rgba-unorm', 'bc3-rgba-unorm'],\n  'dxt-srgb': [\n    'bc1-rgb-unorm-srgb-webgl',\n    'bc1-rgba-unorm-srgb',\n    'bc2-rgba-unorm-srgb',\n    'bc3-rgba-unorm-srgb'\n  ],\n  etc1: ['etc1-rgb-unorm-webgl'],\n  etc2: [\n    'etc2-rgb8unorm',\n    'etc2-rgb8unorm-srgb',\n    'etc2-rgb8a1unorm',\n    'etc2-rgb8a1unorm-srgb',\n    'etc2-rgba8unorm',\n    'etc2-rgba8unorm-srgb',\n    'eac-r11unorm',\n    'eac-r11snorm',\n    'eac-rg11unorm',\n    'eac-rg11snorm'\n  ],\n  pvrtc: [\n    'pvrtc-rgb4unorm-webgl',\n    'pvrtc-rgba4unorm-webgl',\n    'pvrtc-rgb2unorm-webgl',\n    'pvrtc-rgba2unorm-webgl'\n  ],\n  atc: ['atc-rgb-unorm-webgl', 'atc-rgba-unorm-webgl', 'atc-rgbai-unorm-webgl'],\n  astc: [\n    'astc-4x4-unorm',\n    'astc-4x4-unorm-srgb',\n    'astc-5x4-unorm',\n    'astc-5x4-unorm-srgb',\n    'astc-5x5-unorm',\n    'astc-5x5-unorm-srgb',\n    'astc-6x5-unorm',\n    'astc-6x5-unorm-srgb',\n    'astc-6x6-unorm',\n    'astc-6x6-unorm-srgb',\n    'astc-8x5-unorm',\n    'astc-8x5-unorm-srgb',\n    'astc-8x6-unorm',\n    'astc-8x6-unorm-srgb',\n    'astc-8x8-unorm',\n    'astc-8x8-unorm-srgb',\n    'astc-10x5-unorm',\n    'astc-10x5-unorm-srgb',\n    'astc-10x6-unorm',\n    'astc-10x6-unorm-srgb',\n    'astc-10x8-unorm',\n    'astc-10x8-unorm-srgb',\n    'astc-10x10-unorm',\n    'astc-10x10-unorm-srgb',\n    'astc-12x10-unorm',\n    'astc-12x10-unorm-srgb',\n    'astc-12x12-unorm',\n    'astc-12x12-unorm-srgb'\n  ],\n  rgtc: ['bc4-r-unorm', 'bc4-r-snorm', 'bc5-rg-unorm', 'bc5-rg-snorm']\n};\n\nlet formats: Set<GPUTextureFormat> | null = null;\nlet textureFormats: Set<TextureFormat> | null = null;\n\n// DEPRECATED\n/**\n * @deprecated Pass `basis.supportedTextureFormats` to Basis loaders instead of relying on global detection.\n */\nexport function detectSupportedTextureFormats(gl?: WebGLRenderingContext): Set<TextureFormat> {\n  if (!textureFormats) {\n    gl = gl || getWebGLContext() || undefined;\n    textureFormats = new Set<TextureFormat>();\n\n    for (const prefix of BROWSER_PREFIXES) {\n      for (const extension in WEBGL_TEXTURE_FORMATS) {\n        if (gl && gl.getExtension(`${prefix}${extension}`)) {\n          for (const textureFormat of WEBGL_TEXTURE_FORMATS[extension]) {\n            textureFormats.add(textureFormat);\n          }\n        }\n      }\n    }\n  }\n\n  return textureFormats;\n}\n\n// DEPRECATED\n/**\n * Returns a list of formats.\n * Creates a temporary WebGLRenderingContext if none is provided.\n *\n * @deprecated Pass `basis.supportedTextureFormats` to Basis loaders instead of relying on global detection.\n * @param gl - Optional context.\n */\nexport function detectSupportedGPUTextureFormats(gl?: WebGLRenderingContext): Set<string> {\n  if (!formats) {\n    formats = new Set<GPUTextureFormat>();\n    const supportedTextureFormats = detectSupportedTextureFormats(gl);\n\n    for (const gpuTextureFormat in GPU_TEXTURE_FORMATS) {\n      const textureFormatsForGroup = GPU_TEXTURE_FORMATS[gpuTextureFormat as GPUTextureFormat];\n      if (\n        textureFormatsForGroup.some((textureFormat) => supportedTextureFormats.has(textureFormat))\n      ) {\n        formats.add(gpuTextureFormat as GPUTextureFormat);\n      }\n    }\n  }\n\n  return formats;\n}\n\n/**\n * @returns {WebGLRenderingContext?}\n */\nfunction getWebGLContext() {\n  try {\n    const canvas = document.createElement('canvas');\n    return canvas.getContext('webgl');\n  } catch (error) {\n    return null;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TextureLevel} from '@loaders.gl/schema';\nimport {log} from '@loaders.gl/loader-utils';\nimport {read} from 'ktx-parse';\nimport {extractMipmapImages} from '../utils/extract-mipmap-images';\nimport {mapVkFormatToTextureFormat} from '../utils/ktx-format-helper';\n\nconst KTX2_ID = [\n  // '\u00B4', 'K', 'T', 'X', '2', '0', '\u00AA', '\\r', '\\n', '\\x1A', '\\n'\n  0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a\n];\n\n// eslint-disable-next-line complexity\nexport function isKTX(data: ArrayBuffer) {\n  // const id = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n  const id = new Uint8Array(data);\n  const notKTX =\n    id.byteLength < KTX2_ID.length ||\n    id[0] !== KTX2_ID[0] || // '\u00B4'\n    id[1] !== KTX2_ID[1] || // 'K'\n    id[2] !== KTX2_ID[2] || // 'T'\n    id[3] !== KTX2_ID[3] || // 'X'\n    id[4] !== KTX2_ID[4] || // ' '\n    id[5] !== KTX2_ID[5] || // '2'\n    id[6] !== KTX2_ID[6] || // '0'\n    id[7] !== KTX2_ID[7] || // '\u00AA'\n    id[8] !== KTX2_ID[8] || // '\\r'\n    id[9] !== KTX2_ID[9] || // '\\n'\n    id[10] !== KTX2_ID[10] || // '\\x1A'\n    id[11] !== KTX2_ID[11]; // '\\n'\n\n  return !notKTX;\n}\n\nexport function parseKTX(arrayBuffer: ArrayBuffer): TextureLevel[] {\n  const uint8Array = new Uint8Array(arrayBuffer);\n  const ktx = read(uint8Array);\n  const mipMapLevels = Math.max(1, ktx.levels.length);\n  const width = ktx.pixelWidth;\n  const height = ktx.pixelHeight;\n  const textureFormat = mapVkFormatToTextureFormat(ktx.vkFormat);\n\n  if (textureFormat === undefined) {\n    // TODO: Basis-backed and otherwise unknown-format KTX2 files should preserve the\n    // legacy CompressedTextureLoader behavior for now. Do not fail here or add implicit\n    // transcoding in this parser path; just return levels without `format` metadata.\n    log.warn(\n      `KTX2 container vkFormat ${ktx.vkFormat} does not map to a known texture format; returning texture levels without format metadata.`\n    )();\n  }\n\n  return extractMipmapImages(ktx.levels, {\n    mipMapLevels,\n    width,\n    height,\n    sizeFunction: (level: any): number => level.uncompressedByteLength,\n    textureFormat\n  });\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable camelcase */\n/* eslint-disable indent */\nimport type {TextureFormat, TextureLevel} from '@loaders.gl/schema';\nimport {extractLoadLibraryOptions} from '@loaders.gl/worker-utils';\nimport {loadBasisEncoderModule, loadBasisTranscoderModule} from './basis-module-loader';\nimport type {GLTextureFormat} from '../gl-types';\nimport {\n  GL_COMPRESSED_RED_GREEN_RGTC2_EXT,\n  GL_COMPRESSED_RED_RGTC1_EXT,\n  GL_COMPRESSED_RGB_ATC_WEBGL,\n  GL_COMPRESSED_RGB_ETC1_WEBGL,\n  GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n  GL_COMPRESSED_RGB_S3TC_DXT1_EXT,\n  GL_COMPRESSED_RGBA8_ETC2_EAC,\n  GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\n  GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL,\n  GL_COMPRESSED_RGBA_BPTC_UNORM_EXT,\n  GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,\n  GL_RGB565,\n  GL_RGBA4,\n  GL_RGBA8\n} from '../gl-extensions';\nimport {detectSupportedTextureFormats} from '../utils/detect-supported-texture-formats';\nimport {isKTX} from './parse-ktx';\n\n// TODO - circular type import\nimport type {BasisLoaderOptions} from '../../basis-loader';\n\nexport type BasisFormat =\n  | 'etc1'\n  | 'etc2'\n  | 'bc1'\n  | 'bc3'\n  | 'bc4'\n  | 'bc5'\n  | 'bc7-m6-opaque-only'\n  | 'bc7-m5'\n  | 'pvrtc1-4-rgb'\n  | 'pvrtc1-4-rgba'\n  | 'astc-4x4'\n  | 'atc-rgb'\n  | 'atc-rgba-interpolated-alpha'\n  | 'rgba32'\n  | 'rgb565'\n  | 'bgr565'\n  | 'rgba4444';\n\ntype BasisOutputOptions = {\n  basisFormat: number;\n  compressed: boolean;\n  format?: GLTextureFormat;\n  textureFormat?: TextureFormat;\n};\n\nlet basisTranscodingLock: Promise<void> = Promise.resolve();\n\nexport const BASIS_FORMAT_TO_OUTPUT_OPTIONS: Record<BasisFormat, BasisOutputOptions> = {\n  etc1: {\n    basisFormat: 0,\n    compressed: true,\n    format: GL_COMPRESSED_RGB_ETC1_WEBGL,\n    textureFormat: 'etc1-rgb-unorm-webgl'\n  },\n  etc2: {\n    basisFormat: 1,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA8_ETC2_EAC,\n    textureFormat: 'etc2-rgba8unorm'\n  },\n  bc1: {\n    basisFormat: 2,\n    compressed: true,\n    format: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,\n    textureFormat: 'bc1-rgb-unorm-webgl'\n  },\n  bc3: {\n    basisFormat: 3,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,\n    textureFormat: 'bc3-rgba-unorm'\n  },\n  bc4: {\n    basisFormat: 4,\n    compressed: true,\n    format: GL_COMPRESSED_RED_RGTC1_EXT,\n    textureFormat: 'bc4-r-unorm'\n  },\n  bc5: {\n    basisFormat: 5,\n    compressed: true,\n    format: GL_COMPRESSED_RED_GREEN_RGTC2_EXT,\n    textureFormat: 'bc5-rg-unorm'\n  },\n  'bc7-m6-opaque-only': {\n    basisFormat: 6,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_BPTC_UNORM_EXT,\n    textureFormat: 'bc7-rgba-unorm'\n  },\n  'bc7-m5': {\n    basisFormat: 7,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_BPTC_UNORM_EXT,\n    textureFormat: 'bc7-rgba-unorm'\n  },\n  'pvrtc1-4-rgb': {\n    basisFormat: 8,\n    compressed: true,\n    format: GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n    textureFormat: 'pvrtc-rgb4unorm-webgl'\n  },\n  'pvrtc1-4-rgba': {\n    basisFormat: 9,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n    textureFormat: 'pvrtc-rgba4unorm-webgl'\n  },\n  'astc-4x4': {\n    basisFormat: 10,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\n    textureFormat: 'astc-4x4-unorm'\n  },\n  'atc-rgb': {\n    basisFormat: 11,\n    compressed: true,\n    format: GL_COMPRESSED_RGB_ATC_WEBGL,\n    textureFormat: 'atc-rgb-unorm-webgl'\n  },\n  'atc-rgba-interpolated-alpha': {\n    basisFormat: 12,\n    compressed: true,\n    format: GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL,\n    textureFormat: 'atc-rgbai-unorm-webgl'\n  },\n  rgba32: {\n    basisFormat: 13,\n    compressed: false,\n    format: GL_RGBA8,\n    textureFormat: 'rgba8unorm'\n  },\n  rgb565: {\n    basisFormat: 14,\n    compressed: false,\n    format: GL_RGB565,\n    textureFormat: 'rgb565unorm-webgl'\n  },\n  bgr565: {\n    basisFormat: 15,\n    compressed: false,\n    format: GL_RGB565,\n    textureFormat: 'rgb565unorm-webgl'\n  },\n  rgba4444: {\n    basisFormat: 16,\n    compressed: false,\n    format: GL_RGBA4,\n    textureFormat: 'rgba4unorm-webgl'\n  }\n};\n\nexport const BASIS_FORMATS = Object.freeze(\n  Object.keys(BASIS_FORMAT_TO_OUTPUT_OPTIONS) as BasisFormat[]\n);\n\nexport type ParseBasisOptions = {\n  format: 'auto' | BasisFormat | {alpha: BasisFormat; noAlpha: BasisFormat};\n  containerFormat: 'auto' | 'ktx2' | 'basis';\n  module: 'transcoder' | 'encoder';\n  supportedTextureFormats?: TextureFormat[];\n};\n\n/**\n * Serializes access to the Basis transcoder so concurrent callers do not enter the non-reentrant\n * decoder path at the same time.\n * @param transcode - Transcode operation to run with exclusive access.\n * @returns The transcode result.\n */\nexport async function withBasisTranscodingLock<T>(transcode: () => Promise<T> | T): Promise<T> {\n  const previousLock = basisTranscodingLock;\n  let releaseLock!: () => void;\n\n  basisTranscodingLock = new Promise((resolve) => {\n    releaseLock = resolve;\n  });\n\n  await previousLock;\n\n  try {\n    return await transcode();\n  } finally {\n    releaseLock();\n  }\n}\n\n/**\n * parse data with a Binomial Basis_Universal module\n * @param data\n * @param options\n * @returns compressed texture data\n */\n// eslint-disable-next-line complexity\nexport async function parseBasis(\n  data: ArrayBuffer,\n  options: BasisLoaderOptions = {}\n): Promise<TextureLevel[][]> {\n  const loadLibraryOptions = extractLoadLibraryOptions(options);\n\n  return await withBasisTranscodingLock(async () => {\n    if (!options.basis?.containerFormat || options.basis.containerFormat === 'auto') {\n      if (isKTX(data)) {\n        const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);\n        return parseKTX2File(fileConstructors.KTX2File, data, options);\n      }\n      const {BasisFile} = await loadBasisTranscoderModule(loadLibraryOptions);\n      return parseBasisFile(BasisFile, data, options);\n    }\n    switch (options.basis.module) {\n      case 'encoder':\n        const fileConstructors = await loadBasisEncoderModule(loadLibraryOptions);\n        switch (options.basis.containerFormat) {\n          case 'ktx2':\n            return parseKTX2File(fileConstructors.KTX2File, data, options);\n          case 'basis':\n          default:\n            return parseBasisFile(fileConstructors.BasisFile, data, options);\n        }\n      case 'transcoder':\n      default:\n        const {BasisFile} = await loadBasisTranscoderModule(loadLibraryOptions);\n        return parseBasisFile(BasisFile, data, options);\n    }\n  });\n}\n\n/**\n * Parse *.basis file data\n * @param BasisFile - initialized transcoder module\n * @param data\n * @param options\n * @returns compressed texture data\n */\nfunction parseBasisFile(\n  BasisFile,\n  data: ArrayBuffer,\n  options: BasisLoaderOptions\n): TextureLevel[][] {\n  const basisFile = new BasisFile(new Uint8Array(data));\n\n  try {\n    if (!basisFile.startTranscoding()) {\n      throw new Error('Failed to start basis transcoding');\n    }\n\n    const imageCount = basisFile.getNumImages();\n    const images: TextureLevel[][] = [];\n\n    for (let imageIndex = 0; imageIndex < imageCount; imageIndex++) {\n      const levelsCount = basisFile.getNumLevels(imageIndex);\n      const levels: TextureLevel[] = [];\n\n      for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {\n        levels.push(transcodeImage(basisFile, imageIndex, levelIndex, options));\n      }\n\n      images.push(levels);\n    }\n\n    return images;\n  } finally {\n    basisFile.close();\n    basisFile.delete();\n  }\n}\n\n/**\n * Parse the particular level image of a basis file\n * @param basisFile\n * @param imageIndex\n * @param levelIndex\n * @param options\n * @returns compressed texture data\n */\nfunction transcodeImage(\n  basisFile,\n  imageIndex: number,\n  levelIndex: number,\n  options: BasisLoaderOptions\n): TextureLevel {\n  const width = basisFile.getImageWidth(imageIndex, levelIndex);\n  const height = basisFile.getImageHeight(imageIndex, levelIndex);\n\n  // See https://github.com/BinomialLLC/basis_universal/pull/83\n  const hasAlpha = basisFile.getHasAlpha(/* imageIndex, levelIndex */);\n\n  // Check options for output format etc\n  const {compressed, format, basisFormat, textureFormat} = getBasisOptions(options, hasAlpha);\n\n  const decodedSize = basisFile.getImageTranscodedSizeInBytes(imageIndex, levelIndex, basisFormat);\n  const decodedData = new Uint8Array(decodedSize);\n\n  if (!basisFile.transcodeImage(decodedData, imageIndex, levelIndex, basisFormat, 0, 0)) {\n    throw new Error('failed to start Basis transcoding');\n  }\n\n  return {\n    // standard loaders.gl image category payload\n    shape: 'texture-level',\n    width,\n    height,\n    data: decodedData,\n    compressed,\n    ...(format !== undefined ? {format} : {}),\n    ...(textureFormat !== undefined ? {textureFormat} : {}),\n\n    // Additional fields\n    // Add levelSize field.\n    hasAlpha\n  };\n}\n\n/**\n * Parse *.ktx2 file data\n * @param KTX2File\n * @param data\n * @param options\n * @returns compressed texture data\n */\nfunction parseKTX2File(KTX2File, data: ArrayBuffer, options: BasisLoaderOptions): TextureLevel[][] {\n  const ktx2File = new KTX2File(new Uint8Array(data));\n\n  try {\n    if (!ktx2File.startTranscoding()) {\n      throw new Error('failed to start KTX2 transcoding');\n    }\n    const levelsCount = ktx2File.getLevels();\n    const levels: TextureLevel[] = [];\n\n    for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {\n      levels.push(transcodeKTX2Image(ktx2File, levelIndex, options));\n    }\n\n    return [levels];\n  } finally {\n    ktx2File.close();\n    ktx2File.delete();\n  }\n}\n\n/**\n * Parse the particular level image of a ktx2 file\n * @param ktx2File\n * @param levelIndex\n * @param options\n * @returns\n */\nfunction transcodeKTX2Image(\n  ktx2File,\n  levelIndex: number,\n  options: BasisLoaderOptions\n): TextureLevel {\n  const {alphaFlag, height, width} = ktx2File.getImageLevelInfo(levelIndex, 0, 0);\n\n  // Check options for output format etc\n  const {compressed, format, basisFormat, textureFormat} = getBasisOptions(options, alphaFlag);\n\n  const decodedSize = ktx2File.getImageTranscodedSizeInBytes(\n    levelIndex,\n    0 /* layerIndex */,\n    0 /* faceIndex */,\n    basisFormat\n  );\n  const decodedData = new Uint8Array(decodedSize);\n\n  if (\n    !ktx2File.transcodeImage(\n      decodedData,\n      levelIndex,\n      0 /* layerIndex */,\n      0 /* faceIndex */,\n      basisFormat,\n      0,\n      -1 /* channel0 */,\n      -1 /* channel1 */\n    )\n  ) {\n    throw new Error('Failed to transcode KTX2 image');\n  }\n\n  return {\n    // standard loaders.gl image category payload\n    shape: 'texture-level',\n    width,\n    height,\n    data: decodedData,\n    compressed,\n    ...(format !== undefined ? {format} : {}),\n    ...(textureFormat !== undefined ? {textureFormat} : {}),\n\n    // Additional fields\n    levelSize: decodedSize,\n    hasAlpha: alphaFlag\n  };\n}\n\n/**\n * Get BasisFormat by loader format option\n * @param options\n * @param hasAlpha\n * @returns BasisFormat data\n */\nfunction getBasisOptions(options: BasisLoaderOptions, hasAlpha: boolean): BasisOutputOptions {\n  let format = options.basis?.format || 'auto';\n  if (format === 'auto') {\n    format = options.basis?.supportedTextureFormats\n      ? selectSupportedBasisFormat(options.basis.supportedTextureFormats)\n      : selectSupportedBasisFormat();\n  }\n  if (typeof format === 'object') {\n    format = hasAlpha ? format.alpha : format.noAlpha;\n  }\n  const normalizedFormat = format.toLowerCase() as BasisFormat;\n  const basisOutputOptions = BASIS_FORMAT_TO_OUTPUT_OPTIONS[normalizedFormat];\n  if (!basisOutputOptions) {\n    throw new Error(`Unknown Basis format ${format}`);\n  }\n  return basisOutputOptions;\n}\n\n/**\n * Select transcode format from the list of supported formats\n * @returns key for OutputFormat map\n */\nexport function selectSupportedBasisFormat():\n  | BasisFormat\n  | {\n      alpha: BasisFormat;\n      noAlpha: BasisFormat;\n    };\nexport function selectSupportedBasisFormat(supportedTextureFormats?: Iterable<TextureFormat>):\n  | BasisFormat\n  | {\n      alpha: BasisFormat;\n      noAlpha: BasisFormat;\n    };\nexport function selectSupportedBasisFormat(\n  supportedTextureFormats: Iterable<TextureFormat> = detectSupportedTextureFormats()\n): BasisFormat | {alpha: BasisFormat; noAlpha: BasisFormat} {\n  const textureFormats = new Set(supportedTextureFormats);\n\n  if (hasSupportedTextureFormat(textureFormats, ['astc-4x4-unorm', 'astc-4x4-unorm-srgb'])) {\n    return 'astc-4x4';\n  } else if (hasSupportedTextureFormat(textureFormats, ['bc7-rgba-unorm', 'bc7-rgba-unorm-srgb'])) {\n    return {\n      alpha: 'bc7-m5',\n      noAlpha: 'bc7-m6-opaque-only'\n    };\n  } else if (\n    hasSupportedTextureFormat(textureFormats, [\n      'bc1-rgb-unorm-webgl',\n      'bc1-rgb-unorm-srgb-webgl',\n      'bc1-rgba-unorm',\n      'bc1-rgba-unorm-srgb',\n      'bc2-rgba-unorm',\n      'bc2-rgba-unorm-srgb',\n      'bc3-rgba-unorm',\n      'bc3-rgba-unorm-srgb'\n    ])\n  ) {\n    return {\n      alpha: 'bc3',\n      noAlpha: 'bc1'\n    };\n  } else if (\n    hasSupportedTextureFormat(textureFormats, [\n      'pvrtc-rgb4unorm-webgl',\n      'pvrtc-rgba4unorm-webgl',\n      'pvrtc-rgb2unorm-webgl',\n      'pvrtc-rgba2unorm-webgl'\n    ])\n  ) {\n    return {\n      alpha: 'pvrtc1-4-rgba',\n      noAlpha: 'pvrtc1-4-rgb'\n    };\n  } else if (\n    hasSupportedTextureFormat(textureFormats, [\n      'etc2-rgb8unorm',\n      'etc2-rgb8unorm-srgb',\n      'etc2-rgb8a1unorm',\n      'etc2-rgb8a1unorm-srgb',\n      'etc2-rgba8unorm',\n      'etc2-rgba8unorm-srgb',\n      'eac-r11unorm',\n      'eac-r11snorm',\n      'eac-rg11unorm',\n      'eac-rg11snorm'\n    ])\n  ) {\n    return 'etc2';\n  } else if (textureFormats.has('etc1-rgb-unorm-webgl')) {\n    return 'etc1';\n  } else if (\n    hasSupportedTextureFormat(textureFormats, [\n      'atc-rgb-unorm-webgl',\n      'atc-rgba-unorm-webgl',\n      'atc-rgbai-unorm-webgl'\n    ])\n  ) {\n    return {\n      alpha: 'atc-rgba-interpolated-alpha',\n      noAlpha: 'atc-rgb'\n    };\n  }\n  return 'rgb565';\n}\n\nexport function getSupportedBasisFormats(\n  supportedTextureFormats: Iterable<TextureFormat> = detectSupportedTextureFormats()\n): BasisFormat[] {\n  const textureFormats = new Set(supportedTextureFormats);\n  const basisFormats: BasisFormat[] = [];\n\n  if (hasSupportedTextureFormat(textureFormats, ['astc-4x4-unorm', 'astc-4x4-unorm-srgb'])) {\n    basisFormats.push('astc-4x4');\n  }\n  if (\n    hasSupportedTextureFormat(textureFormats, [\n      'bc1-rgb-unorm-webgl',\n      'bc1-rgb-unorm-srgb-webgl',\n      'bc1-rgba-unorm',\n      'bc1-rgba-unorm-srgb',\n      'bc2-rgba-unorm',\n      'bc2-rgba-unorm-srgb',\n      'bc3-rgba-unorm',\n      'bc3-rgba-unorm-srgb'\n    ])\n  ) {\n    basisFormats.push('bc1', 'bc3');\n  }\n  if (hasSupportedTextureFormat(textureFormats, ['bc4-r-unorm', 'bc4-r-snorm'])) {\n    basisFormats.push('bc4');\n  }\n  if (hasSupportedTextureFormat(textureFormats, ['bc5-rg-unorm', 'bc5-rg-snorm'])) {\n    basisFormats.push('bc5');\n  }\n  if (hasSupportedTextureFormat(textureFormats, ['bc7-rgba-unorm', 'bc7-rgba-unorm-srgb'])) {\n    basisFormats.push('bc7-m5', 'bc7-m6-opaque-only');\n  }\n  if (\n    hasSupportedTextureFormat(textureFormats, [\n      'pvrtc-rgb4unorm-webgl',\n      'pvrtc-rgba4unorm-webgl',\n      'pvrtc-rgb2unorm-webgl',\n      'pvrtc-rgba2unorm-webgl'\n    ])\n  ) {\n    basisFormats.push('pvrtc1-4-rgb', 'pvrtc1-4-rgba');\n  }\n  if (\n    hasSupportedTextureFormat(textureFormats, [\n      'etc2-rgb8unorm',\n      'etc2-rgb8unorm-srgb',\n      'etc2-rgb8a1unorm',\n      'etc2-rgb8a1unorm-srgb',\n      'etc2-rgba8unorm',\n      'etc2-rgba8unorm-srgb',\n      'eac-r11unorm',\n      'eac-r11snorm',\n      'eac-rg11unorm',\n      'eac-rg11snorm'\n    ])\n  ) {\n    basisFormats.push('etc2');\n  }\n  if (textureFormats.has('etc1-rgb-unorm-webgl')) {\n    basisFormats.push('etc1');\n  }\n  if (\n    hasSupportedTextureFormat(textureFormats, [\n      'atc-rgb-unorm-webgl',\n      'atc-rgba-unorm-webgl',\n      'atc-rgbai-unorm-webgl'\n    ])\n  ) {\n    basisFormats.push('atc-rgb', 'atc-rgba-interpolated-alpha');\n  }\n\n  basisFormats.push('rgba32', 'rgb565', 'bgr565', 'rgba4444');\n  return basisFormats;\n}\n\nfunction hasSupportedTextureFormat(\n  supportedTextureFormats: Set<TextureFormat>,\n  candidateTextureFormats: TextureFormat[]\n): boolean {\n  return candidateTextureFormats.some((textureFormat) =>\n    supportedTextureFormats.has(textureFormat)\n  );\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {TextureFormat, TextureLevel} from '@loaders.gl/schema';\nimport {VERSION} from './lib/utils/version';\nimport {parseBasis} from './lib/parsers/parse-basis';\nimport type {BasisFormat} from './lib/parsers/parse-basis';\n\ntype BasisFormatOption = BasisFormat | Uppercase<BasisFormat>;\ntype BasisTargetFormat =\n  | 'auto'\n  | BasisFormatOption\n  | {\n      alpha: BasisFormatOption;\n      noAlpha: BasisFormatOption;\n    };\n\n/** Options for the BasisLoader */\nexport type BasisLoaderOptions = LoaderOptions & {\n  /** Options for the BasisLoader */\n  basis?: {\n    /** Supported texture formats - app would typically query a WebGPU device or WebGL context to obtain the list of supported formats.*/\n    supportedTextureFormats?: TextureFormat[];\n    /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n    workerUrl?: string;\n\n    /** What container format is used? */\n    containerFormat?: 'auto' | 'ktx2' | 'basis';\n    /** Format for texture data. auto selects based on platform caps (but gl context doesn't exist on a worker thread) */\n    format?: BasisTargetFormat;\n    /** What module to use for transcoding? */\n    module?: 'transcoder' | 'encoder';\n  };\n};\n\n/**\n * Worker loader for Basis super compressed textures\n */\nexport const BasisWorkerLoader = {\n  dataType: null as unknown as TextureLevel[][],\n  batchType: null as never,\n\n  name: 'Basis',\n  id: 'basis',\n  module: 'textures',\n  version: VERSION,\n  worker: true,\n  extensions: ['basis', 'ktx2'],\n  mimeTypes: ['application/octet-stream', 'image/ktx2'],\n  tests: ['sB'],\n  binary: true,\n  options: {\n    basis: {\n      format: 'auto',\n      containerFormat: 'auto',\n      module: 'transcoder'\n    }\n  }\n} as const satisfies Loader<TextureLevel[][], never, BasisLoaderOptions>;\n\n/**\n * Loader for Basis super compressed textures\n */\nexport const BasisLoader = {\n  ...BasisWorkerLoader,\n  parse: parseBasis\n} as const satisfies LoaderWithParser<TextureLevel[][], never, LoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {VERSION} from './lib/utils/version';\n\n// Types\nexport type {GPUTextureFormat, TextureFormat} from '@loaders.gl/schema';\n\n// Loaders\nexport type {BasisLoaderOptions} from './basis-loader';\nexport {BasisLoader, BasisWorkerLoader} from './basis-loader';\n\nexport type {CompressedTextureLoaderOptions} from './compressed-texture-loader';\nexport {CompressedTextureLoader, CompressedTextureWorkerLoader} from './compressed-texture-loader';\n\nexport type {CrunchLoaderOptions} from './crunch-loader';\nexport {CrunchLoader} from './crunch-loader';\n\nexport type {RadianceHDRLoaderOptions} from './radiance-hdr-loader';\nexport type {RadianceHDRMetadata} from './lib/parsers/parse-hdr';\nexport {RadianceHDRLoader} from './radiance-hdr-loader';\n\nexport type {NPYLoaderOptions} from './npy-loader';\nexport {NPYLoader, NPYWorkerLoader} from './npy-loader';\n\nexport type {TextureManifestLoaderOptions, TextureManifest} from './texture-loader';\nexport {TextureLoader} from './texture-loader';\n\nexport type {TextureArrayLoaderOptions, TextureArrayManifest} from './texture-array-loader';\nexport {TextureArrayLoader} from './texture-array-loader';\n\nexport type {TextureCubeLoaderOptions, TextureCubeManifest} from './texture-cube-loader';\nexport {TextureCubeLoader} from './texture-cube-loader';\n\nexport type {\n  TextureCubeArrayLoaderOptions,\n  TextureCubeArrayManifest\n} from './texture-cube-array-loader';\nexport {TextureCubeArrayLoader} from './texture-cube-array-loader';\n\n// Module constants\nexport {BASIS_EXTERNAL_LIBRARIES} from './lib/parsers/basis-module-loader';\nexport {CRUNCH_EXTERNAL_LIBRARIES} from './lib/parsers/crunch-module-loader';\n\n// Writers\nexport {CompressedTextureWriter} from './compressed-texture-writer';\nexport {KTX2BasisWriter} from './ktx2-basis-writer';\n\nexport const KTX2BasisWriterWorker = {\n  name: 'Basis Universal Supercompressed GPU Texture',\n  id: 'ktx2-basis-writer',\n  module: 'textures',\n  version: VERSION,\n  extensions: ['ktx2'],\n  worker: true,\n  options: {\n    useSRGB: false,\n    qualityLevel: 10,\n    encodeUASTC: false,\n    mipmaps: false\n  }\n};\n\n// Texture Loading API\nexport {loadImageTexture} from './lib/texture-api/load-image';\nexport {loadImageTextureArray} from './lib/texture-api/load-image-array';\nexport {loadImageTextureCube} from './lib/texture-api/load-image-cube';\n\n// Utilities\nexport * from './lib/gl-extensions';\n\n// DEPRECATED\n// @deprecated\nexport {CrunchLoader as CrunchWorkerLoader} from './crunch-loader';\n// @deprecated\nexport type {CompressedTextureLoaderOptions as TextureLoaderOptions} from './compressed-texture-loader';\n", "/* eslint-disable camelcase, max-statements */\n// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#glb-file-format-specification\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\nimport type {GLB} from '../types/glb-types';\nimport {padToNBytes, assert} from '@loaders.gl/loader-utils';\n\n/** Options for parsing a GLB */\nexport type ParseGLBOptions = {\n  /** @deprecated This option was used by XVIZ protocol to define a non-standard magic number */\n  magic?: number;\n  /** @deprecated This option was used by XVIZ protocol to embed non-standard chunks */\n  strict?: boolean;\n};\n\n/** Binary GLTF is little endian. */\nconst LITTLE_ENDIAN = true;\n\n/** 'glTF' in Big-Endian ASCII */\nconst MAGIC_glTF = 0x676c5446;\nconst GLB_FILE_HEADER_SIZE = 12;\nconst GLB_CHUNK_HEADER_SIZE = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4e4f534a;\nconst GLB_CHUNK_TYPE_BIN = 0x004e4942;\nconst GLB_V1_CONTENT_FORMAT_JSON = 0x0;\n\n/** @deprecated - Backward compatibility for old xviz files */\nconst GLB_CHUNK_TYPE_JSON_XVIZ_DEPRECATED = 0;\n/** @deprecated - Backward compatibility for old xviz files */\nconst GLB_CHUNK_TYPE_BIX_XVIZ_DEPRECATED = 1;\n\nfunction getMagicString(dataView, byteOffset = 0) {\n  return `\\\n${String.fromCharCode(dataView.getUint8(byteOffset + 0))}\\\n${String.fromCharCode(dataView.getUint8(byteOffset + 1))}\\\n${String.fromCharCode(dataView.getUint8(byteOffset + 2))}\\\n${String.fromCharCode(dataView.getUint8(byteOffset + 3))}`;\n}\n\n/** Check if the contents of an array buffer contains GLB byte markers */\nexport function isGLB(\n  arrayBuffer: ArrayBuffer,\n  byteOffset: number = 0,\n  options: ParseGLBOptions = {}\n): boolean {\n  const dataView = new DataView(arrayBuffer);\n  // Check that GLB Header starts with the magic number\n  const {magic = MAGIC_glTF} = options;\n  const magic1 = dataView.getUint32(byteOffset, false);\n  return magic1 === magic || magic1 === MAGIC_glTF;\n}\n\n/**\n * Synchronously parse a GLB\n * @param glb - Target, Output is stored there\n * @param arrayBuffer - Input data\n * @param byteOffset - Offset into arrayBuffer to start parsing from (for \"embedded\" GLBs, e.g. in 3D tiles)\n * @param options\n * @returns\n */\nexport function parseGLBSync(\n  glb: GLB,\n  arrayBuffer: ArrayBuffer,\n  byteOffset: number = 0,\n  options: ParseGLBOptions = {}\n) {\n  // Check that GLB Header starts with the magic number\n  const dataView = new DataView(arrayBuffer);\n\n  // Compare format with GLBLoader documentation\n  const type = getMagicString(dataView, byteOffset + 0);\n  const version = dataView.getUint32(byteOffset + 4, LITTLE_ENDIAN); // Version 2 of binary glTF container format\n  const byteLength = dataView.getUint32(byteOffset + 8, LITTLE_ENDIAN); // Total byte length of binary file\n\n  Object.assign(glb, {\n    // Put less important stuff in a header, to avoid clutter\n    header: {\n      byteOffset, // Byte offset into the initial arrayBuffer\n      byteLength,\n      hasBinChunk: false\n    },\n\n    type,\n    version,\n\n    json: {},\n    binChunks: []\n  } as GLB);\n\n  byteOffset += GLB_FILE_HEADER_SIZE;\n\n  switch (glb.version) {\n    case 1:\n      return parseGLBV1(glb, dataView, byteOffset);\n    case 2:\n      return parseGLBV2(glb, dataView, byteOffset, (options = {}));\n    default:\n      throw new Error(`Invalid GLB version ${glb.version}. Only supports version 1 and 2.`);\n  }\n}\n\n/**\n * Parse a V1 GLB\n * @param glb - target, output is stored in this object\n * @param dataView - Input, memory to be parsed\n * @param byteOffset - Offset of first byte of GLB data in the data view\n * @returns Number of bytes parsed (there could be additional non-GLB data after the GLB)\n */\nfunction parseGLBV1(glb: GLB, dataView: DataView, byteOffset: number): number {\n  // Sanity: ensure file is big enough to hold at least the headers\n  assert(glb.header.byteLength > GLB_FILE_HEADER_SIZE + GLB_CHUNK_HEADER_SIZE);\n\n  // Explanation of GLB structure:\n  // https://cloud.githubusercontent.com/assets/3479527/22600725/36b87122-ea55-11e6-9d40-6fd42819fcab.png\n  const contentLength = dataView.getUint32(byteOffset + 0, LITTLE_ENDIAN); // Byte length of chunk\n  const contentFormat = dataView.getUint32(byteOffset + 4, LITTLE_ENDIAN); // Chunk format as uint32\n  byteOffset += GLB_CHUNK_HEADER_SIZE;\n\n  // GLB v1 only supports a single chunk type\n  assert(contentFormat === GLB_V1_CONTENT_FORMAT_JSON);\n\n  parseJSONChunk(glb, dataView, byteOffset, contentLength);\n  // No need to call the function padToBytes() from parseJSONChunk()\n  byteOffset += contentLength;\n  byteOffset += parseBINChunk(glb, dataView, byteOffset, glb.header.byteLength);\n\n  return byteOffset;\n}\n\n/**\n * Parse a V2 GLB\n * @param glb - target, output is stored in this object\n * @param dataView - Input, memory to be parsed\n * @param byteOffset - Offset of first byte of GLB data in the data view\n * @returns Number of bytes parsed (there could be additional non-GLB data after the GLB)\n */\nfunction parseGLBV2(\n  glb: GLB,\n  dataView: DataView,\n  byteOffset: number,\n  options: ParseGLBOptions\n): number {\n  // Sanity: ensure file is big enough to hold at least the first chunk header\n  assert(glb.header.byteLength > GLB_FILE_HEADER_SIZE + GLB_CHUNK_HEADER_SIZE);\n\n  parseGLBChunksSync(glb, dataView, byteOffset, options);\n\n  return byteOffset + glb.header.byteLength;\n}\n\n/** Iterate over GLB chunks and parse them */\nfunction parseGLBChunksSync(\n  glb: GLB,\n  dataView: DataView,\n  byteOffset: number,\n  options: ParseGLBOptions\n) {\n  // Per spec we must iterate over chunks, ignoring all except JSON and BIN\n  // Iterate as long as there is space left for another chunk header\n  while (byteOffset + 8 <= glb.header.byteLength) {\n    const chunkLength = dataView.getUint32(byteOffset + 0, LITTLE_ENDIAN); // Byte length of chunk\n    const chunkFormat = dataView.getUint32(byteOffset + 4, LITTLE_ENDIAN); // Chunk format as uint32\n    byteOffset += GLB_CHUNK_HEADER_SIZE;\n\n    // Per spec we must iterate over chunks, ignoring all except JSON and BIN\n    switch (chunkFormat) {\n      case GLB_CHUNK_TYPE_JSON:\n        parseJSONChunk(glb, dataView, byteOffset, chunkLength);\n        break;\n      case GLB_CHUNK_TYPE_BIN:\n        parseBINChunk(glb, dataView, byteOffset, chunkLength);\n        break;\n\n      // Backward compatibility for very old xviz files\n      case GLB_CHUNK_TYPE_JSON_XVIZ_DEPRECATED:\n        if (!options.strict) {\n          parseJSONChunk(glb, dataView, byteOffset, chunkLength);\n        }\n        break;\n      case GLB_CHUNK_TYPE_BIX_XVIZ_DEPRECATED:\n        if (!options.strict) {\n          parseBINChunk(glb, dataView, byteOffset, chunkLength);\n        }\n        break;\n\n      default:\n        // Ignore, per spec\n        // console.warn(`Unknown GLB chunk type`); // eslint-disable-line\n        break;\n    }\n\n    byteOffset += padToNBytes(chunkLength, 4);\n  }\n\n  return byteOffset;\n}\n\n/* Parse a GLB JSON chunk */\nfunction parseJSONChunk(glb: GLB, dataView: DataView, byteOffset: number, chunkLength: number) {\n  // 1. Create a \"view\" of the binary encoded JSON data inside the GLB\n  const jsonChunk = new Uint8Array(dataView.buffer, byteOffset, chunkLength);\n\n  // 2. Decode the JSON binary array into clear text\n  const textDecoder = new TextDecoder('utf8');\n  const jsonText = textDecoder.decode(jsonChunk);\n\n  // 3. Parse the JSON text into a JavaScript data structure\n  glb.json = JSON.parse(jsonText);\n\n  return padToNBytes(chunkLength, 4);\n}\n\n/** Parse a GLB BIN chunk */\nfunction parseBINChunk(glb: GLB, dataView, byteOffset, chunkLength) {\n  // Note: BIN chunk can be optional\n  glb.header.hasBinChunk = true;\n  glb.binChunks.push({\n    byteOffset,\n    byteLength: chunkLength,\n    arrayBuffer: dataView.buffer\n    // TODO - copy, or create typed array view?\n  });\n\n  return padToNBytes(chunkLength, 4);\n}\n", "import type {LoaderContext, StrictLoaderOptions} from '@loaders.gl/loader-utils';\n\n// Resolves a relative url against a baseUrl\n// If url is absolute, return it unchanged\nexport function resolveUrl(url: string, options?: StrictLoaderOptions, context?: LoaderContext) {\n  // TODO: Use better logic to handle all protocols plus not delay on data\n  const absolute = url.startsWith('data:') || url.startsWith('http:') || url.startsWith('https:');\n  if (absolute) {\n    return url;\n  }\n  const baseUrl = context?.baseUrl || getResolveBaseUrl(options?.core?.baseUrl);\n  if (!baseUrl) {\n    throw new Error(`'baseUrl' must be provided to resolve relative url ${url}`);\n  }\n  return baseUrl.endsWith('/') ? `${baseUrl}${url}` : `${baseUrl}/${url}`;\n}\n\nfunction getResolveBaseUrl(baseUrl?: string): string | undefined {\n  if (!baseUrl) {\n    return undefined;\n  }\n\n  if (baseUrl.endsWith('/')) {\n    return baseUrl;\n  }\n\n  const slashIndex = baseUrl.lastIndexOf('/');\n  return slashIndex >= 0 ? baseUrl.slice(0, slashIndex + 1) : '';\n}\n", "// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2021, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\n\n/* eslint-disable camelcase */\nconst isWebAssemblySupported = typeof WebAssembly !== 'object';\n\n// Built with clang version 11.0.0 (https://github.com/llvm/llvm-project.git 0160ad802e899c2922bc9b29564080c22eb0908c)\n// Built from meshoptimizer 0.16\nconst wasm_base =\n  'B9h9z9tFBBBF8fL9gBB9gLaaaaaFa9gEaaaB9gFaFa9gEaaaFaEMcBFFFGGGEIIILF9wFFFLEFBFKNFaFCx/IFMO/LFVK9tv9t9vq95GBt9f9f939h9z9t9f9j9h9s9s9f9jW9vq9zBBp9tv9z9o9v9wW9f9kv9j9v9kv9WvqWv94h919m9mvqBF8Z9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv94h919m9mvqBGy9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv949TvZ91v9u9jvBEn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9P9jWBIi9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9R919hWBLn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9F949wBKI9z9iqlBOc+x8ycGBM/qQFTa8jUUUUBCU/EBlHL8kUUUUBC9+RKGXAGCFJAI9LQBCaRKAE2BBC+gF9HQBALAEAIJHOAGlAGTkUUUBRNCUoBAG9uC/wgBZHKCUGAKCUG9JyRVAECFJRICBRcGXEXAcAF9PQFAVAFAclAcAVJAF9JyRMGXGXAG9FQBAMCbJHKC9wZRSAKCIrCEJCGrRQANCUGJRfCBRbAIRTEXGXAOATlAQ9PQBCBRISEMATAQJRIGXAS9FQBCBRtCBREEXGXAOAIlCi9PQBCBRISLMANCU/CBJAEJRKGXGXGXGXGXATAECKrJ2BBAtCKZrCEZfIBFGEBMAKhB83EBAKCNJhB83EBSEMAKAI2BIAI2BBHmCKrHYAYCE6HYy86BBAKCFJAICIJAYJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCGJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCEJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCIJAYAmJHY2BBAI2BFHmCKrHPAPCE6HPy86BBAKCLJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCKJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCOJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCNJAYAmJHY2BBAI2BGHmCKrHPAPCE6HPy86BBAKCVJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCcJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCMJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCSJAYAmJHm2BBAI2BEHICKrHYAYCE6HYy86BBAKCQJAmAYJHm2BBAICIrCEZHYAYCE6HYy86BBAKCfJAmAYJHm2BBAICGrCEZHYAYCE6HYy86BBAKCbJAmAYJHK2BBAICEZHIAICE6HIy86BBAKAIJRISGMAKAI2BNAI2BBHmCIrHYAYCb6HYy86BBAKCFJAICNJAYJHY2BBAmCbZHmAmCb6Hmy86BBAKCGJAYAmJHm2BBAI2BFHYCIrHPAPCb6HPy86BBAKCEJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCIJAmAYJHm2BBAI2BGHYCIrHPAPCb6HPy86BBAKCLJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCKJAmAYJHm2BBAI2BEHYCIrHPAPCb6HPy86BBAKCOJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCNJAmAYJHm2BBAI2BIHYCIrHPAPCb6HPy86BBAKCVJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCcJAmAYJHm2BBAI2BLHYCIrHPAPCb6HPy86BBAKCMJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCSJAmAYJHm2BBAI2BKHYCIrHPAPCb6HPy86BBAKCQJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCfJAmAYJHm2BBAI2BOHICIrHYAYCb6HYy86BBAKCbJAmAYJHK2BBAICbZHIAICb6HIy86BBAKAIJRISFMAKAI8pBB83BBAKCNJAICNJ8pBB83BBAICTJRIMAtCGJRtAECTJHEAS9JQBMMGXAIQBCBRISEMGXAM9FQBANAbJ2BBRtCBRKAfREEXAEANCU/CBJAKJ2BBHTCFrCBATCFZl9zAtJHt86BBAEAGJREAKCFJHKAM9HQBMMAfCFJRfAIRTAbCFJHbAG9HQBMMABAcAG9sJANCUGJAMAG9sTkUUUBpANANCUGJAMCaJAG9sJAGTkUUUBpMAMCBAIyAcJRcAIQBMC9+RKSFMCBC99AOAIlAGCAAGCA9Ly6yRKMALCU/EBJ8kUUUUBAKM+OmFTa8jUUUUBCoFlHL8kUUUUBC9+RKGXAFCE9uHOCtJAI9LQBCaRKAE2BBHNC/wFZC/gF9HQBANCbZHVCF9LQBALCoBJCgFCUFT+JUUUBpALC84Jha83EBALC8wJha83EBALC8oJha83EBALCAJha83EBALCiJha83EBALCTJha83EBALha83ENALha83EBAEAIJC9wJRcAECFJHNAOJRMGXAF9FQBCQCbAVCF6yRSABRECBRVCBRQCBRfCBRICBRKEXGXAMAcuQBC9+RKSEMGXGXAN2BBHOC/vF9LQBALCoBJAOCIrCa9zAKJCbZCEWJHb8oGIRTAb8oGBRtGXAOCbZHbAS9PQBALAOCa9zAIJCbZCGWJ8oGBAVAbyROAb9FRbGXGXAGCG9HQBABAt87FBABCIJAO87FBABCGJAT87FBSFMAEAtjGBAECNJAOjGBAECIJATjGBMAVAbJRVALCoBJAKCEWJHmAOjGBAmATjGIALAICGWJAOjGBALCoBJAKCFJCbZHKCEWJHTAtjGBATAOjGIAIAbJRIAKCFJRKSGMGXGXAbCb6QBAQAbJAbC989zJCFJRQSFMAM1BBHbCgFZROGXGXAbCa9MQBAMCFJRMSFMAM1BFHbCgBZCOWAOCgBZqROGXAbCa9MQBAMCGJRMSFMAM1BGHbCgBZCfWAOqROGXAbCa9MQBAMCEJRMSFMAM1BEHbCgBZCdWAOqROGXAbCa9MQBAMCIJRMSFMAM2BIC8cWAOqROAMCLJRMMAOCFrCBAOCFZl9zAQJRQMGXGXAGCG9HQBABAt87FBABCIJAQ87FBABCGJAT87FBSFMAEAtjGBAECNJAQjGBAECIJATjGBMALCoBJAKCEWJHOAQjGBAOATjGIALAICGWJAQjGBALCoBJAKCFJCbZHKCEWJHOAtjGBAOAQjGIAICFJRIAKCFJRKSFMGXAOCDF9LQBALAIAcAOCbZJ2BBHbCIrHTlCbZCGWJ8oGBAVCFJHtATyROALAIAblCbZCGWJ8oGBAtAT9FHmJHtAbCbZHTyRbAT9FRTGXGXAGCG9HQBABAV87FBABCIJAb87FBABCGJAO87FBSFMAEAVjGBAECNJAbjGBAECIJAOjGBMALAICGWJAVjGBALCoBJAKCEWJHYAOjGBAYAVjGIALAICFJHICbZCGWJAOjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAIAmJCbZHICGWJAbjGBALCoBJAKCGJCbZHKCEWJHOAVjGBAOAbjGIAKCFJRKAIATJRIAtATJRVSFMAVCBAM2BBHYyHTAOC/+F6HPJROAYCbZRtGXGXAYCIrHmQBAOCFJRbSFMAORbALAIAmlCbZCGWJ8oGBROMGXGXAtQBAbCFJRVSFMAbRVALAIAYlCbZCGWJ8oGBRbMGXGXAP9FQBAMCFJRYSFMAM1BFHYCgFZRTGXGXAYCa9MQBAMCGJRYSFMAM1BGHYCgBZCOWATCgBZqRTGXAYCa9MQBAMCEJRYSFMAM1BEHYCgBZCfWATqRTGXAYCa9MQBAMCIJRYSFMAM1BIHYCgBZCdWATqRTGXAYCa9MQBAMCLJRYSFMAMCKJRYAM2BLC8cWATqRTMATCFrCBATCFZl9zAQJHQRTMGXGXAmCb6QBAYRPSFMAY1BBHMCgFZROGXGXAMCa9MQBAYCFJRPSFMAY1BFHMCgBZCOWAOCgBZqROGXAMCa9MQBAYCGJRPSFMAY1BGHMCgBZCfWAOqROGXAMCa9MQBAYCEJRPSFMAY1BEHMCgBZCdWAOqROGXAMCa9MQBAYCIJRPSFMAYCLJRPAY2BIC8cWAOqROMAOCFrCBAOCFZl9zAQJHQROMGXGXAtCb6QBAPRMSFMAP1BBHMCgFZRbGXGXAMCa9MQBAPCFJRMSFMAP1BFHMCgBZCOWAbCgBZqRbGXAMCa9MQBAPCGJRMSFMAP1BGHMCgBZCfWAbqRbGXAMCa9MQBAPCEJRMSFMAP1BEHMCgBZCdWAbqRbGXAMCa9MQBAPCIJRMSFMAPCLJRMAP2BIC8cWAbqRbMAbCFrCBAbCFZl9zAQJHQRbMGXGXAGCG9HQBABAT87FBABCIJAb87FBABCGJAO87FBSFMAEATjGBAECNJAbjGBAECIJAOjGBMALCoBJAKCEWJHYAOjGBAYATjGIALAICGWJATjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAICFJHICbZCGWJAOjGBALCoBJAKCGJCbZCEWJHOATjGBAOAbjGIALAIAm9FAmCb6qJHICbZCGWJAbjGBAIAt9FAtCb6qJRIAKCEJRKMANCFJRNABCKJRBAECSJREAKCbZRKAICbZRIAfCEJHfAF9JQBMMCBC99AMAc6yRKMALCoFJ8kUUUUBAKM/tIFGa8jUUUUBCTlRLC9+RKGXAFCLJAI9LQBCaRKAE2BBC/+FZC/QF9HQBALhB83ENAECFJRKAEAIJC98JREGXAF9FQBGXAGCG6QBEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMALCNJAICFZCGWqHGAICGrCBAICFrCFZl9zAG8oGBJHIjGBABAIjGBABCIJRBAFCaJHFQBSGMMEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMABAICGrCBAICFrCFZl9zALCNJAICFZCGWqHI8oGBJHG87FBAIAGjGBABCGJRBAFCaJHFQBMMCBC99AKAE6yRKMAKM+lLKFaF99GaG99FaG99GXGXAGCI9HQBAF9FQFEXGXGX9DBBB8/9DBBB+/ABCGJHG1BB+yAB1BBHE+yHI+L+TABCFJHL1BBHK+yHO+L+THN9DBBBB9gHVyAN9DBB/+hANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE86BBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG86BBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG86BBABCIJRBAFCaJHFQBSGMMAF9FQBEXGXGX9DBBB8/9DBBB+/ABCIJHG8uFB+yAB8uFBHE+yHI+L+TABCGJHL8uFBHK+yHO+L+THN9DBBBB9gHVyAN9DB/+g6ANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE87FBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG87FBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG87FBABCNJRBAFCaJHFQBMMM/SEIEaE99EaF99GXAF9FQBCBREABRIEXGXGX9D/zI818/AICKJ8uFBHLCEq+y+VHKAI8uFB+y+UHO9DB/+g6+U9DBBB8/9DBBB+/AO9DBBBB9gy+SHN+L9DBBB9P9d9FQBAN+oRVSFMCUUUU94RVMAICIJ8uFBRcAICGJ8uFBRMABALCFJCEZAEqCFWJAV87FBGXGXAKAM+y+UHN9DB/+g6+U9DBBB8/9DBBB+/AN9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRMSFMCUUUU94RMMABALCGJCEZAEqCFWJAM87FBGXGXAKAc+y+UHK9DB/+g6+U9DBBB8/9DBBB+/AK9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRcSFMCUUUU94RcMABALCaJCEZAEqCFWJAc87FBGXGX9DBBU8/AOAO+U+TANAN+U+TAKAK+U+THO9DBBBBAO9DBBBB9gy+R9DB/+g6+U9DBBB8/+SHO+L9DBBB9P9d9FQBAO+oRcSFMCUUUU94RcMABALCEZAEqCFWJAc87FBAICNJRIAECIJREAFCaJHFQBMMM9JBGXAGCGrAF9sHF9FQBEXABAB8oGBHGCNWCN91+yAGCi91CnWCUUU/8EJ+++U84GBABCIJRBAFCaJHFQBMMM9TFEaCBCB8oGUkUUBHFABCEJC98ZJHBjGUkUUBGXGXAB8/BCTWHGuQBCaREABAGlCggEJCTrXBCa6QFMAFREMAEM/lFFFaGXGXAFABqCEZ9FQBABRESFMGXGXAGCT9PQBABRESFMABREEXAEAF8oGBjGBAECIJAFCIJ8oGBjGBAECNJAFCNJ8oGBjGBAECSJAFCSJ8oGBjGBAECTJREAFCTJRFAGC9wJHGCb9LQBMMAGCI9JQBEXAEAF8oGBjGBAFCIJRFAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF2BB86BBAECFJREAFCFJRFAGCaJHGQBMMABMoFFGaGXGXABCEZ9FQBABRESFMAFCgFZC+BwsN9sRIGXGXAGCT9PQBABRESFMABREEXAEAIjGBAECSJAIjGBAECNJAIjGBAECIJAIjGBAECTJREAGC9wJHGCb9LQBMMAGCI9JQBEXAEAIjGBAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF86BBAECFJREAGCaJHGQBMMABMMMFBCUNMIT9kBB';\nconst wasm_simd =\n  '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';\n\n// Uses bulk-memory and simd extensions\nconst detector = new Uint8Array([\n  0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 3, 2, 0, 0, 5, 3, 1, 0, 1, 12, 1, 0, 10, 22, 2,\n  12, 0, 65, 0, 65, 0, 65, 0, 252, 10, 0, 0, 11, 7, 0, 65, 0, 253, 15, 26, 11\n]);\n\n// Used to unpack wasm\nconst wasmpack = new Uint8Array([\n  32, 0, 65, 253, 3, 1, 2, 34, 4, 106, 6, 5, 11, 8, 7, 20, 13, 33, 12, 16, 128, 9, 116, 64, 19, 113,\n  127, 15, 10, 21, 22, 14, 255, 66, 24, 54, 136, 107, 18, 23, 192, 26, 114, 118, 132, 17, 77, 101,\n  130, 144, 27, 87, 131, 44, 45, 74, 156, 154, 70, 167\n]);\n\nconst FILTERS = {\n  // legacy index-based enums for glTF\n  0: '',\n  1: 'meshopt_decodeFilterOct',\n  2: 'meshopt_decodeFilterQuat',\n  3: 'meshopt_decodeFilterExp',\n  // string-based enums for glTF\n  NONE: '',\n  OCTAHEDRAL: 'meshopt_decodeFilterOct',\n  QUATERNION: 'meshopt_decodeFilterQuat',\n  EXPONENTIAL: 'meshopt_decodeFilterExp'\n};\n\nconst DECODERS = {\n  // legacy index-based enums for glTF\n  0: 'meshopt_decodeVertexBuffer',\n  1: 'meshopt_decodeIndexBuffer',\n  2: 'meshopt_decodeIndexSequence',\n  // string-based enums for glTF\n  ATTRIBUTES: 'meshopt_decodeVertexBuffer',\n  TRIANGLES: 'meshopt_decodeIndexBuffer',\n  INDICES: 'meshopt_decodeIndexSequence'\n};\n\nexport function isMeshoptSupported(): boolean {\n  return isWebAssemblySupported;\n}\n\nexport async function meshoptDecodeVertexBuffer(\n  target: Uint8Array,\n  count: number,\n  size: number,\n  source: Uint8Array,\n  filter: string | number = 'NONE'\n): Promise<void> {\n  const instance = await loadWasmInstance();\n  decode(\n    instance,\n    instance.exports.meshopt_decodeVertexBuffer,\n    target,\n    count,\n    size,\n    source,\n    instance.exports[FILTERS[filter]]\n  );\n}\n\nexport async function meshoptDecodeIndexBuffer(\n  target: Uint8Array,\n  count: number,\n  size: number,\n  source: Uint8Array\n): Promise<void> {\n  const instance = await loadWasmInstance();\n  decode(instance, instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n}\n\nexport async function meshoptDecodeIndexSequence(\n  target: Uint8Array,\n  count: number,\n  size: number,\n  source: Uint8Array\n): Promise<void> {\n  const instance = await loadWasmInstance();\n  decode(instance, instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n}\n\n// eslint-disable-next-line max-params\nexport async function meshoptDecodeGltfBuffer(\n  target: Uint8Array,\n  count: number,\n  size: number,\n  source: Uint8Array,\n  mode: string,\n  filter: string | number = 'NONE'\n): Promise<void> {\n  const instance = await loadWasmInstance();\n  decode(\n    instance,\n    instance.exports[DECODERS[mode]],\n    target,\n    count,\n    size,\n    source,\n    instance.exports[FILTERS[filter || 'NONE']]\n  );\n}\n\nlet wasmPromise: Promise<WebAssembly.Instance>;\n\nasync function loadWasmInstance(): Promise<WebAssembly.Instance> {\n  // eslint-disable-next-line\n  if (!wasmPromise) {\n    wasmPromise = loadWasmModule();\n  }\n  return wasmPromise;\n}\n\nasync function loadWasmModule(): Promise<WebAssembly.Instance> {\n  let wasm = wasm_base;\n  if (WebAssembly.validate(detector)) {\n    wasm = wasm_simd;\n\n    // eslint-disable-next-line no-console\n    console.log('Warning: meshopt_decoder is using experimental SIMD support');\n  }\n\n  const result = await WebAssembly.instantiate(unpack(wasm), {});\n  await (result.instance.exports as any).__wasm_call_ctors();\n  return result.instance;\n}\n\nfunction unpack(data) {\n  const result = new Uint8Array(data.length);\n  for (let i = 0; i < data.length; ++i) {\n    const ch = data.charCodeAt(i);\n    result[i] = ch > 96 ? ch - 71 : ch > 64 ? ch - 65 : ch > 47 ? ch + 4 : ch > 46 ? 63 : 62;\n  }\n  let write = 0;\n  for (let i = 0; i < data.length; ++i) {\n    result[write++] = result[i] < 60 ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n  }\n  return result.buffer.slice(0, write);\n}\n\n// eslint-disable-next-line max-params\nfunction decode(instance, fun, target, count, size, source, filter?) {\n  const sbrk = instance.exports.sbrk;\n  const count4 = (count + 3) & ~3; // pad for SIMD filter\n  const tp = sbrk(count4 * size);\n  const sp = sbrk(source.length);\n  const heap = new Uint8Array(instance.exports.memory.buffer);\n  heap.set(source, sp);\n  const res = fun(tp, count, size, sp, source.length);\n  if (res === 0 && filter) {\n    filter(tp, count4, size);\n  }\n  target.set(heap.subarray(tp, tp + count * size));\n  sbrk(tp - sbrk(0));\n  if (res !== 0) {\n    throw new Error(`Malformed buffer data: ${res}`);\n  }\n}\n", "/* eslint-disable camelcase */\nimport type {GLTF, GLTFBufferView, GLTF_EXT_meshopt_compression} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {meshoptDecodeGltfBuffer} from '../../meshopt/meshopt-decoder';\n\n// @ts-ignore\n// eslint-disable-next-line\nconst DEFAULT_MESHOPT_OPTIONS = {\n  byteOffset: 0,\n  filter: 'NONE'\n};\n\n/** Extension name */\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\n\nexport const name = EXT_MESHOPT_COMPRESSION;\n\nexport async function decode(gltfData: {json: GLTF}, options: GLTFLoaderOptions) {\n  const scenegraph = new GLTFScenegraph(gltfData);\n\n  if (!options?.gltf?.decompressMeshes || !options.gltf?.loadBuffers) {\n    return;\n  }\n\n  const promises: Promise<any>[] = [];\n  for (const bufferViewIndex of gltfData.json.bufferViews || []) {\n    promises.push(decodeMeshoptBufferView(scenegraph, bufferViewIndex));\n  }\n\n  // Decompress meshes in parallel\n  await Promise.all(promises);\n\n  // We have now decompressed all primitives, so remove the top-level extension\n  scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);\n}\n\n/** Decode one meshopt buffer view */\nasync function decodeMeshoptBufferView(\n  scenegraph: GLTFScenegraph,\n  bufferView: GLTFBufferView\n): Promise<void> {\n  const meshoptExtension = scenegraph.getObjectExtension<GLTF_EXT_meshopt_compression>(\n    bufferView,\n    EXT_MESHOPT_COMPRESSION\n  );\n  if (meshoptExtension) {\n    const {\n      byteOffset = 0,\n      byteLength = 0,\n      byteStride,\n      count,\n      mode,\n      filter = 'NONE',\n      buffer: bufferIndex\n    } = meshoptExtension;\n    const buffer = scenegraph.gltf.buffers[bufferIndex];\n\n    const source = new Uint8Array(buffer.arrayBuffer, buffer.byteOffset + byteOffset, byteLength);\n    const result = new Uint8Array(\n      scenegraph.gltf.buffers[bufferView.buffer].arrayBuffer,\n      bufferView.byteOffset,\n      bufferView.byteLength\n    );\n    await meshoptDecodeGltfBuffer(result, count, byteStride, source, mode, filter);\n    scenegraph.removeObjectExtension(bufferView, EXT_MESHOPT_COMPRESSION);\n  }\n}\n", "// GLTF EXTENSION: EXT_TEXTURE_WEBP\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_TEXTURE_WEBP\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_EXT_texture_webp} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {isImageFormatSupported} from '@loaders.gl/images';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\nconst EXT_TEXTURE_WEBP = 'EXT_texture_webp';\n\n/** Extension name */\nexport const name = EXT_TEXTURE_WEBP;\n\n/**\n * Replaces a texture source reference with the extension texture\n * Done in preprocess() to prevent load of default image\n */\nexport function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {\n  const scenegraph = new GLTFScenegraph(gltfData);\n\n  if (!isImageFormatSupported('image/webp')) {\n    if (scenegraph.getRequiredExtensions().includes(EXT_TEXTURE_WEBP)) {\n      throw new Error(`gltf: Required extension ${EXT_TEXTURE_WEBP} not supported by browser`);\n    }\n    return;\n  }\n\n  const {json} = scenegraph;\n\n  for (const texture of json.textures || []) {\n    const extension = scenegraph.getObjectExtension<GLTF_EXT_texture_webp>(\n      texture,\n      EXT_TEXTURE_WEBP\n    );\n    if (extension) {\n      // TODO - if multiple texture extensions are present which one wins?\n      texture.source = extension.source;\n    }\n    scenegraph.removeObjectExtension(texture, EXT_TEXTURE_WEBP);\n  }\n\n  // Remove the top-level extension\n  scenegraph.removeExtension(EXT_TEXTURE_WEBP);\n}\n", "// GLTF EXTENSION: KHR_texture_basisu\n// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_basisu\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_KHR_texture_basisu} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\nconst KHR_TEXTURE_BASISU = 'KHR_texture_basisu';\n\n/** Extension name */\nexport const name = KHR_TEXTURE_BASISU;\n\n/**\n * Replaces a texture source reference with the extension texture\n * Done in preprocess() to prevent load of default image\n */\nexport function preprocess(gltfData: {json: GLTF}, options: GLTFLoaderOptions): void {\n  const scene = new GLTFScenegraph(gltfData);\n  const {json} = scene;\n\n  for (const texture of json.textures || []) {\n    const extension = scene.getObjectExtension<GLTF_KHR_texture_basisu>(\n      texture,\n      KHR_TEXTURE_BASISU\n    );\n    if (extension) {\n      // TODO - if multiple texture extensions are present which one wins?\n      texture.source = extension.source;\n      scene.removeObjectExtension(texture, KHR_TEXTURE_BASISU);\n    }\n  }\n\n  // Remove the top-level extension\n  scene.removeExtension(KHR_TEXTURE_BASISU);\n}\n", "// Dynamic DRACO module loading inspired by THREE.DRACOLoader\n// https://github.com/mrdoob/three.js/blob/398c4f39ebdb8b23eefd4a7a5ec49ec0c96c7462/examples/jsm/loaders/DRACOLoader.js\n// by Don McCurdy / https://www.donmccurdy.com / MIT license\n\nimport {isBrowser, loadLibrary, type LoadLibraryOptions} from '@loaders.gl/worker-utils';\n\nconst DRACO_DECODER_VERSION = '1.5.6';\nconst DRACO_ENCODER_VERSION = '1.4.1';\n\nconst STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;\n\nexport const DRACO_EXTERNAL_LIBRARIES = {\n  /** The primary Draco3D encoder, javascript wrapper part */\n  DECODER: 'draco_wasm_wrapper.js',\n  /** The primary draco decoder, compiled web assembly part */\n  DECODER_WASM: 'draco_decoder.wasm',\n  /** Fallback decoder for non-webassebly environments. Very big bundle, lower performance */\n  FALLBACK_DECODER: 'draco_decoder.js',\n  /** Draco encoder */\n  ENCODER: 'draco_encoder.js'\n};\n\nexport const DRACO_EXTERNAL_LIBRARY_URLS = {\n  [DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,\n  [DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,\n  [DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,\n  [DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`\n};\n\nlet loadDecoderPromise;\nlet loadEncoderPromise;\n\nexport async function loadDracoDecoderModule(\n  options: LoadLibraryOptions = {},\n  type: 'wasm' | 'js'\n) {\n  const modules = options.modules || {};\n\n  // Check if a bundled draco3d library has been supplied by application\n  if (modules.draco3d) {\n    loadDecoderPromise ||= modules.draco3d.createDecoderModule({}).then((draco) => {\n      return {draco};\n    });\n  } else {\n    // If not, dynamically load the WASM script from our CDN\n    loadDecoderPromise ||= loadDracoDecoder(options, type);\n  }\n  return await loadDecoderPromise;\n}\n\nexport async function loadDracoEncoderModule(options: LoadLibraryOptions) {\n  const modules = options.modules || {};\n\n  // Check if a bundled draco3d library has been supplied by application\n  if (modules.draco3d) {\n    loadEncoderPromise ||= modules.draco3d.createEncoderModule({}).then((draco) => {\n      return {draco};\n    });\n  } else {\n    // If not, dynamically load the WASM script from our CDN\n    loadEncoderPromise ||= loadDracoEncoder(options);\n  }\n  return await loadEncoderPromise;\n}\n\nfunction getLibraryExport(library: any, exportName: string): any {\n  if (library && typeof library === 'object') {\n    if (library.default) {\n      return library.default;\n    }\n    if (library[exportName]) {\n      return library[exportName];\n    }\n  }\n  return library;\n}\n\n// DRACO DECODER LOADING\n/** @todo - type the options, they are inconsistent */\nasync function loadDracoDecoder(options: LoadLibraryOptions, type: 'wasm' | 'js') {\n  let DracoDecoderModule;\n  let wasmBinary;\n  switch (type) {\n    case 'js':\n      DracoDecoderModule = await loadLibrary(\n        DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER],\n        'draco',\n        options,\n        DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER\n      );\n      break;\n\n    case 'wasm':\n    default:\n      try {\n        [DracoDecoderModule, wasmBinary] = await Promise.all([\n          await loadLibrary(\n            DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],\n            'draco',\n            options,\n            DRACO_EXTERNAL_LIBRARIES.DECODER\n          ),\n          await loadLibrary(\n            DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],\n            'draco',\n            options,\n            DRACO_EXTERNAL_LIBRARIES.DECODER_WASM\n          )\n        ]);\n      } catch {\n        DracoDecoderModule = null;\n        wasmBinary = null;\n      }\n  }\n  DracoDecoderModule = getLibraryExport(DracoDecoderModule, 'DracoDecoderModule');\n  // @ts-ignore\n  DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;\n\n  // In Node environments without network access, fall back to local copies in the repo.\n  if (!DracoDecoderModule && !isBrowser) {\n    [DracoDecoderModule, wasmBinary] = await Promise.all([\n      await loadLibrary(\n        DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER],\n        'draco',\n        {...options, useLocalLibraries: true},\n        DRACO_EXTERNAL_LIBRARIES.DECODER\n      ),\n      await loadLibrary(\n        DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM],\n        'draco',\n        {...options, useLocalLibraries: true},\n        DRACO_EXTERNAL_LIBRARIES.DECODER_WASM\n      )\n    ]);\n    DracoDecoderModule = getLibraryExport(DracoDecoderModule, 'DracoDecoderModule');\n    // @ts-ignore\n    DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;\n  }\n\n  return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);\n}\n\nfunction initializeDracoDecoder(DracoDecoderModule, wasmBinary) {\n  if (typeof DracoDecoderModule !== 'function') {\n    throw new Error('DracoDecoderModule could not be loaded');\n  }\n\n  const options: {wasmBinary?: any} = {};\n  if (wasmBinary) {\n    options.wasmBinary = wasmBinary;\n  }\n\n  return new Promise((resolve) => {\n    DracoDecoderModule({\n      ...options,\n      onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n    });\n  });\n}\n\n// ENCODER\n\nasync function loadDracoEncoder(options: LoadLibraryOptions) {\n  let DracoEncoderModule = await loadLibrary(\n    DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],\n    'draco',\n    options,\n    DRACO_EXTERNAL_LIBRARIES.ENCODER\n  );\n  DracoEncoderModule = getLibraryExport(DracoEncoderModule, 'DracoEncoderModule');\n  // @ts-ignore\n  DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;\n\n  // In Node environments without network access, fall back to local copies in the repo.\n  if (!DracoEncoderModule && !isBrowser) {\n    DracoEncoderModule = await loadLibrary(\n      DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.ENCODER],\n      'draco',\n      {...options, useLocalLibraries: true},\n      DRACO_EXTERNAL_LIBRARIES.ENCODER\n    );\n    DracoEncoderModule = getLibraryExport(DracoEncoderModule, 'DracoEncoderModule');\n    // @ts-ignore\n    DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;\n  }\n\n  if (typeof DracoEncoderModule !== 'function') {\n    throw new Error('DracoEncoderModule could not be loaded');\n  }\n\n  return new Promise((resolve) => {\n    DracoEncoderModule({\n      onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n    });\n  });\n}\n", "// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n", "import {MeshAttribute, Schema, Field} from '@loaders.gl/schema';\nimport {deduceMeshField} from '@loaders.gl/schema-utils';\nimport type {DracoAttribute, DracoLoaderData, DracoMetadataEntry} from '../draco-types';\n\n/** Extract an arrow-like schema from a Draco mesh */\nexport function getDracoSchema(\n  attributes: {[attributeName: string]: MeshAttribute},\n  loaderData: DracoLoaderData,\n  indices?: MeshAttribute\n): Schema {\n  const metadata = makeMetadata(loaderData.metadata);\n  const fields: Field[] = [];\n  const namedLoaderDataAttributes = transformAttributesLoaderData(loaderData.attributes);\n  for (const attributeName in attributes) {\n    const attribute = attributes[attributeName];\n    const field = getArrowFieldFromAttribute(\n      attributeName,\n      attribute,\n      namedLoaderDataAttributes[attributeName]\n    );\n    fields.push(field);\n  }\n  if (indices) {\n    const indicesField = getArrowFieldFromAttribute('indices', indices);\n    fields.push(indicesField);\n  }\n  return {fields, metadata};\n}\n\nfunction transformAttributesLoaderData(loaderData: {[key: number]: DracoAttribute}): {\n  [attributeName: string]: DracoAttribute;\n} {\n  const result: {[attributeName: string]: DracoAttribute} = {};\n  for (const key in loaderData) {\n    const dracoAttribute = loaderData[key];\n    result[dracoAttribute.name || 'undefined'] = dracoAttribute;\n  }\n  return result;\n}\n\nfunction getArrowFieldFromAttribute(\n  attributeName: string,\n  attribute: MeshAttribute,\n  loaderData?: DracoAttribute\n): Field {\n  const metadataMap = loaderData ? makeMetadata(loaderData.metadata) : undefined;\n  const field = deduceMeshField(attributeName, attribute, metadataMap);\n  return field;\n}\n\nfunction makeMetadata(metadata: {[key: string]: DracoMetadataEntry}): Record<string, string> {\n  Object.entries(metadata);\n  const serializedMetadata: Record<string, string> = {};\n  for (const key in metadata) {\n    serializedMetadata[`${key}.string`] = JSON.stringify(metadata[key]);\n  }\n  return serializedMetadata;\n}\n", "/* eslint-disable camelcase */\n\nimport type {TypedArray, MeshAttribute, MeshGeometry} from '@loaders.gl/schema';\n\n// Draco types (input)\nimport type {\n  Draco3D,\n  Decoder,\n  Mesh,\n  PointCloud,\n  PointAttribute,\n  Metadata,\n  MetadataQuerier,\n  DracoInt32Array,\n  draco_DataType\n} from '../draco3d/draco3d-types';\n\n// Parsed data types (output)\nimport type {\n  DracoMesh,\n  DracoLoaderData,\n  DracoAttribute,\n  DracoMetadataEntry,\n  DracoQuantizationTransform,\n  DracoOctahedronTransform\n} from './draco-types';\n\nimport {getMeshBoundingBox} from '@loaders.gl/schema-utils';\nimport {getDracoSchema} from './utils/get-draco-schema';\n\n/** Options to control draco parsing */\nexport type DracoParseOptions = {\n  /** How triangle indices should be generated (mesh only) */\n  topology?: 'triangle-list' | 'triangle-strip';\n  /** Specify which attribute metadata entry stores the attribute name */\n  attributeNameEntry?: string;\n  /** Names and ids of extra attributes to include in the output */\n  extraAttributes?: {[uniqueId: string]: number};\n  /** Skip transforms specific quantized attributes */\n  quantizedAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n  /** Skip transforms specific octahedron encoded  attributes */\n  octahedronAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n};\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst GEOMETRY_TYPE = {\n  TRIANGULAR_MESH: 0,\n  POINT_CLOUD: 1\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP = {\n  POSITION: 'POSITION',\n  NORMAL: 'NORMAL',\n  COLOR: 'COLOR_0',\n  TEX_COORD: 'TEXCOORD_0'\n};\n\nconst DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP = {\n  1: Int8Array,\n  2: Uint8Array,\n  3: Int16Array,\n  4: Uint16Array,\n  5: Int32Array,\n  6: Uint32Array,\n  // 7: BigInt64Array,\n  // 8: BigUint64Array,\n  9: Float32Array\n  // 10: Float64Array\n  // 11: BOOL - What array type do we use for this?\n};\n\nconst INDEX_ITEM_SIZE = 4;\n\nexport default class DracoParser {\n  draco: Draco3D;\n  decoder: Decoder;\n  metadataQuerier: MetadataQuerier;\n\n  // draco - the draco decoder, either import `draco3d` or load dynamically\n  constructor(draco: Draco3D) {\n    this.draco = draco;\n    this.decoder = new this.draco.Decoder();\n    this.metadataQuerier = new this.draco.MetadataQuerier();\n  }\n\n  /**\n   * Destroy draco resources\n   */\n  destroy(): void {\n    this.draco.destroy(this.decoder);\n    this.draco.destroy(this.metadataQuerier);\n  }\n\n  /**\n   * NOTE: caller must call `destroyGeometry` on the return value after using it\n   * @param arrayBuffer\n   * @param options\n   */\n  parseSync(arrayBuffer: ArrayBuffer, options: DracoParseOptions = {}): DracoMesh {\n    const buffer = new this.draco.DecoderBuffer();\n    buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength);\n\n    this._disableAttributeTransforms(options);\n\n    const geometry_type = this.decoder.GetEncodedGeometryType(buffer);\n    const dracoGeometry =\n      geometry_type === this.draco.TRIANGULAR_MESH\n        ? new this.draco.Mesh()\n        : new this.draco.PointCloud();\n\n    try {\n      let dracoStatus;\n      switch (geometry_type) {\n        case this.draco.TRIANGULAR_MESH:\n          dracoStatus = this.decoder.DecodeBufferToMesh(buffer, dracoGeometry as Mesh);\n          break;\n\n        case this.draco.POINT_CLOUD:\n          dracoStatus = this.decoder.DecodeBufferToPointCloud(buffer, dracoGeometry);\n          break;\n\n        default:\n          throw new Error('DRACO: Unknown geometry type.');\n      }\n\n      if (!dracoStatus.ok() || !dracoGeometry.ptr) {\n        const message = `DRACO decompression failed: ${dracoStatus.error_msg()}`;\n        // console.error(message);\n        throw new Error(message);\n      }\n\n      const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);\n\n      const geometry = this._getMeshData(dracoGeometry, loaderData, options);\n\n      const boundingBox = getMeshBoundingBox(geometry.attributes);\n\n      const schema = getDracoSchema(geometry.attributes, loaderData, geometry.indices);\n\n      const data: DracoMesh = {\n        loader: 'draco',\n        loaderData,\n        header: {\n          vertexCount: dracoGeometry.num_points(),\n          boundingBox\n        },\n        ...geometry,\n        schema\n      };\n      return data;\n    } finally {\n      this.draco.destroy(buffer);\n      if (dracoGeometry) {\n        this.draco.destroy(dracoGeometry);\n      }\n    }\n  }\n\n  // Draco specific \"loader data\"\n\n  /**\n   * Extract\n   * @param dracoGeometry\n   * @param geometry_type\n   * @param options\n   * @returns\n   */\n  _getDracoLoaderData(\n    dracoGeometry: Mesh | PointCloud,\n    geometry_type,\n    options: DracoParseOptions\n  ): DracoLoaderData {\n    const metadata = this._getTopLevelMetadata(dracoGeometry);\n    const attributes = this._getDracoAttributes(dracoGeometry, options);\n\n    return {\n      geometry_type,\n      num_attributes: dracoGeometry.num_attributes(),\n      num_points: dracoGeometry.num_points(),\n      num_faces: dracoGeometry instanceof this.draco.Mesh ? dracoGeometry.num_faces() : 0,\n      metadata,\n      attributes\n    };\n  }\n\n  /**\n   * Extract all draco provided information and metadata for each attribute\n   * @param dracoGeometry\n   * @param options\n   * @returns\n   */\n  _getDracoAttributes(\n    dracoGeometry: Mesh | PointCloud,\n    options: DracoParseOptions\n  ): {[unique_id: number]: DracoAttribute} {\n    const dracoAttributes: {[unique_id: number]: DracoAttribute} = {};\n\n    for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n      // Note: Draco docs do not seem clear on `GetAttribute` ids just being a zero-based index,\n      // but it does seems to work this way\n      const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n\n      const metadata = this._getAttributeMetadata(dracoGeometry, attributeId);\n\n      dracoAttributes[dracoAttribute.unique_id()] = {\n        unique_id: dracoAttribute.unique_id(),\n        attribute_type: dracoAttribute.attribute_type(),\n        data_type: dracoAttribute.data_type(),\n        num_components: dracoAttribute.num_components(),\n\n        byte_offset: dracoAttribute.byte_offset(),\n        byte_stride: dracoAttribute.byte_stride(),\n        normalized: dracoAttribute.normalized(),\n        attribute_index: attributeId,\n\n        metadata\n      };\n\n      // Add transformation parameters for any attributes app wants untransformed\n      const quantization = this._getQuantizationTransform(dracoAttribute, options);\n      if (quantization) {\n        dracoAttributes[dracoAttribute.unique_id()].quantization_transform = quantization;\n      }\n\n      const octahedron = this._getOctahedronTransform(dracoAttribute, options);\n      if (octahedron) {\n        dracoAttributes[dracoAttribute.unique_id()].octahedron_transform = octahedron;\n      }\n    }\n\n    return dracoAttributes;\n  }\n\n  /**\n   * Get standard loaders.gl mesh category data\n   * Extracts the geometry from draco\n   * @param dracoGeometry\n   * @param options\n   */\n  _getMeshData(\n    dracoGeometry: Mesh | PointCloud,\n    loaderData: DracoLoaderData,\n    options: DracoParseOptions\n  ): MeshGeometry {\n    const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);\n\n    const positionAttribute = attributes.POSITION;\n    if (!positionAttribute) {\n      throw new Error('DRACO: No position attribute found.');\n    }\n\n    // For meshes, we need indices to define the faces.\n    if (dracoGeometry instanceof this.draco.Mesh) {\n      switch (options.topology) {\n        case 'triangle-strip':\n          return {\n            topology: 'triangle-strip',\n            // TODO - mode is wrong?\n            mode: 4, // GL.TRIANGLES\n            attributes,\n            indices: {\n              value: this._getTriangleStripIndices(dracoGeometry),\n              size: 1\n            }\n          };\n        case 'triangle-list':\n        default:\n          return {\n            topology: 'triangle-list',\n            // TODO - mode is wrong?\n            mode: 5, // GL.TRIANGLE_STRIP\n            attributes,\n            indices: {\n              value: this._getTriangleListIndices(dracoGeometry),\n              size: 1\n            }\n          };\n      }\n    }\n\n    // PointCloud - must come last as Mesh inherits from PointCloud\n    return {\n      topology: 'point-list',\n      mode: 0, // GL.POINTS\n      attributes\n    };\n  }\n\n  _getMeshAttributes(\n    loaderData: DracoLoaderData,\n    dracoGeometry: Mesh | PointCloud,\n    options: DracoParseOptions\n  ): {[attributeName: string]: MeshAttribute} {\n    const attributes: {[key: string]: MeshAttribute} = {};\n\n    for (const loaderAttribute of Object.values(loaderData.attributes)) {\n      const attributeName = this._deduceAttributeName(loaderAttribute, options);\n      loaderAttribute.name = attributeName;\n      const values = this._getAttributeValues(dracoGeometry, loaderAttribute);\n      if (values) {\n        const {value, size} = values;\n        attributes[attributeName] = {\n          value,\n          size,\n          byteOffset: loaderAttribute.byte_offset,\n          byteStride: loaderAttribute.byte_stride,\n          normalized: loaderAttribute.normalized\n        };\n      }\n    }\n\n    return attributes;\n  }\n\n  // MESH INDICES EXTRACTION\n\n  /**\n   * For meshes, we need indices to define the faces.\n   * @param dracoGeometry\n   */\n  _getTriangleListIndices(dracoGeometry: Mesh) {\n    // Example on how to retrieve mesh and attributes.\n    const numFaces = dracoGeometry.num_faces();\n    const numIndices = numFaces * 3;\n    const byteLength = numIndices * INDEX_ITEM_SIZE;\n\n    const ptr = this.draco._malloc(byteLength);\n    try {\n      this.decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);\n      return new Uint32Array(this.draco.HEAPF32.buffer, ptr, numIndices).slice();\n    } finally {\n      this.draco._free(ptr);\n    }\n  }\n\n  /**\n   * For meshes, we need indices to define the faces.\n   * @param dracoGeometry\n   */\n  _getTriangleStripIndices(dracoGeometry: Mesh) {\n    const dracoArray = new this.draco.DracoInt32Array();\n    try {\n      /* const numStrips = */ this.decoder.GetTriangleStripsFromMesh(dracoGeometry, dracoArray);\n      return getUint32Array(dracoArray);\n    } finally {\n      this.draco.destroy(dracoArray);\n    }\n  }\n\n  /**\n   *\n   * @param dracoGeometry\n   * @param dracoAttribute\n   * @param attributeName\n   */\n  _getAttributeValues(\n    dracoGeometry: Mesh | PointCloud,\n    attribute: DracoAttribute\n  ): {value: TypedArray; size: number} | null {\n    const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];\n    if (!TypedArrayCtor) {\n      // eslint-disable-next-line no-console\n      console.warn(`DRACO: Unsupported attribute type ${attribute.data_type}`);\n      return null;\n    }\n    const numComponents = attribute.num_components;\n    const numPoints = dracoGeometry.num_points();\n    const numValues = numPoints * numComponents;\n\n    const byteLength = numValues * TypedArrayCtor.BYTES_PER_ELEMENT;\n    const dataType = getDracoDataType(this.draco, TypedArrayCtor);\n\n    let value: TypedArray;\n\n    const ptr = this.draco._malloc(byteLength);\n    try {\n      const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);\n      this.decoder.GetAttributeDataArrayForAllPoints(\n        dracoGeometry,\n        dracoAttribute,\n        dataType,\n        byteLength,\n        ptr\n      );\n      value = new TypedArrayCtor(this.draco.HEAPF32.buffer, ptr, numValues).slice();\n    } finally {\n      this.draco._free(ptr);\n    }\n\n    return {value, size: numComponents};\n  }\n\n  // Attribute names\n\n  /** \n   * DRACO does not store attribute names - We need to deduce an attribute name\n   * for each attribute\n  _getAttributeNames(\n    dracoGeometry: Mesh | PointCloud,\n    options: DracoParseOptions\n  ): {[unique_id: number]: string} {\n    const attributeNames: {[unique_id: number]: string} = {};\n    for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n      const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n      const attributeName = this._deduceAttributeName(dracoAttribute, options);\n      attributeNames[attributeName] = attributeName;\n    }\n    return attributeNames;\n  }\n   */\n\n  /**\n   * Deduce an attribute name.\n   * @note DRACO does not save attribute names, just general type (POSITION, COLOR)\n   * to help optimize compression. We generate GLTF compatible names for the Draco-recognized\n   * types\n   * @param attributeData\n   */\n  _deduceAttributeName(attribute: DracoAttribute, options: DracoParseOptions): string {\n    // Deduce name based on application provided map\n    const uniqueId = attribute.unique_id;\n    for (const [attributeName, attributeUniqueId] of Object.entries(\n      options.extraAttributes || {}\n    )) {\n      if (attributeUniqueId === uniqueId) {\n        return attributeName;\n      }\n    }\n\n    // Deduce name based on attribute type\n    const thisAttributeType = attribute.attribute_type;\n    for (const dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP) {\n      const attributeType = this.draco[dracoAttributeConstant];\n      if (attributeType === thisAttributeType) {\n        // TODO - Return unique names if there multiple attributes per type\n        // (e.g. multiple TEX_COORDS or COLORS)\n        return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];\n      }\n    }\n\n    // Look up in metadata\n    // TODO - shouldn't this have priority?\n    const entryName = options.attributeNameEntry || 'name';\n    if (attribute.metadata[entryName]) {\n      return attribute.metadata[entryName].string;\n    }\n\n    // Attribute of \"GENERIC\" type, we need to assign some name\n    return `CUSTOM_ATTRIBUTE_${uniqueId}`;\n  }\n\n  // METADATA EXTRACTION\n\n  /** Get top level metadata */\n  _getTopLevelMetadata(dracoGeometry: Mesh | PointCloud) {\n    const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);\n    return this._getDracoMetadata(dracoMetadata);\n  }\n\n  /** Get per attribute metadata */\n  _getAttributeMetadata(dracoGeometry: Mesh | PointCloud, attributeId: number) {\n    const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);\n    return this._getDracoMetadata(dracoMetadata);\n  }\n\n  /**\n   * Extract metadata field values\n   * @param dracoMetadata\n   * @returns\n   */\n  _getDracoMetadata(dracoMetadata: Metadata): {[entry: string]: DracoMetadataEntry} {\n    // The not so wonderful world of undocumented Draco APIs :(\n    if (!dracoMetadata || !dracoMetadata.ptr) {\n      return {};\n    }\n    const result = {};\n    const numEntries = this.metadataQuerier.NumEntries(dracoMetadata);\n    for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {\n      const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);\n      result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);\n    }\n    return result;\n  }\n\n  /**\n   * Extracts possible values for one metadata entry by name\n   * @param dracoMetadata\n   * @param entryName\n   */\n  _getDracoMetadataField(dracoMetadata: Metadata, entryName: string): DracoMetadataEntry {\n    const dracoArray = new this.draco.DracoInt32Array();\n    try {\n      // Draco metadata fields can hold int32 arrays\n      this.metadataQuerier.GetIntEntryArray(dracoMetadata, entryName, dracoArray);\n      const intArray = getInt32Array(dracoArray);\n      return {\n        int: this.metadataQuerier.GetIntEntry(dracoMetadata, entryName),\n        string: this.metadataQuerier.GetStringEntry(dracoMetadata, entryName),\n        double: this.metadataQuerier.GetDoubleEntry(dracoMetadata, entryName),\n        intArray\n      };\n    } finally {\n      this.draco.destroy(dracoArray);\n    }\n  }\n\n  // QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)\n\n  /** Skip transforms for specific attribute types */\n  _disableAttributeTransforms(options: DracoParseOptions) {\n    const {quantizedAttributes = [], octahedronAttributes = []} = options;\n    const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];\n    for (const dracoAttributeName of skipAttributes) {\n      this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);\n    }\n  }\n\n  /**\n   * Extract (and apply?) Position Transform\n   * @todo not used\n   */\n  _getQuantizationTransform(\n    dracoAttribute: PointAttribute,\n    options: DracoParseOptions\n  ): DracoQuantizationTransform | null {\n    const {quantizedAttributes = []} = options;\n    const attribute_type = dracoAttribute.attribute_type();\n    const skip = quantizedAttributes.map((type) => this.decoder[type]).includes(attribute_type);\n    if (skip) {\n      const transform = new this.draco.AttributeQuantizationTransform();\n      try {\n        if (transform.InitFromAttribute(dracoAttribute)) {\n          return {\n            quantization_bits: transform.quantization_bits(),\n            range: transform.range(),\n            min_values: new Float32Array([1, 2, 3]).map((i) => transform.min_value(i))\n          };\n        }\n      } finally {\n        this.draco.destroy(transform);\n      }\n    }\n    return null;\n  }\n\n  _getOctahedronTransform(\n    dracoAttribute: PointAttribute,\n    options: DracoParseOptions\n  ): DracoOctahedronTransform | null {\n    const {octahedronAttributes = []} = options;\n    const attribute_type = dracoAttribute.attribute_type();\n    const octahedron = octahedronAttributes\n      .map((type) => this.decoder[type])\n      .includes(attribute_type);\n    if (octahedron) {\n      const transform = new this.draco.AttributeQuantizationTransform();\n      try {\n        if (transform.InitFromAttribute(dracoAttribute)) {\n          return {\n            quantization_bits: transform.quantization_bits()\n          };\n        }\n      } finally {\n        this.draco.destroy(transform);\n      }\n    }\n    return null;\n  }\n\n  // HELPERS\n}\n\n/**\n * Get draco specific data type by TypedArray constructor type\n * @param attributeType\n * @returns draco specific data type\n */\nfunction getDracoDataType(draco: Draco3D, attributeType: any): draco_DataType {\n  switch (attributeType) {\n    case Float32Array:\n      return draco.DT_FLOAT32;\n    case Int8Array:\n      return draco.DT_INT8;\n    case Int16Array:\n      return draco.DT_INT16;\n    case Int32Array:\n      return draco.DT_INT32;\n    case Uint8Array:\n      return draco.DT_UINT8;\n    case Uint16Array:\n      return draco.DT_UINT16;\n    case Uint32Array:\n      return draco.DT_UINT32;\n    default:\n      return draco.DT_INVALID;\n  }\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getInt32Array(dracoArray: DracoInt32Array): Int32Array {\n  const numValues = dracoArray.size();\n  const intArray = new Int32Array(numValues);\n  for (let i = 0; i < numValues; i++) {\n    intArray[i] = dracoArray.GetValue(i);\n  }\n  return intArray;\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getUint32Array(dracoArray: DracoInt32Array): Int32Array {\n  const numValues = dracoArray.size();\n  const intArray = new Int32Array(numValues);\n  for (let i = 0; i < numValues; i++) {\n    intArray[i] = dracoArray.GetValue(i);\n  }\n  return intArray;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport {extractLoadLibraryOptions} from '@loaders.gl/worker-utils';\nimport type {DracoMesh} from './lib/draco-types';\nimport type {DracoParseOptions} from './lib/draco-parser';\nimport {VERSION} from './lib/utils/version';\nimport DracoParser from './lib/draco-parser';\nimport {loadDracoDecoderModule} from './lib/draco-module-loader';\n\nexport type DracoLoaderOptions = StrictLoaderOptions & {\n  draco?: DracoParseOptions & {\n    /** @deprecated WASM decoding is faster but JS is more backwards compatible */\n    decoderType?: 'wasm' | 'js';\n    /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n    workerUrl?: string;\n  };\n};\n\n/**\n * Worker loader for Draco3D compressed geometries\n */\nexport const DracoWorkerLoader = {\n  dataType: null as unknown as DracoMesh,\n  batchType: null as never,\n  name: 'Draco',\n  id: 'draco',\n  module: 'draco',\n  // shapes: ['mesh'],\n  version: VERSION,\n  worker: true,\n  extensions: ['drc'],\n  mimeTypes: ['application/octet-stream'],\n  binary: true,\n  tests: ['DRACO'],\n  options: {\n    draco: {\n      decoderType: typeof WebAssembly === 'object' ? 'wasm' : 'js', // 'js' for IE11\n      extraAttributes: {},\n      attributeNameEntry: undefined\n    }\n  }\n} as const satisfies Loader<DracoMesh, never, DracoLoaderOptions>;\n\n/**\n * Loader for Draco3D compressed geometries\n */\nexport const DracoLoader = {\n  ...DracoWorkerLoader,\n  parse\n} as const satisfies LoaderWithParser<DracoMesh, never, DracoLoaderOptions>;\n\nasync function parse(arrayBuffer: ArrayBuffer, options?: DracoLoaderOptions): Promise<DracoMesh> {\n  const {draco} = await loadDracoDecoderModule(\n    extractLoadLibraryOptions(options),\n    options?.draco?.decoderType || 'wasm'\n  );\n  const dracoParser = new DracoParser(draco);\n  try {\n    return dracoParser.parseSync(arrayBuffer, options?.draco);\n  } finally {\n    dracoParser.destroy();\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Module constants\nexport {DRACO_EXTERNAL_LIBRARIES, DRACO_EXTERNAL_LIBRARY_URLS} from './lib/draco-module-loader';\n\n// Draco data types\n\nexport type {DracoMesh, DracoLoaderData} from './lib/draco-types';\n\n// Draco Writer\n\nexport type {DracoWriterOptions} from './draco-writer';\nexport {DracoWriterWorker, DracoWriter} from './draco-writer';\n\n// Draco Loader\n\nexport type {DracoLoaderOptions} from './draco-loader';\nexport {DracoWorkerLoader, DracoLoader} from './draco-loader';\nexport {DracoArrowLoader} from './draco-arrow-loader';\n", "// import type {TypedArray} from '../types/loader-utils';\nimport type {GLTFAccessor} from '../types/gltf-json-schema';\n// TODO - remove\nimport {getAccessorTypeFromSize, getComponentTypeFromArray} from './gltf-utils';\n\n// Returns a fresh attributes object with glTF-standardized attributes names\n// Attributes that cannot be identified will not be included\n// Removes `indices` if present, as it should be stored separately from the attributes\nexport function getGLTFAccessors(attributes): {[key: string]: GLTFAccessor} {\n  const accessors = {};\n  for (const name in attributes) {\n    const attribute = attributes[name];\n    if (name !== 'indices') {\n      const glTFAccessor = getGLTFAccessor(attribute);\n      accessors[name] = glTFAccessor;\n    }\n  }\n  return accessors;\n}\n\n// Fix up a single accessor.\n// Input: typed array or a partial accessor object\n// Return: accessor object\nexport function getGLTFAccessor(attribute) {\n  const {buffer, size, count} = getAccessorData(attribute);\n\n  const glTFAccessor: GLTFAccessor = {\n    // glTF Accessor values\n    // TODO: Instead of a bufferView index we could have an actual buffer (typed array)\n    // bufferView: null,\n    // TODO: Deprecate `value` in favor of bufferView?\n    // @ts-ignore\n    value: buffer,\n    size, // Decoded `type` (e.g. SCALAR)\n\n    byteOffset: 0,\n    count,\n    type: getAccessorTypeFromSize(size),\n    componentType: getComponentTypeFromArray(buffer)\n  };\n\n  return glTFAccessor;\n}\n\n// export function getGLTFAttribute(data, gltfAttributeName): GLTFAccessor {\n//   return data.attributes[data.glTFAttributeMap[gltfAttributeName]];\n// }\n\nfunction getAccessorData(attribute) {\n  let buffer = attribute;\n  let size = 1;\n  let count = 0;\n\n  if (attribute && attribute.value) {\n    buffer = attribute.value;\n    size = attribute.size || 1;\n  }\n\n  if (buffer) {\n    if (!ArrayBuffer.isView(buffer)) {\n      buffer = toTypedArray(buffer, Float32Array);\n    }\n    count = buffer.length / size;\n  }\n\n  return {buffer, size, count};\n}\n\n// Convert non-typed arrays to arrays of specified format\nfunction toTypedArray(array, ArrayType, convertTypedArrays = false) {\n  if (!array) {\n    return null;\n  }\n  if (Array.isArray(array)) {\n    return new ArrayType(array);\n  }\n  if (convertTypedArrays && !(array instanceof ArrayType)) {\n    return new ArrayType(array);\n  }\n  return array;\n}\n", "// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\n/* eslint-disable camelcase */\n\nimport type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {sliceArrayBuffer, parseFromContext} from '@loaders.gl/loader-utils';\n\nimport {DracoLoader, DracoLoaderOptions} from '@loaders.gl/draco';\n\nimport type {\n  GLTF,\n  GLTFAccessor,\n  GLTFMeshPrimitive,\n  GLTF_KHR_draco_mesh_compression\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {getGLTFAccessors, getGLTFAccessor} from '../gltf-utils/gltf-attribute-utils';\n\nconst KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';\n\n/** Extension name */\nexport const name = KHR_DRACO_MESH_COMPRESSION;\n\nexport function preprocess(\n  gltfData: {json: GLTF},\n  options: GLTFLoaderOptions,\n  context: LoaderContext\n): void {\n  const scenegraph = new GLTFScenegraph(gltfData);\n  for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {\n    if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {\n      // TODO - Remove fallback accessors to make sure we don't load unnecessary buffers\n    }\n  }\n}\n\nexport async function decode(\n  gltfData: {json: GLTF},\n  options: GLTFLoaderOptions,\n  context: LoaderContext\n): Promise<void> {\n  if (!options?.gltf?.decompressMeshes) {\n    return;\n  }\n\n  const scenegraph = new GLTFScenegraph(gltfData);\n  const promises: Promise<void>[] = [];\n  for (const primitive of makeMeshPrimitiveIterator(scenegraph)) {\n    if (scenegraph.getObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION)) {\n      promises.push(decompressPrimitive(scenegraph, primitive, options, context));\n    }\n  }\n\n  // Decompress meshes in parallel\n  await Promise.all(promises);\n\n  // We have now decompressed all primitives, so remove the top-level extension\n  scenegraph.removeExtension(KHR_DRACO_MESH_COMPRESSION);\n}\n\nexport function encode(gltfData, options: GLTFLoaderOptions = {}): void {\n  const scenegraph = new GLTFScenegraph(gltfData);\n\n  for (const mesh of scenegraph.json.meshes || []) {\n    // eslint-disable-next-line camelcase\n    // @ts-ignore\n    compressMesh(mesh, options);\n    // NOTE: Only add the extension if something was actually compressed\n    scenegraph.addRequiredExtension(KHR_DRACO_MESH_COMPRESSION);\n  }\n}\n\n// DECODE\n\n// Unpacks one mesh primitive and removes the extension from the primitive\n// DracoDecoder needs to be imported and registered by app\n// Returns: Promise that resolves when all pending draco decoder jobs for this mesh complete\n\n// TODO - Implement fallback behavior per KHR_DRACO_MESH_COMPRESSION spec\n\nasync function decompressPrimitive(\n  scenegraph: GLTFScenegraph,\n  primitive: GLTFMeshPrimitive,\n  options: GLTFLoaderOptions,\n  context: LoaderContext\n): Promise<void> {\n  const dracoExtension = scenegraph.getObjectExtension<GLTF_KHR_draco_mesh_compression>(\n    primitive,\n    KHR_DRACO_MESH_COMPRESSION\n  );\n  if (!dracoExtension) {\n    return;\n  }\n\n  const buffer = scenegraph.getTypedArrayForBufferView(dracoExtension.bufferView);\n  // TODO - parse does not yet deal well with byte offsets embedded in typed arrays. Copy buffer\n  // TODO - remove when `parse` is fixed to handle `byteOffset`s\n  const bufferCopy = sliceArrayBuffer(buffer.buffer, buffer.byteOffset); // , buffer.byteLength);\n\n  const dracoOptions: DracoLoaderOptions = {...options};\n\n  // TODO - remove hack: The entire tileset might be included, too expensive to serialize\n  delete dracoOptions['3d-tiles'];\n  const decodedData = await parseFromContext(bufferCopy, DracoLoader, dracoOptions, context);\n\n  const decodedAttributes: {[key: string]: GLTFAccessor} = getGLTFAccessors(decodedData.attributes);\n\n  // Restore min/max values\n  for (const [attributeName, decodedAttribute] of Object.entries(decodedAttributes)) {\n    if (attributeName in primitive.attributes) {\n      const accessorIndex: number = primitive.attributes[attributeName];\n      const accessor = scenegraph.getAccessor(accessorIndex);\n      if (accessor?.min && accessor?.max) {\n        decodedAttribute.min = accessor.min;\n        decodedAttribute.max = accessor.max;\n      }\n    }\n  }\n\n  // @ts-ignore\n  primitive.attributes = decodedAttributes;\n  if (decodedData.indices) {\n    // @ts-ignore\n    primitive.indices = getGLTFAccessor(decodedData.indices);\n  }\n\n  // Extension has been processed, delete it\n  scenegraph.removeObjectExtension(primitive, KHR_DRACO_MESH_COMPRESSION);\n\n  checkPrimitive(primitive);\n}\n\n// ENCODE\n\n// eslint-disable-next-line max-len\n// Only TRIANGLES: 0x0004 and TRIANGLE_STRIP: 0x0005 are supported\nfunction compressMesh(attributes, indices, mode: number = 4, options, context: LoaderContext) {\n  if (!options.DracoWriter) {\n    throw new Error('options.gltf.DracoWriter not provided');\n  }\n\n  // TODO - use DracoWriter using encode w/ registered DracoWriter...\n  const compressedData = options.DracoWriter.encodeSync({attributes});\n\n  // Draco compression may change the order and number of vertices in a mesh.\n  // To satisfy the requirement that accessors properties be correct for both\n  // compressed and uncompressed data, generators should create uncompressed\n  // attributes and indices using data that has been decompressed from the Draco buffer,\n  // rather than the original source data.\n  // @ts-ignore TODO this needs to be fixed\n  const decodedData = context?.parseSync?.({attributes});\n  const fauxAccessors = options._addFauxAttributes(decodedData.attributes);\n\n  const bufferViewIndex = options.addBufferView(compressedData);\n\n  const glTFMesh = {\n    primitives: [\n      {\n        attributes: fauxAccessors, // TODO - verify with spec\n        mode, // GL.POINTS\n        extensions: {\n          [KHR_DRACO_MESH_COMPRESSION]: {\n            bufferView: bufferViewIndex,\n            attributes: fauxAccessors // TODO - verify with spec\n          }\n        }\n      }\n    ]\n  };\n\n  return glTFMesh;\n}\n\n// UTILS\n\nfunction checkPrimitive(primitive: GLTFMeshPrimitive) {\n  if (!primitive.attributes && Object.keys(primitive.attributes).length > 0) {\n    throw new Error('glTF: Empty primitive detected: Draco decompression failure?');\n  }\n}\n\nfunction* makeMeshPrimitiveIterator(scenegraph) {\n  for (const mesh of scenegraph.json.meshes || []) {\n    for (const primitive of mesh.primitives) {\n      yield primitive;\n    }\n  }\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */ // radians and degrees are common variable names\n\nimport type {NumericArray} from '@math.gl/types';\n\nimport type {MathArray} from '../classes/base/math-array';\n\nconst RADIANS_TO_DEGREES = (1 / Math.PI) * 180;\nconst DEGREES_TO_RADIANS = (1 / 180) * Math.PI;\n\nexport type ConfigurationOptions = {\n  EPSILON: number;\n  debug?: boolean;\n  precision: number;\n  printTypes?: boolean;\n  printDegrees?: boolean;\n  printRowMajor?: boolean;\n  _cartographicRadians?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required<ConfigurationOptions> = {\n  EPSILON: 1e-12,\n  debug: false,\n  precision: 4,\n  printTypes: false,\n  printDegrees: false,\n  printRowMajor: true,\n  _cartographicRadians: false\n};\n\n// We use a global field to store the config\ndeclare global {\n  // eslint-disable-next-line no-var\n  var mathgl: {\n    config: Required<ConfigurationOptions>;\n  };\n}\n\n// Configuration is truly global as of v3.6 to ensure single config even if multiple copies of math.gl\n// Multiple copies of config can be quite tricky to debug...\nglobalThis.mathgl = globalThis.mathgl || {config: {...DEFAULT_CONFIG}};\n\nexport const config = globalThis.mathgl.config;\n\nexport function configure(options: Partial<ConfigurationOptions>): ConfigurationOptions {\n  // Only copy existing keys\n  Object.assign(config, options);\n  return config;\n}\n\n/**\n * Formats a value into a string\n * @param value\n * @param param1\n * @returns\n */\nexport function formatValue(\n  value: number,\n  {precision = config.precision}: {precision?: number} = {}\n): string {\n  value = round(value);\n  // get rid of trailing zeros\n  return `${parseFloat(value.toPrecision(precision))}`;\n}\n\n/**\n * Check if value is an \"array\"\n * Returns `true` if value is either an array or a typed array\n * Note: returns `false` for `ArrayBuffer` and `DataView` instances\n * @note isTypedArray and isNumericArray are often more useful in TypeScript\n */\nexport function isArray(value: unknown): boolean {\n  return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));\n}\n\nexport function clone(array: NumericArray | MathArray): NumericArray {\n  return 'clone' in array ? array.clone() : array.slice();\n}\n\nexport function toRadians(degrees: number): number;\nexport function toRadians(degrees: NumericArray): NumericArray;\n\nexport function toRadians(degrees: number | NumericArray): number | NumericArray {\n  return radians(degrees as NumericArray);\n}\n\nexport function toDegrees(degrees: number): number;\nexport function toDegrees(degrees: NumericArray): NumericArray;\n\nexport function toDegrees(radians: number | NumericArray): number | NumericArray {\n  return degrees(radians as NumericArray);\n}\n\n// GLSL math function equivalents - Works on both single values and vectors\n\n/**\n * \"GLSL equivalent\" radians: Works on single values and vectors\n */\nexport function radians(degrees: number): number;\nexport function radians(degrees: NumericArray, result?: NumericArray): NumericArray;\n\nexport function radians(\n  degrees: number | NumericArray,\n  result?: NumericArray\n): number | NumericArray {\n  return map(degrees, (degrees) => degrees * DEGREES_TO_RADIANS, result);\n}\n\n/**\n * \"GLSL equivalent\" degrees: Works on single values and vectors\n */\nexport function degrees(radians: number): number;\nexport function degrees(radians: NumericArray, result?: NumericArray): NumericArray;\n\nexport function degrees(\n  radians: number | NumericArray,\n  result?: NumericArray\n): number | NumericArray {\n  return map(radians, (radians) => radians * RADIANS_TO_DEGREES, result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.sin`: Works on single values and vectors\n * @deprecated\n */\nexport function sin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.sin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.cos`: Works on single values and vectors\n * @deprecated\n */\nexport function cos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.cos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.tan`: Works on single values and vectors\n * @deprecated\n */\nexport function tan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.tan(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.asin`: Works on single values and vectors\n * @deprecated\n */\nexport function asin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.asin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.acos`: Works on single values and vectors\n * @deprecated\n */\nexport function acos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.acos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.atan`: Works on single values and vectors\n * @deprecated\n */\nexport function atan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n  return map(radians, (angle) => Math.atan(angle), result);\n}\n\n/**\n * GLSL style value clamping: Works on single values and vectors\n */\nexport function clamp(value: number, min: number, max: number): number;\nexport function clamp(value: NumericArray, min: number, max: number): NumericArray;\n\nexport function clamp(\n  value: number | NumericArray,\n  min: number,\n  max: number\n): number | NumericArray {\n  return map(value, (value) => Math.max(min, Math.min(max, value)));\n}\n\n/**\n * Interpolate between two numbers or two arrays\n */\nexport function lerp(a: number, b: number, t: number): number;\nexport function lerp(a: NumericArray, b: NumericArray, t: number): NumericArray;\n\nexport function lerp(\n  a: number | NumericArray,\n  b: number | NumericArray,\n  t: number\n): number | NumericArray {\n  if (isArray(a)) {\n    return (a as NumericArray).map((ai: number, i: number) => lerp(ai, (b as NumericArray)[i], t));\n  }\n  return t * (b as number) + (1 - t) * (a as number);\n}\n\n/* eslint-disable */\n\n/**\n * Compares any two math objects, using `equals` method if available.\n * @param a\n * @param b\n * @param epsilon\n * @returns\n */\nexport function equals(a: any, b: any, epsilon?: number): boolean {\n  const oldEpsilon = config.EPSILON;\n  if (epsilon) {\n    config.EPSILON = epsilon;\n  }\n  try {\n    if (a === b) {\n      return true;\n    }\n    if (isArray(a) && isArray(b)) {\n      if (a.length !== b.length) {\n        return false;\n      }\n      for (let i = 0; i < a.length; ++i) {\n        // eslint-disable-next-line max-depth\n        if (!equals(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    if (a && a.equals) {\n      return a.equals(b);\n    }\n    if (b && b.equals) {\n      return b.equals(a);\n    }\n    if (typeof a === 'number' && typeof b === 'number') {\n      return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n    }\n    return false;\n  } finally {\n    config.EPSILON = oldEpsilon;\n  }\n}\n\nexport function exactEquals(a: any, b: any): boolean {\n  if (a === b) {\n    return true;\n  }\n  if (a && typeof a === 'object' && b && typeof b === 'object') {\n    if (a.constructor !== b.constructor) {\n      return false;\n    }\n    if (a.exactEquals) {\n      return a.exactEquals(b);\n    }\n  }\n  if (isArray(a) && isArray(b)) {\n    if (a.length !== b.length) {\n      return false;\n    }\n    for (let i = 0; i < a.length; ++i) {\n      if (!exactEquals(a[i], b[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return false;\n}\n\n/* eslint-enable */\n\nexport function withEpsilon<T>(epsilon: number, func: () => T): T {\n  const oldPrecision = config.EPSILON;\n  config.EPSILON = epsilon;\n  let value: T;\n  try {\n    value = func();\n  } finally {\n    config.EPSILON = oldPrecision;\n  }\n  return value;\n}\n\n// HELPERS\n\nfunction round(value: number): number {\n  return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\n// If the array has a clone function, calls it, otherwise returns a copy\nfunction duplicateArray(array: NumericArray): NumericArray {\n  // @ts-expect-error We check for math.gl class methods\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n  return array.clone ? (array.clone() as NumericArray) : (new Array(array.length) as number[]);\n}\n\n// If the argument value is an array, applies the func element wise,\n// otherwise applies func to the argument value\nfunction map(\n  value: number | NumericArray,\n  func: (x: number, index?: number, resultArray?: NumericArray) => number,\n  result?: NumericArray\n): number | NumericArray {\n  if (isArray(value)) {\n    const array = value as NumericArray;\n    result = result || duplicateArray(array);\n    for (let i = 0; i < result.length && i < array.length; ++i) {\n      const val = typeof value === 'number' ? value : value[i];\n      result[i] = func(val, i, result);\n    }\n    return result;\n  }\n  return func(value as number);\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NumericArray} from '@math.gl/types';\nimport {ConfigurationOptions, config, formatValue, equals, isArray} from '../../lib/common';\n\n/** Base class for vectors and matrices */\nexport abstract class MathArray extends Array<number> {\n  /** Number of elements (values) in this array */\n  abstract get ELEMENTS(): number;\n\n  abstract copy(vector: Readonly<NumericArray>): this;\n\n  abstract fromObject(object: Record<string, unknown>): this;\n\n  // Common methods\n\n  /**\n   * Clone the current object\n   * @returns a new copy of this object\n   */\n  clone(): this {\n    // @ts-expect-error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.\n    return new this.constructor().copy(this); // eslint-disable-line\n  }\n\n  fromArray(array: Readonly<NumericArray>, offset: number = 0): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = array[i + offset];\n    }\n    return this.check();\n  }\n\n  toArray<TypedArray>(targetArray: TypedArray, offset?: number): TypedArray;\n  toArray(targetArray?: number[], offset?: number): NumericArray;\n\n  toArray(targetArray: NumericArray = [], offset: number = 0): NumericArray {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      targetArray[offset + i] = this[i];\n    }\n    return targetArray;\n  }\n\n  toObject(targetObject: Record<string, unknown>): Record<string, unknown> {\n    return targetObject;\n  }\n\n  from(arrayOrObject: Readonly<NumericArray> | Record<string, unknown>): this {\n    return Array.isArray(arrayOrObject)\n      ? this.copy(arrayOrObject)\n      : // @ts-ignore\n        this.fromObject(arrayOrObject);\n  }\n\n  to<T extends NumericArray | Record<string, unknown>>(arrayOrObject: T): T {\n    // @ts-ignore\n    if (arrayOrObject === this) {\n      return this as T;\n    }\n    // @ts-expect-error TS2339: Property 'toObject' does not exist on type 'MathArray'.\n    return isArray(arrayOrObject) ? this.toArray(arrayOrObject) : this.toObject(arrayOrObject);\n  }\n\n  toTarget(target: this): this {\n    return target ? this.to(target) : this;\n  }\n\n  /** @deprecated */\n  toFloat32Array(): Float32Array {\n    return new Float32Array(this);\n  }\n\n  override toString(): string {\n    return this.formatString(config);\n  }\n\n  /** Formats string according to options */\n  formatString(opts: ConfigurationOptions): string {\n    let string = '';\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      string += (i > 0 ? ', ' : '') + formatValue(this[i], opts);\n    }\n    return `${opts.printTypes ? this.constructor.name : ''}[${string}]`;\n  }\n\n  equals(array: Readonly<NumericArray>): boolean {\n    if (!array || this.length !== array.length) {\n      return false;\n    }\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      if (!equals(this[i], array[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  exactEquals(array: Readonly<NumericArray>): boolean {\n    if (!array || this.length !== array.length) {\n      return false;\n    }\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      if (this[i] !== array[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  // Modifiers\n\n  /** Negates all values in this object */\n  negate(): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = -this[i];\n    }\n    return this.check();\n  }\n\n  /** Linearly interpolates between two values */\n  lerp(a: Readonly<NumericArray>, t: number): this;\n  lerp(a: Readonly<NumericArray>, b: Readonly<NumericArray>, t: number): this;\n\n  lerp(a: Readonly<NumericArray>, b: Readonly<NumericArray> | number, t?: number): this {\n    if (t === undefined) {\n      return this.lerp(this, a, b as number);\n    }\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      const ai = a[i];\n      const endValue = typeof b === 'number' ? b : b[i];\n      this[i] = ai + t * (endValue - ai);\n    }\n    return this.check();\n  }\n\n  /** Minimal */\n  min(vector: Readonly<NumericArray>): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = Math.min(vector[i], this[i]);\n    }\n    return this.check();\n  }\n\n  /** Maximal */\n  max(vector: Readonly<NumericArray>): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = Math.max(vector[i], this[i]);\n    }\n    return this.check();\n  }\n\n  clamp(minVector: Readonly<NumericArray>, maxVector: Readonly<NumericArray>): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);\n    }\n    return this.check();\n  }\n\n  add(...vectors: Readonly<NumericArray>[]): this {\n    for (const vector of vectors) {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] += vector[i];\n      }\n    }\n    return this.check();\n  }\n\n  subtract(...vectors: Readonly<NumericArray>[]): this {\n    for (const vector of vectors) {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] -= vector[i];\n      }\n    }\n    return this.check();\n  }\n\n  scale(scale: number | Readonly<NumericArray>): this {\n    if (typeof scale === 'number') {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] *= scale;\n      }\n    } else {\n      for (let i = 0; i < this.ELEMENTS && i < scale.length; ++i) {\n        this[i] *= scale[i];\n      }\n    }\n    return this.check();\n  }\n\n  /**\n   * Multiplies all elements by `scale`\n   * Note: `Matrix4.multiplyByScalar` only scales its 3x3 \"minor\"\n   */\n  multiplyByScalar(scalar: number): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] *= scalar;\n    }\n    return this.check();\n  }\n\n  // Debug checks\n\n  /** Throws an error if array length is incorrect or contains illegal values */\n  check(): this {\n    if (config.debug && !this.validate()) {\n      throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);\n    }\n    return this;\n  }\n\n  /** Returns false if the array length is incorrect or contains illegal values */\n  validate(): boolean {\n    let valid = this.length === this.ELEMENTS;\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      valid = valid && Number.isFinite(this[i]);\n    }\n    return valid;\n  }\n\n  // three.js compatibility\n\n  /** @deprecated */\n  sub(a: Readonly<NumericArray>): this {\n    return this.subtract(a);\n  }\n\n  /** @deprecated */\n  setScalar(a: number): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = a;\n    }\n    return this.check();\n  }\n\n  /** @deprecated */\n  addScalar(a: number): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] += a;\n    }\n    return this.check();\n  }\n\n  /** @deprecated */\n  subScalar(a: number): this {\n    return this.addScalar(-a);\n  }\n\n  /** @deprecated */\n  multiplyScalar(scalar: number): this {\n    // Multiplies all elements\n    // `Matrix4.scale` only scales its 3x3 \"minor\"\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] *= scalar;\n    }\n    return this.check();\n  }\n\n  /** @deprecated */\n  divideScalar(a: number): this {\n    return this.multiplyByScalar(1 / a);\n  }\n\n  /** @deprecated */\n  clampScalar(min: number, max: number): this {\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      this[i] = Math.min(Math.max(this[i], min), max);\n    }\n    return this.check();\n  }\n\n  /** @deprecated */\n  get elements(): NumericArray {\n    return this;\n  }\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NumericArray} from '@math.gl/types';\nimport {config} from './common';\n\nexport function validateVector(v: NumericArray, length: number): boolean {\n  if (v.length !== length) {\n    return false;\n  }\n  // Could be arguments \"array\" (v.every not availasble)\n  for (let i = 0; i < v.length; ++i) {\n    if (!Number.isFinite(v[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function checkNumber(value: unknown): number {\n  if (!Number.isFinite(value)) {\n    throw new Error(`Invalid number ${JSON.stringify(value)}`);\n  }\n  return value as number;\n}\n\nexport function checkVector<T extends NumericArray>(\n  v: T,\n  length: number,\n  callerName: string = ''\n): T {\n  if (config.debug && !validateVector(v, length)) {\n    throw new Error(`math.gl: ${callerName} some fields set to invalid numbers'`);\n  }\n  return v;\n}\n\nconst map: Record<string, boolean> = {};\n\nexport function deprecated(method: string, version: string): void {\n  if (!map[method]) {\n    map[method] = true;\n    // eslint-disable-next-line\n    console.warn(\n      `${method} has been removed in version ${version}, see upgrade guide for more information`\n    );\n  }\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport function assert(condition: unknown, message?: string): void {\n  if (!condition) {\n    throw new Error(`math.gl assertion ${message}`);\n  }\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Copyright (c) 2017 Uber Technologies, Inc.\n\nimport {NumericArray} from '@math.gl/types';\nimport {MathArray} from './math-array';\nimport {checkNumber} from '../../lib/validators';\nimport {assert} from '../../lib/assert';\n\n/** Base class for vectors with at least 2 elements */\nexport abstract class Vector extends MathArray {\n  // ACCESSORS\n\n  get x(): number {\n    return this[0];\n  }\n\n  set x(value: number) {\n    this[0] = checkNumber(value);\n  }\n\n  get y(): number {\n    return this[1];\n  }\n\n  set y(value: number) {\n    this[1] = checkNumber(value);\n  }\n\n  /**\n   * Returns the length of the vector from the origin to the point described by this vector\n   *\n   * @note `length` is a reserved word for Arrays, so `v.length()` will return number of elements\n   * Instead we provide `len` and `magnitude`\n   */\n  len(): number {\n    return Math.sqrt(this.lengthSquared());\n  }\n\n  /**\n   * Returns the length of the vector from the origin to the point described by this vector\n   */\n  magnitude(): number {\n    return this.len();\n  }\n\n  /**\n   * Returns the squared length of the vector from the origin to the point described by this vector\n   */\n  lengthSquared(): number {\n    let length = 0;\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      length += this[i] * this[i];\n    }\n    return length;\n  }\n\n  /**\n   * Returns the squared length of the vector from the origin to the point described by this vector\n   */\n  magnitudeSquared(): number {\n    return this.lengthSquared();\n  }\n\n  distance(mathArray: Readonly<NumericArray>): number {\n    return Math.sqrt(this.distanceSquared(mathArray));\n  }\n\n  distanceSquared(mathArray: Readonly<NumericArray>): number {\n    let length = 0;\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      const dist = this[i] - mathArray[i];\n      length += dist * dist;\n    }\n    return checkNumber(length);\n  }\n\n  dot(mathArray: Readonly<NumericArray>): number {\n    let product = 0;\n    for (let i = 0; i < this.ELEMENTS; ++i) {\n      product += this[i] * mathArray[i];\n    }\n    return checkNumber(product);\n  }\n\n  // MODIFIERS\n\n  normalize(): this {\n    const length = this.magnitude();\n    if (length !== 0) {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] /= length;\n      }\n    }\n    return this.check();\n  }\n\n  multiply(...vectors: Readonly<NumericArray>[]): this {\n    for (const vector of vectors) {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] *= vector[i];\n      }\n    }\n    return this.check();\n  }\n\n  divide(...vectors: Readonly<NumericArray>[]): this {\n    for (const vector of vectors) {\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        this[i] /= vector[i];\n      }\n    }\n    return this.check();\n  }\n\n  // THREE.js compatibility\n\n  lengthSq(): number {\n    return this.lengthSquared();\n  }\n  distanceTo(vector: Readonly<NumericArray>): number {\n    return this.distance(vector);\n  }\n  distanceToSquared(vector: Readonly<NumericArray>): number {\n    return this.distanceSquared(vector);\n  }\n\n  getComponent(i: number): number {\n    assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n    return checkNumber(this[i]);\n  }\n\n  setComponent(i: number, value: number): this {\n    assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n    this[i] = value;\n    return this.check();\n  }\n\n  addVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {\n    return this.copy(a).add(b);\n  }\n\n  subVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {\n    return this.copy(a).subtract(b);\n  }\n\n  multiplyVectors(a: Readonly<NumericArray>, b: Readonly<NumericArray>): this {\n    return this.copy(a).multiply(b);\n  }\n\n  addScaledVector(a: Readonly<NumericArray>, b: number): this {\n    // @ts-expect-error error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.\n    return this.add((new this.constructor(a) as this).multiplyScalar(b));\n  }\n}\n", "// @eslint-disable\n// @ts-nocheck\n\n/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport const EPSILON = 0.000001;\nexport let ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport const RANDOM = Math.random;\nexport const ANGLE_ORDER = 'zyx';\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n  if (a >= 0) return Math.round(a);\n\n  return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n  ARRAY_TYPE = type;\n}\n\nconst degree = Math.PI / 180;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n  return a * degree;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n  return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n", "// @eslint-disable\n// @ts-nocheck\n\nimport type {NumericArray} from '@math.gl/types';\nimport * as glMatrix from './common.js';\n\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns a new 2D vector\n */\nexport function create(): NumericArray {\n  const out = new glMatrix.ARRAY_TYPE(2);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n  }\n  return out;\n}\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param a vector to clone\n * @returns a new 2D vector\n */\nexport function clone(a: Readonly<NumericArray>): NumericArray {\n  const out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param x X component\n * @param y Y component\n * @returns a new 2D vector\n */\nexport function fromValues(x: number, y: number): NumericArray {\n  const out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the source vector\n * @returns {NumericArray} out\n */\nexport function copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {NumericArray} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {NumericArray} out\n */\nexport function set(out, x, y) {\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n\n/**\n * Adds two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  return out;\n}\n\n/**\n * Multiplies two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  return out;\n}\n\n/**\n * Divides two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  return out;\n}\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to ceil\n * @returns {NumericArray} out\n */\nexport function ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  return out;\n}\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to floor\n * @returns {NumericArray} out\n */\nexport function floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  return out;\n}\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  return out;\n}\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {NumericArray} out\n */\nexport function max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  return out;\n}\n\n/**\n * symmetric round the components of a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to round\n * @returns {NumericArray} out\n */\nexport function round(out, a) {\n  out[0] = glMatrix.round(a[0]);\n  out[1] = glMatrix.round(a[1]);\n  return out;\n}\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {NumericArray} out\n */\nexport function scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  return out;\n}\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {NumericArray} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  return Math.sqrt(x * x + y * y);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  return x * x + y * y;\n}\n\n/**\n * Calculates the length of a vec2\n *\n * @param {Readonly<NumericArray>} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n  const x = a[0];\n  const y = a[1];\n  return Math.sqrt(x * x + y * y);\n}\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {Readonly<NumericArray>} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n  const x = a[0];\n  const y = a[1];\n  return x * x + y * y;\n}\n\n/**\n * Negates the components of a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to negate\n * @returns {NumericArray} out\n */\nexport function negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  return out;\n}\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to invert\n * @returns {NumericArray} out\n */\nexport function inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n}\n\n/**\n * Normalize a vec2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a vector to normalize\n * @returns {NumericArray} out\n */\nexport function normalize(out, a) {\n  const x = a[0];\n  const y = a[1];\n  let len = x * x + y * y;\n  if (len > 0) {\n    // TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  return out;\n}\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1];\n}\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n  const z = a[0] * b[1] - a[1] * b[0];\n  out[0] = out[1] = 0;\n  out[2] = z;\n  return out;\n}\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the first operand\n * @param {Readonly<NumericArray>} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {NumericArray} out\n */\nexport function lerp(out, a, b, t) {\n  const ax = a[0];\n  const ay = a[1];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {NumericArray} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {NumericArray} out\n */\nexport function random(out, scale) {\n  scale = scale === undefined ? 1.0 : scale;\n  const r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  out[0] = Math.cos(r) * scale;\n  out[1] = Math.sin(r) * scale;\n  return out;\n}\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {NumericArray} out\n */\nexport function transformMat2(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[2] * y;\n  out[1] = m[1] * x + m[3] * y;\n  return out;\n}\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {NumericArray} out\n */\nexport function transformMat2d(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[2] * y + m[4];\n  out[1] = m[1] * x + m[3] * y + m[5];\n  return out;\n}\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {NumericArray} out\n */\nexport function transformMat3(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[3] * y + m[6];\n  out[1] = m[1] * x + m[4] * y + m[7];\n  return out;\n}\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {NumericArray} out the receiving vector\n * @param {Readonly<NumericArray>} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {NumericArray} out\n */\nexport function transformMat4(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[4] * y + m[12];\n  out[1] = m[1] * x + m[5] * y + m[13];\n  return out;\n}\n\n/**\n * Rotate a 2D vector\n * @param {NumericArray} out The receiving vec2\n * @param {Readonly<NumericArray>} a The vec2 point to rotate\n * @param {Readonly<NumericArray>} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {NumericArray} out\n */\nexport function rotate(out, a, b, rad) {\n  // Translate point to the origin\n  const p0 = a[0] - b[0];\n  const p1 = a[1] - b[1];\n  const sinC = Math.sin(rad);\n  const cosC = Math.cos(rad);\n\n  // perform rotation and translate to correct position\n  out[0] = p0 * cosC - p1 * sinC + b[0];\n  out[1] = p0 * sinC + p1 * cosC + b[1];\n\n  return out;\n}\n\n/**\n * Get the angle between two 2D vectors\n * @param {Readonly<NumericArray>} a The first operand\n * @param {Readonly<NumericArray>} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n  const x1 = a[0];\n  const y1 = a[1];\n  const x2 = b[0];\n  const y2 = b[1];\n  // mag is the product of the magnitudes of a and b\n  const mag = Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2));\n  // mag &&.. short circuits if mag == 0\n  const cosine = mag && (x1 * x2 + y1 * y2) / mag;\n  // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n  return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec2 to zero\n *\n * @param {NumericArray} out the receiving vector\n * @returns {NumericArray} out\n */\nexport function zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {Readonly<NumericArray>} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n  return `vec2(${a[0]}, ${a[1]})`;\n}\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {Readonly<NumericArray>} a The first vector.\n * @param {Readonly<NumericArray>} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {Readonly<NumericArray>} a The first vector.\n * @param {Readonly<NumericArray>} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const b0 = b[0];\n  const b1 = b[1];\n  return (\n    Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n    Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1))\n  );\n}\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nexport const len = length;\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nexport const sub = subtract;\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nexport const div = divide;\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nexport const dist = distance;\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nexport const sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nexport const sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport const forEach = (function () {\n  const vec = create();\n\n  return function (a, stride, offset, count, fn, arg) {\n    let i;\n    let l;\n    if (!stride) {\n      stride = 2;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n    }\n\n    return a;\n  };\n})();\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable camelcase */\nimport {NumericArray} from '@math.gl/types';\n// vec2 additions\n\nexport function vec2_transformMat4AsVector<T extends NumericArray>(\n  out: T,\n  a: Readonly<NumericArray>,\n  m: Readonly<NumericArray>\n): T {\n  const x = a[0];\n  const y = a[1];\n  const w = m[3] * x + m[7] * y || 1.0;\n  out[0] = (m[0] * x + m[4] * y) / w;\n  out[1] = (m[1] * x + m[5] * y) / w;\n  return out;\n}\n\n// vec3 additions\n\n// Transform as vector, only uses 3x3 minor matrix\nexport function vec3_transformMat4AsVector<T extends NumericArray>(\n  out: T,\n  a: Readonly<NumericArray>,\n  m: Readonly<NumericArray>\n): T {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = m[3] * x + m[7] * y + m[11] * z || 1.0;\n  out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n  out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n  out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n  return out;\n}\n\nexport function vec3_transformMat2<T extends NumericArray>(\n  out: T,\n  a: Readonly<NumericArray>,\n  m: Readonly<NumericArray>\n): T {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[2] * y;\n  out[1] = m[1] * x + m[3] * y;\n  out[2] = a[2];\n  return out;\n}\n\n// vec4 additions\n\nexport function vec4_transformMat2<T extends NumericArray>(\n  out: T,\n  a: Readonly<NumericArray>,\n  m: Readonly<NumericArray>\n): T {\n  const x = a[0];\n  const y = a[1];\n  out[0] = m[0] * x + m[2] * y;\n  out[1] = m[1] * x + m[3] * y;\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n\nexport function vec4_transformMat3<T extends NumericArray>(\n  out: T,\n  a: Readonly<NumericArray>,\n  m: Readonly<NumericArray>\n): T {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  out[0] = m[0] * x + m[3] * y + m[6] * z;\n  out[1] = m[1] * x + m[4] * y + m[7] * z;\n  out[2] = m[2] * x + m[5] * y + m[8] * z;\n  out[3] = a[3];\n  return out;\n}\n", "// @eslint-disable\n// @ts-nocheck\n\nimport * as glMatrix from './common.js';\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n  const out = new glMatrix.ARRAY_TYPE(3);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n  return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n  const out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n  const out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n  out[0] = glMatrix.round(a[0]);\n  out[1] = glMatrix.round(a[1]);\n  out[2] = glMatrix.round(a[2]);\n  return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  const z = b[2] - a[2];\n  return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  const z = b[2] - a[2];\n  return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  let len = x * x + y * y + z * z;\n  if (len > 0) {\n    // TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  out[2] = a[2] * len;\n  return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n\n  out[0] = ay * bz - az * by;\n  out[1] = az * bx - ax * bz;\n  out[2] = ax * by - ay * bx;\n  return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n  const angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n  const sinTotal = Math.sin(angle);\n\n  const ratioA = Math.sin((1 - t) * angle) / sinTotal;\n  const ratioB = Math.sin(t * angle) / sinTotal;\n  out[0] = ratioA * a[0] + ratioB * b[0];\n  out[1] = ratioA * a[1] + ratioB * b[1];\n  out[2] = ratioA * a[2] + ratioB * b[2];\n\n  return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n  const factorTimes2 = t * t;\n  const factor1 = factorTimes2 * (2 * t - 3) + 1;\n  const factor2 = factorTimes2 * (t - 2) + t;\n  const factor3 = factorTimes2 * (t - 1);\n  const factor4 = factorTimes2 * (3 - 2 * t);\n\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n\n  return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n  const inverseFactor = 1 - t;\n  const inverseFactorTimesTwo = inverseFactor * inverseFactor;\n  const factorTimes2 = t * t;\n  const factor1 = inverseFactorTimesTwo * inverseFactor;\n  const factor2 = 3 * t * inverseFactorTimesTwo;\n  const factor3 = 3 * factorTimes2 * inverseFactor;\n  const factor4 = factorTimes2 * t;\n\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n\n  return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n  scale = scale === undefined ? 1.0 : scale;\n\n  const r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  const z = glMatrix.RANDOM() * 2.0 - 1.0;\n  const zScale = Math.sqrt(1.0 - z * z) * scale;\n\n  out[0] = Math.cos(r) * zScale;\n  out[1] = Math.sin(r) * zScale;\n  out[2] = z * scale;\n  return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  let w = m[3] * x + m[7] * y + m[11] * z + m[15];\n  w = w || 1.0;\n  out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n  out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n  out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n  return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  out[0] = x * m[0] + y * m[3] + z * m[6];\n  out[1] = x * m[1] + y * m[4] + z * m[7];\n  out[2] = x * m[2] + y * m[5] + z * m[8];\n  return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n  // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n  const qx = q[0];\n  const qy = q[1];\n  const qz = q[2];\n  const qw = q[3];\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  // var qvec = [qx, qy, qz];\n  // var uv = vec3.cross([], qvec, a);\n  let uvx = qy * z - qz * y;\n  let uvy = qz * x - qx * z;\n  let uvz = qx * y - qy * x;\n  // var uuv = vec3.cross([], qvec, uv);\n  let uuvx = qy * uvz - qz * uvy;\n  let uuvy = qz * uvx - qx * uvz;\n  let uuvz = qx * uvy - qy * uvx;\n  // vec3.scale(uv, uv, 2 * w);\n  const w2 = qw * 2;\n  uvx *= w2;\n  uvy *= w2;\n  uvz *= w2;\n  // vec3.scale(uuv, uuv, 2);\n  uuvx *= 2;\n  uuvy *= 2;\n  uuvz *= 2;\n  // return vec3.add(out, a, vec3.add(out, uv, uuv));\n  out[0] = x + uvx + uuvx;\n  out[1] = y + uvy + uuvy;\n  out[2] = z + uvz + uuvz;\n  return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n  const p = [];\n  const r = [];\n  // Translate point to the origin\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2];\n\n  // perform rotation\n  r[0] = p[0];\n  r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n  r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n  // translate to correct position\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n\n  return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n  const p = [];\n  const r = [];\n  // Translate point to the origin\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2];\n\n  // perform rotation\n  r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n  r[1] = p[1];\n  r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n  // translate to correct position\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n\n  return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n  const p = [];\n  const r = [];\n  // Translate point to the origin\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2];\n\n  // perform rotation\n  r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n  r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n  r[2] = p[2];\n\n  // translate to correct position\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n\n  return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  const mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz));\n  const cosine = mag && dot(a, b) / mag;\n  return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n  return `vec3(${a[0]}, ${a[1]}, ${a[2]})`;\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const a2 = a[2];\n  const b0 = b[0];\n  const b1 = b[1];\n  const b2 = b[2];\n  return (\n    Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n    Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n    Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2))\n  );\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport const sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport const div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport const dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport const sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport const len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport const sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport const forEach = (function () {\n  const vec = create();\n\n  return function (a, stride, offset, count, fn, arg) {\n    let i;\n    let l;\n    if (!stride) {\n      stride = 3;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n    }\n\n    return a;\n  };\n})();\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Copyright (c) 2017 Uber Technologies, Inc.\n\nimport {NumericArray, NumericArray3} from '@math.gl/types';\nimport {Vector} from './base/vector';\nimport {config, isArray} from '../lib/common';\nimport {checkNumber} from '../lib/validators';\n// @ts-ignore gl-matrix types\nimport {\n  angle as vec3_angle,\n  cross as vec3_cross,\n  rotateX as vec3_rotateX,\n  rotateY as vec3_rotateY,\n  rotateZ as vec3_rotateZ,\n  transformMat4 as vec3_transformMat4,\n  transformMat3 as vec3_transformMat3,\n  transformQuat as vec3_transformQuat\n} from '../gl-matrix/vec3';\n/* eslint-disable camelcase */\nimport {vec3_transformMat2, vec3_transformMat4AsVector} from '../lib/gl-matrix-extras';\n\nconst ORIGIN = [0, 0, 0];\n\nlet ZERO: Vector3;\n\n/** Helper type that captures array length for a 3 element vector */\nexport type Vector3Like = Vector3 | NumericArray3;\n\n/**\n * Three-element vector class with common linear algebra operations.\n * Subclass of Array<number> meaning that it is highly compatible with other libraries\n */\nexport class Vector3 extends Vector {\n  static get ZERO(): Vector3 {\n    if (!ZERO) {\n      ZERO = new Vector3(0, 0, 0);\n      Object.freeze(ZERO);\n    }\n    return ZERO;\n  }\n\n  /**\n   * @class\n   * @param x\n   * @param y\n   * @param z\n   */\n  constructor(x: number | Readonly<NumericArray> = 0, y: number = 0, z: number = 0) {\n    // PERF NOTE: initialize elements as double precision numbers\n    super(-0, -0, -0);\n    if (arguments.length === 1 && isArray(x)) {\n      this.copy(x as NumericArray);\n    } else {\n      // this.set(x, y, z);\n      if (config.debug) {\n        checkNumber(x);\n        checkNumber(y);\n        checkNumber(z);\n      }\n      // @ts-expect-error TS2412: Property '0' of type 'number | [number, number, number]' is not assignable to numeric index type 'number'\n      this[0] = x;\n      this[1] = y;\n      this[2] = z;\n    }\n  }\n\n  set(x: number, y: number, z: number): this {\n    this[0] = x;\n    this[1] = y;\n    this[2] = z;\n    return this.check();\n  }\n\n  copy(array: Readonly<NumericArray>): this {\n    this[0] = array[0];\n    this[1] = array[1];\n    this[2] = array[2];\n    return this.check();\n  }\n\n  fromObject(object: {x: number; y: number; z: number}): this {\n    if (config.debug) {\n      checkNumber(object.x);\n      checkNumber(object.y);\n      checkNumber(object.z);\n    }\n    this[0] = object.x;\n    this[1] = object.y;\n    this[2] = object.z;\n    return this.check();\n  }\n\n  override toObject(object: {x?: number; y?: number; z?: number}): {\n    x: number;\n    y: number;\n    z: number;\n  } {\n    object.x = this[0];\n    object.y = this[1];\n    object.z = this[2];\n    return object as {x: number; y: number; z: number};\n  }\n\n  // Getters/setters\n\n  get ELEMENTS(): number {\n    return 3;\n  }\n  get z(): number {\n    return this[2];\n  }\n  set z(value: number) {\n    this[2] = checkNumber(value);\n  }\n\n  // ACCESSORS\n\n  angle(vector: Readonly<NumericArray>): number {\n    return vec3_angle(this, vector);\n  }\n\n  // MODIFIERS\n\n  cross(vector: Readonly<NumericArray>): this {\n    vec3_cross(this, this, vector);\n    return this.check();\n  }\n\n  rotateX({radians, origin = ORIGIN}: {radians: number; origin?: Readonly<NumericArray>}): this {\n    vec3_rotateX(this, this, origin, radians);\n    return this.check();\n  }\n\n  rotateY({radians, origin = ORIGIN}: {radians: number; origin?: Readonly<NumericArray>}): this {\n    vec3_rotateY(this, this, origin, radians);\n    return this.check();\n  }\n\n  rotateZ({radians, origin = ORIGIN}: {radians: number; origin?: Readonly<NumericArray>}): this {\n    vec3_rotateZ(this, this, origin, radians);\n    return this.check();\n  }\n\n  // Transforms\n\n  // transforms as point (4th component is implicitly 1)\n  transform(matrix4: Readonly<NumericArray>): this {\n    return this.transformAsPoint(matrix4);\n  }\n\n  // transforms as point (4th component is implicitly 1)\n  transformAsPoint(matrix4: Readonly<NumericArray>): this {\n    vec3_transformMat4(this, this, matrix4);\n    return this.check();\n  }\n\n  // transforms as vector  (4th component is implicitly 0, ignores translation. slightly faster)\n  transformAsVector(matrix4: Readonly<NumericArray>): this {\n    vec3_transformMat4AsVector(this, this, matrix4);\n    return this.check();\n  }\n\n  transformByMatrix3(matrix3: Readonly<NumericArray>): this {\n    vec3_transformMat3(this, this, matrix3);\n    return this.check();\n  }\n\n  transformByMatrix2(matrix2: Readonly<NumericArray>): this {\n    vec3_transformMat2(this, this, matrix2);\n    return this.check();\n  }\n\n  transformByQuaternion(quaternion: Readonly<NumericArray>): this {\n    vec3_transformQuat(this, this, quaternion);\n    return this.check();\n  }\n}\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Copyright (c) 2017 Uber Technologies, Inc.\n\nimport {NumericArray} from '@math.gl/types';\nimport {MathArray} from './math-array';\nimport {checkNumber} from '../../lib/validators';\nimport {config} from '../../lib/common';\n\n/** Base class for matrices */\nexport abstract class Matrix extends MathArray {\n  abstract get RANK(): number;\n\n  // fromObject(object) {\n  //   const array = object.elements;\n  //   return this.fromRowMajor(array);\n  // }\n  // toObject(object) {\n  //   const array = object.elements;\n  //   this.toRowMajor(array);\n  //   return object;\n  // }\n\n  // TODO better override formatString?\n  override toString(): string {\n    let string = '[';\n    if (config.printRowMajor) {\n      string += 'row-major:';\n      for (let row = 0; row < this.RANK; ++row) {\n        for (let col = 0; col < this.RANK; ++col) {\n          string += ` ${this[col * this.RANK + row]}`;\n        }\n      }\n    } else {\n      string += 'column-major:';\n      for (let i = 0; i < this.ELEMENTS; ++i) {\n        string += ` ${this[i]}`;\n      }\n    }\n    string += ']';\n    return string;\n  }\n\n  getElementIndex(row: number, col: number): number {\n    return col * this.RANK + row;\n  }\n\n  // By default assumes row major indices\n  getElement(row: number, col: number): number {\n    return this[col * this.RANK + row];\n  }\n\n  // By default assumes row major indices\n  setElement(row: number, col: number, value: number): this {\n    this[col * this.RANK + row] = checkNumber(value);\n    return this;\n  }\n  getColumn<NumArrayT>(columnIndex: number, result: NumArrayT): NumArrayT;\n  getColumn(columnIndex: number): number[];\n\n  getColumn(\n    columnIndex: number,\n    result: number[] = new Array<number>(this.RANK).fill(-0)\n  ): number[] {\n    const firstIndex = columnIndex * this.RANK;\n    for (let i = 0; i < this.RANK; ++i) {\n      result[i] = this[firstIndex + i];\n    }\n    return result;\n  }\n\n  setColumn(columnIndex: number, columnVector: Readonly<NumericArray>): this {\n    const firstIndex = columnIndex * this.RANK;\n    for (let i = 0; i < this.RANK; ++i) {\n      this[firstIndex + i] = columnVector[i];\n    }\n    return this;\n  }\n}\n", "import * as glMatrix from './common.js';\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nexport function create() {\n  const out = new glMatrix.ARRAY_TYPE(9);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n  }\n  out[0] = 1;\n  out[4] = 1;\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\nexport function fromMat4(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[4];\n  out[4] = a[5];\n  out[5] = a[6];\n  out[6] = a[8];\n  out[7] = a[9];\n  out[8] = a[10];\n  return out;\n}\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nexport function clone(a) {\n  const out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\nexport function copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  const out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nexport function identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\nexport function transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    const a01 = a[1];\n    const a02 = a[2];\n    const a12 = a[5];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a01;\n    out[5] = a[7];\n    out[6] = a02;\n    out[7] = a12;\n  } else {\n    out[0] = a[0];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a[1];\n    out[4] = a[4];\n    out[5] = a[7];\n    out[6] = a[2];\n    out[7] = a[5];\n    out[8] = a[8];\n  }\n\n  return out;\n}\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\nexport function invert(out, a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n\n  const b01 = a22 * a11 - a12 * a21;\n  const b11 = -a22 * a10 + a12 * a20;\n  const b21 = a21 * a10 - a11 * a20;\n\n  // Calculate the determinant\n  let det = a00 * b01 + a01 * b11 + a02 * b21;\n\n  if (!det) {\n    return null;\n  }\n  det = 1.0 / det;\n\n  out[0] = b01 * det;\n  out[1] = (-a22 * a01 + a02 * a21) * det;\n  out[2] = (a12 * a01 - a02 * a11) * det;\n  out[3] = b11 * det;\n  out[4] = (a22 * a00 - a02 * a20) * det;\n  out[5] = (-a12 * a00 + a02 * a10) * det;\n  out[6] = b21 * det;\n  out[7] = (-a21 * a00 + a01 * a20) * det;\n  out[8] = (a11 * a00 - a01 * a10) * det;\n  return out;\n}\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\nexport function adjoint(out, a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n\n  out[0] = a11 * a22 - a12 * a21;\n  out[1] = a02 * a21 - a01 * a22;\n  out[2] = a01 * a12 - a02 * a11;\n  out[3] = a12 * a20 - a10 * a22;\n  out[4] = a00 * a22 - a02 * a20;\n  out[5] = a02 * a10 - a00 * a12;\n  out[6] = a10 * a21 - a11 * a20;\n  out[7] = a01 * a20 - a00 * a21;\n  out[8] = a00 * a11 - a01 * a10;\n  return out;\n}\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n\n  return (\n    a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20)\n  );\n}\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\nexport function multiply(out, a, b) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n\n  const b00 = b[0];\n  const b01 = b[1];\n  const b02 = b[2];\n  const b10 = b[3];\n  const b11 = b[4];\n  const b12 = b[5];\n  const b20 = b[6];\n  const b21 = b[7];\n  const b22 = b[8];\n\n  out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n  out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n  out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n  out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n  out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n  out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n  out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n  out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n  out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n  return out;\n}\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\nexport function translate(out, a, v) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n  const x = v[0];\n  const y = v[1];\n\n  out[0] = a00;\n  out[1] = a01;\n  out[2] = a02;\n\n  out[3] = a10;\n  out[4] = a11;\n  out[5] = a12;\n\n  out[6] = x * a00 + y * a10 + a20;\n  out[7] = x * a01 + y * a11 + a21;\n  out[8] = x * a02 + y * a12 + a22;\n  return out;\n}\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nexport function rotate(out, a, rad) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a10 = a[3];\n  const a11 = a[4];\n  const a12 = a[5];\n  const a20 = a[6];\n  const a21 = a[7];\n  const a22 = a[8];\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n\n  out[0] = c * a00 + s * a10;\n  out[1] = c * a01 + s * a11;\n  out[2] = c * a02 + s * a12;\n\n  out[3] = c * a10 - s * a00;\n  out[4] = c * a11 - s * a01;\n  out[5] = c * a12 - s * a02;\n\n  out[6] = a20;\n  out[7] = a21;\n  out[8] = a22;\n  return out;\n}\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nexport function scale(out, a, v) {\n  const x = v[0];\n  const y = v[1];\n\n  out[0] = x * a[0];\n  out[1] = x * a[1];\n  out[2] = x * a[2];\n\n  out[3] = y * a[3];\n  out[4] = y * a[4];\n  out[5] = y * a[5];\n\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\nexport function fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = v[0];\n  out[7] = v[1];\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nexport function fromRotation(out, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n\n  out[3] = -s;\n  out[4] = c;\n  out[5] = 0;\n\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\nexport function fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n\n  out[3] = 0;\n  out[4] = v[1];\n  out[5] = 0;\n\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nexport function fromMat2d(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = 0;\n\n  out[3] = a[2];\n  out[4] = a[3];\n  out[5] = 0;\n\n  out[6] = a[4];\n  out[7] = a[5];\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\nexport function fromQuat(out, q) {\n  const x = q[0];\n  const y = q[1];\n  const z = q[2];\n  const w = q[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n\n  const xx = x * x2;\n  const yx = y * x2;\n  const yy = y * y2;\n  const zx = z * x2;\n  const zy = z * y2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n\n  out[0] = 1 - yy - zz;\n  out[3] = yx - wz;\n  out[6] = zx + wy;\n\n  out[1] = yx + wz;\n  out[4] = 1 - xx - zz;\n  out[7] = zy - wx;\n\n  out[2] = zx - wy;\n  out[5] = zy + wx;\n  out[8] = 1 - xx - yy;\n\n  return out;\n}\n\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\nexport function normalFromMat4(out, a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b00 = a00 * a11 - a01 * a10;\n  const b01 = a00 * a12 - a02 * a10;\n  const b02 = a00 * a13 - a03 * a10;\n  const b03 = a01 * a12 - a02 * a11;\n  const b04 = a01 * a13 - a03 * a11;\n  const b05 = a02 * a13 - a03 * a12;\n  const b06 = a20 * a31 - a21 * a30;\n  const b07 = a20 * a32 - a22 * a30;\n  const b08 = a20 * a33 - a23 * a30;\n  const b09 = a21 * a32 - a22 * a31;\n  const b10 = a21 * a33 - a23 * a31;\n  const b11 = a22 * a33 - a23 * a32;\n\n  // Calculate the determinant\n  let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n  det = 1.0 / det;\n\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n  out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n  out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n  return out;\n}\n\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\nexport function projection(out, width, height) {\n  out[0] = 2 / width;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -2 / height;\n  out[5] = 0;\n  out[6] = -1;\n  out[7] = 1;\n  out[8] = 1;\n  return out;\n}\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nexport function str(a) {\n  return `mat3(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]}, ${a[4]}, ${a[5]}, ${a[6]}, ${a[7]}, ${a[8]})`;\n}\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nexport function frob(a) {\n  return Math.sqrt(\n    a[0] * a[0] +\n      a[1] * a[1] +\n      a[2] * a[2] +\n      a[3] * a[3] +\n      a[4] * a[4] +\n      a[5] * a[5] +\n      a[6] * a[6] +\n      a[7] * a[7] +\n      a[8] * a[8]\n  );\n}\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\nexport function add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\nexport function subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nexport function multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  return out;\n}\n\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  return out;\n}\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n  return (\n    a[0] === b[0] &&\n    a[1] === b[1] &&\n    a[2] === b[2] &&\n    a[3] === b[3] &&\n    a[4] === b[4] &&\n    a[5] === b[5] &&\n    a[6] === b[6] &&\n    a[7] === b[7] &&\n    a[8] === b[8]\n  );\n}\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function equals(a, b) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const a2 = a[2];\n  const a3 = a[3];\n  const a4 = a[4];\n  const a5 = a[5];\n  const a6 = a[6];\n  const a7 = a[7];\n  const a8 = a[8];\n  const b0 = b[0];\n  const b1 = b[1];\n  const b2 = b[2];\n  const b3 = b[3];\n  const b4 = b[4];\n  const b5 = b[5];\n  const b6 = b[6];\n  const b7 = b[7];\n  const b8 = b[8];\n  return (\n    Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n    Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n    Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n    Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n    Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n    Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n    Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n    Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n    Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8))\n  );\n}\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\nexport const sub = subtract;\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Copyright (c) 2017 Uber Technologies, Inc.\n\nimport {NumericArray, NumericArray9} from '@math.gl/types';\nimport {Matrix} from './base/matrix';\nimport {checkVector} from '../lib/validators';\n\nimport {vec4_transformMat3} from '../lib/gl-matrix-extras';\n\nimport {\n  fromQuat as mat3_fromQuat,\n  determinant as mat3_determinant,\n  transpose as mat3_transpose,\n  invert as mat3_invert,\n  multiply as mat3_multiply,\n  rotate as mat3_rotate,\n  scale as mat3_scale,\n  translate as mat3_translate\n} from '../gl-matrix/mat3';\nimport {transformMat3 as vec2_transformMat3} from '../gl-matrix/vec2';\nimport {transformMat3 as vec3_transformMat3} from '../gl-matrix/vec3';\n\n// eslint-disable-next-line no-shadow\nenum INDICES {\n  COL0ROW0 = 0,\n  COL0ROW1 = 1,\n  COL0ROW2 = 2,\n  COL1ROW0 = 3,\n  COL1ROW1 = 4,\n  COL1ROW2 = 5,\n  COL2ROW0 = 6,\n  COL2ROW1 = 7,\n  COL2ROW2 = 8\n}\n\nconst IDENTITY_MATRIX = Object.freeze([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\n/** Helper type that captures array length for a 3x3 matrix */\nexport type Matrix3Like = Matrix3 | NumericArray9;\n\n/**\n * A 3x3 matrix with common linear algebra operations\n * Subclass of Array<number> meaning that it is highly compatible with other libraries\n */\nexport class Matrix3 extends Matrix {\n  static get IDENTITY(): Readonly<Matrix3> {\n    return getIdentityMatrix();\n  }\n\n  static get ZERO(): Readonly<Matrix3> {\n    return getZeroMatrix();\n  }\n\n  get ELEMENTS(): number {\n    return 9;\n  }\n\n  get RANK(): number {\n    return 3;\n  }\n\n  get INDICES(): typeof INDICES {\n    return INDICES;\n  }\n\n  constructor(array?: Readonly<NumericArray>);\n  /** @deprecated */\n  constructor(...args: number[]);\n\n  constructor(array?: number | Readonly<NumericArray>, ...args: number[]) {\n    // PERF NOTE: initialize elements as double precision numbers\n    super(-0, -0, -0, -0, -0, -0, -0, -0, -0);\n    if (arguments.length === 1 && Array.isArray(array)) {\n      this.copy(array);\n    } else if (args.length > 0) {\n      this.copy([array as number, ...args]);\n    } else {\n      this.identity();\n    }\n  }\n\n  copy(array: Readonly<NumericArray>): this {\n    // Element wise copy for performance\n    this[0] = array[0];\n    this[1] = array[1];\n    this[2] = array[2];\n    this[3] = array[3];\n    this[4] = array[4];\n    this[5] = array[5];\n    this[6] = array[6];\n    this[7] = array[7];\n    this[8] = array[8];\n    return this.check();\n  }\n\n  // Constructors\n\n  identity(): this {\n    return this.copy(IDENTITY_MATRIX);\n  }\n\n  /**\n   *\n   * @param object\n   * @returns self\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  fromObject(object: {[key: string]: any}): this {\n    return this.check();\n  }\n\n  /** Calculates a 3x3 matrix from the given quaternion\n   * q quat  Quaternion to create matrix from\n   */\n  fromQuaternion(q: Readonly<NumericArray>): this {\n    mat3_fromQuat(this, q);\n    return this.check();\n  }\n\n  /**\n   * accepts column major order, stores in column major order\n   */\n  // eslint-disable-next-line max-params\n  set(\n    m00: number,\n    m10: number,\n    m20: number,\n    m01: number,\n    m11: number,\n    m21: number,\n    m02: number,\n    m12: number,\n    m22: number\n  ): this {\n    this[0] = m00;\n    this[1] = m10;\n    this[2] = m20;\n    this[3] = m01;\n    this[4] = m11;\n    this[5] = m21;\n    this[6] = m02;\n    this[7] = m12;\n    this[8] = m22;\n    return this.check();\n  }\n\n  /**\n   * accepts row major order, stores as column major\n   */\n  // eslint-disable-next-line max-params\n  setRowMajor(\n    m00: number,\n    m01: number,\n    m02: number,\n    m10: number,\n    m11: number,\n    m12: number,\n    m20: number,\n    m21: number,\n    m22: number\n  ): this {\n    this[0] = m00;\n    this[1] = m10;\n    this[2] = m20;\n    this[3] = m01;\n    this[4] = m11;\n    this[5] = m21;\n    this[6] = m02;\n    this[7] = m12;\n    this[8] = m22;\n    return this.check();\n  }\n\n  // Accessors\n\n  determinant(): number {\n    return mat3_determinant(this);\n  }\n\n  // Modifiers\n  transpose(): this {\n    mat3_transpose(this, this);\n    return this.check();\n  }\n\n  /** Invert a matrix. Note that this can fail if the matrix is not invertible */\n  invert(): this {\n    mat3_invert(this, this);\n    return this.check();\n  }\n\n  // Operations\n  multiplyLeft(a: NumericArray): this {\n    mat3_multiply(this, a, this);\n    return this.check();\n  }\n\n  multiplyRight(a: NumericArray): this {\n    mat3_multiply(this, this, a);\n    return this.check();\n  }\n\n  rotate(radians: number): this {\n    mat3_rotate(this, this, radians);\n    return this.check();\n  }\n\n  override scale(factor: NumericArray | number): this {\n    if (Array.isArray(factor)) {\n      mat3_scale(this, this, factor);\n    } else {\n      mat3_scale(this, this, [factor as number, factor as number]);\n    }\n    return this.check();\n  }\n\n  translate(vec: NumericArray): this {\n    mat3_translate(this, this, vec);\n    return this.check();\n  }\n\n  // Transforms\n  transform(vector: Readonly<NumericArray>, result?: NumericArray): NumericArray {\n    let out: NumericArray;\n    switch (vector.length) {\n      case 2:\n        out = vec2_transformMat3(result || [-0, -0], vector, this) as NumericArray;\n        break;\n      case 3:\n        out = vec3_transformMat3(result || [-0, -0, -0], vector, this) as NumericArray;\n        break;\n      case 4:\n        out = vec4_transformMat3(result || [-0, -0, -0, -0], vector, this);\n        break;\n      default:\n        throw new Error('Illegal vector');\n    }\n    checkVector(out, vector.length);\n    return out;\n  }\n\n  /** @deprecated */\n  transformVector(vector: Readonly<NumericArray>, result?: NumericArray): NumericArray {\n    return this.transform(vector, result);\n  }\n\n  /** @deprecated */\n  transformVector2(vector: Readonly<NumericArray>, result?: NumericArray): NumericArray {\n    return this.transform(vector, result);\n  }\n\n  /** @deprecated */\n  transformVector3(vector: Readonly<NumericArray>, result?: NumericArray): NumericArray {\n    return this.transform(vector, result);\n  }\n}\n\nlet ZERO_MATRIX3: Matrix3 | null;\nlet IDENTITY_MATRIX3: Matrix3 | null = null;\n\nfunction getZeroMatrix(): Readonly<Matrix3> {\n  if (!ZERO_MATRIX3) {\n    ZERO_MATRIX3 = new Matrix3([0, 0, 0, 0, 0, 0, 0, 0, 0]);\n    Object.freeze(ZERO_MATRIX3);\n  }\n  return ZERO_MATRIX3;\n}\n\nfunction getIdentityMatrix(): Matrix3 {\n  if (!IDENTITY_MATRIX3) {\n    IDENTITY_MATRIX3 = new Matrix3();\n    Object.freeze(IDENTITY_MATRIX3);\n  }\n  return IDENTITY_MATRIX3;\n}\n", "// @eslint-disable\n// @ts-nocheck\n\nimport * as glMatrix from './common.js';\n\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns a new 4x4 matrix\n */\nexport function create() {\n  const out = new glMatrix.ARRAY_TYPE(16);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n  }\n  out[0] = 1;\n  out[5] = 1;\n  out[10] = 1;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nexport function clone(a) {\n  const out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nexport function fromValues(\n  m00,\n  m01,\n  m02,\n  m03,\n  m10,\n  m11,\n  m12,\n  m13,\n  m20,\n  m21,\n  m22,\n  m23,\n  m30,\n  m31,\n  m32,\n  m33\n) {\n  const out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nexport function set(\n  out,\n  m00,\n  m01,\n  m02,\n  m03,\n  m10,\n  m11,\n  m12,\n  m13,\n  m20,\n  m21,\n  m22,\n  m23,\n  m30,\n  m31,\n  m32,\n  m33\n) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    const a01 = a[1];\n    const a02 = a[2];\n    const a03 = a[3];\n    const a12 = a[6];\n    const a13 = a[7];\n    const a23 = a[11];\n\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a01;\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a02;\n    out[9] = a12;\n    out[11] = a[14];\n    out[12] = a03;\n    out[13] = a13;\n    out[14] = a23;\n  } else {\n    out[0] = a[0];\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a[1];\n    out[5] = a[5];\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a[2];\n    out[9] = a[6];\n    out[10] = a[10];\n    out[11] = a[14];\n    out[12] = a[3];\n    out[13] = a[7];\n    out[14] = a[11];\n    out[15] = a[15];\n  }\n\n  return out;\n}\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function invert(out, a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b00 = a00 * a11 - a01 * a10;\n  const b01 = a00 * a12 - a02 * a10;\n  const b02 = a00 * a13 - a03 * a10;\n  const b03 = a01 * a12 - a02 * a11;\n  const b04 = a01 * a13 - a03 * a11;\n  const b05 = a02 * a13 - a03 * a12;\n  const b06 = a20 * a31 - a21 * a30;\n  const b07 = a20 * a32 - a22 * a30;\n  const b08 = a20 * a33 - a23 * a30;\n  const b09 = a21 * a32 - a22 * a31;\n  const b10 = a21 * a33 - a23 * a31;\n  const b11 = a22 * a33 - a23 * a32;\n\n  // Calculate the determinant\n  let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n  det = 1.0 / det;\n\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n  out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n  out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n  out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n  out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n  out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n  out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n  out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n  out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n  out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n  return out;\n}\n\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function adjoint(out, a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b00 = a00 * a11 - a01 * a10;\n  const b01 = a00 * a12 - a02 * a10;\n  const b02 = a00 * a13 - a03 * a10;\n  const b03 = a01 * a12 - a02 * a11;\n  const b04 = a01 * a13 - a03 * a11;\n  const b05 = a02 * a13 - a03 * a12;\n  const b06 = a20 * a31 - a21 * a30;\n  const b07 = a20 * a32 - a22 * a30;\n  const b08 = a20 * a33 - a23 * a30;\n  const b09 = a21 * a32 - a22 * a31;\n  const b10 = a21 * a33 - a23 * a31;\n  const b11 = a22 * a33 - a23 * a32;\n\n  out[0] = a11 * b11 - a12 * b10 + a13 * b09;\n  out[1] = a02 * b10 - a01 * b11 - a03 * b09;\n  out[2] = a31 * b05 - a32 * b04 + a33 * b03;\n  out[3] = a22 * b04 - a21 * b05 - a23 * b03;\n  out[4] = a12 * b08 - a10 * b11 - a13 * b07;\n  out[5] = a00 * b11 - a02 * b08 + a03 * b07;\n  out[6] = a32 * b02 - a30 * b05 - a33 * b01;\n  out[7] = a20 * b05 - a22 * b02 + a23 * b01;\n  out[8] = a10 * b10 - a11 * b08 + a13 * b06;\n  out[9] = a01 * b08 - a00 * b10 - a03 * b06;\n  out[10] = a30 * b04 - a31 * b02 + a33 * b00;\n  out[11] = a21 * b02 - a20 * b04 - a23 * b00;\n  out[12] = a11 * b07 - a10 * b09 - a12 * b06;\n  out[13] = a00 * b09 - a01 * b07 + a02 * b06;\n  out[14] = a31 * b01 - a30 * b03 - a32 * b00;\n  out[15] = a20 * b03 - a21 * b01 + a22 * b00;\n  return out;\n}\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  const b0 = a00 * a11 - a01 * a10;\n  const b1 = a00 * a12 - a02 * a10;\n  const b2 = a01 * a12 - a02 * a11;\n  const b3 = a20 * a31 - a21 * a30;\n  const b4 = a20 * a32 - a22 * a30;\n  const b5 = a21 * a32 - a22 * a31;\n  const b6 = a00 * b5 - a01 * b4 + a02 * b3;\n  const b7 = a10 * b5 - a11 * b4 + a12 * b3;\n  const b8 = a20 * b2 - a21 * b1 + a22 * b0;\n  const b9 = a30 * b2 - a31 * b1 + a32 * b0;\n\n  // Calculate the determinant\n  return a13 * b6 - a03 * b7 + a33 * b8 - a23 * b9;\n}\n\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function multiply(out, a, b) {\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n  const a30 = a[12];\n  const a31 = a[13];\n  const a32 = a[14];\n  const a33 = a[15];\n\n  // Cache only the current line of the second matrix\n  let b0 = b[0];\n  let b1 = b[1];\n  let b2 = b[2];\n  let b3 = b[3];\n  out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n  b0 = b[4];\n  b1 = b[5];\n  b2 = b[6];\n  b3 = b[7];\n  out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n  b0 = b[8];\n  b1 = b[9];\n  b2 = b[10];\n  b3 = b[11];\n  out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n  b0 = b[12];\n  b1 = b[13];\n  b2 = b[14];\n  b3 = b[15];\n  out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  return out;\n}\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\nexport function translate(out, a, v) {\n  const x = v[0];\n  const y = v[1];\n  const z = v[2];\n  let a00;\n  let a01;\n  let a02;\n  let a03;\n  let a10;\n  let a11;\n  let a12;\n  let a13;\n  let a20;\n  let a21;\n  let a22;\n  let a23;\n\n  if (a === out) {\n    out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n    out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n    out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n    out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n  } else {\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a03;\n    out[4] = a10;\n    out[5] = a11;\n    out[6] = a12;\n    out[7] = a13;\n    out[8] = a20;\n    out[9] = a21;\n    out[10] = a22;\n    out[11] = a23;\n\n    out[12] = a00 * x + a10 * y + a20 * z + a[12];\n    out[13] = a01 * x + a11 * y + a21 * z + a[13];\n    out[14] = a02 * x + a12 * y + a22 * z + a[14];\n    out[15] = a03 * x + a13 * y + a23 * z + a[15];\n  }\n\n  return out;\n}\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nexport function scale(out, a, v) {\n  const x = v[0];\n  const y = v[1];\n  const z = v[2];\n\n  out[0] = a[0] * x;\n  out[1] = a[1] * x;\n  out[2] = a[2] * x;\n  out[3] = a[3] * x;\n  out[4] = a[4] * y;\n  out[5] = a[5] * y;\n  out[6] = a[6] * y;\n  out[7] = a[7] * y;\n  out[8] = a[8] * z;\n  out[9] = a[9] * z;\n  out[10] = a[10] * z;\n  out[11] = a[11] * z;\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function rotate(out, a, rad, axis) {\n  let x = axis[0];\n  let y = axis[1];\n  let z = axis[2];\n  let len = Math.sqrt(x * x + y * y + z * z);\n  let c;\n  let s;\n  let t;\n  let a00;\n  let a01;\n  let a02;\n  let a03;\n  let a10;\n  let a11;\n  let a12;\n  let a13;\n  let a20;\n  let a21;\n  let a22;\n  let a23;\n  let b00;\n  let b01;\n  let b02;\n  let b10;\n  let b11;\n  let b12;\n  let b20;\n  let b21;\n  let b22;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c;\n\n  a00 = a[0];\n  a01 = a[1];\n  a02 = a[2];\n  a03 = a[3];\n  a10 = a[4];\n  a11 = a[5];\n  a12 = a[6];\n  a13 = a[7];\n  a20 = a[8];\n  a21 = a[9];\n  a22 = a[10];\n  a23 = a[11];\n\n  // Construct the elements of the rotation matrix\n  b00 = x * x * t + c;\n  b01 = y * x * t + z * s;\n  b02 = z * x * t - y * s;\n  b10 = x * y * t - z * s;\n  b11 = y * y * t + c;\n  b12 = z * y * t + x * s;\n  b20 = x * z * t + y * s;\n  b21 = y * z * t - x * s;\n  b22 = z * z * t + c;\n\n  // Perform rotation-specific matrix multiplication\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n  return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateX(out, a, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[4] = a10 * c + a20 * s;\n  out[5] = a11 * c + a21 * s;\n  out[6] = a12 * c + a22 * s;\n  out[7] = a13 * c + a23 * s;\n  out[8] = a20 * c - a10 * s;\n  out[9] = a21 * c - a11 * s;\n  out[10] = a22 * c - a12 * s;\n  out[11] = a23 * c - a13 * s;\n  return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateY(out, a, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a20 = a[8];\n  const a21 = a[9];\n  const a22 = a[10];\n  const a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[0] = a00 * c - a20 * s;\n  out[1] = a01 * c - a21 * s;\n  out[2] = a02 * c - a22 * s;\n  out[3] = a03 * c - a23 * s;\n  out[8] = a00 * s + a20 * c;\n  out[9] = a01 * s + a21 * c;\n  out[10] = a02 * s + a22 * c;\n  out[11] = a03 * s + a23 * c;\n  return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateZ(out, a, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n  const a00 = a[0];\n  const a01 = a[1];\n  const a02 = a[2];\n  const a03 = a[3];\n  const a10 = a[4];\n  const a11 = a[5];\n  const a12 = a[6];\n  const a13 = a[7];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n\n  // Perform axis-specific matrix multiplication\n  out[0] = a00 * c + a10 * s;\n  out[1] = a01 * c + a11 * s;\n  out[2] = a02 * c + a12 * s;\n  out[3] = a03 * c + a13 * s;\n  out[4] = a10 * c - a00 * s;\n  out[5] = a11 * c - a01 * s;\n  out[6] = a12 * c - a02 * s;\n  out[7] = a13 * c - a03 * s;\n  return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\nexport function fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\nexport function fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = v[1];\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = v[2];\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function fromRotation(out, rad, axis) {\n  let x = axis[0];\n  let y = axis[1];\n  let z = axis[2];\n  let len = Math.sqrt(x * x + y * y + z * z);\n  let c;\n  let s;\n  let t;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c;\n\n  // Perform rotation-specific matrix multiplication\n  out[0] = x * x * t + c;\n  out[1] = y * x * t + z * s;\n  out[2] = z * x * t - y * s;\n  out[3] = 0;\n  out[4] = x * y * t - z * s;\n  out[5] = y * y * t + c;\n  out[6] = z * y * t + x * s;\n  out[7] = 0;\n  out[8] = x * z * t + y * s;\n  out[9] = y * z * t - x * s;\n  out[10] = z * z * t + c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromXRotation(out, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n\n  // Perform axis-specific matrix multiplication\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = c;\n  out[6] = s;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = -s;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromYRotation(out, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n\n  // Perform axis-specific matrix multiplication\n  out[0] = c;\n  out[1] = 0;\n  out[2] = -s;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = s;\n  out[9] = 0;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromZRotation(out, rad) {\n  const s = Math.sin(rad);\n  const c = Math.cos(rad);\n\n  // Perform axis-specific matrix multiplication\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -s;\n  out[5] = c;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslation(out, q, v) {\n  // Quaternion math\n  const x = q[0];\n  const y = q[1];\n  const z = q[2];\n  const w = q[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n\n  const xx = x * x2;\n  const xy = x * y2;\n  const xz = x * z2;\n  const yy = y * y2;\n  const yz = y * z2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n\n  out[0] = 1 - (yy + zz);\n  out[1] = xy + wz;\n  out[2] = xz - wy;\n  out[3] = 0;\n  out[4] = xy - wz;\n  out[5] = 1 - (xx + zz);\n  out[6] = yz + wx;\n  out[7] = 0;\n  out[8] = xz + wy;\n  out[9] = yz - wx;\n  out[10] = 1 - (xx + yy);\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n\n  return out;\n}\n\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\nexport function fromQuat2(out, a) {\n  const translation = new glMatrix.ARRAY_TYPE(3);\n  const bx = -a[0];\n  const by = -a[1];\n  const bz = -a[2];\n  const bw = a[3];\n  const ax = a[4];\n  const ay = a[5];\n  const az = a[6];\n  const aw = a[7];\n\n  const magnitude = bx * bx + by * by + bz * bz + bw * bw;\n  // Only scale if it makes sense\n  if (magnitude > 0) {\n    translation[0] = ((ax * bw + aw * bx + ay * bz - az * by) * 2) / magnitude;\n    translation[1] = ((ay * bw + aw * by + az * bx - ax * bz) * 2) / magnitude;\n    translation[2] = ((az * bw + aw * bz + ax * by - ay * bx) * 2) / magnitude;\n  } else {\n    translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n    translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n    translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n  }\n  fromRotationTranslation(out, a, translation);\n  return out;\n}\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getTranslation(out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n\n  return out;\n}\n\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getScaling(out, mat) {\n  const m11 = mat[0];\n  const m12 = mat[1];\n  const m13 = mat[2];\n  const m21 = mat[4];\n  const m22 = mat[5];\n  const m23 = mat[6];\n  const m31 = mat[8];\n  const m32 = mat[9];\n  const m33 = mat[10];\n\n  out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n  out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n  out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n\n  return out;\n}\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nexport function getRotation(out, mat) {\n  const scaling = new glMatrix.ARRAY_TYPE(3);\n  getScaling(scaling, mat);\n\n  const is1 = 1 / scaling[0];\n  const is2 = 1 / scaling[1];\n  const is3 = 1 / scaling[2];\n\n  const sm11 = mat[0] * is1;\n  const sm12 = mat[1] * is2;\n  const sm13 = mat[2] * is3;\n  const sm21 = mat[4] * is1;\n  const sm22 = mat[5] * is2;\n  const sm23 = mat[6] * is3;\n  const sm31 = mat[8] * is1;\n  const sm32 = mat[9] * is2;\n  const sm33 = mat[10] * is3;\n\n  const trace = sm11 + sm22 + sm33;\n  let S = 0;\n\n  if (trace > 0) {\n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (sm23 - sm32) / S;\n    out[1] = (sm31 - sm13) / S;\n    out[2] = (sm12 - sm21) / S;\n  } else if (sm11 > sm22 && sm11 > sm33) {\n    S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n    out[3] = (sm23 - sm32) / S;\n    out[0] = 0.25 * S;\n    out[1] = (sm12 + sm21) / S;\n    out[2] = (sm31 + sm13) / S;\n  } else if (sm22 > sm33) {\n    S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n    out[3] = (sm31 - sm13) / S;\n    out[0] = (sm12 + sm21) / S;\n    out[1] = 0.25 * S;\n    out[2] = (sm23 + sm32) / S;\n  } else {\n    S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n    out[3] = (sm12 - sm21) / S;\n    out[0] = (sm31 + sm13) / S;\n    out[1] = (sm23 + sm32) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n}\n\n/**\n * Decomposes a transformation matrix into its rotation, translation\n * and scale components. Returns only the rotation component\n * @param  {quat} out_r Quaternion to receive the rotation component\n * @param  {vec3} out_t Vector to receive the translation vector\n * @param  {vec3} out_s Vector to receive the scaling factor\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @returns {quat} out_r\n */\nexport function decompose(out_r, out_t, out_s, mat) {\n  out_t[0] = mat[12];\n  out_t[1] = mat[13];\n  out_t[2] = mat[14];\n\n  const m11 = mat[0];\n  const m12 = mat[1];\n  const m13 = mat[2];\n  const m21 = mat[4];\n  const m22 = mat[5];\n  const m23 = mat[6];\n  const m31 = mat[8];\n  const m32 = mat[9];\n  const m33 = mat[10];\n\n  out_s[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n  out_s[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n  out_s[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n\n  const is1 = 1 / out_s[0];\n  const is2 = 1 / out_s[1];\n  const is3 = 1 / out_s[2];\n\n  const sm11 = m11 * is1;\n  const sm12 = m12 * is2;\n  const sm13 = m13 * is3;\n  const sm21 = m21 * is1;\n  const sm22 = m22 * is2;\n  const sm23 = m23 * is3;\n  const sm31 = m31 * is1;\n  const sm32 = m32 * is2;\n  const sm33 = m33 * is3;\n\n  const trace = sm11 + sm22 + sm33;\n  let S = 0;\n\n  if (trace > 0) {\n    S = Math.sqrt(trace + 1.0) * 2;\n    out_r[3] = 0.25 * S;\n    out_r[0] = (sm23 - sm32) / S;\n    out_r[1] = (sm31 - sm13) / S;\n    out_r[2] = (sm12 - sm21) / S;\n  } else if (sm11 > sm22 && sm11 > sm33) {\n    S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n    out_r[3] = (sm23 - sm32) / S;\n    out_r[0] = 0.25 * S;\n    out_r[1] = (sm12 + sm21) / S;\n    out_r[2] = (sm31 + sm13) / S;\n  } else if (sm22 > sm33) {\n    S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n    out_r[3] = (sm31 - sm13) / S;\n    out_r[0] = (sm12 + sm21) / S;\n    out_r[1] = 0.25 * S;\n    out_r[2] = (sm23 + sm32) / S;\n  } else {\n    S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n    out_r[3] = (sm12 - sm21) / S;\n    out_r[0] = (sm31 + sm13) / S;\n    out_r[1] = (sm23 + sm32) / S;\n    out_r[2] = 0.25 * S;\n  }\n\n  return out_r;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScale(out, q, v, s) {\n  // Quaternion math\n  const x = q[0];\n  const y = q[1];\n  const z = q[2];\n  const w = q[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n\n  const xx = x * x2;\n  const xy = x * y2;\n  const xz = x * z2;\n  const yy = y * y2;\n  const yz = y * z2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n  const sx = s[0];\n  const sy = s[1];\n  const sz = s[2];\n\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n\n  return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n  // Quaternion math\n  const x = q[0];\n  const y = q[1];\n  const z = q[2];\n  const w = q[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n\n  const xx = x * x2;\n  const xy = x * y2;\n  const xz = x * z2;\n  const yy = y * y2;\n  const yz = y * z2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n\n  const sx = s[0];\n  const sy = s[1];\n  const sz = s[2];\n\n  const ox = o[0];\n  const oy = o[1];\n  const oz = o[2];\n\n  const out0 = (1 - (yy + zz)) * sx;\n  const out1 = (xy + wz) * sx;\n  const out2 = (xz - wy) * sx;\n  const out4 = (xy - wz) * sy;\n  const out5 = (1 - (xx + zz)) * sy;\n  const out6 = (yz + wx) * sy;\n  const out8 = (xz + wy) * sz;\n  const out9 = (yz - wx) * sz;\n  const out10 = (1 - (xx + yy)) * sz;\n\n  out[0] = out0;\n  out[1] = out1;\n  out[2] = out2;\n  out[3] = 0;\n  out[4] = out4;\n  out[5] = out5;\n  out[6] = out6;\n  out[7] = 0;\n  out[8] = out8;\n  out[9] = out9;\n  out[10] = out10;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n  out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n  out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n  out[15] = 1;\n\n  return out;\n}\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nexport function fromQuat(out, q) {\n  const x = q[0];\n  const y = q[1];\n  const z = q[2];\n  const w = q[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n\n  const xx = x * x2;\n  const yx = y * x2;\n  const yy = y * y2;\n  const zx = z * x2;\n  const zy = z * y2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n\n  out[0] = 1 - yy - zz;\n  out[1] = yx + wz;\n  out[2] = zx - wy;\n  out[3] = 0;\n\n  out[4] = yx - wz;\n  out[5] = 1 - xx - zz;\n  out[6] = zy + wx;\n  out[7] = 0;\n\n  out[8] = zx + wy;\n  out[9] = zy - wx;\n  out[10] = 1 - xx - yy;\n  out[11] = 0;\n\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n\n  return out;\n}\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function frustum(out, left, right, bottom, top, near, far) {\n  const rl = 1 / (right - left);\n  const tb = 1 / (top - bottom);\n  const nf = 1 / (near - far);\n  out[0] = near * 2 * rl;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = near * 2 * tb;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = (right + left) * rl;\n  out[9] = (top + bottom) * tb;\n  out[10] = (far + near) * nf;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = far * near * 2 * nf;\n  out[15] = 0;\n  return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n  const f = 1.0 / Math.tan(fovy / 2);\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[15] = 0;\n  if (far != null && far !== Infinity) {\n    const nf = 1 / (near - far);\n    out[10] = (far + near) * nf;\n    out[14] = 2 * far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -2 * near;\n  }\n  return out;\n}\n\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\nexport const perspective = perspectiveNO;\n\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n  const f = 1.0 / Math.tan(fovy / 2);\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[15] = 0;\n  if (far != null && far !== Infinity) {\n    const nf = 1 / (near - far);\n    out[10] = far * nf;\n    out[14] = far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -near;\n  }\n  return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n  const upTan = Math.tan((fov.upDegrees * Math.PI) / 180.0);\n  const downTan = Math.tan((fov.downDegrees * Math.PI) / 180.0);\n  const leftTan = Math.tan((fov.leftDegrees * Math.PI) / 180.0);\n  const rightTan = Math.tan((fov.rightDegrees * Math.PI) / 180.0);\n  const xScale = 2.0 / (leftTan + rightTan);\n  const yScale = 2.0 / (upTan + downTan);\n\n  out[0] = xScale;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  out[4] = 0.0;\n  out[5] = yScale;\n  out[6] = 0.0;\n  out[7] = 0.0;\n  out[8] = -((leftTan - rightTan) * xScale * 0.5);\n  out[9] = (upTan - downTan) * yScale * 0.5;\n  out[10] = far / (near - far);\n  out[11] = -1.0;\n  out[12] = 0.0;\n  out[13] = 0.0;\n  out[14] = (far * near) / (near - far);\n  out[15] = 0.0;\n  return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n  const lr = 1 / (left - right);\n  const bt = 1 / (bottom - top);\n  const nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\nexport const ortho = orthoNO;\n\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n  const lr = 1 / (left - right);\n  const bt = 1 / (bottom - top);\n  const nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = near * nf;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function lookAt(out, eye, center, up) {\n  let len;\n  let x0;\n  let x1;\n  let x2;\n  let y0;\n  let y1;\n  let y2;\n  let z0;\n  let z1;\n  let z2;\n  const eyex = eye[0];\n  const eyey = eye[1];\n  const eyez = eye[2];\n  const upx = up[0];\n  const upy = up[1];\n  const upz = up[2];\n  const centerx = center[0];\n  const centery = center[1];\n  const centerz = center[2];\n\n  if (\n    Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n    Math.abs(eyey - centery) < glMatrix.EPSILON &&\n    Math.abs(eyez - centerz) < glMatrix.EPSILON\n  ) {\n    return identity(out);\n  }\n\n  z0 = eyex - centerx;\n  z1 = eyey - centery;\n  z2 = eyez - centerz;\n\n  len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n  z0 *= len;\n  z1 *= len;\n  z2 *= len;\n\n  x0 = upy * z2 - upz * z1;\n  x1 = upz * z0 - upx * z2;\n  x2 = upx * z1 - upy * z0;\n  len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n  if (!len) {\n    x0 = 0;\n    x1 = 0;\n    x2 = 0;\n  } else {\n    len = 1 / len;\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  y0 = z1 * x2 - z2 * x1;\n  y1 = z2 * x0 - z0 * x2;\n  y2 = z0 * x1 - z1 * x0;\n\n  len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n  if (!len) {\n    y0 = 0;\n    y1 = 0;\n    y2 = 0;\n  } else {\n    len = 1 / len;\n    y0 *= len;\n    y1 *= len;\n    y2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = y0;\n  out[2] = z0;\n  out[3] = 0;\n  out[4] = x1;\n  out[5] = y1;\n  out[6] = z1;\n  out[7] = 0;\n  out[8] = x2;\n  out[9] = y2;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n  out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n  out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n  out[15] = 1;\n\n  return out;\n}\n\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function targetTo(out, eye, target, up) {\n  const eyex = eye[0];\n  const eyey = eye[1];\n  const eyez = eye[2];\n  const upx = up[0];\n  const upy = up[1];\n  const upz = up[2];\n\n  let z0 = eyex - target[0];\n  let z1 = eyey - target[1];\n  let z2 = eyez - target[2];\n\n  let len = z0 * z0 + z1 * z1 + z2 * z2;\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n  }\n\n  let x0 = upy * z2 - upz * z1;\n  let x1 = upz * z0 - upx * z2;\n  let x2 = upx * z1 - upy * z0;\n\n  len = x0 * x0 + x1 * x1 + x2 * x2;\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = x1;\n  out[2] = x2;\n  out[3] = 0;\n  out[4] = z1 * x2 - z2 * x1;\n  out[5] = z2 * x0 - z0 * x2;\n  out[6] = z0 * x1 - z1 * x0;\n  out[7] = 0;\n  out[8] = z0;\n  out[9] = z1;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = eyex;\n  out[13] = eyey;\n  out[14] = eyez;\n  out[15] = 1;\n  return out;\n}\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nexport function str(a) {\n  return `mat4(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]}, ${a[4]}, ${a[5]}, ${a[6]}, ${a[7]}, ${a[8]}, ${a[9]}, ${a[10]}, ${a[11]}, ${a[12]}, ${a[13]}, ${a[14]}, ${a[15]})`;\n}\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nexport function frob(a) {\n  return Math.sqrt(\n    a[0] * a[0] +\n      a[1] * a[1] +\n      a[2] * a[2] +\n      a[3] * a[3] +\n      a[4] * a[4] +\n      a[5] * a[5] +\n      a[6] * a[6] +\n      a[7] * a[7] +\n      a[8] * a[8] +\n      a[9] * a[9] +\n      a[10] * a[10] +\n      a[11] * a[11] +\n      a[12] * a[12] +\n      a[13] * a[13] +\n      a[14] * a[14] +\n      a[15] * a[15]\n  );\n}\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  out[9] = a[9] + b[9];\n  out[10] = a[10] + b[10];\n  out[11] = a[11] + b[11];\n  out[12] = a[12] + b[12];\n  out[13] = a[13] + b[13];\n  out[14] = a[14] + b[14];\n  out[15] = a[15] + b[15];\n  return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  out[9] = a[9] - b[9];\n  out[10] = a[10] - b[10];\n  out[11] = a[11] - b[11];\n  out[12] = a[12] - b[12];\n  out[13] = a[13] - b[13];\n  out[14] = a[14] - b[14];\n  out[15] = a[15] - b[15];\n  return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nexport function multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  out[9] = a[9] * b;\n  out[10] = a[10] * b;\n  out[11] = a[11] * b;\n  out[12] = a[12] * b;\n  out[13] = a[13] * b;\n  out[14] = a[14] * b;\n  out[15] = a[15] * b;\n  return out;\n}\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  out[9] = a[9] + b[9] * scale;\n  out[10] = a[10] + b[10] * scale;\n  out[11] = a[11] + b[11] * scale;\n  out[12] = a[12] + b[12] * scale;\n  out[13] = a[13] + b[13] * scale;\n  out[14] = a[14] + b[14] * scale;\n  out[15] = a[15] + b[15] * scale;\n  return out;\n}\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n  return (\n    a[0] === b[0] &&\n    a[1] === b[1] &&\n    a[2] === b[2] &&\n    a[3] === b[3] &&\n    a[4] === b[4] &&\n    a[5] === b[5] &&\n    a[6] === b[6] &&\n    a[7] === b[7] &&\n    a[8] === b[8] &&\n    a[9] === b[9] &&\n    a[10] === b[10] &&\n    a[11] === b[11] &&\n    a[12] === b[12] &&\n    a[13] === b[13] &&\n    a[14] === b[14] &&\n    a[15] === b[15]\n  );\n}\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function equals(a, b) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const a2 = a[2];\n  const a3 = a[3];\n  const a4 = a[4];\n  const a5 = a[5];\n  const a6 = a[6];\n  const a7 = a[7];\n  const a8 = a[8];\n  const a9 = a[9];\n  const a10 = a[10];\n  const a11 = a[11];\n  const a12 = a[12];\n  const a13 = a[13];\n  const a14 = a[14];\n  const a15 = a[15];\n\n  const b0 = b[0];\n  const b1 = b[1];\n  const b2 = b[2];\n  const b3 = b[3];\n  const b4 = b[4];\n  const b5 = b[5];\n  const b6 = b[6];\n  const b7 = b[7];\n  const b8 = b[8];\n  const b9 = b[9];\n  const b10 = b[10];\n  const b11 = b[11];\n  const b12 = b[12];\n  const b13 = b[13];\n  const b14 = b[14];\n  const b15 = b[15];\n\n  return (\n    Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n    Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n    Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n    Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n    Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n    Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n    Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n    Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n    Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&\n    Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&\n    Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&\n    Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&\n    Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&\n    Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&\n    Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&\n    Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15))\n  );\n}\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nexport const sub = subtract;\n", "// @eslint-disable\n// @ts-nocheck\n\nimport * as glMatrix from './common.js';\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nexport function create() {\n  const out = new glMatrix.ARRAY_TYPE(4);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n  }\n  return out;\n}\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nexport function clone(a) {\n  const out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nexport function fromValues(x, y, z, w) {\n  const out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\nexport function copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nexport function set(out, x, y, z, w) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  return out;\n}\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  out[3] = a[3] * b[3];\n  return out;\n}\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  out[3] = a[3] / b[3];\n  return out;\n}\n\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\nexport function ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  out[3] = Math.ceil(a[3]);\n  return out;\n}\n\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\nexport function floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  out[3] = Math.floor(a[3]);\n  return out;\n}\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  out[3] = Math.min(a[3], b[3]);\n  return out;\n}\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\nexport function max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  out[3] = Math.max(a[3], b[3]);\n  return out;\n}\n\n/**\n * symmetric round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\nexport function round(out, a) {\n  out[0] = glMatrix.round(a[0]);\n  out[1] = glMatrix.round(a[1]);\n  out[2] = glMatrix.round(a[2]);\n  out[3] = glMatrix.round(a[3]);\n  return out;\n}\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nexport function scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  return out;\n}\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  const z = b[2] - a[2];\n  const w = b[3] - a[3];\n  return Math.sqrt(x * x + y * y + z * z + w * w);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n  const x = b[0] - a[0];\n  const y = b[1] - a[1];\n  const z = b[2] - a[2];\n  const w = b[3] - a[3];\n  return x * x + y * y + z * z + w * w;\n}\n\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n  return Math.sqrt(x * x + y * y + z * z + w * w);\n}\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n  return x * x + y * y + z * z + w * w;\n}\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\nexport function negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = -a[3];\n  return out;\n}\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\nexport function inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n}\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\nexport function normalize(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n  let len = x * x + y * y + z * z + w * w;\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n  }\n  out[0] = x * len;\n  out[1] = y * len;\n  out[2] = z * len;\n  out[3] = w * len;\n  return out;\n}\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\nexport function cross(out, u, v, w) {\n  const A = v[0] * w[1] - v[1] * w[0];\n  const B = v[0] * w[2] - v[2] * w[0];\n  const C = v[0] * w[3] - v[3] * w[0];\n  const D = v[1] * w[2] - v[2] * w[1];\n  const E = v[1] * w[3] - v[3] * w[1];\n  const F = v[2] * w[3] - v[3] * w[2];\n  const G = u[0];\n  const H = u[1];\n  const I = u[2];\n  const J = u[3];\n\n  out[0] = H * F - I * E + J * D;\n  out[1] = -(G * F) + I * C - J * B;\n  out[2] = G * E - H * C + J * A;\n  out[3] = -(G * D) + H * B - I * A;\n\n  return out;\n}\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\nexport function lerp(out, a, b, t) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  out[3] = aw + t * (b[3] - aw);\n  return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec4} out\n */\nexport function random(out, scale) {\n  scale = scale === undefined ? 1.0 : scale;\n\n  // Marsaglia, George. Choosing a Point from the Surface of a\n  // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n  // http://projecteuclid.org/euclid.aoms/1177692644;\n  let v1;\n  let v2;\n  let v3;\n  let v4;\n  let s1;\n  let s2;\n  do {\n    v1 = glMatrix.RANDOM() * 2 - 1;\n    v2 = glMatrix.RANDOM() * 2 - 1;\n    s1 = v1 * v1 + v2 * v2;\n  } while (s1 >= 1);\n  do {\n    v3 = glMatrix.RANDOM() * 2 - 1;\n    v4 = glMatrix.RANDOM() * 2 - 1;\n    s2 = v3 * v3 + v4 * v4;\n  } while (s2 >= 1);\n\n  const d = Math.sqrt((1 - s1) / s2);\n  out[0] = scale * v1;\n  out[1] = scale * v2;\n  out[2] = scale * v3 * d;\n  out[3] = scale * v4 * d;\n  return out;\n}\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\nexport function transformMat4(out, a, m) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n  out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n  out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n  out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n  out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n  return out;\n}\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\nexport function transformQuat(out, a, q) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const qx = q[0];\n  const qy = q[1];\n  const qz = q[2];\n  const qw = q[3];\n\n  // calculate quat * vec\n  const ix = qw * x + qy * z - qz * y;\n  const iy = qw * y + qz * x - qx * z;\n  const iz = qw * z + qx * y - qy * x;\n  const iw = -qx * x - qy * y - qz * z;\n\n  // calculate result * inverse quat\n  out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n  out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n  out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n  out[3] = a[3];\n  return out;\n}\n\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\nexport function zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n  return `vec4(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]})`;\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const a2 = a[2];\n  const a3 = a[3];\n  const b0 = b[0];\n  const b1 = b[1];\n  const b2 = b[2];\n  const b3 = b[3];\n  return (\n    Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n    Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n    Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n    Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3))\n  );\n}\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nexport const sub = subtract;\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nexport const div = divide;\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nexport const dist = distance;\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nexport const sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nexport const len = length;\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nexport const sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport const forEach = (function () {\n  const vec = create();\n\n  return function (a, stride, offset, count, fn, arg) {\n    let i;\n    let l;\n    if (!stride) {\n      stride = 4;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      vec[3] = a[i + 3];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n      a[i + 3] = vec[3];\n    }\n\n    return a;\n  };\n})();\n", "// @eslint-disable\n// @ts-nocheck\n\nimport * as glMatrix from './common.js';\nimport * as mat3 from './mat3.js';\nimport * as vec3 from './vec3.js';\nimport * as vec4 from './vec4.js';\n\n// const glMatrix: {EPSILON = 0.000001};\n\n/**\n * Quaternion in the format XYZW\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nexport function create() {\n  const out = new glMatrix.ARRAY_TYPE(4);\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n  out[3] = 1;\n  return out;\n}\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nexport function identity(out) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nexport function setAxisAngle(out, axis, rad) {\n  rad = rad * 0.5;\n  const s = Math.sin(rad);\n  out[0] = s * axis[0];\n  out[1] = s * axis[1];\n  out[2] = s * axis[2];\n  out[3] = Math.cos(rad);\n  return out;\n}\n\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {ReadonlyQuat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\nexport function getAxisAngle(out_axis, q) {\n  const rad = Math.acos(q[3]) * 2.0;\n  const s = Math.sin(rad / 2.0);\n  if (s > glMatrix.EPSILON) {\n    out_axis[0] = q[0] / s;\n    out_axis[1] = q[1] / s;\n    out_axis[2] = q[2] / s;\n  } else {\n    // If s is zero, return any axis (no rotation - axis does not matter)\n    out_axis[0] = 1;\n    out_axis[1] = 0;\n    out_axis[2] = 0;\n  }\n  return rad;\n}\n\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {ReadonlyQuat} a     Origin unit quaternion\n * @param  {ReadonlyQuat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */\nexport function getAngle(a, b) {\n  const dotproduct = dot(a, b);\n\n  return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\nexport function multiply(out, a, b) {\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bx = b[0];\n  const by = b[1];\n  const bz = b[2];\n  const bw = b[3];\n\n  out[0] = ax * bw + aw * bx + ay * bz - az * by;\n  out[1] = ay * bw + aw * by + az * bx - ax * bz;\n  out[2] = az * bw + aw * bz + ax * by - ay * bx;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateX(out, a, rad) {\n  rad *= 0.5;\n\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bx = Math.sin(rad);\n  const bw = Math.cos(rad);\n\n  out[0] = ax * bw + aw * bx;\n  out[1] = ay * bw + az * bx;\n  out[2] = az * bw - ay * bx;\n  out[3] = aw * bw - ax * bx;\n  return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateY(out, a, rad) {\n  rad *= 0.5;\n\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const by = Math.sin(rad);\n  const bw = Math.cos(rad);\n\n  out[0] = ax * bw - az * by;\n  out[1] = ay * bw + aw * by;\n  out[2] = az * bw + ax * by;\n  out[3] = aw * bw - ay * by;\n  return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateZ(out, a, rad) {\n  rad *= 0.5;\n\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  const bz = Math.sin(rad);\n  const bw = Math.cos(rad);\n\n  out[0] = ax * bw + ay * bz;\n  out[1] = ay * bw - ax * bz;\n  out[2] = az * bw + aw * bz;\n  out[3] = aw * bw - az * bz;\n  return out;\n}\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\nexport function calculateW(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n  return out;\n}\n\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\nexport function exp(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n\n  const r = Math.sqrt(x * x + y * y + z * z);\n  const et = Math.exp(w);\n  const s = r > 0 ? (et * Math.sin(r)) / r : 0;\n\n  out[0] = x * s;\n  out[1] = y * s;\n  out[2] = z * s;\n  out[3] = et * Math.cos(r);\n\n  return out;\n}\n\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\nexport function ln(out, a) {\n  const x = a[0];\n  const y = a[1];\n  const z = a[2];\n  const w = a[3];\n\n  const r = Math.sqrt(x * x + y * y + z * z);\n  const t = r > 0 ? Math.atan2(r, w) / r : 0;\n\n  out[0] = x * t;\n  out[1] = y * t;\n  out[2] = z * t;\n  out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n\n  return out;\n}\n\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\nexport function pow(out, a, b) {\n  ln(out, a);\n  scale(out, out, b);\n  exp(out, out);\n  return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\nexport function slerp(out, a, b, t) {\n  // benchmarks:\n  //    http://jsperf.com/quaternion-slerp-implementations\n  const ax = a[0];\n  const ay = a[1];\n  const az = a[2];\n  const aw = a[3];\n  let bx = b[0];\n  let by = b[1];\n  let bz = b[2];\n  let bw = b[3];\n\n  let cosom;\n  let omega;\n  let scale0;\n  let scale1;\n  let sinom;\n\n  // calc cosine\n  cosom = ax * bx + ay * by + az * bz + aw * bw;\n  // adjust signs (if necessary)\n  if (cosom < 0.0) {\n    cosom = -cosom;\n    bx = -bx;\n    by = -by;\n    bz = -bz;\n    bw = -bw;\n  }\n  // calculate coefficients\n  if (1.0 - cosom > glMatrix.EPSILON) {\n    // standard case (slerp)\n    omega = Math.acos(cosom);\n    sinom = Math.sin(omega);\n    scale0 = Math.sin((1.0 - t) * omega) / sinom;\n    scale1 = Math.sin(t * omega) / sinom;\n  } else {\n    // \"from\" and \"to\" quaternions are very close\n    //  ... so we can do a linear interpolation\n    scale0 = 1.0 - t;\n    scale1 = t;\n  }\n  // calculate final values\n  out[0] = scale0 * ax + scale1 * bx;\n  out[1] = scale0 * ay + scale1 * by;\n  out[2] = scale0 * az + scale1 * bz;\n  out[3] = scale0 * aw + scale1 * bw;\n\n  return out;\n}\n\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n// export function random(out) {\n//   // Implementation of http://planning.cs.uiuc.edu/node198.html\n//   // TODO: Calling random 3 times is probably not the fastest solution\n//   let u1 = glMatrix.RANDOM();\n//   let u2 = glMatrix.RANDOM();\n//   let u3 = glMatrix.RANDOM();\n\n//   let sqrt1MinusU1 = Math.sqrt(1 - u1);\n//   let sqrtU1 = Math.sqrt(u1);\n\n//   out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n//   out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n//   out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n//   out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n//   return out;\n// }\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\nexport function invert(out, a) {\n  const a0 = a[0];\n  const a1 = a[1];\n  const a2 = a[2];\n  const a3 = a[3];\n  const dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n  const invDot = dot ? 1.0 / dot : 0;\n\n  // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n  out[0] = -a0 * invDot;\n  out[1] = -a1 * invDot;\n  out[2] = -a2 * invDot;\n  out[3] = a3 * invDot;\n  return out;\n}\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nexport function conjugate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = a[3];\n  return out;\n}\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nexport function fromMat3(out, m) {\n  // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n  // article \"Quaternion Calculus and Fast Animation\".\n  const fTrace = m[0] + m[4] + m[8];\n  let fRoot;\n\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0); // 2w\n    out[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot; // 1/(4w)\n    out[0] = (m[5] - m[7]) * fRoot;\n    out[1] = (m[6] - m[2]) * fRoot;\n    out[2] = (m[1] - m[3]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    let i = 0;\n    if (m[4] > m[0]) i = 1;\n    if (m[8] > m[i * 3 + i]) i = 2;\n    const j = (i + 1) % 3;\n    const k = (i + 2) % 3;\n\n    fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n    out[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n    out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n    out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n  }\n\n  return out;\n}\n\n/**\n * Creates a quaternion from the given euler angle x, y, z using the provided intrinsic order for the conversion.\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x Angle to rotate around X axis in degrees.\n * @param {Number} y Angle to rotate around Y axis in degrees.\n * @param {Number} z Angle to rotate around Z axis in degrees.\n * @param {'zyx'|'xyz'|'yxz'|'yzx'|'zxy'|'zyx'} order Intrinsic order for conversion, default is zyx.\n * @returns {quat} out\n * @function\n */\n// export function fromEuler(out, x, y, z, order = glMatrix.ANGLE_ORDER) {\n//   let halfToRad = Math.PI / 360;\n//   x *= halfToRad;\n//   z *= halfToRad;\n//   y *= halfToRad;\n\n//   let sx = Math.sin(x);\n//   let cx = Math.cos(x);\n//   let sy = Math.sin(y);\n//   let cy = Math.cos(y);\n//   let sz = Math.sin(z);\n//   let cz = Math.cos(z);\n\n//   switch (order) {\n//     case \"xyz\":\n//       out[0] = sx * cy * cz + cx * sy * sz;\n//       out[1] = cx * sy * cz - sx * cy * sz;\n//       out[2] = cx * cy * sz + sx * sy * cz;\n//       out[3] = cx * cy * cz - sx * sy * sz;\n//       break;\n\n//     case \"xzy\":\n//       out[0] = sx * cy * cz - cx * sy * sz;\n//       out[1] = cx * sy * cz - sx * cy * sz;\n//       out[2] = cx * cy * sz + sx * sy * cz;\n//       out[3] = cx * cy * cz + sx * sy * sz;\n//       break;\n\n//     case \"yxz\":\n//       out[0] = sx * cy * cz + cx * sy * sz;\n//       out[1] = cx * sy * cz - sx * cy * sz;\n//       out[2] = cx * cy * sz - sx * sy * cz;\n//       out[3] = cx * cy * cz + sx * sy * sz;\n//       break;\n\n//     case \"yzx\":\n//       out[0] = sx * cy * cz + cx * sy * sz;\n//       out[1] = cx * sy * cz + sx * cy * sz;\n//       out[2] = cx * cy * sz - sx * sy * cz;\n//       out[3] = cx * cy * cz - sx * sy * sz;\n//       break;\n\n//     case \"zxy\":\n//       out[0] = sx * cy * cz - cx * sy * sz;\n//       out[1] = cx * sy * cz + sx * cy * sz;\n//       out[2] = cx * cy * sz + sx * sy * cz;\n//       out[3] = cx * cy * cz - sx * sy * sz;\n//       break;\n\n//     case \"zyx\":\n//       out[0] = sx * cy * cz - cx * sy * sz;\n//       out[1] = cx * sy * cz + sx * cy * sz;\n//       out[2] = cx * cy * sz - sx * sy * cz;\n//       out[3] = cx * cy * cz + sx * sy * sz;\n//       break;\n\n//     default:\n//       throw new Error('Unknown angle order ' + order);\n//   }\n\n//   return out;\n// }\n\n/**\n * Returns a string representation of a quaternion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n  return `quat(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]})`;\n}\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nexport const clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nexport const fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nexport const copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nexport const set = vec4.set;\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\nexport const add = vec4.add;\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nexport const mul = multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nexport const scale = vec4.scale;\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nexport const dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\nexport const lerp = vec4.lerp;\n\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport const length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nexport const len = length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nexport const squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nexport const sqrLen = squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nexport const normalize = vec4.normalize;\n\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport const exactEquals = vec4.exactEquals;\n\n/**\n * Returns whether or not the quaternions point approximately to the same direction.\n *\n * Both quaternions are assumed to be unit length.\n *\n * @param {ReadonlyQuat} a The first unit quaternion.\n * @param {ReadonlyQuat} b The second unit quaternion.\n * @returns {Boolean} True if the quaternions are equal, false otherwise.\n */\nexport function equals(a, b) {\n  return Math.abs(vec4.dot(a, b)) >= 1 - glMatrix.EPSILON;\n}\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\nexport const rotationTo = (function () {\n  const tmpvec3 = vec3.create();\n  const xUnitVec3 = vec3.fromValues(1, 0, 0);\n  const yUnitVec3 = vec3.fromValues(0, 1, 0);\n\n  return function (out, a, b) {\n    const dot = vec3.dot(a, b);\n    if (dot < -0.999999) {\n      vec3.cross(tmpvec3, xUnitVec3, a);\n      if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n      vec3.normalize(tmpvec3, tmpvec3);\n      setAxisAngle(out, tmpvec3, Math.PI);\n      return out;\n    } else if (dot > 0.999999) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 1;\n      return out;\n    }\n    vec3.cross(tmpvec3, a, b);\n    out[0] = tmpvec3[0];\n    out[1] = tmpvec3[1];\n    out[2] = tmpvec3[2];\n    out[3] = 1 + dot;\n    return normalize(out, out);\n  };\n})();\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\nexport const sqlerp = (function () {\n  const temp1 = create();\n  const temp2 = create();\n\n  return function (out, a, b, c, d, t) {\n    slerp(temp1, a, d, t);\n    slerp(temp2, b, c, t);\n    slerp(out, temp1, temp2, 2 * t * (1 - t));\n\n    return out;\n  };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view  the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nexport const setAxes = (function () {\n  const matr = mat3.create();\n\n  return function (out, view, right, up) {\n    matr[0] = right[0];\n    matr[3] = right[1];\n    matr[6] = right[2];\n\n    matr[1] = up[0];\n    matr[4] = up[1];\n    matr[7] = up[2];\n\n    matr[2] = -view[0];\n    matr[5] = -view[1];\n    matr[8] = -view[2];\n\n    return normalize(out, fromMat3(out, matr));\n  };\n})();\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// NOTE: Added to make Cesium-derived test cases work\n// TODO: Determine if/how to keep\nexport const EPSILON1 = 1e-1;\nexport const EPSILON2 = 1e-2;\nexport const EPSILON3 = 1e-3;\nexport const EPSILON4 = 1e-4;\nexport const EPSILON5 = 1e-5;\nexport const EPSILON6 = 1e-6;\nexport const EPSILON7 = 1e-7;\nexport const EPSILON8 = 1e-8;\nexport const EPSILON9 = 1e-9;\nexport const EPSILON10 = 1e-10;\nexport const EPSILON11 = 1e-11;\nexport const EPSILON12 = 1e-12;\nexport const EPSILON13 = 1e-13;\nexport const EPSILON14 = 1e-14;\nexport const EPSILON15 = 1e-15;\nexport const EPSILON16 = 1e-16;\nexport const EPSILON17 = 1e-17;\nexport const EPSILON18 = 1e-18;\nexport const EPSILON19 = 1e-19;\nexport const EPSILON20 = 1e-20;\n\nexport const PI_OVER_TWO = Math.PI / 2;\nexport const PI_OVER_FOUR = Math.PI / 4;\nexport const PI_OVER_SIX = Math.PI / 6;\n\nexport const TWO_PI = Math.PI * 2;\n", "// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// types\nexport type {\n  TypedArray,\n  TypedArrayConstructor,\n  NumericArray,\n  NumberArray,\n  NumberArray2,\n  NumberArray3,\n  NumberArray4,\n  NumberArray6,\n  NumberArray8,\n  NumberArray9,\n  NumberArray12,\n  NumberArray16\n} from '@math.gl/types';\n\nexport type {isTypedArray, isNumberArray, isNumericArray} from '@math.gl/types';\n\n// classes\nexport {Vector2} from './classes/vector2';\nexport {Vector3} from './classes/vector3';\nexport {Vector4} from './classes/vector4';\nexport {Matrix3} from './classes/matrix3';\nexport {Matrix4} from './classes/matrix4';\nexport {Quaternion} from './classes/quaternion';\n\nexport type {Vector2Like} from './classes/vector2';\nexport type {Vector3Like} from './classes/vector3';\nexport type {Vector4Like} from './classes/vector4';\nexport type {Matrix3Like} from './classes/matrix3';\nexport type {Matrix4Like} from './classes/matrix4';\n\n// experimental\nexport {SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose} from './classes/pose';\nexport {Euler} from './classes/euler';\n\nexport * as _MathUtils from './lib/math-utils';\n\n// lib\nexport {assert} from './lib/assert';\n\nexport {\n  // math.gl global utility methods\n  config,\n  configure,\n  formatValue,\n  isArray,\n  clone,\n  equals,\n  exactEquals,\n  toRadians,\n  toDegrees,\n  // math.gl \"GLSL\"-style functions\n  radians,\n  degrees,\n  sin,\n  cos,\n  tan,\n  asin,\n  acos,\n  atan,\n  clamp,\n  lerp,\n  withEpsilon\n} from './lib/common';\n\n// DEPRECATED\nexport {SphericalCoordinates as _SphericalCoordinates} from './classes/spherical-coordinates';\nexport {Pose as _Pose} from './classes/pose';\nexport {Euler as _Euler} from './classes/euler';\n\n/** @deprecated Use Matrix3 */\nexport * as mat3 from './gl-matrix/mat3';\n/** @deprecated Use Matrix4 */\nexport * as mat4 from './gl-matrix/mat4';\n/** @deprecated Use Quaterinion */\nexport * as quat from './gl-matrix/quat';\n/** @deprecated UseVector */\nexport * as vec2 from './gl-matrix/vec2';\n/** @deprecated Use Vector3 */\nexport * as vec3 from './gl-matrix/vec3';\n/** @deprecated Use Vector4 */\nexport * as vec4 from './gl-matrix/vec4';\n", "/**\n * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md\n */\n\nimport {Vector3, Matrix3} from '@math.gl/core';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {\n  GLTFMeshPrimitive,\n  GLTFAccessor,\n  GLTFMaterialNormalTextureInfo,\n  GLTFMaterialOcclusionTextureInfo,\n  GLTFTextureInfo\n} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\n\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {BYTES, COMPONENTS} from '../gltf-utils/gltf-constants';\nimport {} from '../types/gltf-json-schema';\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\nimport {ensureArrayBuffer} from '@loaders.gl/loader-utils';\n\n/** Extension name */\nconst KHR_TEXTURE_TRANSFORM = 'KHR_texture_transform';\n\nexport const name = KHR_TEXTURE_TRANSFORM;\n\nconst scratchVector = new Vector3();\nconst scratchRotationMatrix = new Matrix3();\nconst scratchScaleMatrix = new Matrix3();\n\n/** Extension textureInfo https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\ntype TextureInfo = {\n  /** The offset of the UV coordinate origin as a factor of the texture dimensions. */\n  offset?: [number, number];\n  /** Rotate the UVs by this many radians counter-clockwise around the origin. This is equivalent to a similar rotation of the image clockwise. */\n  rotation?: number;\n  /** The scale factor applied to the components of the UV coordinates. */\n  scale?: [number, number];\n  /** Overrides the textureInfo texCoord value if supplied, and if this extension is supported. */\n  texCoord?: number;\n};\n/** Intersection of all GLTF textures */\ntype CompoundGLTFTextureInfo = GLTFTextureInfo &\n  GLTFMaterialNormalTextureInfo &\n  GLTFMaterialOcclusionTextureInfo;\n/** Parameters for TEXCOORD transformation */\ntype TransformParameters = {\n  /** Original texCoord value https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#_textureinfo_texcoord */\n  originalTexCoord: number;\n  /** New texCoord value from extension https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates */\n  texCoord: number;\n  /** Transformation matrix */\n  matrix: Matrix3;\n};\n\n/**\n * The extension entry to process the transformation\n * @param gltfData gltf buffers and json\n * @param options GLTFLoader options\n */\nexport async function decode(gltfData: GLTFWithBuffers, options: GLTFLoaderOptions) {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const hasExtension = gltfScenegraph.hasExtension(KHR_TEXTURE_TRANSFORM);\n  if (!hasExtension || !options.gltf?.loadBuffers) {\n    return;\n  }\n  const materials = gltfData.json.materials || [];\n  for (let i = 0; i < materials.length; i++) {\n    transformTexCoords(i, gltfData);\n  }\n}\n\n/**\n * Transform TEXCOORD by material\n * @param materialIndex processing material index\n * @param gltfData gltf buffers and json\n */\nfunction transformTexCoords(materialIndex: number, gltfData: GLTFWithBuffers): void {\n  const material = gltfData.json.materials?.[materialIndex];\n  const materialTextures = [\n    material?.pbrMetallicRoughness?.baseColorTexture,\n    material?.emissiveTexture,\n    material?.normalTexture,\n    material?.occlusionTexture,\n    material?.pbrMetallicRoughness?.metallicRoughnessTexture\n  ];\n\n  // Save processed texCoords in order no to process the same twice\n  const processedTexCoords: [number, number][] = [];\n\n  for (const textureInfo of materialTextures) {\n    if (textureInfo && textureInfo?.extensions?.[KHR_TEXTURE_TRANSFORM]) {\n      transformPrimitives(gltfData, materialIndex, textureInfo, processedTexCoords);\n    }\n  }\n}\n\n/**\n * Transform primitives of the particular material\n * @param gltfData gltf data\n * @param materialIndex primitives with this material will be transformed\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n */\nfunction transformPrimitives(\n  gltfData: GLTFWithBuffers,\n  materialIndex: number,\n  texture: CompoundGLTFTextureInfo,\n  processedTexCoords: [number, number][]\n) {\n  const transformParameters = getTransformParameters(texture, processedTexCoords);\n  if (!transformParameters) {\n    return;\n  }\n  const meshes = gltfData.json.meshes || [];\n  for (const mesh of meshes) {\n    for (const primitive of mesh.primitives) {\n      const material = primitive.material;\n      if (Number.isFinite(material) && materialIndex === material) {\n        transformPrimitive(gltfData, primitive, transformParameters);\n      }\n    }\n  }\n}\n\n/**\n * Get parameters for TEXCOORD transformation\n * @param texture texture object\n * @param processedTexCoords storage to save already processed texCoords\n * @returns texCoord couple and transformation matrix\n */\nfunction getTransformParameters(\n  texture: CompoundGLTFTextureInfo,\n  processedTexCoords: [number, number][]\n): TransformParameters | null {\n  const textureInfo = texture.extensions?.[KHR_TEXTURE_TRANSFORM];\n  const {texCoord: originalTexCoord = 0} = texture;\n  // If texCoord is not set in the extension, original attribute data will be replaced\n  const {texCoord = originalTexCoord} = textureInfo;\n  // Make sure that couple [originalTexCoord, extensionTexCoord] is not processed twice\n  const isProcessed =\n    processedTexCoords.findIndex(\n      ([original, newTexCoord]) => original === originalTexCoord && newTexCoord === texCoord\n    ) !== -1;\n  if (!isProcessed) {\n    const matrix = makeTransformationMatrix(textureInfo);\n    if (originalTexCoord !== texCoord) {\n      texture.texCoord = texCoord;\n    }\n    processedTexCoords.push([originalTexCoord, texCoord]);\n    return {originalTexCoord, texCoord, matrix};\n  }\n  return null;\n}\n\n/**\n * Transform `TEXCOORD_0` attribute in the primitive\n * @param gltfData gltf data\n * @param primitive primitive object\n * @param transformParameters texCoord couple and transformation matrix\n */\nfunction transformPrimitive(\n  gltfData: GLTFWithBuffers,\n  primitive: GLTFMeshPrimitive,\n  transformParameters: TransformParameters\n) {\n  const {originalTexCoord, texCoord, matrix} = transformParameters;\n  const texCoordAccessor = primitive.attributes[`TEXCOORD_${originalTexCoord}`];\n  if (Number.isFinite(texCoordAccessor)) {\n    // Get accessor of the `TEXCOORD_0` attribute\n    const accessor = gltfData.json.accessors?.[texCoordAccessor];\n    if (accessor && accessor.bufferView !== undefined) {\n      // Get `bufferView` of the `accessor`\n      const bufferView = gltfData.json.bufferViews?.[accessor.bufferView];\n      if (bufferView) {\n        // Get `arrayBuffer` the `bufferView` look at\n        const {arrayBuffer, byteOffset: bufferByteOffset} = gltfData.buffers[bufferView.buffer];\n        // Resulting byteOffset is sum of the buffer, accessor and bufferView byte offsets\n        const byteOffset =\n          (bufferByteOffset || 0) + (accessor.byteOffset || 0) + (bufferView.byteOffset || 0);\n        // Deduce TypedArray type and its length from `accessor` and `bufferView` data\n        const {ArrayType, length} = getAccessorArrayTypeAndLength(accessor, bufferView);\n        // Number of bytes each component occupies\n        const bytes = BYTES[accessor.componentType];\n        // Number of components. For the `TEXCOORD_0` with `VEC2` type, it must return 2\n        const components = COMPONENTS[accessor.type];\n        // Multiplier to calculate the address of the `TEXCOORD_0` element in the arrayBuffer\n        const elementAddressScale = bufferView.byteStride || bytes * components;\n        // Data transform to Float32Array\n        const result = new Float32Array(length);\n        for (let i = 0; i < accessor.count; i++) {\n          // Take [u, v] couple from the arrayBuffer\n          const uv = new ArrayType(arrayBuffer, byteOffset + i * elementAddressScale, 2);\n          // Set and transform Vector3 per https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#overview\n          scratchVector.set(uv[0], uv[1], 1);\n          scratchVector.transformByMatrix3(matrix);\n          // Save result in Float32Array\n          result.set([scratchVector[0], scratchVector[1]], i * components);\n        }\n        // If texCoord the same, replace gltf structural data\n        if (originalTexCoord === texCoord) {\n          updateGltf(accessor, gltfData, result, accessor.bufferView);\n        } else {\n          // If texCoord change, create new attribute\n          createAttribute(texCoord, accessor, primitive, gltfData, result);\n        }\n      }\n    }\n  }\n}\n\n/**\n * Update GLTF structural objects with new data as we create new `Float32Array` for `TEXCOORD_0`.\n * @param accessor accessor to change\n * @param gltfData gltf json and buffers\n * @param newTexcoordArray typed array with data after transformation\n */\nfunction updateGltf(\n  accessor: GLTFAccessor,\n  gltfData: GLTFWithBuffers,\n  newTexCoordArray: Float32Array,\n  originalBufferViewIndex: number\n): void {\n  accessor.componentType = 5126;\n  accessor.byteOffset = 0;\n\n  const accessors = gltfData.json.accessors || [];\n  const bufferViewReferenceCount = accessors.reduce((count, currentAccessor) => {\n    return currentAccessor.bufferView === originalBufferViewIndex ? count + 1 : count;\n  }, 0);\n  const shouldCreateNewBufferView = bufferViewReferenceCount > 1;\n\n  gltfData.buffers.push({\n    arrayBuffer: ensureArrayBuffer(newTexCoordArray.buffer),\n    byteOffset: 0,\n    byteLength: newTexCoordArray.buffer.byteLength\n  });\n  const newBufferIndex = gltfData.buffers.length - 1;\n\n  gltfData.json.bufferViews = gltfData.json.bufferViews || [];\n  if (shouldCreateNewBufferView) {\n    gltfData.json.bufferViews.push({\n      buffer: newBufferIndex,\n      byteLength: newTexCoordArray.buffer.byteLength,\n      byteOffset: 0\n    });\n    accessor.bufferView = gltfData.json.bufferViews.length - 1;\n    return;\n  }\n\n  const bufferView = gltfData.json.bufferViews[originalBufferViewIndex];\n  if (!bufferView) {\n    return;\n  }\n  bufferView.buffer = newBufferIndex;\n  bufferView.byteOffset = 0;\n  bufferView.byteLength = newTexCoordArray.buffer.byteLength;\n  if (bufferView.byteStride !== undefined) {\n    delete (bufferView as {byteStride?: number}).byteStride;\n  }\n}\n\n/**\n *\n * @param newTexCoord new `texCoord` value\n * @param originalAccessor original accessor object, that store data before transformation\n * @param primitive primitive object\n * @param gltfData gltf data\n * @param newTexCoordArray typed array with data after transformation\n * @returns\n */\nfunction createAttribute(\n  newTexCoord: number,\n  originalAccessor: GLTFAccessor,\n  primitive: GLTFMeshPrimitive,\n  gltfData: GLTFWithBuffers,\n  newTexCoordArray: Float32Array\n) {\n  gltfData.buffers.push({\n    arrayBuffer: ensureArrayBuffer(newTexCoordArray.buffer),\n    byteOffset: 0,\n    byteLength: newTexCoordArray.buffer.byteLength\n  });\n  gltfData.json.bufferViews = gltfData.json.bufferViews || [];\n  const bufferViews = gltfData.json.bufferViews;\n  bufferViews.push({\n    buffer: gltfData.buffers.length - 1,\n    byteLength: newTexCoordArray.buffer.byteLength,\n    byteOffset: 0\n  });\n  const accessors = gltfData.json.accessors;\n  if (!accessors) {\n    return;\n  }\n  accessors.push({\n    bufferView: bufferViews?.length - 1,\n    byteOffset: 0,\n    componentType: 5126,\n    count: originalAccessor.count,\n    type: 'VEC2'\n  });\n  primitive.attributes[`TEXCOORD_${newTexCoord}`] = accessors.length - 1;\n}\n\n/**\n * Construct transformation matrix from the extension data (transition, rotation, scale)\n * @param extensionData extension data\n * @returns transformation matrix\n */\nfunction makeTransformationMatrix(extensionData: TextureInfo): Matrix3 {\n  const {offset = [0, 0], rotation = 0, scale = [1, 1]} = extensionData;\n  const translationMatrix = new Matrix3().set(1, 0, 0, 0, 1, 0, offset[0], offset[1], 1);\n  const rotationMatrix = scratchRotationMatrix.set(\n    Math.cos(rotation),\n    Math.sin(rotation),\n    0,\n    -Math.sin(rotation),\n    Math.cos(rotation),\n    0,\n    0,\n    0,\n    1\n  );\n  const scaleMatrix = scratchScaleMatrix.set(scale[0], 0, 0, 0, scale[1], 0, 0, 0, 1);\n  return translationMatrix.multiplyRight(rotationMatrix).multiplyRight(scaleMatrix);\n}\n", "// GLTF EXTENSION: KHR_lights_punctual\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n\nimport type {GLTF} from '../../types/gltf-json-schema';\n\nimport {assert} from '../../utils/assert';\nimport {GLTFScenegraph} from '../../api/gltf-scenegraph';\n\nconst KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';\n\nexport const name = KHR_LIGHTS_PUNCTUAL;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  // Move the light array out of the extension and remove the extension\n  const extension = gltfScenegraph.getExtension(KHR_LIGHTS_PUNCTUAL);\n  if (extension) {\n    // @ts-ignore\n    gltfScenegraph.json.lights = extension.lights;\n    gltfScenegraph.removeExtension(KHR_LIGHTS_PUNCTUAL);\n  }\n\n  // Any nodes that have the extension, add lights field pointing to light object\n  // and remove the extension\n  for (const node of json.nodes || []) {\n    const nodeExtension = gltfScenegraph.getObjectExtension(node, KHR_LIGHTS_PUNCTUAL);\n    if (nodeExtension) {\n      // @ts-ignore\n      node.light = nodeExtension.light;\n    }\n    gltfScenegraph.removeObjectExtension(node, KHR_LIGHTS_PUNCTUAL);\n  }\n}\n\n// Move the light ar ray out of the extension and remove the extension\nexport async function encode(gltfData): Promise<void> {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  // @ts-ignore\n  if (json.lights) {\n    const extension = gltfScenegraph.addExtension(KHR_LIGHTS_PUNCTUAL);\n    // @ts-ignore\n    assert(!extension.lights);\n    // @ts-ignore\n    extension.lights = json.lights;\n    // @ts-ignore\n    delete json.lights;\n  }\n\n  // Any nodes that have lights field pointing to light object\n  // add the extension\n  // @ts-ignore\n  if (gltfScenegraph.json.lights) {\n    // @ts-ignore\n    for (const light of gltfScenegraph.json.lights) {\n      const node = light.node;\n      gltfScenegraph.addObjectExtension(node, KHR_LIGHTS_PUNCTUAL, light);\n    }\n    // @ts-ignore\n    delete gltfScenegraph.json.lights;\n  }\n}\n", "// GLTF EXTENSION: KHR_materials_unlit\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n\nimport type {GLTF} from '../../types/gltf-json-schema';\n\nimport {GLTFScenegraph} from '../../api/gltf-scenegraph';\n\nconst KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';\n\nexport const name = KHR_MATERIALS_UNLIT;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  // Any nodes that have the extension, add lights field pointing to light object\n  // and remove the extension\n  for (const material of json.materials || []) {\n    const extension = material.extensions && material.extensions.KHR_materials_unlit;\n    if (extension) {\n      // @ts-ignore TODO\n      material.unlit = true;\n    }\n    gltfScenegraph.removeObjectExtension(material, KHR_MATERIALS_UNLIT);\n  }\n\n  // Remove the top-level extension\n  gltfScenegraph.removeExtension(KHR_MATERIALS_UNLIT);\n}\n\nexport function encode(gltfData) {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  // Any nodes that have lights field pointing to light object\n  // add the extension\n  // @ts-ignore\n  if (gltfScenegraph.materials) {\n    for (const material of json.materials || []) {\n      // @ts-ignore\n      if (material.unlit) {\n        // @ts-ignore\n        delete material.unlit;\n        gltfScenegraph.addObjectExtension(material, KHR_MATERIALS_UNLIT, {});\n        gltfScenegraph.addExtension(KHR_MATERIALS_UNLIT);\n      }\n    }\n  }\n}\n", "// GLTF EXTENSION: KHR_techniques_webgl\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_techniques_webgl\n\nimport type {GLTF} from '../../types/gltf-json-schema';\n\nimport {GLTFScenegraph} from '../../api/gltf-scenegraph';\n\nconst KHR_TECHNIQUES_WEBGL = 'KHR_techniques_webgl';\n\nexport const name = KHR_TECHNIQUES_WEBGL;\n\nexport async function decode(gltfData: {json: GLTF}): Promise<void> {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  const extension = gltfScenegraph.getExtension(KHR_TECHNIQUES_WEBGL);\n  if (extension) {\n    const techniques = resolveTechniques(extension, gltfScenegraph);\n\n    for (const material of json.materials || []) {\n      const materialExtension = gltfScenegraph.getObjectExtension(material, KHR_TECHNIQUES_WEBGL);\n      if (materialExtension) {\n        // @ts-ignore TODO\n        material.technique = Object.assign(\n          {},\n          materialExtension,\n          // @ts-ignore\n          techniques[materialExtension.technique]\n        );\n        // @ts-ignore TODO\n        material.technique.values = resolveValues(material.technique, gltfScenegraph);\n      }\n      gltfScenegraph.removeObjectExtension(material, KHR_TECHNIQUES_WEBGL);\n    }\n\n    // Remove the top-level extension\n    gltfScenegraph.removeExtension(KHR_TECHNIQUES_WEBGL);\n  }\n}\n// eslint-disable-next-line\nexport async function encode(gltfData, options): Promise<void> {\n  // TODO\n}\n\nfunction resolveTechniques(\n  techniquesExtension: {[key: string]: any},\n  // programs: {[key: string]: any}[],\n  // shaders: {[key: string]: any}[],\n  // techniques: {[key: string]: any}[]\n  gltfScenegraph\n) {\n  const {programs = [], shaders = [], techniques = []} = techniquesExtension;\n  const textDecoder = new TextDecoder();\n\n  shaders.forEach((shader) => {\n    if (Number.isFinite(shader.bufferView)) {\n      shader.code = textDecoder.decode(\n        gltfScenegraph.getTypedArrayForBufferView(shader.bufferView)\n      );\n    } else {\n      // TODO: handle URI shader\n      throw new Error('KHR_techniques_webgl: no shader code');\n    }\n  });\n\n  programs.forEach((program) => {\n    program.fragmentShader = shaders[program.fragmentShader];\n    program.vertexShader = shaders[program.vertexShader];\n  });\n\n  techniques.forEach((technique) => {\n    technique.program = programs[technique.program];\n  });\n\n  return techniques;\n}\n\nfunction resolveValues(technique, gltfScenegraph) {\n  const values = Object.assign({}, technique.values);\n\n  // merge values from uniforms\n  Object.keys(technique.uniforms || {}).forEach((uniform) => {\n    if (technique.uniforms[uniform].value && !(uniform in values)) {\n      values[uniform] = technique.uniforms[uniform].value;\n    }\n  });\n\n  // resolve textures\n  Object.keys(values).forEach((uniform) => {\n    if (typeof values[uniform] === 'object' && values[uniform].index !== undefined) {\n      // Assume this is a texture\n      // TODO: find if there are any other types that can be referenced\n      values[uniform].texture = gltfScenegraph.getTexture(values[uniform].index);\n    }\n  });\n\n  return values;\n}\n", "/* eslint-disable camelcase */\nimport {GLTF} from '../types/gltf-json-schema';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport {GLTFWriterOptions} from '../../gltf-writer';\n\n// GLTF 1.0 extensions (decode only)\n// import * as KHR_binary_gltf from './KHR_draco_mesh_compression';\n\n// GLTF 2.0 Vendor extensions\nimport * as EXT_mesh_features from '../extensions/EXT_mesh_features';\nimport * as EXT_structural_metadata from '../extensions/EXT_structural_metadata';\n\n// GLTF 2.0 Khronos extensions (decode/encode)\nimport * as EXT_meshopt_compression from '../extensions/EXT_meshopt_compression';\nimport * as EXT_texture_webp from '../extensions/EXT_texture_webp';\nimport * as KHR_texture_basisu from '../extensions/KHR_texture_basisu';\nimport * as KHR_draco_mesh_compression from '../extensions/KHR_draco_mesh_compression';\nimport * as KHR_texture_transform from '../extensions/KHR_texture_transform';\n\n// Deprecated. These should be handled by rendering library (e.g. luma.gl), not the loader.\nimport * as KHR_lights_punctual from '../extensions/deprecated/KHR_lights_punctual';\nimport * as KHR_materials_unlit from '../extensions/deprecated/KHR_materials_unlit';\nimport * as KHR_techniques_webgl from '../extensions/deprecated/KHR_techniques_webgl';\nimport * as EXT_feature_metadata from '../extensions/deprecated/EXT_feature_metadata';\n\ntype GLTFExtensionPlugin = {\n  name: string;\n  preprocess?: (gltfData: {json: GLTF}, options: GLTFLoaderOptions, context) => void;\n  decode?: (\n    gltfData: {\n      json: GLTF;\n      buffers: {arrayBuffer: ArrayBuffer; byteOffset: number; byteLength: number}[];\n    },\n    options: GLTFLoaderOptions,\n    context\n  ) => Promise<void>;\n  encode?: (gltfData: {json: GLTF}, options: GLTFWriterOptions) => void;\n};\n\n/**\n * List of extensions processed by the GLTFLoader\n * Note that may extensions can only be handled on the rendering stage and are left out here\n * These are just extensions that can be handled fully or partially during loading.\n */\nexport const EXTENSIONS: GLTFExtensionPlugin[] = [\n  // 1.0\n  // KHR_binary_gltf is handled separately - must be processed before other parsing starts\n  // KHR_binary_gltf,\n\n  // 2.0\n  EXT_structural_metadata,\n  EXT_mesh_features,\n  EXT_meshopt_compression,\n  EXT_texture_webp,\n  // Basisu should come after webp, we want basisu to be preferred if both are provided\n  KHR_texture_basisu,\n  KHR_draco_mesh_compression,\n  KHR_lights_punctual,\n  KHR_materials_unlit,\n  KHR_techniques_webgl,\n  KHR_texture_transform,\n  EXT_feature_metadata\n];\n\n/**\n * List of extensions processed by the GLTFWriter\n */\nconst EXTENSIONS_ENCODING: GLTFExtensionPlugin[] = [EXT_structural_metadata, EXT_mesh_features];\n\n/** Call before any resource loading starts */\nexport function preprocessExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n  const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n  for (const extension of extensions) {\n    extension.preprocess?.(gltf, options, context);\n  }\n}\n\n/** Call after resource loading */\nexport async function decodeExtensions(gltf, options: GLTFLoaderOptions = {}, context?) {\n  const extensions = EXTENSIONS.filter((extension) => useExtension(extension.name, options));\n  for (const extension of extensions) {\n    // Note: We decode async extensions sequentially, this might not be necessary\n    // Currently we only have Draco, but when we add Basis we may revisit\n    await extension.decode?.(gltf, options, context);\n  }\n}\n\n/** Call before resource writing */\nexport function encodeExtensions(gltf, options: GLTFWriterOptions = {}) {\n  for (const extension of EXTENSIONS_ENCODING) {\n    gltf = extension.encode?.(gltf, options) ?? gltf;\n  }\n  return gltf;\n}\n\nfunction useExtension(extensionName: string, options: GLTFLoaderOptions) {\n  const excludes = options?.gltf?.excludeExtensions || {};\n  const exclude = extensionName in excludes && !excludes[extensionName];\n  return !exclude;\n}\n", "// GLTF 1.0 EXTENSION: KHR_binary_glTF\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n/* eslint-disable camelcase */\n\nimport type {GLTF, GLTF_KHR_binary_glTF} from '../types/gltf-json-schema';\n\nimport {GLTFScenegraph} from '../api/gltf-scenegraph';\n\nconst KHR_BINARY_GLTF = 'KHR_binary_glTF';\n\n/** Extension name */\nexport const name = KHR_BINARY_GLTF;\n\nexport function preprocess(gltfData: {json: GLTF}): void {\n  const gltfScenegraph = new GLTFScenegraph(gltfData);\n  const {json} = gltfScenegraph;\n\n  // Note: json.buffers.binary_glTF also needs to be replaced\n  // This is currently done during gltf normalization\n\n  // Image and shader nodes can have the extension\n  // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/image.KHR_binary_glTF.schema.json\n  for (const image of json.images || []) {\n    const extension = gltfScenegraph.getObjectExtension<GLTF_KHR_binary_glTF>(\n      image,\n      KHR_BINARY_GLTF\n    );\n    // The data in the extension is valid as glTF 2.0 data inside the object, so just copy it in\n    if (extension) {\n      Object.assign(image, extension);\n    }\n    gltfScenegraph.removeObjectExtension(image, KHR_BINARY_GLTF);\n  }\n\n  // TODO shaders - At least traverse and throw error if used?\n  // https://github.com/KhronosGroup/glTF/blob/master/extensions/1.0/Khronos/KHR_binary_glTF/schema/shader.KHR_binary_glTF.schema.json\n\n  // glTF v1 one files have a partially formed URI field that is not expected in (and causes problems in) 2.0\n  if (json.buffers && json.buffers[0]) {\n    delete json.buffers[0].uri;\n  }\n\n  // Remove the top-level extension as it has now been processed\n  gltfScenegraph.removeExtension(KHR_BINARY_GLTF);\n}\n\n// KHR_binary_gltf is a 1.0 extension that is supported natively by 2.0\n// export function encode() {\n//   throw new Error(KHR_BINARY_GLTF);\n// }\n", "/* eslint-disable camelcase */\nimport * as KHR_binary_glTF from '../extensions/KHR_binary_gltf';\n\n// Binary format changes (mainly implemented by GLBLoader)\n// https://github.com/KhronosGroup/glTF/tree/master/extensions/1.0/Khronos/KHR_binary_glTF\n\n// JSON format changes:\n// https://github.com/khronosgroup/gltf/issues/605\n\n// - [x] Top-level JSON objects are arrays now\n// - [ ] Removed indirection from animation: sampler now refers directly to accessors, #712\n// - [ ] material.parameter.value and technique.parameter.value must be an array, #690\n// - [ ] Node can have only one mesh #821\n// - [ ] Added reqs on JSON encoding\n// - [ ] Added reqs on binary data alignment #802 (comment)\n\n// Additions:\n// - [ ] Added accessor.normalized, #691, #706\n// - [ ] Added glExtensionsUsed property and 5125 (UNSIGNED_INT) accessor.componentType value, #619\n// - [ ] Added extensionsRequired property, #720, #721\n// - [ ] Added \"STEP\" as valid animation.sampler.interpolation value, #712\n\n// Removals:\n// - [x] Removed buffer.type, #786, #629\n// - [ ] Removed revision number from profile.version, #709\n// - [ ] Removed technique.functions.scissor and removed 3089 (SCISSOR_TEST) as a valid value for technique.states.enable, #681\n// - [ ] Techniques, programs, and shaders were moved out to KHR_technique_webgl extension.\n\n// Other edits:\n// - [x] asset is now required, #642\n// - [ ] buffer.byteLength and bufferView.byteLength are now required, #560.\n// - [ ] accessor.min and accessor.max are now required, #593, and clarified that the JSON value and binary data must be the same, #628.\n// - [ ] Clarified animation.sampler and animation.channel restrictions, #712\n// - [ ] skin.inverseBindMatrices is now optional, #461.\n// - [ ] Attribute parameters can't have a value defined in the technique or parameter, #563 (comment).\n// - [ ] Only TEXCOORD and COLOR attribute semantics can be written in the form [semantic]_[set_index], #563 (comment).\n// - [ ] TEXCOORD and COLOR attribute semantics must be written in the form [semantic]_[set_index], e.g., just TEXCOORD should be TEXCOORD_0, and just COLOR should be COLOR_0, #649\n// - [ ] camera.perspective.aspectRatio and camera.perspective.yfov must now be > 0, not >= 0, #563 (comment).\n// - [ ] Application-specific parameter semantics must start with an underscore, e.g., _TEMPERATURE and _SIMULATION_TIME, #563 (comment).\n// - [ ] Properties in technique.parameters must be defined in technique.uniforms or technique.attributes,\n\n// #563 (comment).\n// - [ ] technique.parameter.count can only be defined when the semantic is JOINTMATRIX or an application-specific semantic is used. It can never be defined for attribute parameters; only uniforms, d2f6945\n// - [ ] technique.parameter.semantic is required when the parameter is an attribute, 28e113d\n// - [ ] Mesh-only models are allowed, e.g., without materials, #642\n// - [ ] Skeleton hierarchies (nodes containing jointName) must be separated from non-skeleton hierarchies., #647\n// - [ ] technique.states.functions.blendColor and technique.states.functions.depthRange parameters now must match WebGL function min/max, #707\n\nconst GLTF_ARRAYS = {\n  accessors: 'accessor',\n  animations: 'animation',\n  buffers: 'buffer',\n  bufferViews: 'bufferView',\n  images: 'image',\n  materials: 'material',\n  meshes: 'mesh',\n  nodes: 'node',\n  samplers: 'sampler',\n  scenes: 'scene',\n  skins: 'skin',\n  textures: 'texture'\n};\n\nconst GLTF_KEYS = {\n  accessor: 'accessors',\n  animations: 'animation',\n  buffer: 'buffers',\n  bufferView: 'bufferViews',\n  image: 'images',\n  material: 'materials',\n  mesh: 'meshes',\n  node: 'nodes',\n  sampler: 'samplers',\n  scene: 'scenes',\n  skin: 'skins',\n  texture: 'textures'\n};\n\n/**\n * Converts (normalizes) glTF v1 to v2\n */\nclass GLTFV1Normalizer {\n  idToIndexMap = {\n    animations: {},\n    accessors: {},\n    buffers: {},\n    bufferViews: {},\n    images: {},\n    materials: {},\n    meshes: {},\n    nodes: {},\n    samplers: {},\n    scenes: {},\n    skins: {},\n    textures: {}\n  };\n\n  json;\n\n  // constructor() {}\n\n  /**\n   * Convert (normalize) glTF < 2.0 to glTF 2.0\n   * @param gltf - object with json and binChunks\n   * @param options\n   * @param options normalize Whether to actually normalize\n   */\n  normalize(gltf, options) {\n    this.json = gltf.json;\n    const json = gltf.json;\n\n    // Check version\n    switch (json.asset && json.asset.version) {\n      // We are converting to v2 format. Return if there is nothing to do\n      case '2.0':\n        return;\n\n      // This class is written to convert 1.0\n      case undefined:\n      case '1.0':\n        break;\n\n      default:\n        // eslint-disable-next-line no-undef, no-console\n        console.warn(`glTF: Unknown version ${json.asset.version}`);\n        return;\n    }\n\n    if (!options.normalize) {\n      // We are still missing a few conversion tricks, remove once addressed\n      throw new Error('glTF v1 is not supported.');\n    }\n\n    // eslint-disable-next-line no-undef, no-console\n    console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');\n\n    this._addAsset(json);\n\n    // In glTF2 top-level fields are Arrays not Object maps\n    this._convertTopLevelObjectsToArrays(json);\n\n    // Extract bufferView indices for images\n    // (this extension needs to be invoked early in the normalization process)\n    // TODO can this be handled by standard extension processing instead of called explicitly?\n    KHR_binary_glTF.preprocess(gltf);\n\n    // Convert object references from ids to indices\n    this._convertObjectIdsToArrayIndices(json);\n\n    this._updateObjects(json);\n\n    this._updateMaterial(json);\n  }\n\n  // asset is now required, #642 https://github.com/KhronosGroup/glTF/issues/639\n  _addAsset(json) {\n    json.asset = json.asset || {};\n    // We are normalizing to glTF v2, so change version to \"2.0\"\n    json.asset.version = '2.0';\n    json.asset.generator = json.asset.generator || 'Normalized to glTF 2.0 by loaders.gl';\n  }\n\n  _convertTopLevelObjectsToArrays(json) {\n    // TODO check that all arrays are covered\n    for (const arrayName in GLTF_ARRAYS) {\n      this._convertTopLevelObjectToArray(json, arrayName);\n    }\n  }\n\n  /** Convert one top level object to array */\n  _convertTopLevelObjectToArray(json, mapName) {\n    const objectMap = json[mapName];\n    if (!objectMap || Array.isArray(objectMap)) {\n      return;\n    }\n\n    // Rewrite the top-level field as an array\n    json[mapName] = [];\n    // Copy the map key into object.id\n    for (const id in objectMap) {\n      const object = objectMap[id];\n      object.id = object.id || id; // Mutates the loaded object\n      const index = json[mapName].length;\n      json[mapName].push(object);\n      this.idToIndexMap[mapName][id] = index;\n    }\n  }\n\n  /** Go through all objects in all top-level arrays and replace ids with indices */\n  _convertObjectIdsToArrayIndices(json) {\n    for (const arrayName in GLTF_ARRAYS) {\n      this._convertIdsToIndices(json, arrayName);\n    }\n    if ('scene' in json) {\n      json.scene = this._convertIdToIndex(json.scene, 'scene');\n    }\n\n    // Convert any index references that are not using array names\n\n    // texture.source (image)\n    for (const texture of json.textures) {\n      this._convertTextureIds(texture);\n    }\n    for (const mesh of json.meshes) {\n      this._convertMeshIds(mesh);\n    }\n    for (const node of json.nodes) {\n      this._convertNodeIds(node);\n    }\n    for (const node of json.scenes) {\n      this._convertSceneIds(node);\n    }\n  }\n\n  _convertTextureIds(texture) {\n    if (texture.source) {\n      texture.source = this._convertIdToIndex(texture.source, 'image');\n    }\n  }\n\n  _convertMeshIds(mesh) {\n    for (const primitive of mesh.primitives) {\n      const {attributes, indices, material} = primitive;\n      for (const attributeName in attributes) {\n        attributes[attributeName] = this._convertIdToIndex(attributes[attributeName], 'accessor');\n      }\n      if (indices) {\n        primitive.indices = this._convertIdToIndex(indices, 'accessor');\n      }\n      if (material) {\n        primitive.material = this._convertIdToIndex(material, 'material');\n      }\n    }\n  }\n\n  _convertNodeIds(node) {\n    if (node.children) {\n      node.children = node.children.map((child) => this._convertIdToIndex(child, 'node'));\n    }\n    if (node.meshes) {\n      node.meshes = node.meshes.map((mesh) => this._convertIdToIndex(mesh, 'mesh'));\n    }\n  }\n\n  _convertSceneIds(scene) {\n    if (scene.nodes) {\n      scene.nodes = scene.nodes.map((node) => this._convertIdToIndex(node, 'node'));\n    }\n  }\n\n  /** Go through all objects in a top-level array and replace ids with indices */\n  _convertIdsToIndices(json, topLevelArrayName) {\n    if (!json[topLevelArrayName]) {\n      console.warn(`gltf v1: json doesn't contain attribute ${topLevelArrayName}`); // eslint-disable-line no-console, no-undef\n      json[topLevelArrayName] = [];\n    }\n    for (const object of json[topLevelArrayName]) {\n      for (const key in object) {\n        const id = object[key];\n        const index = this._convertIdToIndex(id, key);\n        object[key] = index;\n      }\n    }\n  }\n\n  _convertIdToIndex(id, key) {\n    const arrayName = GLTF_KEYS[key];\n    if (arrayName in this.idToIndexMap) {\n      const index = this.idToIndexMap[arrayName][id];\n      if (!Number.isFinite(index)) {\n        throw new Error(`gltf v1: failed to resolve ${key} with id ${id}`);\n      }\n      return index;\n    }\n    return id;\n  }\n\n  /**\n   *\n   * @param {*} json\n   */\n  _updateObjects(json) {\n    for (const buffer of this.json.buffers) {\n      // - [x] Removed buffer.type, #786, #629\n      delete buffer.type;\n    }\n  }\n\n  /**\n   * Update material (set pbrMetallicRoughness)\n   * @param {*} json\n   */\n  _updateMaterial(json) {\n    for (const material of json.materials) {\n      material.pbrMetallicRoughness = {\n        baseColorFactor: [1, 1, 1, 1],\n        metallicFactor: 1,\n        roughnessFactor: 1\n      };\n\n      const textureId =\n        material.values?.tex || material.values?.texture2d_0 || material.values?.diffuseTex;\n      const textureIndex = json.textures.findIndex((texture) => texture.id === textureId);\n      if (textureIndex !== -1) {\n        material.pbrMetallicRoughness.baseColorTexture = {index: textureIndex};\n      }\n    }\n  }\n}\n\nexport function normalizeGLTFV1(gltf, options = {}) {\n  return new GLTFV1Normalizer().normalize(gltf, options);\n}\n", "/* eslint-disable camelcase, max-statements, no-restricted-globals */\nimport type {LoaderContext, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport type {GLTFLoaderOptions} from '../../gltf-loader';\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {GLB} from '../types/glb-types';\nimport type {ParseGLBOptions} from './parse-glb';\n\nimport type {ImageType, TextureLevel} from '@loaders.gl/schema';\nimport {parseJSON, sliceArrayBuffer, parseFromContext} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {BasisLoader} from '@loaders.gl/textures';\n\nimport {assert} from '../utils/assert';\nimport {isGLB, parseGLBSync} from './parse-glb';\nimport {resolveUrl} from '../gltf-utils/resolve-url';\nimport {getTypedArrayForBufferView} from '../gltf-utils/get-typed-array';\nimport {preprocessExtensions, decodeExtensions} from '../api/gltf-extensions';\nimport {normalizeGLTFV1} from '../api/normalize-gltf-v1';\n\n/**  */\nexport type ParseGLTFOptions = ParseGLBOptions & {\n  normalize?: boolean;\n  loadImages?: boolean;\n  loadBuffers?: boolean;\n  decompressMeshes?: boolean;\n  excludeExtensions?: string[];\n  /** @deprecated not supported in v4. `postProcessGLTF()` must be called by the application */\n  postProcess?: never;\n};\n\n/** Check if an array buffer appears to contain GLTF data */\nexport function isGLTF(arrayBuffer: ArrayBuffer, options?: ParseGLTFOptions): boolean {\n  const byteOffset = 0;\n  return isGLB(arrayBuffer, byteOffset, options);\n}\n\nexport async function parseGLTF(\n  gltf: GLTFWithBuffers,\n  arrayBufferOrString,\n  byteOffset = 0,\n  options: GLTFLoaderOptions,\n  context: LoaderContext\n): Promise<GLTFWithBuffers> {\n  parseGLTFContainerSync(gltf, arrayBufferOrString, byteOffset, options);\n\n  normalizeGLTFV1(gltf, {normalize: options?.gltf?.normalize});\n\n  preprocessExtensions(gltf, options, context);\n\n  // Load linked buffers asynchronously and decodes base64 buffers in parallel\n  if (options?.gltf?.loadBuffers && gltf.json.buffers) {\n    await loadBuffers(gltf, options, context);\n  }\n\n  // loadImages and decodeExtensions should not be running in parallel, because\n  // decodeExtensions uses data from images taken during the loadImages call.\n  if (options?.gltf?.loadImages) {\n    await loadImages(gltf, options, context);\n  }\n\n  await decodeExtensions(gltf, options, context);\n\n  return gltf;\n}\n\n/**\n *\n * @param gltf\n * @param data - can be ArrayBuffer (GLB), ArrayBuffer (Binary JSON), String (JSON), or Object (parsed JSON)\n * @param byteOffset\n * @param options\n */\nfunction parseGLTFContainerSync(gltf, data, byteOffset, options: GLTFLoaderOptions) {\n  // Initialize gltf container\n  if (options.core?.baseUrl) {\n    gltf.baseUri = options.core?.baseUrl;\n  }\n\n  // If data is binary and starting with magic bytes, assume binary JSON text, convert to string\n  if (data instanceof ArrayBuffer && !isGLB(data, byteOffset, options.glb)) {\n    const textDecoder = new TextDecoder();\n    data = textDecoder.decode(data);\n  }\n\n  if (typeof data === 'string') {\n    // If string, try to parse as JSON\n    gltf.json = parseJSON(data);\n  } else if (data instanceof ArrayBuffer) {\n    // If still ArrayBuffer, parse as GLB container\n    const glb: GLB = {} as GLB;\n    byteOffset = parseGLBSync(glb, data, byteOffset, options.glb);\n\n    assert(glb.type === 'glTF', `Invalid GLB magic string ${glb.type}`);\n\n    gltf._glb = glb;\n    gltf.json = glb.json;\n  } else {\n    assert(false, 'GLTF: must be ArrayBuffer or string');\n  }\n\n  // Populate buffers\n  // Create an external buffers array to hold binary data\n  const buffers = gltf.json.buffers || [];\n  gltf.buffers = new Array(buffers.length).fill(null);\n\n  // Populates JSON and some bin chunk info\n  if (gltf._glb && gltf._glb.header.hasBinChunk) {\n    const {binChunks} = gltf._glb;\n    gltf.buffers[0] = {\n      arrayBuffer: binChunks[0].arrayBuffer,\n      byteOffset: binChunks[0].byteOffset,\n      byteLength: binChunks[0].byteLength\n    };\n\n    // TODO - this modifies JSON and is a post processing thing\n    // gltf.json.buffers[0].data = gltf.buffers[0].arrayBuffer;\n    // gltf.json.buffers[0].byteOffset = gltf.buffers[0].byteOffset;\n  }\n\n  // Populate images\n  const images = gltf.json.images || [];\n  gltf.images = new Array(images.length).fill({});\n}\n\n/** Asynchronously fetch and parse buffers, store in buffers array outside of json\n * TODO - traverse gltf and determine which buffers are actually needed\n */\nasync function loadBuffers(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n  // TODO\n  const buffers = gltf.json.buffers || [];\n  for (let i = 0; i < buffers.length; ++i) {\n    const buffer = buffers[i];\n    if (buffer.uri) {\n      const {fetch} = context;\n      assert(fetch);\n\n      const uri = resolveUrl(buffer.uri, options, context);\n      const response = await context?.fetch?.(uri);\n      const arrayBuffer = await response?.arrayBuffer?.();\n\n      gltf.buffers[i] = {\n        arrayBuffer,\n        byteOffset: 0,\n        byteLength: arrayBuffer.byteLength\n      };\n\n      delete buffer.uri;\n    } else if (gltf.buffers[i] === null) {\n      gltf.buffers[i] = {\n        arrayBuffer: new ArrayBuffer(buffer.byteLength),\n        byteOffset: 0,\n        byteLength: buffer.byteLength\n      };\n    }\n  }\n}\n\n/**\n * Loads all images\n * TODO - traverse gltf and determine which images are actually needed\n * @param gltf\n * @param options\n * @param context\n * @returns\n */\nasync function loadImages(gltf: GLTFWithBuffers, options, context: LoaderContext) {\n  const imageIndices = getReferencesImageIndices(gltf);\n\n  const images = gltf.json.images || [];\n\n  const promises: Promise<any>[] = [];\n  for (const imageIndex of imageIndices) {\n    promises.push(loadImage(gltf, images[imageIndex], imageIndex, options, context));\n  }\n\n  return await Promise.all(promises);\n}\n\n/** Make sure we only load images that are actually referenced by textures */\nfunction getReferencesImageIndices(gltf: GLTFWithBuffers): number[] {\n  const imageIndices = new Set<number>();\n\n  const textures = gltf.json.textures || [];\n  for (const texture of textures) {\n    if (texture.source !== undefined) {\n      imageIndices.add(texture.source);\n    }\n  }\n\n  return Array.from(imageIndices).sort();\n}\n\n/** Asynchronously fetches and parses one image, store in images array outside of json */\nasync function loadImage(\n  gltf: GLTFWithBuffers,\n  image,\n  index: number,\n  options,\n  context: LoaderContext\n) {\n  let arrayBuffer;\n\n  if (image.uri && !image.hasOwnProperty('bufferView')) {\n    const uri = resolveUrl(image.uri, options, context);\n\n    const {fetch} = context;\n    const response = await fetch(uri);\n\n    arrayBuffer = await response.arrayBuffer();\n    image.bufferView = {\n      data: arrayBuffer\n    };\n  }\n\n  if (Number.isFinite(image.bufferView)) {\n    const array = getTypedArrayForBufferView(gltf.json, gltf.buffers, image.bufferView);\n    arrayBuffer = sliceArrayBuffer(array.buffer, array.byteOffset, array.byteLength);\n  }\n\n  assert(arrayBuffer, 'glTF image has no data');\n\n  const strictOptions = options;\n\n  const gltfOptions = {\n    ...strictOptions,\n    core: {...strictOptions?.core, mimeType: image.mimeType}\n  } satisfies StrictLoaderOptions;\n\n  // Call `parse`\n  let parsedImage = (await parseFromContext(\n    arrayBuffer,\n    [ImageLoader, BasisLoader],\n    gltfOptions,\n    context\n  )) as ImageType | TextureLevel[][];\n\n  if (parsedImage && parsedImage[0]) {\n    parsedImage = {\n      compressed: true,\n      // @ts-expect-error\n      mipmaps: false,\n      width: parsedImage[0].width,\n      height: parsedImage[0].height,\n      data: parsedImage[0]\n    };\n  }\n  // TODO making sure ImageLoader is overridable by using array of loaders\n  // const parsedImage = await parse(arrayBuffer, [ImageLoader]);\n\n  // Store the loaded image\n  gltf.images = gltf.images || [];\n  // @ts-expect-error TODO - sort out image typing asap\n  gltf.images[index] = parsedImage;\n}\n", "import type {LoaderWithParser, StrictLoaderOptions} from '@loaders.gl/loader-utils';\nimport type {DracoLoaderOptions} from '@loaders.gl/draco';\nimport {VERSION} from './lib/utils/version';\nimport type {ImageLoaderOptions} from '@loaders.gl/images';\nimport type {TextureLoaderOptions} from '@loaders.gl/textures';\nimport type {ParseGLTFOptions} from './lib/parsers/parse-gltf';\nimport type {GLTFWithBuffers} from './lib/types/gltf-types';\nimport type {GLBLoaderOptions} from './glb-loader';\nimport {parseGLTF} from './lib/parsers/parse-gltf';\n\n/**\n * GLTF loader options\n */\nexport type GLTFLoaderOptions = StrictLoaderOptions &\n  ImageLoaderOptions &\n  TextureLoaderOptions &\n  GLBLoaderOptions &\n  DracoLoaderOptions & {\n    gltf?: ParseGLTFOptions;\n  };\n\n/**\n * GLTF loader\n */\nexport const GLTFLoader = {\n  dataType: null as unknown as GLTFWithBuffers,\n  batchType: null as never,\n  name: 'glTF',\n  id: 'gltf',\n  module: 'gltf',\n  version: VERSION,\n  extensions: ['gltf', 'glb'],\n  mimeTypes: ['model/gltf+json', 'model/gltf-binary'],\n\n  text: true,\n  binary: true,\n  tests: ['glTF'],\n  parse,\n\n  options: {\n    gltf: {\n      normalize: true, // Normalize glTF v1 to glTF v2 format (not yet stable)\n      loadBuffers: true, // Fetch any linked .BIN buffers, decode base64\n      loadImages: true, // Create image objects\n      decompressMeshes: true // Decompress Draco encoded meshes\n    }\n  }\n} as const satisfies LoaderWithParser<GLTFWithBuffers, never, GLTFLoaderOptions>;\n\nexport async function parse(\n  arrayBuffer,\n  options: GLTFLoaderOptions = {},\n  context\n): Promise<GLTFWithBuffers> {\n  // Apps can call the parse method directly, we so apply default options here\n  const mergedOptions = {...GLTFLoader.options, ...options};\n  mergedOptions.gltf = {...GLTFLoader.options.gltf, ...mergedOptions.gltf};\n\n  const byteOffset = options?.glb?.byteOffset || 0;\n  const gltf = {};\n  return await parseGLTF(gltf as GLTFWithBuffers, arrayBuffer, byteOffset, mergedOptions, context);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {GLTFWithBuffers} from '../types/gltf-types';\nimport type {ParseGLTFOptions} from '../parsers/parse-gltf';\n\nimport type {\n  GLTF,\n  GLTFAccessor,\n  GLTFBufferView,\n  GLTFCamera,\n  GLTFImage,\n  GLTFMaterial,\n  GLTFMesh,\n  GLTFNode,\n  GLTFSampler,\n  GLTFScene,\n  GLTFSkin,\n  GLTFTexture\n} from '../types/gltf-json-schema';\n\nimport type {\n  GLTFPostprocessed,\n  GLTFAccessorPostprocessed,\n  GLTFBufferPostprocessed,\n  GLTFBufferViewPostprocessed,\n  GLTFCameraPostprocessed,\n  GLTFImagePostprocessed,\n  GLTFMaterialPostprocessed,\n  GLTFMeshPostprocessed,\n  GLTFNodePostprocessed,\n  GLTFSamplerPostprocessed,\n  GLTFScenePostprocessed,\n  GLTFSkinPostprocessed,\n  GLTFTexturePostprocessed,\n  GLTFMeshPrimitivePostprocessed\n} from '../types/gltf-postprocessed-schema';\n\nimport {assert} from '../utils/assert';\nimport {getAccessorArrayTypeAndLength} from '../gltf-utils/gltf-utils';\nimport {copyToArrayBuffer} from '@loaders.gl/loader-utils';\n\n// This is a post processor for loaded glTF files\n// The goal is to make the loaded data easier to use in WebGL applications\n//\n// Functions:\n// * Resolve indexed arrays structure of glTF into a linked tree.\n// * Translate stringified enum keys and values into WebGL constants.\n// * Load images (optional)\n\n// ENUM LOOKUP\n\nconst COMPONENTS = {\n  SCALAR: 1,\n  VEC2: 2,\n  VEC3: 3,\n  VEC4: 4,\n  MAT2: 4,\n  MAT3: 9,\n  MAT4: 16\n};\n\nconst BYTES = {\n  5120: 1, // BYTE\n  5121: 1, // UNSIGNED_BYTE\n  5122: 2, // SHORT\n  5123: 2, // UNSIGNED_SHORT\n  5125: 4, // UNSIGNED_INT\n  5126: 4 // FLOAT\n};\n\nconst GL_SAMPLER = {\n  // Sampler parameters\n  TEXTURE_MAG_FILTER: 0x2800,\n  TEXTURE_MIN_FILTER: 0x2801,\n  TEXTURE_WRAP_S: 0x2802,\n  TEXTURE_WRAP_T: 0x2803,\n\n  // Sampler default values\n  REPEAT: 0x2901,\n  LINEAR: 0x2601,\n  NEAREST_MIPMAP_LINEAR: 0x2702\n};\n\nconst SAMPLER_PARAMETER_GLTF_TO_GL = {\n  magFilter: GL_SAMPLER.TEXTURE_MAG_FILTER,\n  minFilter: GL_SAMPLER.TEXTURE_MIN_FILTER,\n  wrapS: GL_SAMPLER.TEXTURE_WRAP_S,\n  wrapT: GL_SAMPLER.TEXTURE_WRAP_T\n};\n\n// When undefined, a sampler with repeat wrapping and auto filtering should be used.\n// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#texture\nconst DEFAULT_SAMPLER_PARAMETERS = {\n  [GL_SAMPLER.TEXTURE_MAG_FILTER]: GL_SAMPLER.LINEAR,\n  [GL_SAMPLER.TEXTURE_MIN_FILTER]: GL_SAMPLER.NEAREST_MIPMAP_LINEAR,\n  [GL_SAMPLER.TEXTURE_WRAP_S]: GL_SAMPLER.REPEAT,\n  [GL_SAMPLER.TEXTURE_WRAP_T]: GL_SAMPLER.REPEAT\n};\n\nfunction makeDefaultSampler(): GLTFSamplerPostprocessed {\n  return {\n    id: 'default-sampler',\n    parameters: DEFAULT_SAMPLER_PARAMETERS\n  };\n}\n\nfunction getBytesFromComponentType(componentType) {\n  return BYTES[componentType];\n}\n\nfunction getSizeFromAccessorType(type) {\n  return COMPONENTS[type];\n}\n\nclass GLTFPostProcessor {\n  baseUri: string = '';\n  // @ts-expect-error\n  jsonUnprocessed: GLTF;\n  // @ts-expect-error\n  json: GLTFPostprocessed;\n  buffers: {\n    arrayBuffer: ArrayBuffer;\n    byteOffset: number;\n    byteLength: number;\n  }[] = [];\n  images: any[] = [];\n\n  postProcess(gltf: GLTFWithBuffers, options = {}) {\n    const {json, buffers = [], images = []} = gltf;\n    // @ts-expect-error\n    const {baseUri = ''} = gltf;\n    assert(json);\n\n    this.baseUri = baseUri;\n    this.buffers = buffers;\n    this.images = images;\n    this.jsonUnprocessed = json;\n\n    this.json = this._resolveTree(gltf.json, options);\n\n    return this.json;\n  }\n\n  // Convert indexed glTF structure into tree structure\n  // cross-link index resolution, enum lookup, convenience calculations\n  // eslint-disable-next-line complexity, max-statements\n  _resolveTree(gltf: GLTF, options = {}): GLTFPostprocessed {\n    // @ts-expect-error\n    const json: GLTFPostprocessed = {...gltf};\n    this.json = json;\n\n    if (gltf.bufferViews) {\n      json.bufferViews = gltf.bufferViews.map((bufView, i) => this._resolveBufferView(bufView, i));\n    }\n    if (gltf.images) {\n      json.images = gltf.images.map((image, i) => this._resolveImage(image, i));\n    }\n    if (gltf.samplers) {\n      json.samplers = gltf.samplers.map((sampler, i) => this._resolveSampler(sampler, i));\n    }\n    if (gltf.textures) {\n      json.textures = gltf.textures.map((texture, i) => this._resolveTexture(texture, i));\n    }\n    if (gltf.accessors) {\n      json.accessors = gltf.accessors.map((accessor, i) => this._resolveAccessor(accessor, i));\n    }\n    if (gltf.materials) {\n      json.materials = gltf.materials.map((material, i) => this._resolveMaterial(material, i));\n    }\n    if (gltf.meshes) {\n      json.meshes = gltf.meshes.map((mesh, i) => this._resolveMesh(mesh, i));\n    }\n    if (gltf.nodes) {\n      json.nodes = gltf.nodes.map((node, i) => this._resolveNode(node, i));\n      json.nodes = json.nodes.map((node, i) => this._resolveNodeChildren(node));\n    }\n    if (gltf.skins) {\n      json.skins = gltf.skins.map((skin, i) => this._resolveSkin(skin, i));\n    }\n    if (gltf.scenes) {\n      json.scenes = gltf.scenes.map((scene, i) => this._resolveScene(scene, i));\n    }\n    if (typeof this.json.scene === 'number' && json.scenes) {\n      json.scene = json.scenes[this.json.scene];\n    }\n\n    return json;\n  }\n\n  getScene(index: number): GLTFScenePostprocessed {\n    return this._get(this.json.scenes, index);\n  }\n\n  getNode(index: number): GLTFNodePostprocessed {\n    return this._get(this.json.nodes, index);\n  }\n\n  getSkin(index: number): GLTFSkinPostprocessed {\n    return this._get(this.json.skins, index);\n  }\n\n  getMesh(index: number): GLTFMeshPostprocessed {\n    return this._get(this.json.meshes, index);\n  }\n\n  getMaterial(index: number): GLTFMaterialPostprocessed {\n    return this._get(this.json.materials, index);\n  }\n\n  getAccessor(index: number): GLTFAccessorPostprocessed {\n    return this._get(this.json.accessors, index);\n  }\n\n  getCamera(index: number): GLTFCameraPostprocessed {\n    return this._get(this.json.cameras, index);\n  }\n\n  getTexture(index: number): GLTFTexturePostprocessed {\n    return this._get(this.json.textures, index);\n  }\n\n  getSampler(index: number): GLTFSamplerPostprocessed {\n    return this._get(this.json.samplers, index);\n  }\n\n  getImage(index: number): GLTFImagePostprocessed {\n    return this._get(this.json.images, index);\n  }\n\n  getBufferView(index: number): GLTFBufferViewPostprocessed {\n    return this._get(this.json.bufferViews, index);\n  }\n\n  getBuffer(index: number): GLTFBufferPostprocessed {\n    return this._get(this.json.buffers, index);\n  }\n\n  _get<T>(array: T[] | undefined, index: number): T {\n    // check if already resolved\n    if (typeof index === 'object') {\n      return index;\n    }\n    const object = array && array[index];\n    if (!object) {\n      console.warn(`glTF file error: Could not find ${array}[${index}]`); // eslint-disable-line\n    }\n    return object as T;\n  }\n\n  // PARSING HELPERS\n\n  _resolveScene(scene: GLTFScene, index: number): GLTFScenePostprocessed {\n    return {\n      ...scene,\n      // @ts-ignore\n      id: scene.id || `scene-${index}`,\n      nodes: (scene.nodes || []).map((node) => this.getNode(node))\n    };\n  }\n\n  _resolveNode(gltfNode: GLTFNode, index: number): GLTFNodePostprocessed {\n    // @ts-expect-error\n    const node: GLTFNodePostprocessed = {\n      ...gltfNode,\n      // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: gltfNode?.id || `node-${index}`\n    };\n    if (gltfNode.mesh !== undefined) {\n      node.mesh = this.getMesh(gltfNode.mesh);\n    }\n    if (gltfNode.camera !== undefined) {\n      node.camera = this.getCamera(gltfNode.camera);\n    }\n    if (gltfNode.skin !== undefined) {\n      node.skin = this.getSkin(gltfNode.skin);\n    }\n\n    // TODO deprecated - Delete in v4.0?\n    // @ts-expect-error node.meshes does not seem to be part of the GLTF standard\n    if (gltfNode.meshes !== undefined && gltfNode.meshes.length) {\n      // @ts-expect-error\n      node.mesh = gltfNode.meshes.reduce(\n        (accum, meshIndex) => {\n          const mesh = this.getMesh(meshIndex);\n          accum.id = mesh.id;\n          accum.primitives = accum.primitives.concat(mesh.primitives);\n          return accum;\n        },\n        {primitives: []}\n      );\n    }\n\n    return node;\n  }\n\n  _resolveNodeChildren(node: GLTFNodePostprocessed): GLTFNodePostprocessed {\n    if (node.children) {\n      // @ts-expect-error node.children are numbers at this stage\n      node.children = node.children.map((child) => this.getNode(child));\n    }\n    return node;\n  }\n\n  _resolveSkin(gltfSkin: GLTFSkin, index: number): GLTFSkinPostprocessed {\n    const inverseBindMatrices =\n      typeof gltfSkin.inverseBindMatrices === 'number'\n        ? this.getAccessor(gltfSkin.inverseBindMatrices)\n        : undefined;\n\n    return {\n      ...gltfSkin,\n      id: gltfSkin.id || `skin-${index}`,\n      inverseBindMatrices\n    };\n  }\n\n  _resolveMesh(gltfMesh: GLTFMesh, index: number): GLTFMeshPostprocessed {\n    const mesh: GLTFMeshPostprocessed = {\n      ...gltfMesh,\n      id: gltfMesh.id || `mesh-${index}`,\n      primitives: []\n    };\n    if (gltfMesh.primitives) {\n      mesh.primitives = gltfMesh.primitives.map((gltfPrimitive) => {\n        const primitive: GLTFMeshPrimitivePostprocessed = {\n          ...gltfPrimitive,\n          attributes: {},\n          indices: undefined,\n          material: undefined\n        };\n        const attributes = gltfPrimitive.attributes;\n        for (const attribute in attributes) {\n          primitive.attributes[attribute] = this.getAccessor(attributes[attribute]);\n        }\n        if (gltfPrimitive.indices !== undefined) {\n          primitive.indices = this.getAccessor(gltfPrimitive.indices);\n        }\n        if (gltfPrimitive.material !== undefined) {\n          primitive.material = this.getMaterial(gltfPrimitive.material);\n        }\n        return primitive;\n      });\n    }\n    return mesh;\n  }\n\n  _resolveMaterial(gltfMaterial: GLTFMaterial, index: number): GLTFMaterialPostprocessed {\n    // @ts-expect-error\n    const material: GLTFMaterialPostprocessed = {\n      ...gltfMaterial,\n      // @ts-expect-error\n      id: gltfMaterial.id || `material-${index}`\n    };\n    if (material.normalTexture) {\n      material.normalTexture = {...material.normalTexture};\n      material.normalTexture.texture = this.getTexture(material.normalTexture.index);\n    }\n    if (material.occlusionTexture) {\n      material.occlusionTexture = {...material.occlusionTexture};\n      material.occlusionTexture.texture = this.getTexture(material.occlusionTexture.index);\n    }\n    if (material.emissiveTexture) {\n      material.emissiveTexture = {...material.emissiveTexture};\n      material.emissiveTexture.texture = this.getTexture(material.emissiveTexture.index);\n    }\n    if (!material.emissiveFactor) {\n      material.emissiveFactor = material.emissiveTexture ? [1, 1, 1] : [0, 0, 0];\n    }\n\n    if (material.pbrMetallicRoughness) {\n      material.pbrMetallicRoughness = {...material.pbrMetallicRoughness};\n      const mr = material.pbrMetallicRoughness;\n      if (mr.baseColorTexture) {\n        mr.baseColorTexture = {...mr.baseColorTexture};\n        mr.baseColorTexture.texture = this.getTexture(mr.baseColorTexture.index);\n      }\n      if (mr.metallicRoughnessTexture) {\n        mr.metallicRoughnessTexture = {...mr.metallicRoughnessTexture};\n        mr.metallicRoughnessTexture.texture = this.getTexture(mr.metallicRoughnessTexture.index);\n      }\n    }\n    return material;\n  }\n\n  _resolveAccessor(gltfAccessor: GLTFAccessor, index: number): GLTFAccessorPostprocessed {\n    // Look up enums\n    const bytesPerComponent = getBytesFromComponentType(gltfAccessor.componentType);\n    const components = getSizeFromAccessorType(gltfAccessor.type);\n    const bytesPerElement = bytesPerComponent * components;\n\n    const accessor: GLTFAccessorPostprocessed = {\n      ...gltfAccessor,\n      // @ts-expect-error\n      id: gltfAccessor.id || `accessor-${index}`,\n      bytesPerComponent,\n      components,\n      bytesPerElement,\n      value: undefined!,\n      bufferView: undefined!,\n      sparse: undefined!\n    };\n    if (gltfAccessor.bufferView !== undefined) {\n      // Draco encoded meshes don't have bufferView\n      accessor.bufferView = this.getBufferView(gltfAccessor.bufferView);\n    }\n\n    // Create TypedArray for the accessor\n    // Note: The canonical way to instantiate is to ignore this array and create\n    // WebGLBuffer's using the bufferViews.\n    if (accessor.bufferView) {\n      const buffer = accessor.bufferView.buffer;\n      const {ArrayType, byteLength} = getAccessorArrayTypeAndLength(accessor, accessor.bufferView);\n      const byteOffset =\n        (accessor.bufferView.byteOffset || 0) + (accessor.byteOffset || 0) + buffer.byteOffset;\n      let cutBuffer = copyToArrayBuffer(buffer.arrayBuffer, byteOffset, byteLength);\n      if (accessor.bufferView.byteStride) {\n        cutBuffer = this._getValueFromInterleavedBuffer(\n          buffer,\n          byteOffset,\n          accessor.bufferView.byteStride,\n          accessor.bytesPerElement,\n          accessor.count\n        );\n      }\n      accessor.value = new ArrayType(cutBuffer);\n    }\n\n    return accessor;\n  }\n\n  /**\n   * Take values of particular accessor from interleaved buffer\n   * various parts of the buffer\n   * @param buffer\n   * @param byteOffset\n   * @param byteStride\n   * @param bytesPerElement\n   * @param count\n   * @returns\n   */\n  _getValueFromInterleavedBuffer(\n    buffer,\n    byteOffset: number,\n    byteStride: number,\n    bytesPerElement: number,\n    count: number\n  ): ArrayBuffer {\n    const result = new Uint8Array(count * bytesPerElement);\n    for (let i = 0; i < count; i++) {\n      const elementOffset = byteOffset + i * byteStride;\n      result.set(\n        new Uint8Array(buffer.arrayBuffer.slice(elementOffset, elementOffset + bytesPerElement)),\n        i * bytesPerElement\n      );\n    }\n    return result.buffer;\n  }\n\n  _resolveTexture(gltfTexture: GLTFTexture, index: number): GLTFTexturePostprocessed {\n    return {\n      ...gltfTexture,\n      // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: gltfTexture.id || `texture-${index}`,\n      sampler:\n        typeof gltfTexture.sampler === 'number'\n          ? this.getSampler(gltfTexture.sampler)\n          : makeDefaultSampler(),\n      source: typeof gltfTexture.source === 'number' ? this.getImage(gltfTexture.source) : undefined\n    };\n  }\n\n  _resolveSampler(gltfSampler: GLTFSampler, index: number): GLTFSamplerPostprocessed {\n    const sampler: GLTFSamplerPostprocessed = {\n      // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: gltfSampler.id || `sampler-${index}`,\n      ...gltfSampler,\n      parameters: {}\n    };\n    // Map textual parameters to GL parameter values\n    for (const key in sampler) {\n      const glEnum = this._enumSamplerParameter(key);\n      if (glEnum !== undefined) {\n        sampler.parameters[glEnum] = sampler[key];\n      }\n    }\n    return sampler;\n  }\n\n  _enumSamplerParameter(key: string): number {\n    return SAMPLER_PARAMETER_GLTF_TO_GL[key];\n  }\n\n  _resolveImage(gltfImage: GLTFImage, index: number): GLTFImagePostprocessed {\n    const image: GLTFImagePostprocessed = {\n      ...gltfImage,\n      // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: gltfImage.id || `image-${index}`,\n      image: null!,\n      bufferView:\n        gltfImage.bufferView !== undefined ? this.getBufferView(gltfImage.bufferView) : undefined\n    };\n\n    // Check if image has been preloaded by the GLTFLoader\n    // If so, link it into the JSON and drop the URI\n    const preloadedImage = this.images[index];\n    if (preloadedImage) {\n      image.image = preloadedImage;\n    }\n\n    return image;\n  }\n\n  _resolveBufferView(gltfBufferView: GLTFBufferView, index: number): GLTFBufferViewPostprocessed {\n    const bufferIndex = gltfBufferView.buffer;\n    const arrayBuffer = this.buffers[bufferIndex].arrayBuffer;\n    // Add offset of buffer, then offset of buffer view\n    let byteOffset = this.buffers[bufferIndex].byteOffset || 0;\n    if (gltfBufferView.byteOffset) {\n      byteOffset += gltfBufferView.byteOffset;\n    }\n\n    const bufferView: GLTFBufferViewPostprocessed = {\n      // // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: `bufferView-${index}`,\n      ...gltfBufferView,\n      // ...this.buffers[bufferIndex],\n      buffer: this.buffers[bufferIndex],\n      data: new Uint8Array(arrayBuffer, byteOffset, gltfBufferView.byteLength)\n    };\n\n    return bufferView;\n  }\n\n  _resolveCamera(gltfCamera: GLTFCamera, index): GLTFCameraPostprocessed {\n    const camera: GLTFCameraPostprocessed = {\n      ...gltfCamera,\n      // @ts-expect-error id could already be present, glTF standard does not prevent it\n      id: gltfCamera.id || `camera-${index}`\n    };\n\n    // TODO - create 4x4 matrices\n    if (camera.perspective) {\n      // camera.matrix = createPerspectiveMatrix(camera.perspective);\n    }\n    if (camera.orthographic) {\n      // camera.matrix = createOrthographicMatrix(camera.orthographic);\n    }\n    return camera;\n  }\n}\n\nexport function postProcessGLTF(\n  gltf: GLTFWithBuffers,\n  options?: ParseGLTFOptions\n): GLTFPostprocessed {\n  return new GLTFPostProcessor().postProcess(gltf, options);\n}\n", "/* eslint-disable camelcase, indent */\nexport type {GLB} from './lib/types/glb-types';\n\n// Raw GLTF Types (i.e. not post-processed)\nexport type {\n  GLTF,\n  GLTFAccessor,\n  GLTFBuffer,\n  GLTFBufferView,\n  GLTFMeshPrimitive,\n  GLTFMesh,\n  GLTFNode,\n  GLTFMaterial,\n  GLTFSampler,\n  GLTFScene,\n  GLTFSkin,\n  GLTFTexture,\n  GLTFImage,\n  GLTFObject,\n  // The following extensions are handled by the GLTFLoader and removed from the parsed glTF (disable via options.gltf.excludeExtensions)\n  GLTF_KHR_binary_glTF,\n  GLTF_KHR_draco_mesh_compression,\n  GLTF_KHR_texture_basisu,\n  GLTF_EXT_meshopt_compression,\n  GLTF_EXT_texture_webp\n} from './lib/types/gltf-json-schema';\n\n// 3DTiles extensions\nexport type {\n  GLTF_EXT_feature_metadata_GLTF,\n  GLTF_EXT_feature_metadata_Schema,\n  GLTF_EXT_feature_metadata_Class,\n  GLTF_EXT_feature_metadata_ClassProperty,\n  GLTF_EXT_feature_metadata_Enum,\n  GLTF_EXT_feature_metadata_EnumValue,\n  GLTF_EXT_feature_metadata_FeatureTable,\n  GLTF_EXT_feature_metadata_FeatureTableProperty,\n  GLTF_EXT_feature_metadata_FeatureTexture,\n  GLTF_EXT_feature_metadata_TextureAccessor,\n  GLTF_EXT_feature_metadata_Statistics,\n  GLTF_EXT_feature_metadata_StatisticsClass,\n  GLTF_EXT_feature_metadata_StatisticsClassProperty,\n  GLTF_EXT_feature_metadata_Primitive,\n  GLTF_EXT_feature_metadata_FeatureIdAttribute,\n  GLTF_EXT_feature_metadata_FeatureIdAttributeFeatureIds,\n  GLTF_EXT_feature_metadata_FeatureIdTexture,\n  GLTF_EXT_feature_metadata_FeatureIdTextureAccessor\n} from './lib/types/gltf-ext-feature-metadata-schema';\n\nexport type {\n  GLTF_EXT_structural_metadata_GLTF,\n  GLTF_EXT_structural_metadata_Schema,\n  GLTF_EXT_structural_metadata_PropertyTable,\n  GLTF_EXT_structural_metadata_PropertyTexture,\n  GLTF_EXT_structural_metadata_Class,\n  GLTF_EXT_structural_metadata_ClassProperty\n} from './lib/types/gltf-ext-structural-metadata-schema';\n\nexport type {\n  GLTF_EXT_mesh_features,\n  GLTF_EXT_mesh_features_featureId\n} from './lib/types/gltf-ext-mesh-features-schema';\n\nexport {name as EXT_MESH_FEATURES} from './lib/extensions/EXT_mesh_features';\nexport {name as EXT_STRUCTURAL_METADATA} from './lib/extensions/EXT_structural_metadata';\nexport {name as EXT_FEATURE_METADATA} from './lib/extensions/deprecated/EXT_feature_metadata';\n\n// Postprocessed types (modified GLTF types)\nexport type {\n  GLTFPostprocessed,\n  GLTFAccessorPostprocessed,\n  GLTFNodePostprocessed,\n  GLTFMaterialPostprocessed,\n  GLTFMeshPostprocessed,\n  GLTFMeshPrimitivePostprocessed,\n  GLTFImagePostprocessed,\n  GLTFTexturePostprocessed\n} from './lib/types/gltf-postprocessed-schema';\n\nexport type {GLTFWithBuffers, FeatureTableJson} from './lib/types/gltf-types';\n\n// glTF loader/writer definition objects\nexport {GLTFLoader} from './gltf-loader';\nexport {GLTFWriter} from './gltf-writer';\n\n// GLB Loader & Writer (for custom formats that want to leverage the GLB binary \"envelope\")\nexport {GLBLoader} from './glb-loader';\nexport {GLBWriter} from './glb-writer';\n\n// glTF Data Access Helper Class\nexport {GLTFScenegraph} from './lib/api/gltf-scenegraph';\nexport {postProcessGLTF} from './lib/api/post-process-gltf';\nexport {getMemoryUsageGLTF as _getMemoryUsageGLTF} from './lib/gltf-utils/gltf-utils';\n\nexport {\n  createExtStructuralMetadata,\n  type PropertyAttribute\n} from './lib/extensions/EXT_structural_metadata';\nexport {createExtMeshFeatures} from './lib/extensions/EXT_mesh_features';\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { TEXTURES_URL } from '../config.mjs';\nimport { MESHES_URL } from '../config.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { DIRTY, markResourceDirty } from './dirty-flags.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { sceneLightUniformState } from './scene-lighting.mjs';\n\n// --- CRITICAL FIX 1: Missing Imports added ---\nimport { load } from '@loaders.gl/core';\nimport { GLTFLoader, postProcessGLTF } from '@loaders.gl/gltf';\n\nconst IDENTITY_MATRIX = twgl.m4.identity();\nconst NO_RIM_COLOR = Object.freeze([0, 0, 0, 0]);\n\nfunction normaliseRimLight(rimLight) {\n    if (rimLight == null) return null;\n    const { color, power = 4 } = rimLight;\n    if ((!Array.isArray(color) && !(color instanceof Float32Array)) || color.length !== 4\n            || Array.from(color).some(channel => !Number.isFinite(channel) || channel < 0 || channel > 1)) {\n        throw new Error('MeshInstance rimLight.color must contain four RGBA channels between 0 and 1.');\n    }\n    if (!Number.isFinite(power) || power <= 0) {\n        throw new Error('MeshInstance rimLight.power must be positive and finite.');\n    }\n    return Object.freeze({ color: Object.freeze(Array.from(color)), power });\n}\n\nfunction validateRimStrength(strength) {\n    if (!Number.isFinite(strength) || strength < 0) {\n        throw new Error('MeshInstance rim_light_strength must be finite and non-negative.');\n    }\n    return strength;\n}\n\n/* Compose the optional post-view spin in presentation space so axis experiments stay decoupled from scene transforms. */\nfunction meshPostViewMatrix(node) {\n    const basis = node.state.postViewMatrix ?? IDENTITY_MATRIX;\n    const spinY = node.state.post_view_rotation_y ?? 0.0;\n    if (!spinY) {\n        return basis;\n    }\n    return twgl.m4.multiply(twgl.m4.rotationY(spinY), basis);\n}\n\nfunction presentedMeshNodes(shared, group) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return group.nodes;\n    }\n    return group.nodes.filter(node => scene._isPresentedNode(node));\n}\n\nexport class Mesh extends ui.Resource {\n    constructor(scene, name) {\n        super(scene);\n\n        this.name = name;\n        this.glbModel = null;\n        this.ownGlPartBufferInfos = null;\n        this.filename = `${MESHES_URL}${this.name}`;\n    }\n\n    dropOwnGlPartBufferInfos(gl) {\n        if (!this.ownGlPartBufferInfos) {\n            return;\n        }\n        for (const ownGlPartBufferInfo of this.ownGlPartBufferInfos) {\n            deleteBufferInfo(gl, ownGlPartBufferInfo);\n        }\n        this.ownGlPartBufferInfos = null;\n    }\n\n    async _onAcquireContext(gl, visited) {\n        if (visited?.has(this)) {\n            return;\n        }\n        // Note: If you lose WebGL context, you might need to uncomment this!\n        // this.glbModel = await loadGLB(this.filename + '.glb')\n    }\n\n    _onReleaseContext(gl, visited) {\n        this.dropOwnGlPartBufferInfos(gl);\n        if (this.glbModel) {\n            this.glbModel = null;\n        }\n    }\n};\n\nexport async function createGLBModel(scene, name) {\n    let ret = new Mesh(scene, name);\n    try {\n        ret.glbModel = await loadGLB(ret.filename + '.glb');\n    } catch (e) {\n        console.warn(`Failed to load mesh data from ${ret.filename}.`);\n        throw e;\n    }\n    return ret;\n}\n\nasync function loadGLB(url) {\n    // 1. Let loaders.gl fetch, unzip, and parse the file automatically\n    let gltf = await load(url, GLTFLoader, {\n        gltf: {\n            loadBuffers: true,\n            loadImages: false,\n        },\n    });\n    gltf = await postProcessGLTF(gltf);\n    if (!Array.isArray(gltf?.meshes)) {\n        throw new Error(`GLTF loader did not return a meshes array for '${url}'.`);\n    }\n    \n    const parsedParts = [];\n\n    // 2. Loop through the parsed meshes\n    for (const mesh of gltf.meshes) {\n        for (const primitive of mesh.primitives) {\n            \n            // loaders.gl extracts exactly what TWGL wants: flat TypedArrays\n            const part = {\n                positions: primitive.attributes.POSITION.value,\n                vertexCount: primitive.attributes.POSITION.value.length / 3\n            };\n\n            if (primitive.attributes.NORMAL) {\n                part.normals = primitive.attributes.NORMAL.value;\n            }\n\n            // Safely grab colors if they exist\n            if (primitive.attributes.COLOR_0) {\n                part.colors = primitive.attributes.COLOR_0.value;\n            }\n            \n            // Safely grab indices if they exist\n            if (primitive.indices) {\n                part.indices = primitive.indices.value;\n                part.indexCount = primitive.indices.value.length;\n            }\n\n            parsedParts.push(part);\n        }\n    }\n\n    if (parsedParts.length === 0) {\n        throw new Error(`GLTF '${url}' contained no drawable mesh primitives.`);\n    }\n\n    // 3. Return the array of parts to your TWGL draw loop\n    return parsedParts; \n}\n\n/* Optional rimLight: { color: RGBA, power } adds an emissive surface rim.\n * Animate rim_light_strength independently of opacity and presentation spin. */\nexport class MeshInstance extends ui.Node {\n    constructor(state) {\n        super({ ...state, rimLight: normaliseRimLight(state.rimLight),\n            rim_light_strength: validateRimStrength(state.rim_light_strength ?? (state.rimLight ? 1 : 0)) });\n\n        this.meshData = state.mesh\n        if (!this.meshData) {\n            throw Error(\"MeshInstance has no Mesh assgined to it.\")\n        }\n\n        this.visible = true;\n    }\n\n    mutate(newState) {\n        const next = { ...newState };\n        if (Object.hasOwn(next, 'rimLight')) next.rimLight = normaliseRimLight(next.rimLight);\n        if (Object.hasOwn(next, 'rim_light_strength')) validateRimStrength(next.rim_light_strength);\n        super.mutate(next);\n    }\n\n    static _onAttachClass(shared) {\n        shared.groupByMesh = new Map();\n    }\n\n    _onAttachNode(shared) {\n        const meshName = this.state.mesh.name;\n\n        let group = shared.groupByMesh.get(meshName);\n        if (!group) {\n            group = { nodes: [], mesh: this.state.mesh, dirtyLabel: `MeshGroup.${meshName}` };\n            shared.groupByMesh.set(meshName, group);\n        }\n        group.nodes.push(this);\n\n        if (this.scene?.gl && !group.mesh.glbModel) {\n            group.mesh._onAcquireContext(this.scene.gl, new WeakMap());\n        }\n\n        markResourceDirty(group, [DIRTY.attach, DIRTY.structure, DIRTY.transform, DIRTY.visibility]);\n    }\n\n    _onDetachNode(shared) {\n        const meshName = this.state.mesh.name;\n        const group = shared.groupByMesh.get(meshName);\n\n        if (group) {\n\n            const index = group.nodes.indexOf(this);\n            if (index !== -1) {\n                group.nodes.splice(index, 1);\n            }\n\n            markResourceDirty(group, [DIRTY.detach, DIRTY.structure, DIRTY.transform, DIRTY.visibility]);\n\n            if (group.nodes.length === 0) {\n                shared.groupByMesh.delete(meshName);\n            }\n        }\n    }\n\n    setVisibility(state) {\n        if (this.visible === state) {\n            return;\n        }\n        this.visible = state;\n        this._dirtyResources();\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.mesh_instance');\n        shared.ownGlBufferInfo = null;\n        markResourceDirty(shared, [DIRTY.attach, DIRTY.buffer]);\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vshader = 'lib/evilui/mesh-instance';\n            const fshader = 'lib/evilui/mesh-instance';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.mesh_instance', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(vshader + '.vs.glsl', fshader + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n            if (!shared.ownGlProgram) {\n                console.warn(`Shader ${vshader} not found. Tile ${this.state.name} will not render.`);\n            }\n        })();  // fire-and-forget\n    }\n\n    static _onReleaseContext(gl, shared, visited) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        for (let [, group] of shared.groupByMesh) {\n            group.mesh._onReleaseContext(gl, visited);\n            shared.ownGlBufferInfo = null;\n            group.instanceCount = 0;\n            markResourceDirty(shared, [DIRTY.detach, DIRTY.buffer]);\n        }\n        shared.ownGlProgram = null;\n        shared.ownGlBufferInfo = null;\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = ui.RENDER_STATUS.LOADING;\n\n        if (!shared.ownGlProgram) {\n            return;\n        }\n\n        const borGlProgram = shared.ownGlProgram;\n        gl.useProgram(borGlProgram.program);\n        const inverseViewMatrix = twgl.m4.inverse(viewMatrix);\n        const lightingUniforms = sceneLightUniformState(shared.scene);\n\n        const maxAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);\n        for (let i = 0; i < maxAttribs; ++i) {\n            gl.disableVertexAttribArray(i);\n        }\n\n        let drew = false;\n\n        // Iterate over every unique mesh group\n        for (let [meshName, group] of shared.groupByMesh) {\n            const mesh = group.mesh;\n            const nodes = presentedMeshNodes(shared, group);\n            if (nodes.length === 0) {\n                continue;\n            }\n\n            // Skip if the GLB hasn't finished loading/parsing yet\n            if (!mesh.glbModel) continue;\n\n            // --- CRITICAL FIX 2: Handle Array of Parts ---\n            // Generate owned GL buffer infos PER PART of the mesh.\n            if (!mesh.ownGlPartBufferInfos) {\n                mesh.ownGlPartBufferInfos = [];\n                // glbModel is now an array of parts from loadGLB!\n                for (let part of mesh.glbModel) {\n                    mesh.ownGlPartBufferInfos.push(makeGlBufferInfo(gl, part));\n                }\n            }\n\n            // Iterate over all instances (nodes) that use this mesh\n            for (let node of nodes) {\n                if (!node.computedVisible) continue;\n                const pose = node._batchPose?.(shared.scene);\n                if (!pose) {\n                    throw new Error(`${node.state?.name ?? node.constructor?.name ?? 'MeshInstance'} reached draw without a live batch pose.`);\n                }\n\n                const postViewMatrix = meshPostViewMatrix(node);\n                // Set uniform for this specific node's transform\n                twgl.setUniforms(borGlProgram, {\n                    u_viewMatrix: viewMatrix,\n                    u_inverseViewMatrix: inverseViewMatrix,\n                    u_projectionMatrix: projectionMatrix,\n                    u_matrix: pose.worldMatrix,\n                    u_postViewMatrix: postViewMatrix,\n                    u_resolution: [30.0,30.0],\n                    u_opacity: pose.opacity ?? 1.0,\n                    u_isOrthographic: projectionMatrix[15] === 0 ? 0 : 1,\n                    u_rimColor: node.state.rimLight?.color ?? NO_RIM_COLOR,\n                    u_rimPower: node.state.rimLight?.power ?? 4,\n                    u_rimStrength: node.state.rimLight ? node.state.rim_light_strength : 0,\n                    ...lightingUniforms,\n                });\n\n                // Draw EVERY part of the mesh\n                for (const [partIndex, borGlPartBufferInfo] of mesh.ownGlPartBufferInfos.entries()) {\n                    twgl.setUniforms(borGlProgram, { u_hasMeshNormals: mesh.glbModel[partIndex].normals ? 1 : 0 });\n                    twgl.setBuffersAndAttributes(gl, borGlProgram, borGlPartBufferInfo);\n                    twgl.drawBufferInfo(gl, borGlPartBufferInfo);\n                }\n                drew = true;\n            }\n        }\n\n        if (drew || shared.groupByMesh.size === 0) {\n            status.response = ui.RENDER_STATUS.READY;\n            return;\n        }\n\n        let hasDrawableGroup = false;\n        for (const [, group] of shared.groupByMesh) {\n            if (presentedMeshNodes(shared, group).length > 0) {\n                hasDrawableGroup = true;\n                break;\n            }\n        }\n        if (!hasDrawableGroup) {\n            status.response = ui.RENDER_STATUS.READY;\n        }\n    }\n}\n\n\n// NOTE: I changed the parameter name from 'glbModel' to 'meshPart' so it's less confusing, \n// since we are passing a single part from the array into this function now.\nexport function makeGlBufferInfo(gl, meshPart) {\n    // 1. Build the arrays object for TWGL using your extracted data\n    const arrays = {\n        position: { numComponents: 3, data: meshPart.positions }\n    };\n\n    if (meshPart.normals) {\n        arrays.normal = { numComponents: 3, data: meshPart.normals };\n    } else {\n        const normals = new Float32Array(meshPart.vertexCount * 3);\n        for (let i = 0; i < meshPart.vertexCount; i++) {\n            normals[i * 3 + 2] = 1.0;\n        }\n        arrays.normal = { numComponents: 3, data: normals };\n    }\n\n    if (meshPart.colors) {\n        const colorComponents = meshPart.colors.length / meshPart.vertexCount;\n        \n        arrays.color = { \n            numComponents: colorComponents, \n            data: meshPart.colors,\n            // Add this! If the data is 0-255 bytes or shorts, WebGL MUST convert it to 0.0-1.0\n            normalize: meshPart.colors instanceof Uint8Array || meshPart.colors instanceof Uint16Array\n        };\n    }\n\n    if (meshPart.indices) {\n        arrays.indices = { data: meshPart.indices };\n    }\n\n    // 2. Create the BufferInfo object\n    return gpuDiagWithResourceOrigin('mesh_instance.make_buffer_info', () => twgl.createBufferInfoFromArrays(gl, arrays));\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const BANNER_TITLE_FONT_SIZE = 66;\nexport const BANNER_SUBTITLE_FONT_SIZE = 42;\nexport const BANNER_CONTENT_SCALE = 0.5;\nexport const BANNER_TITLE_CENTER_Y_OFFSET = 48;\nexport const BANNER_SUBTITLE_GAP = 54;\nexport const BANNER_MIN_LEFT_PAD = 80;\n\n/* Keep banner title placement deterministic across loader and directory overlays. */\nexport function bannerTitleY(height) {\n    return Math.max(0, height * 0.5 + BANNER_TITLE_CENTER_Y_OFFSET);\n}\n\n/* Keep banner subtitle placement derived from the shared title anchor. */\nexport function bannerSubtitleY(height) {\n    return bannerTitleY(height) + BANNER_SUBTITLE_GAP;\n}\n\n/* Keep horizontally centred banner text clear of the left chrome gutter. */\nexport function bannerTextX(left, centreX, width, scale = BANNER_CONTENT_SCALE) {\n    return Math.max(left + BANNER_MIN_LEFT_PAD, centreX - width * scale * 0.5);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport * as twgl from 'twgl';\nimport { PORTAL_MIN_BUILD } from '../build-flags.mjs';\nimport { CommanderBus } from '../commander.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport {\n    BANNER_CONTENT_SCALE,\n    BANNER_TITLE_FONT_SIZE,\n    bannerTextX,\n    bannerTitleY,\n} from './banner-layout.mjs';\n\nconst LOADER_DAMON_POST_VIEW_ROTATION_Y = 0.5 * Math.PI;\nconst LOADER_DAMON_SPIN_DURATION_S = 0.8;\nconst LOADER_DAMON_SCALE = 0.92;\n\nexport class LoaderUI extends ui.Button{\n    #maxLoadingSeconds = 10;\n    #removed = false;\n    #ownOnLoadFinished = null;\n    #ownRemoveThink = null;\n    #damonBuildStarted = false;\n    ownLabel = null;\n\n    /* Place loader Damon with only translation so raw mesh orientation stays visible. */\n    #damonBaseMatrix() {\n        let out = twgl.m4.translation([this.state.width * 0.5, this.state.height * 0.5, -100.0]);\n        out = twgl.m4.scale(out, [LOADER_DAMON_SCALE, LOADER_DAMON_SCALE, LOADER_DAMON_SCALE]);\n        return out;\n    }\n\n    constructor(state){\n        const maxLoadingSeconds = Number.isFinite(state.maxLoadingSeconds)\n            ? Math.max(0, state.maxLoadingSeconds)\n            : 10;\n        state.color = [0.098, 0.122, 0.145, 1.0]\n        super(state)\n        this.#maxLoadingSeconds = maxLoadingSeconds\n        \n        if (state.dismissOnLoadFinished !== false) {\n            this.#ownOnLoadFinished = () => {\n                this.#removeSelf();\n            };\n            CommanderBus.on(\"LOAD_FINISHED\", this.#ownOnLoadFinished);\n        }\n    }\n\n    onPointerInput(event){\n        return true;\n    }\n    _onHoverEnter() {\n        this._mouseIsHovering = true;\n    }\n    _onHoverExit() {\n        this._mouseIsHovering = true;\n    }\n\n    /* Arm the loader timeout once attached so detached prebuilt screens do not age out off-scene. */\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#build();\n        if (this.#removed || this.#ownRemoveThink !== null || this.#maxLoadingSeconds === null || this.#maxLoadingSeconds <= 0) {\n            return;\n        }\n        const nowS = this.scene?.stage?.frameNowS ?? this.scene?.presentationTimeSeconds?.() ?? 0.0;\n        this.#ownRemoveThink = this.thinkAt(nowS + this.#maxLoadingSeconds, () => {\n            this.#ownRemoveThink = null;\n            this.#removeSelf();\n        });\n    }\n\n    /* Explicit owners (such as an in-place table refresh) control this loader's lifetime. */\n    dismiss() {\n        this.#removeSelf();\n    }\n\n    #removeSelf() {\n        if (this.#removed) {\n            return;\n        }\n        this.#removed = true;\n        if (this.#ownOnLoadFinished) {\n            CommanderBus.off(\"LOAD_FINISHED\", this.#ownOnLoadFinished);\n            this.#ownOnLoadFinished = null;\n        }\n        if (this.#ownRemoveThink !== null) {\n            this.cancelThinkAt(this.#ownRemoveThink);\n            this.#ownRemoveThink = null;\n        }\n        if (this.parentNode) {\n            this.parentNode.removeChild(this);\n        }\n    }\n\n    _onDetachNode(shared) {\n        if (this.#ownOnLoadFinished) {\n            CommanderBus.off(\"LOAD_FINISHED\", this.#ownOnLoadFinished);\n            this.#ownOnLoadFinished = null;\n        }\n        if (this.#ownRemoveThink !== null) {\n            this.cancelThinkAt(this.#ownRemoveThink);\n            this.#ownRemoveThink = null;\n        }\n        super._onDetachNode(shared);\n    }\n\n    #build(){\n        if (this.#damonBuildStarted || !this.scene) {\n            return;\n        }\n        this.#damonBuildStarted = true;\n        this.createDamon();\n    }\n\n    /* Keep the standalone loader title aligned with the shared directory banner layout. */\n    #syncLabelLayout() {\n        if (!this.ownLabel) {\n            return;\n        }\n        const width = this.state.width ?? this.width ?? 0;\n        const height = this.state.height ?? this.height ?? 0;\n        const centreX = width * 0.5;\n        const layout = evilfont.MSDFText.measureFromState({\n            font: this.state.font,\n            fontSize: this.ownLabel.state.fontSize,\n            text: this.ownLabel.state.text,\n        });\n        this.ownLabel.setLocalToParent(twgl.m4.scale(\n            twgl.m4.translation([\n                bannerTextX(0, centreX, layout.width),\n                bannerTitleY(height),\n                this.ownLabel.localPosition()[2],\n            ]),\n            [BANNER_CONTENT_SCALE, BANNER_CONTENT_SCALE, 1.0],\n        ));\n    }\n\n    onViewportResized(_gl) {\n        this.damonMount?.setLocalToParent(this.#damonBaseMatrix());\n        this.#syncLabelLayout();\n    }\n\n    async createDamon() {\n        /*prototype*/\n        if (!this.scene) {\n            throw new Error('LoaderUI.createDamon(): loader must be attached to a scene before creating Damon.');\n        }\n        const damonModel = await ui.createGLBModel(this.scene, 'damon')\n        if (this.damonMount && this.children.includes(this.damonMount)) {\n            this.removeChild(this.damonMount)\n        }\n\n        this.damonMount = new ui.Placeholder({\n            localToParent: this.#damonBaseMatrix(),\n        })\n        this.damon = new ui.MeshInstance({\n            mesh: damonModel,\n            postViewMatrix: twgl.m4.rotationY(LOADER_DAMON_POST_VIEW_ROTATION_Y),\n            post_view_rotation_y: 0.0,\n        })\n        this.damonMount.appendChild(this.damon)\n\n        this.appendChild(this.damonMount)\n        this.damon.animateTo({\n            post_view_rotation_y: Math.PI * 2.0,\n            duration_s: LOADER_DAMON_SPIN_DURATION_S,\n            ease: 'linear',\n            loop: 'repeat',\n            iterations: null,\n            accumulate: true,\n        });\n\n        if (!this.ownLabel) {\n            this.ownLabel = new evilfont.MSDFText({\n                font: this.state.font,\n                fontSize: BANNER_TITLE_FONT_SIZE,\n                text: \"Loading changes...\",\n                z: -1.0,\n                fontColor: Palette.white,\n            });\n            this.appendChild(this.ownLabel);\n        }\n        this.#syncLabelLayout();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as twgl from 'twgl';\nimport { Mouse } from '../../controls.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { currentEvil } from '../eviltime.mjs';\n\nconst CAMERA_MOTION_SETTLE_EPS = 1e-2;\nconst CAMERA_WHEEL_GESTURE_IDLE_LATCH_S = 0.18;\n\nfunction normalizeFreeMoveKey(key) {\n    if (typeof key !== 'string') {\n        return null;\n    }\n    let normalized = key.toLowerCase();\n    if (normalized === ' ') {\n        normalized = 'space';\n    }\n    switch (normalized) {\n        case 'arrowup':\n            return 'w';\n        case 'arrowleft':\n            return 'a';\n        case 'arrowdown':\n            return 's';\n        case 'arrowright':\n            return 'd';\n        case 'w':\n        case 'a':\n        case 's':\n        case 'd':\n        case 'shift':\n            return normalized;\n        default:\n            return null;\n    }\n}\n\n/* Treat tiny residual physics values as settled so diagnostics can focus on real motion. */\nfunction hasMotionComponent(value, threshold = CAMERA_MOTION_SETTLE_EPS) {\n    return Number.isFinite(value) && Math.abs(value) > threshold;\n}\n\n/* Clone a short vector into a plain array so debug snapshots stay JSON-friendly. */\nfunction cloneVec(vec) {\n    return Array.isArray(vec) ? vec.map((v) => Number(v)) : [0, 0, 0];\n}\n\n/* Keep only recent drag samples so release throws reflect short-term gesture intent rather than one frame of noise. */\nfunction pruneRecentDragSamples(samples, nowS, maxAgeS) {\n    return samples.filter((sample) => (nowS - sample.at_s) <= maxAgeS);\n}\n\n/* Solve one monotone exponential-decay boundary hit so sparse stop wakes can land exactly on hard camera clamps. */\nfunction decayBoundaryHitAfterS(position, velocity, decayPerS, boundary) {\n    if (!Number.isFinite(boundary) || !Number.isFinite(position) || !Number.isFinite(velocity) || !Number.isFinite(decayPerS) || decayPerS <= 0) {\n        return null;\n    }\n    if (velocity === 0) {\n        return position === boundary ? 0 : null;\n    }\n    const limit = position + (velocity / decayPerS);\n    if (velocity > 0) {\n        if (!(boundary >= position && boundary <= limit)) {\n            return null;\n        }\n    } else if (!(boundary <= position && boundary >= limit)) {\n        return null;\n    }\n    const unit = 1 - ((decayPerS * (boundary - position)) / velocity);\n    if (!(unit >= 0 && unit <= 1)) {\n        return null;\n    }\n    return -Math.log(Math.max(unit, 1e-12)) / decayPerS;\n}\n\n/* Project the earliest exact hard stop for one scalar camera decay against fixed min/max bounds. */\nfunction predictScalarClampStop({ start_s, position, velocity, decay_per_s, min = -Infinity, max = Infinity }) {\n    if (position < min || (position === min && velocity <= 0)) {\n        return { stop_s: start_s, position: min, velocity: 0, reason: 'clamped' };\n    }\n    if (position > max || (position === max && velocity >= 0)) {\n        return { stop_s: start_s, position: max, velocity: 0, reason: 'clamped' };\n    }\n    const minDt = velocity < 0 ? decayBoundaryHitAfterS(position, velocity, decay_per_s, min) : null;\n    const maxDt = velocity > 0 ? decayBoundaryHitAfterS(position, velocity, decay_per_s, max) : null;\n    const dt_s = [minDt, maxDt].filter((dt) => Number.isFinite(dt)).sort((a, b) => a - b)[0];\n    if (!Number.isFinite(dt_s)) {\n        return null;\n    }\n    const hit = minDt != null && minDt === dt_s ? min : max;\n    return {\n        stop_s: start_s + dt_s,\n        position: hit,\n        velocity: 0,\n        reason: 'clamped',\n    };\n}\n\n/* Convert the camera's signed Z bounds into positive view-depth bounds for log-depth zoom motion. */\nfunction zoomLogDepthBounds(minZ, maxZ) {\n    const minDepth = -maxZ;\n    const maxDepth = -minZ;\n    if (!(Number.isFinite(minDepth) && Number.isFinite(maxDepth) && minDepth > 0 && maxDepth >= minDepth)) {\n        throw new Error(`zoomLogDepthBounds(${minZ}, ${maxZ}): expected negative Z bounds with positive depth range.`);\n    }\n    return {\n        minPos: Math.log(minDepth),\n        maxPos: Math.log(maxDepth),\n    };\n}\n\nconst SCREEN_CAMERA_Z_CLIP_HALF_RANGE = 100000;\n\n/*\n * Camera for retained screen-space surfaces. UI coordinates are CSS pixels\n * from the top-left and remain independent of the Stage's world camera.\n */\nexport class ScreenCamera extends ui.Node {\n    projectionMatrix = twgl.m4.identity();\n    #viewportSize = [1, 1];\n\n    vpBounds = { left: 0, right: 1, top: 0, bottom: 1 };\n    constructor(state = {}) {\n        super(state);\n        this.#rebuildProjectionMatrix(1, 1);\n    }\n\n    _onViewportResized(_gl, _res, { width, height }) {\n        const nextWidth = Math.max(1, Number(width) || 1);\n        const nextHeight = Math.max(1, Number(height) || 1);\n        this.#viewportSize = [nextWidth, nextHeight];\n        this.vpBounds = { left: 0, right: nextWidth, top: 0, bottom: nextHeight };\n        this.#rebuildProjectionMatrix(nextWidth, nextHeight);\n    }\n\n    getViewportSize() {\n        return [...this.#viewportSize];\n    }\n\n    getMouseWorldPosition() {\n        return [\n            Mouse.x * this.#viewportSize[0],\n            Mouse.y * this.#viewportSize[1],\n            0,\n        ];\n    }\n\n    getMouseViewPosition() {\n        return this.getMouseWorldPosition();\n    }\n\n    viewMode() {\n        return 'screen';\n    }\n\n    getWorldCameraCenter() {\n        return [this.#viewportSize[0] * 0.5, this.#viewportSize[1] * 0.5, 0];\n    }\n\n    /* Preserve the global F7 camera command when keyboard focus belongs to screen UI. */\n    toggleViewMode() {\n        return this.scene?.stage?.activeCamera?.toggleViewMode?.() ?? false;\n    }\n\n    #rebuildProjectionMatrix(width, height) {\n        const projection = twgl.m4.ortho(\n            0,\n            width,\n            height,\n            0,\n            -SCREEN_CAMERA_Z_CLIP_HALF_RANGE,\n            SCREEN_CAMERA_Z_CLIP_HALF_RANGE,\n        );\n        // Retain EvilUI's convention that increasingly negative local Z is nearer.\n        this.projectionMatrix = twgl.m4.scale(projection, [1, 1, -1]);\n    }\n}\n\n/**\n * Maintains a transformation matrix for the scene camera.\n * The framework must invert this matrix when composing it with the scene graph.\n */\nexport class Camera extends ui.Node {\n    fov = 90;\n    vpBounds = null;\n\n    #mode = 'locked'; // 'locked' | 'free'\n\n    // Lockedview settings\n    #zoomSpeedBoost = 8.0;\n    #wheelZoomStep = 0.012;\n    #pixelWheelZoomScale = 1.0;\n    #pixelWheelZoomDrag = 0.52;\n    #zoomDrag = 0.80;\n    \n    #wheelPanPixels = 28.0;\n    #pixelWheelPanScale = 0.9;\n    #wheelPanBoost = 3.0;\n    #wheelPanCarry = 0.35;\n    #wheelPanDrag = 0.82;\n    #pixelWheelPanCarry = 0.06;\n    #pixelWheelPanDrag = 0.52;\n    #drag = 0.95;\n    #dragThrowWindowS = 0.10;\n\n    // Inertial state\n    #currentThrowVelocity = [0, 0, 0];\n    #dragThrowSamples = [];\n    #dragThrowActive = false;\n    \n    // Bounds & Viewport\n    #viewportSize = [1, 1];\n    #maxZ = -150;\n    #minZ = -2000;\n    #bounds = { minX: null, maxX: null, minY: null, maxY: null };\n    \n    #angleThreshold = 35.0;\n    #sensitivity = Math.tan(this.#angleThreshold * (Math.PI / 180));\n\n    // Freeview settings & state\n    #freePosition = [0, 0, 0];\n    #freeYaw = 0;\n    #freePitch = 0;\n    #freeLookDelta = [0, 0];\n    #freeMoveSpeed = 640;\n    #freeRunMultiplier = 2.5;\n    #freeLookSensitivity = 0.0025;\n    #freeMaxPitch = (Math.PI / 2) - 0.01;\n    #freeActiveKeys = new Set();\n    #freeRestoreMatrix = null;\n    \n    #keyListenersAttached = false;\n    #freeKeyDownHandler = (e) => this.#updateFreeKeyState(e?.key, true);\n    #freeKeyUpHandler = (e) => this.#updateFreeKeyState(e?.key, false);\n    #pointerLockChangeHandler = () => this.#handlePointerLockChange();\n    #ownLoopThink = null;\n    #lastLoopS = null;\n    #wheelGestureOwnedUntilS = null;\n\n    constructor(state) {\n        super(state);\n    }\n\n    /* Keep wheel-gesture ownership stable across hover retargets until the wheel stream goes idle. */\n    ownsActiveWheelGesture(nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        return Number.isFinite(this.#wheelGestureOwnedUntilS) && nowS <= this.#wheelGestureOwnedUntilS;\n    }\n\n    /* Let non-camera wheel owners preserve the shared gesture latch so hover retarget does not immediately hand the same gesture to a nested preview. */\n    retainWheelGesture(nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        this.#retainWheelGesture(nowS);\n    }\n\n    /* Extend the current camera-owned wheel gesture so late hover changes do not retarget mid-stream. */\n    #retainWheelGesture(nowS = this.scene?.stage?.frameNowS ?? currentEvil()) {\n        this.#wheelGestureOwnedUntilS = nowS + CAMERA_WHEEL_GESTURE_IDLE_LATCH_S;\n    }\n\n    #motionVelocityThreshold(baseThreshold = CAMERA_MOTION_SETTLE_EPS) {\n        return baseThreshold / this.sceneFrameStepS();\n    }\n\n    _onViewportResized(gl, res, { width, height }) {\n        const alt = 0.5 * Math.min(width, height);\n        // Centers the 2D view at a Z-depth that maintains a 90-degree FOV mapping\n        this.setLocalToParent(twgl.m4.translation([0, 0, -alt || 0]));\n        this.#rebuildProjectionMatrix(width / height);\n        this.#viewportSize = [width, height];\n        this.updateBounds();\n    }\n\n    getViewportSize() {\n        return this.#viewportSize;\n    }\n\n    /* Expose the current interaction mode so stage-owned chrome anchoring can follow free-look globally. */\n    viewMode() {\n        return this.#mode;\n    }\n\n    /* Freeze the effective 2D view used by recording/replay. The transform is\n       authoritative; derived bounds are rebuilt after restoration. */\n    recordingViewState() {\n        return {\n            kind: 'camera',\n            version: 1,\n            mode: this.#mode,\n            local_to_parent: Array.from(this.localToParent()),\n            viewport: [...this.#viewportSize],\n        };\n    }\n\n    restoreRecordingViewState(state) {\n        if (!state || state.version !== 1 || state.mode !== 'locked') {\n            throw new Error(`Camera replay supports only version-1 locked views (got mode=${state?.mode ?? 'missing'}).`);\n        }\n        const matrix = state.local_to_parent;\n        if (!Array.isArray(matrix) || matrix.length !== 16 || matrix.some((value) => !Number.isFinite(value))) {\n            throw new Error('Camera replay state requires a finite 4x4 local_to_parent matrix.');\n        }\n        if (this.#mode !== 'locked') this._setMode('locked');\n        this.stopMotion();\n        this.setLocalToParent(new Float32Array(matrix));\n        this.updateBounds();\n        this.#syncLoopState();\n        return this.recordingViewState();\n    }\n\n    /* Toggle between locked and free camera modes from keyboard-driven scene commands. */\n    toggleViewMode() {\n        this._setMode(this.#mode === 'locked' ? 'free' : 'locked');\n    }\n\n    #validateBounds(min, max, context) {\n        if (!Number.isFinite(min) || !Number.isFinite(max)) {\n            throw new Error(`Camera.${context}(${min}, ${max}): bounds must be finite.`);\n        }\n        if (min > max) {\n            throw new Error(`Camera.${context}(${min}, ${max}): min exceeds max.`);\n        }\n    }\n\n    setVerticalBounds(minY, maxY) {\n        this.#validateBounds(minY, maxY, 'setVerticalBounds');\n        this.#bounds.minY = minY;\n        this.#bounds.maxY = maxY;\n    }\n\n    setHorizontalBounds(minX, maxX) {\n        this.#validateBounds(minX, maxX, 'setHorizontalBounds');\n        this.#bounds.minX = minX;\n        this.#bounds.maxX = maxX;\n    }\n\n    clampVertical(minY, maxY) {\n        this.#validateBounds(minY, maxY, 'clampVertical');\n        const pos = this.localPosition();\n        const nextY = Math.max(minY, Math.min(maxY, pos[1]));\n        \n        if (Math.abs(nextY - pos[1]) <= 0.01) return false;\n        \n        this.setLocalPosition([pos[0], nextY, pos[2]]);\n        this.cancelExponentialDecay('pan_y');\n        this.cancelExponentialDecay('wheel_y');\n        this.cancelExponentialDecay('wheel_x');\n        this.#currentThrowVelocity[1] = 0.0;\n        this.updateBounds();\n        this.#syncLoopState();\n        return true;\n    }\n\n    clampHorizontal(minX, maxX) {\n        this.#validateBounds(minX, maxX, 'clampHorizontal');\n        const pos = this.localPosition();\n        const nextX = Math.max(minX, Math.min(maxX, pos[0]));\n        \n        if (Math.abs(nextX - pos[0]) <= 0.01) return false;\n        \n        this.setLocalPosition([nextX, pos[1], pos[2]]);\n        this.cancelExponentialDecay('pan_x');\n        this.cancelExponentialDecay('wheel_x');\n        this.#currentThrowVelocity[0] = 0.0;\n        this.updateBounds();\n        this.#syncLoopState();\n        return true;\n    }\n\n    stopMotion() {\n        this.cancelExponentialDecay('pan_x');\n        this.cancelExponentialDecay('pan_y');\n        this.cancelExponentialDecay('zoom_log_depth');\n        this.cancelExponentialDecay('wheel_x');\n        this.cancelExponentialDecay('wheel_y');\n        this.#currentThrowVelocity = [0, 0, 0];\n        this.#resetDragThrow();\n        this.#syncLoopState();\n    }\n\n    /* Stop only vertical locked-camera pan motion so document-owned local scrolling does not cancel unrelated horizontal wheel state. */\n    stopVerticalMotion() {\n        this.cancelExponentialDecay('pan_y');\n        this.cancelExponentialDecay('wheel_y');\n        this.#currentThrowVelocity[1] = 0.0;\n        this.#syncLoopState();\n    }\n\n    /* Drop any accumulated drag history so the next gesture starts with a clean throw estimate. */\n    #resetDragThrow() {\n        this.#currentThrowVelocity = [0, 0, 0];\n        this.#dragThrowSamples = [];\n        this.#dragThrowActive = false;\n    }\n\n    /* Fold one drag frame into a short recent-history estimate used for release inertia. */\n    #recordDragThrowSample(delta, dtS) {\n        const safeDtS = Number.isFinite(dtS) && dtS > 0 ? dtS : this.sceneFrameStepS();\n        const nowS = this.sceneNowS();\n        this.#dragThrowActive = true;\n        this.#dragThrowSamples.push({\n            at_s: nowS,\n            dt_s: safeDtS,\n            delta: cloneVec(delta),\n        });\n        this.#dragThrowSamples = pruneRecentDragSamples(this.#dragThrowSamples, nowS, this.#dragThrowWindowS);\n        let totalDtS = 0.0;\n        const totalDelta = [0, 0, 0];\n        for (const sample of this.#dragThrowSamples) {\n            totalDtS += sample.dt_s;\n            totalDelta[0] += sample.delta[0];\n            totalDelta[1] += sample.delta[1];\n            totalDelta[2] += sample.delta[2];\n        }\n        if (totalDtS <= 0) {\n            this.#currentThrowVelocity = [0, 0, 0];\n            return this.#currentThrowVelocity;\n        }\n        this.#currentThrowVelocity = [\n            totalDelta[0] / totalDtS,\n            totalDelta[1] / totalDtS,\n            totalDelta[2] / totalDtS,\n        ];\n        return this.#currentThrowVelocity;\n    }\n\n    /* Expose the main motion drivers so crash diagnostics can explain steady-state redraws. */\n    debugMotionState(threshold = CAMERA_MOTION_SETTLE_EPS) {\n        const velocityThreshold = this.#motionVelocityThreshold(threshold);\n        const panX = this.exponentialDecayState('pan_x');\n        const panY = this.exponentialDecayState('pan_y');\n        const zoom = this.exponentialDecayState('zoom_log_depth');\n        const wheelX = this.exponentialDecayState('wheel_x');\n        const wheelY = this.exponentialDecayState('wheel_y');\n        const reasons = [];\n        if (hasMotionComponent(panX?.velocity ?? 0, velocityThreshold) || hasMotionComponent(panY?.velocity ?? 0, velocityThreshold)) {\n            reasons.push('throw_velocity');\n        }\n        if (hasMotionComponent(zoom?.velocity ?? 0, velocityThreshold)) {\n            reasons.push('zoom_velocity');\n        }\n        if (hasMotionComponent(wheelX?.velocity ?? 0, velocityThreshold) || hasMotionComponent(wheelY?.velocity ?? 0, velocityThreshold)) {\n            reasons.push('wheel_velocity');\n        }\n        if (hasMotionComponent(this.#currentThrowVelocity[0], velocityThreshold)\n            || hasMotionComponent(this.#currentThrowVelocity[1], velocityThreshold)\n            || hasMotionComponent(this.#currentThrowVelocity[2], velocityThreshold)) {\n            reasons.push('drag_throw');\n        }\n        if (this.#mode === 'free' && (hasMotionComponent(this.#freeLookDelta[0], threshold)\n            || hasMotionComponent(this.#freeLookDelta[1], threshold))) {\n            reasons.push('free_look_delta');\n        }\n        if (this.#mode === 'free' && this.#freeActiveKeys.size > 0) {\n            reasons.push('free_move_keys');\n        }\n        return {\n            mode: this.#mode,\n            moving: reasons.length > 0,\n            reasons,\n            velocity: [Number(panX?.velocity ?? 0), Number(panY?.velocity ?? 0), 0],\n            current_throw_velocity: cloneVec(this.#currentThrowVelocity),\n            zoom_velocity: Number(zoom?.velocity ?? 0),\n            wheel_velocity_x: Number(wheelX?.velocity ?? 0),\n            wheel_velocity_y: Number(wheelY?.velocity ?? 0),\n            free_look_delta: [Number(this.#freeLookDelta[0]), Number(this.#freeLookDelta[1])],\n            free_active_keys: Array.from(this.#freeActiveKeys).sort(),\n        };\n    }\n\n    updateBounds() {\n        const depth = -this.localToParent()[14];\n        const scale = (depth * 2.0) / this.#viewportSize[1];\n        const worldHeight = this.#viewportSize[1] * scale;\n        const worldWidth = this.#viewportSize[0] * scale;\n\n        const offset = twgl.m4.getTranslation(this.localToParent());\n        const [camX, camY] = offset;\n\n        this.vpBounds = {\n            minX: camX - (worldWidth / 2),\n            maxX: camX + (worldWidth / 2),\n            minY: camY - (worldHeight / 2),\n            maxY: camY + (worldHeight / 2),\n            width: worldWidth,\n            height: worldHeight\n        };\n    }\n\n    getMouseWorldPosition() {\n        return [\n            Mouse.x * this.vpBounds.width + this.vpBounds.minX,\n            Mouse.y * this.vpBounds.height + this.vpBounds.minY\n        ];\n    }\n\n    getMouseViewPosition() {\n        const offset = twgl.m4.getTranslation(this.localToParent());\n        const x = Mouse.x * this.#viewportSize[0] - this.#viewportSize[0] * 0.5;\n        const y = Mouse.y * this.#viewportSize[1] - this.#viewportSize[1] * 0.5;\n        return [x + offset[0], y + offset[1]];\n    }\n\n    getWorldCameraCenter() {\n        if (!this.vpBounds) return [0, 0];\n        return [\n            this.vpBounds.minX + this.vpBounds.width * 0.5, \n            this.vpBounds.minY + this.vpBounds.height * 0.5\n        ];\n    }\n\n    #pixelWheelResponse(raw) {\n        return Number.isFinite(raw) ? Math.tanh(raw / 52.0) : 0.0;\n    }\n\n    /* Seed one zoom decay from the live clamped depth so hard-bound reversals never depend on stale pre-clamp momentum. */\n    #startZoomDecay(deltaVelocity, decayPerS, decayEpsilon) {\n        if (!Number.isFinite(deltaVelocity) || deltaVelocity === 0) {\n            return false;\n        }\n        const depth = -this.localPosition()[2];\n        const logDepth = Math.log(Math.max(1e-6, depth));\n        const { minPos, maxPos } = zoomLogDepthBounds(this.#minZ, this.#maxZ);\n        const livePos = Math.max(minPos, Math.min(maxPos, logDepth));\n        const prev = this.exponentialDecayState('zoom_log_depth');\n        let position = Number.isFinite(prev?.position) ? prev.position : livePos;\n        let velocity = Number.isFinite(prev?.velocity) ? prev.velocity : 0.0;\n        if (position < minPos || position > maxPos) {\n            position = livePos;\n            velocity = 0.0;\n        }\n        const inputDir = Math.sign(deltaVelocity);\n        const prevDir = Math.sign(velocity);\n        const atNear = livePos <= minPos + 1e-6;\n        const atFar = livePos >= maxPos - 1e-6;\n        const pinnedOutward = (atNear && velocity < 0) || (atFar && velocity > 0);\n        if ((prevDir !== 0 && prevDir !== inputDir) || pinnedOutward) {\n            position = livePos;\n            velocity = 0.0;\n        }\n        this.startExponentialDecay('zoom_log_depth', {\n            position,\n            velocity: velocity + deltaVelocity,\n            decay_per_s: decayPerS,\n            epsilon: decayEpsilon,\n            predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                start_s,\n                position,\n                velocity,\n                decay_per_s,\n                min: minPos,\n                max: maxPos,\n            }),\n            clamp: ({ position, velocity }) => {\n                const next = Math.max(minPos, Math.min(maxPos, position));\n                if (next !== position) {\n                    return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                }\n                return { position, velocity };\n            },\n            apply: ({ position }) => {\n                const pos = this.localPosition();\n                this.setLocalPosition([pos[0], pos[1], -Math.exp(position)]);\n                this.updateBounds();\n            },\n        });\n        return true;\n    }\n\n    onPointerInput(events) {\n        let eventConsumed = false;\n        const nowS = this.scene?.stage?.frameNowS ?? currentEvil();\n        const decayDt = Number.isFinite(events?.frameDeltaTime) && events.frameDeltaTime > 0\n            ? events.frameDeltaTime\n            : this.sceneFrameStepS();\n        const decayEpsilon = CAMERA_MOTION_SETTLE_EPS;\n        const dragCapture = this.scene?.dragCapture ?? null;\n        const dragCapturedExternally = dragCapture === 'window' || dragCapture === 'input-cell'\n            || dragCapture === 'document_selection' || dragCapture === 'scrollbox';\n\n        if (this.#mode === 'free') {\n            if (events?.has?.('escape')) {\n                this._setMode('locked');\n                return true;\n            }\n            return true;\n        }\n\n        // Lockedview Input Handling\n        let thisFrameMoveDelta = [0, 0, 0];\n        const zoomMode = events.has('CTRL_KEY');\n        const shiftActive = events.has('SHIFT_KEY');\n        \n        const zoomSpeed = zoomMode && shiftActive ? this.#zoomSpeedBoost : 1.0;\n        const panSpeed = !zoomMode && shiftActive ? this.#wheelPanBoost : 1.0;\n        \n        const depth = -this.state.localToParent[14];\n        const scale = (depth * 2.0) / this.#viewportSize[1];\n        const wheelPanStep = this.#wheelPanPixels * scale * panSpeed;\n\n        for (const event of events) {\n            if (event === 'SCROLL_DOWN' || event === 'SCROLL_UP' || event === 'SCROLL_LEFT' || event === 'SCROLL_RIGHT') {\n                const vertical = event === 'SCROLL_DOWN' || event === 'SCROLL_UP';\n                const direction = (event === 'SCROLL_DOWN' || event === 'SCROLL_RIGHT') ? 1 : -1;\n                if (zoomMode) {\n                    this.#startZoomDecay(\n                        ((this.#wheelZoomStep * zoomSpeed) * direction) / decayDt,\n                        -Math.log(this.#zoomDrag) / this.sceneFrameStepS(),\n                        decayEpsilon,\n                    );\n                } else {\n                    if (vertical) {\n                        thisFrameMoveDelta[1] += wheelPanStep * direction;\n                        const nextY = this.localPosition()[1] + thisFrameMoveDelta[1];\n                        const prev = this.exponentialDecayState('wheel_y');\n                        const velocity = (prev?.velocity ?? 0) + ((wheelPanStep * this.#wheelPanCarry) * direction) / decayDt;\n                        this.startExponentialDecay('wheel_y', {\n                            position: nextY,\n                            velocity,\n                            decay_per_s: -Math.log(this.#wheelPanDrag) / this.sceneFrameStepS(),\n                            epsilon: decayEpsilon,\n                            predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                                start_s,\n                                position,\n                                velocity,\n                                decay_per_s,\n                                min: this.#bounds.minY ?? -Infinity,\n                                max: this.#bounds.maxY ?? Infinity,\n                            }),\n                            clamp: ({ position, velocity }) => {\n                                const next = Math.max(this.#bounds.minY ?? -Infinity, Math.min(this.#bounds.maxY ?? Infinity, position));\n                                if (next !== position) {\n                                    return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                                }\n                                return { position, velocity };\n                            },\n                            apply: ({ position }) => {\n                                const pos = this.localPosition();\n                                this.setLocalPosition([pos[0], position, pos[2]]);\n                                this.updateBounds();\n                            },\n                        });\n                    } else {\n                        thisFrameMoveDelta[0] += wheelPanStep * direction;\n                        const nextX = this.localPosition()[0] + thisFrameMoveDelta[0];\n                        const prev = this.exponentialDecayState('wheel_x');\n                        const velocity = (prev?.velocity ?? 0) + ((wheelPanStep * this.#wheelPanCarry) * direction) / decayDt;\n                        this.startExponentialDecay('wheel_x', {\n                            position: nextX,\n                            velocity,\n                            decay_per_s: -Math.log(this.#wheelPanDrag) / this.sceneFrameStepS(),\n                            epsilon: decayEpsilon,\n                            predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                                start_s,\n                                position,\n                                velocity,\n                                decay_per_s,\n                                min: this.#bounds.minX ?? -Infinity,\n                                max: this.#bounds.maxX ?? Infinity,\n                            }),\n                            clamp: ({ position, velocity }) => {\n                                const next = Math.max(this.#bounds.minX ?? -Infinity, Math.min(this.#bounds.maxX ?? Infinity, position));\n                                if (next !== position) {\n                                    return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                                }\n                                return { position, velocity };\n                            },\n                            apply: ({ position }) => {\n                                const pos = this.localPosition();\n                                this.setLocalPosition([position, pos[1], pos[2]]);\n                                this.updateBounds();\n                            },\n                        });\n                    }\n                }\n                eventConsumed = true;\n            }\n\n            if (event === 'L_MOUSE_DOWN_HOLD') {\n                if (dragCapturedExternally) {\n                    eventConsumed = true;\n                    continue;\n                }\n                if (!Mouse.movedSinceButtonDown(0)) {\n                    eventConsumed = true;\n                    continue;\n                }\n                if (!this.#dragThrowActive) {\n                    this.#resetDragThrow();\n                    this.#dragThrowActive = true;\n                }\n                let dx = Mouse.x - Mouse.lastX;\n                let dy = Mouse.y - Mouse.lastY;\n                const absX = Math.abs(dx);\n                const absY = Math.abs(dy);\n\n                // Axis Snapping\n                if (absY * this.#sensitivity > absX) dx = 0;\n                else if (absY < absX * this.#sensitivity) dy = 0;\n\n                thisFrameMoveDelta[0] = dx * -this.#viewportSize[0] * scale;\n                thisFrameMoveDelta[1] = dy * -this.#viewportSize[1] * scale;\n                this.#recordDragThrowSample(thisFrameMoveDelta, decayDt);\n\n                // Cancel conflicting momentum\n                const panX = this.exponentialDecayState('pan_x');\n                const panY = this.exponentialDecayState('pan_y');\n                const dot = ((panX?.velocity ?? 0) * this.#currentThrowVelocity[0]) + ((panY?.velocity ?? 0) * this.#currentThrowVelocity[1]);\n                if (dot < 0) {\n                    this.cancelExponentialDecay('pan_x');\n                    this.cancelExponentialDecay('pan_y');\n                }\n                \n                eventConsumed = true;\n            }\n\n            if (event === 'L_MOUSE_UP') {\n                if (dragCapturedExternally) {\n                    eventConsumed = true;\n                    continue;\n                }\n                const panX = this.exponentialDecayState('pan_x');\n                const panY = this.exponentialDecayState('pan_y');\n                this.startExponentialDecay('pan_x', {\n                    position: panX?.position ?? this.localPosition()[0],\n                    velocity: (panX?.velocity ?? 0) + this.#currentThrowVelocity[0],\n                    decay_per_s: -Math.log(this.#drag) / this.sceneFrameStepS(),\n                    epsilon: decayEpsilon,\n                    predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                        start_s,\n                        position,\n                        velocity,\n                        decay_per_s,\n                        min: this.#bounds.minX ?? -Infinity,\n                        max: this.#bounds.maxX ?? Infinity,\n                    }),\n                    clamp: ({ position, velocity }) => {\n                        const next = Math.max(this.#bounds.minX ?? -Infinity, Math.min(this.#bounds.maxX ?? Infinity, position));\n                        if (next !== position) {\n                            return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                        }\n                        return { position, velocity };\n                    },\n                    apply: ({ position }) => {\n                        const pos = this.localPosition();\n                        this.setLocalPosition([position, pos[1], pos[2]]);\n                        this.updateBounds();\n                    },\n                });\n                this.startExponentialDecay('pan_y', {\n                    position: panY?.position ?? this.localPosition()[1],\n                    velocity: (panY?.velocity ?? 0) + this.#currentThrowVelocity[1],\n                    decay_per_s: -Math.log(this.#drag) / this.sceneFrameStepS(),\n                    epsilon: decayEpsilon,\n                    predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                        start_s,\n                        position,\n                        velocity,\n                        decay_per_s,\n                        min: this.#bounds.minY ?? -Infinity,\n                        max: this.#bounds.maxY ?? Infinity,\n                    }),\n                    clamp: ({ position, velocity }) => {\n                        const next = Math.max(this.#bounds.minY ?? -Infinity, Math.min(this.#bounds.maxY ?? Infinity, position));\n                        if (next !== position) {\n                            return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                        }\n                        return { position, velocity };\n                    },\n                    apply: ({ position }) => {\n                        const pos = this.localPosition();\n                        this.setLocalPosition([pos[0], position, pos[2]]);\n                        this.updateBounds();\n                    },\n                });\n                this.#resetDragThrow();\n                eventConsumed = true;\n            }\n        }\n\n        if (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && (((events.wheelDeltaX ?? 0) !== 0) || ((events.wheelDeltaY ?? 0) !== 0))) {\n            const responseY = this.#pixelWheelResponse(events.wheelDeltaY ?? 0);\n            const responseX = this.#pixelWheelResponse(events.wheelDeltaX ?? 0);\n            if (zoomMode && responseY !== 0) {\n                this.#startZoomDecay(\n                    (this.#wheelZoomStep * zoomSpeed * this.#pixelWheelZoomScale * responseY) / decayDt,\n                    -Math.log(this.#pixelWheelZoomDrag) / this.sceneFrameStepS(),\n                    decayEpsilon,\n                );\n            } else {\n                if (responseX !== 0) {\n                    const wheelDelta = wheelPanStep * this.#pixelWheelPanScale * responseX;\n                    thisFrameMoveDelta[0] += wheelDelta;\n                    const nextX = this.localPosition()[0] + thisFrameMoveDelta[0];\n                    const prev = this.exponentialDecayState('wheel_x');\n                    const velocity = (prev?.velocity ?? 0) + (wheelDelta * this.#pixelWheelPanCarry) / decayDt;\n                    this.startExponentialDecay('wheel_x', {\n                        position: nextX,\n                        velocity,\n                        decay_per_s: -Math.log(this.#pixelWheelPanDrag) / this.sceneFrameStepS(),\n                        epsilon: decayEpsilon,\n                        predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                            start_s,\n                            position,\n                            velocity,\n                            decay_per_s,\n                            min: this.#bounds.minX ?? -Infinity,\n                            max: this.#bounds.maxX ?? Infinity,\n                        }),\n                        clamp: ({ position, velocity }) => {\n                            const next = Math.max(this.#bounds.minX ?? -Infinity, Math.min(this.#bounds.maxX ?? Infinity, position));\n                            if (next !== position) {\n                                return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                            }\n                            return { position, velocity };\n                        },\n                        apply: ({ position }) => {\n                            const pos = this.localPosition();\n                            this.setLocalPosition([position, pos[1], pos[2]]);\n                            this.updateBounds();\n                        },\n                    });\n                }\n                if (responseY !== 0) {\n                    const wheelDelta = wheelPanStep * this.#pixelWheelPanScale * responseY;\n                    thisFrameMoveDelta[1] += wheelDelta;\n                    const nextY = this.localPosition()[1] + thisFrameMoveDelta[1];\n                    const prev = this.exponentialDecayState('wheel_y');\n                    const velocity = (prev?.velocity ?? 0) + (wheelDelta * this.#pixelWheelPanCarry) / decayDt;\n                    this.startExponentialDecay('wheel_y', {\n                        position: nextY,\n                        velocity,\n                        decay_per_s: -Math.log(this.#pixelWheelPanDrag) / this.sceneFrameStepS(),\n                        epsilon: decayEpsilon,\n                        predict_stop: ({ start_s, position, velocity, decay_per_s }) => predictScalarClampStop({\n                            start_s,\n                            position,\n                            velocity,\n                            decay_per_s,\n                            min: this.#bounds.minY ?? -Infinity,\n                            max: this.#bounds.maxY ?? Infinity,\n                        }),\n                        clamp: ({ position, velocity }) => {\n                            const next = Math.max(this.#bounds.minY ?? -Infinity, Math.min(this.#bounds.maxY ?? Infinity, position));\n                            if (next !== position) {\n                                return { position: next, velocity: 0, stop: true, reason: 'clamped' };\n                            }\n                            return { position, velocity };\n                        },\n                        apply: ({ position }) => {\n                            const pos = this.localPosition();\n                            this.setLocalPosition([pos[0], position, pos[2]]);\n                            this.updateBounds();\n                        },\n                    });\n                }\n            }\n            eventConsumed = true;\n        }\n\n        if (thisFrameMoveDelta[0] !== 0 || thisFrameMoveDelta[1] !== 0 || thisFrameMoveDelta[2] !== 0) {\n            this.setLocalToParent(twgl.m4.translate(this.localToParent(), thisFrameMoveDelta));\n            this.#clampBounds();\n            this.updateBounds();\n        }\n\n        if (eventConsumed && (\n            events?.has?.('SCROLL_LEFT')\n            || events?.has?.('SCROLL_RIGHT')\n            || events?.has?.('SCROLL_DOWN')\n            || events?.has?.('SCROLL_UP')\n            || events?.has?.('SCROLL_LEFT_PIXEL')\n            || events?.has?.('SCROLL_RIGHT_PIXEL')\n            || events?.has?.('SCROLL_DOWN_PIXEL')\n            || events?.has?.('SCROLL_UP_PIXEL')\n            || (events?.wheelDeltaMode === WheelEvent.DOM_DELTA_PIXEL && (((events.wheelDeltaX ?? 0) !== 0) || ((events.wheelDeltaY ?? 0) !== 0)))\n        )) {\n            this.#retainWheelGesture(nowS);\n        }\n\n        this.#syncLoopState();\n        return eventConsumed;\n    }\n\n    _processFreeviewInput(deltatime) {\n        let consumed = false;\n        const lookX = this.#freeLookDelta[0];\n        const lookY = this.#freeLookDelta[1];\n        \n        if (lookX !== 0 || lookY !== 0) {\n            this.#freeYaw += lookX * this.#freeLookSensitivity;\n            this.#freePitch -= lookY * this.#freeLookSensitivity;\n            this.#freePitch = Math.max(-this.#freeMaxPitch, Math.min(this.#freeMaxPitch, this.#freePitch));\n            this.#freeLookDelta = [0, 0];\n            consumed = true;\n        }\n        \n        const move = [0, 0, 0];\n        if (this.#freeActiveKeys.has('w')) move[2] += 1;\n        if (this.#freeActiveKeys.has('s')) move[2] -= 1;\n        if (this.#freeActiveKeys.has('a')) move[0] -= 1;\n        if (this.#freeActiveKeys.has('d')) move[0] += 1;\n        \n        const dt = deltatime ?? 0;\n        const moveLengthSq = move[0] * move[0] + move[1] * move[1] + move[2] * move[2];\n        \n        if (moveLengthSq > 0 && dt > 0) {\n            const cosPitch = Math.cos(this.#freePitch);\n            const sinPitch = Math.sin(this.#freePitch);\n            const cosYaw = Math.cos(this.#freeYaw);\n            const sinYaw = Math.sin(this.#freeYaw);\n            \n            // Standard +Z Forward / +Y Down coordinate extraction\n            let forward = twgl.v3.normalize([\n                cosPitch * sinYaw,\n                -sinPitch,\n                cosPitch * cosYaw, \n            ]);\n            \n            let right = twgl.v3.cross(forward, [0, -1, 0]);\n            const rightLen = twgl.v3.length(right);\n            \n            if (rightLen < 1e-5) {\n                right = [Math.cos(this.#freeYaw + Math.PI / 2), 0, Math.sin(this.#freeYaw + Math.PI / 2)];\n            } else {\n                right = twgl.v3.mulScalar(right, 1 / rightLen);\n            }\n            \n            let worldMove = [0, 0, 0];\n            if (move[2] !== 0) worldMove = twgl.v3.add(worldMove, twgl.v3.mulScalar(forward, move[2]));\n            if (move[0] !== 0) worldMove = twgl.v3.add(worldMove, twgl.v3.mulScalar(right, move[0]));\n            \n            const length = twgl.v3.length(worldMove);\n            if (length > 0) {\n                worldMove = twgl.v3.mulScalar(worldMove, 1 / length);\n                const speed = this.#freeMoveSpeed * (this.#freeActiveKeys.has('shift') ? this.#freeRunMultiplier : 1.0);\n                const delta = twgl.v3.mulScalar(worldMove, speed * dt);\n                this.#freePosition = twgl.v3.add(this.#freePosition, delta);\n                consumed = true;\n            }\n        }\n        \n        if (consumed) this.#applyFreeviewTransform();\n        return consumed;\n    }\n\n    _setMode(targetMode) {\n        if (this.#mode === targetMode) return;\n        this.#mode = targetMode;\n        \n        if (targetMode === 'free') this.#enterFreeview();\n        else this.#exitFreeview();\n        this.#syncLoopState();\n    }\n\n    #enterFreeview() {\n        this.stopMotion();\n        this.#freeActiveKeys.clear();\n        this.#freeLookDelta = [0, 0];\n        \n        // Hide and lock the mouse to the canvas\n        Mouse.toggleMouseLock(true);\n        \n        const currentMatrix = this.localToParent();\n        this.#freeRestoreMatrix = currentMatrix.slice();\n        this.#freePosition = twgl.m4.getTranslation(currentMatrix);\n        \n        const forward = twgl.v3.normalize(twgl.m4.transformDirection(currentMatrix, [0, 0, 1]));\n        \n        if (Number.isFinite(forward[0]) && Number.isFinite(forward[1]) && Number.isFinite(forward[2])) {\n            this.#freeYaw = Math.atan2(forward[0], forward[2]); \n            const pitch = Math.asin(Math.max(-1, Math.min(1, -forward[1]))); \n            this.#freePitch = Math.max(-this.#freeMaxPitch, Math.min(this.#freeMaxPitch, pitch));\n        } else {\n            this.#freeYaw = 0;\n            this.#freePitch = 0;\n        }\n        \n        this.#attachFreeviewKeyListeners();\n        this.#applyFreeviewTransform();\n        this.updateBounds();\n    }\n\n    #exitFreeview() {\n        this.#freeActiveKeys.clear();\n        this.#freeLookDelta = [0, 0];\n        this.#detachFreeviewKeyListeners();\n        \n        Mouse.toggleMouseLock(false);\n\n        const matrix = this.#freeRestoreMatrix ? this.#freeRestoreMatrix.slice() : twgl.m4.identity();\n        matrix[12] = this.#freePosition[0];\n        matrix[13] = this.#freePosition[1];\n        matrix[14] = this.#freePosition[2];\n        this.setLocalToParent(matrix);\n        this.#freeRestoreMatrix = null;\n        this.updateBounds();\n    }\n\n    #applyFreeviewTransform() {\n        const cosPitch = Math.cos(this.#freePitch);\n        const sinPitch = Math.sin(this.#freePitch);\n        const cosYaw = Math.cos(this.#freeYaw);\n        const sinYaw = Math.sin(this.#freeYaw);\n        \n        const forward = [\n            cosPitch * sinYaw,\n            -sinPitch,\n            cosPitch * cosYaw,\n        ];\n        \n        // Target is placed behind the camera to force local +Z to point forward \n        // while up remains [0, 1, 0] to counter the lookAt cross-product order.\n        const target = twgl.v3.subtract(this.#freePosition, forward); \n        const cameraWorldMatrix = twgl.m4.lookAt(this.#freePosition, target, [0, 1, 0]);\n        this.setLocalToParent(cameraWorldMatrix);\n        this.updateBounds();\n    }\n\n    #attachFreeviewKeyListeners() {\n        if (this.#keyListenersAttached || typeof document === 'undefined') return;\n        document.addEventListener('keydown', this.#freeKeyDownHandler, true);\n        document.addEventListener('keyup', this.#freeKeyUpHandler, true);\n        document.addEventListener('pointerlockchange', this.#pointerLockChangeHandler, true);\n        document.addEventListener('mozpointerlockchange', this.#pointerLockChangeHandler, true);\n        this.#keyListenersAttached = true;\n    }\n\n    #detachFreeviewKeyListeners() {\n        if (!this.#keyListenersAttached || typeof document === 'undefined') return;\n        document.removeEventListener('keydown', this.#freeKeyDownHandler, true);\n        document.removeEventListener('keyup', this.#freeKeyUpHandler, true);\n        document.removeEventListener('pointerlockchange', this.#pointerLockChangeHandler, true);\n        document.removeEventListener('mozpointerlockchange', this.#pointerLockChangeHandler, true);\n        this.#keyListenersAttached = false;\n    }\n\n    /* Browser escape drops pointer lock before app state changes; treat that loss as an immediate free-look exit. */\n    #handlePointerLockChange() {\n        if (this.#mode !== 'free' || typeof document === 'undefined') {\n            return;\n        }\n        const canvas = Mouse.canvas ?? null;\n        const lockedElement = document.pointerLockElement ?? document.mozPointerLockElement ?? null;\n        if (canvas && lockedElement === canvas) {\n            return;\n        }\n        this._setMode('locked');\n    }\n\n    #updateFreeKeyState(key, pressed) {\n        const normalized = normalizeFreeMoveKey(key);\n        if (!normalized) return;\n\n        if (pressed) this.#freeActiveKeys.add(normalized);\n        else this.#freeActiveKeys.delete(normalized);\n        this.#syncLoopState();\n    }\n\n    /* Keep one explicit self-rescheduling loop only while free-look is active. */\n    #needsLoop() {\n        return this.#mode === 'free';\n    }\n\n    /* Cancel one pending camera follow-up when motion settles or the camera detaches. */\n    #clearLoop() {\n        if (this.#ownLoopThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.#ownLoopThink);\n        this.#ownLoopThink = null;\n    }\n\n    /* Re-arm one sparse camera follow-up only while free-look remains live. */\n    #syncLoopState() {\n        if (!this.scene || !this.#needsLoop()) {\n            this.#clearLoop();\n            return;\n        }\n        if (this.#ownLoopThink !== null) {\n            return;\n        }\n        this.#ownLoopThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), ({ now_s }) => {\n            this.#ownLoopThink = null;\n            const last = this.#lastLoopS ?? (now_s - this.sceneFrameStepS());\n            this.#lastLoopS = now_s;\n            this.#runLoop(Math.max(0, now_s - last));\n            this.#syncLoopState();\n        });\n    }\n\n    /* Advance camera free-look from one explicit scheduled wake. */\n    #runLoop(deltatime) {\n        if (this.#mode === 'free') {\n            if (Mouse.mouseMoved()) {\n                const [width, height] = this.#viewportSize;\n                this.#freeLookDelta[0] += (Mouse.x - Mouse.lastX) * width;\n                this.#freeLookDelta[1] += (Mouse.y - Mouse.lastY) * height;\n            }\n            this._processFreeviewInput(deltatime);\n        }\n        this.updateBounds();\n    }\n\n    _onAcquireNode(gl, res) {\n        const width = gl.canvas.clientWidth;\n        const height = gl.canvas.clientHeight;\n        this._onViewportResized(gl, res, { width, height });\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.updateBounds();\n        this.#syncLoopState();\n    }\n\n    _onDetachNode(shared) {\n        this.#clearLoop();\n        this.#detachFreeviewKeyListeners();\n        super._onDetachNode(shared);\n    }\n\n    #clampBounds() {\n        if (this.#bounds.minX !== null && this.#bounds.maxX !== null) {\n            this.clampHorizontal(this.#bounds.minX, this.#bounds.maxX);\n        }\n        if (this.#bounds.minY !== null && this.#bounds.maxY !== null) {\n            this.clampVertical(this.#bounds.minY, this.#bounds.maxY);\n        }\n    }\n\n    #rebuildProjectionMatrix(aspect) {\n        const fov = 0.5 * Math.PI; \n        const near = 10.0; \n        const far = 10000.0; \n\n        const openglProjection = twgl.m4.perspective(fov, aspect, near, far);\n\n        // Flips Y to increase down the screen for intuitive UI layouts.\n        this.projectionMatrix = twgl.m4.scale(openglProjection, [1.0, -1.0, -1.0]);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport * as twgl from 'twgl';\nimport * as ewu from '../evil-works-utils.mjs';\nimport * as ui from './evilui.mjs';\nimport { TEXTURES_URL } from '../config.mjs';\nimport { PORTAL_MIN_BUILD } from '../build-flags.mjs';\nimport { gpuDiagWithResourceOrigin } from './browser-gpu-diagnostics.mjs';\nimport { deleteBufferInfo } from './gl-buffer.mjs';\nimport { beginGlAcquire, getContextGlProgram, invalidateGlAcquire, isCurrentGlAcquire, peekContextGlProgram } from './gl-program.mjs';\nimport { DIRTY, clearNonPickerResourceDirty, hasAnyResourceDirty, markResourceDirty } from './dirty-flags.mjs';\nimport { noteProgramReady, warnProgramPending } from './gl-program-wait.mjs';\n\nconst TEXTURE_TILE_BUFFER_KINDS = Object.freeze([\n    DIRTY.attach,\n    DIRTY.detach,\n    DIRTY.structure,\n    DIRTY.content,\n    DIRTY.style,\n    DIRTY.layout,\n    DIRTY.transform,\n    DIRTY.visibility,\n    DIRTY.instance,\n    DIRTY.buffer,\n]);\n\n/* Filter texture tiles to the currently presented subtree so fullscreen switches do not draw stale buffers. */\nfunction presentedTextureTileNodes(shared) {\n    const scene = shared.scene;\n    if (!scene?._isPresentedNode) {\n        return shared.nodes ?? [];\n    }\n    return (shared.nodes ?? []).filter(node => scene._isPresentedNode(node));\n}\n\n/* Resolve one texture tile pose within the active anchor scope. */\nfunction textureTileLocalMatrix(node, scene) {\n    const pose = node._batchPose?.(scene) ?? null;\n    return pose?.localToAnchor ?? node.localToAnchor ?? node._worldMatrixForBatch?.(scene) ?? null;\n}\n\n/* Resolve the shared texture-tile anchor owner so draw-time inertia can stay uniform-driven. */\nfunction textureTileScopeNode(nodes = []) {\n    const node = nodes[0] ?? null;\n    return node?.anchorNode ?? null;\n}\n\n\nexport class TextureTile extends ui.Tile {\n    constructor(state) {\n        // Override to white default. Future implementations can use this for tint/modulate\n        state.color = state.color || [1.0, 1.0, 1.0, 1.0];\n        super(state);\n\n        if (!state.url && !state.imageBlob) {\n            console.warn(\"TextureTile requires a URL to fetch an image file or an imageBlob (File/Blob/HTMLImageElement).\");\n            return;\n        }\n\n        // Support both URL fetching and direct image objects\n        this.url = state.url || null;\n        this.imageBlob = state.imageBlob || null;\n        this.keepAspectRatio = state.keepAspectRatio ?? true;\n\n        // Initialize working dimensions\n        this.width = state.width || 0;\n        this.height = state.height || 0;\n        this.imageWidth = null;\n        this.imageHeight = null;\n        this.fitWidth = this.width;\n        this.fitHeight = this.height;\n\n        this.ownGlTexture = null;\n        this.ownGlBufferInfo = null;\n        this.ownPendingGlTexture = 0;\n        this._texturePromise = null; // Guard to prevent redundant fetching\n    }\n\n    _dropOwnGlTexture(gl) {\n        if (!gl || !this.ownGlTexture) {\n            this.ownGlTexture = null;\n            return;\n        }\n        gl.deleteTexture(this.ownGlTexture);\n        this.ownGlTexture = null;\n    }\n\n    _dropOwnGlBufferInfo(gl) {\n        if (!this.ownGlBufferInfo) {\n            return;\n        }\n        deleteBufferInfo(gl, this.ownGlBufferInfo);\n        this.ownGlBufferInfo = null;\n    }\n\n    _invalidateTextureAcquire() {\n        invalidateGlAcquire(this, 'ownPendingGlTexture');\n        this._texturePromise = null;\n    }\n\n    _acceptTextureAcquire(gl, texture, token, shared) {\n        const accepted = texture && typeof texture === 'object' && Object.hasOwn(texture, 'texture')\n            ? texture\n            : { texture, width: null, height: null };\n        const current = isCurrentGlAcquire(this, token, 'ownPendingGlTexture')\n            && this._glAttached\n            && this.scene?.gl === gl;\n        if (!current) {\n            if (accepted.texture) {\n                gl.deleteTexture(accepted.texture);\n            }\n            return false;\n        }\n        this.ownGlTexture = accepted.texture;\n        if (accepted.width && accepted.height) {\n            this.ensureAspectRatio(accepted.width, accepted.height);\n        }\n        markResourceDirty(shared, DIRTY.content);\n        return true;\n    }\n\n    _queueTextureAcquire(gl, shared) {\n        if (!gl || this.ownGlTexture || this._texturePromise) {\n            return;\n        }\n        const token = beginGlAcquire(this, 'ownPendingGlTexture');\n        const promise = this.createTexture(gl).then(texture => {\n            this._acceptTextureAcquire(gl, texture, token, shared);\n        }).finally(() => {\n            if (this._texturePromise === promise) {\n                this._texturePromise = null;\n            }\n        });\n        this._texturePromise = promise;\n    }\n\n    ensureAspectRatio(imgWidth, imgHeight) {\n        this.imageWidth = imgWidth;\n        this.imageHeight = imgHeight;\n        return this.fitWithin(this.fitWidth || this.state?.width || imgWidth, this.fitHeight || this.state?.height || imgHeight);\n    }\n\n    /* Fit a decoded image into new layout bounds without discarding its intrinsic aspect ratio. */\n    fitWithin(maxWidth, maxHeight) {\n        if (!Number.isFinite(maxWidth) || !Number.isFinite(maxHeight) || maxWidth <= 0 || maxHeight <= 0) {\n            return { width: this.width, height: this.height, changed: false };\n        }\n        this.fitWidth = maxWidth;\n        this.fitHeight = maxHeight;\n        if (!this.keepAspectRatio || !this.imageWidth || !this.imageHeight) {\n            return { width: this.width, height: this.height, changed: false };\n        }\n        const imageAspect = this.imageWidth / this.imageHeight;\n        const boundAspect = maxWidth / maxHeight;\n        const width = imageAspect > boundAspect ? maxWidth : maxHeight * imageAspect;\n        const height = imageAspect > boundAspect ? maxWidth / imageAspect : maxHeight;\n        const changed = width !== this.width || height !== this.height;\n        if (changed) {\n            this.width = width;\n            this.height = height;\n            this.mutate?.({ width, height });\n        }\n        return { width, height, changed };\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n\n        if (!this.url && !this.imageBlob) {\n            console.warn(\"No URL or valid blob given to TextureTile.\")\n            return;\n        }\n\n        //Fetch current gl context\n        const gl = this.scene.gl\n        if (!gl) {\n            console.warn(`No WebGL context found on attach for node ${this.state?.name || 'unknown'}.`);\n            return;\n        }\n\n        // Only start fetch if we don't already have a texture and aren't currently fetching\n        this._queueTextureAcquire(gl, shared);\n    }\n\n\n    async createTexture(gl) {\n        if (!gl || (!this.imageBlob && !this.url)) {\n            return null;\n        }\n\n        try {\n            if (this.imageBlob) {\n                const bitmap = await createImageBitmap(this.imageBlob, {\n                    colorSpaceConversion: 'none'\n                });\n                const texture = twgl.createTexture(gl, {\n                    src: bitmap\n                });\n                const width = bitmap.width;\n                const height = bitmap.height;\n                bitmap.close();\n\n                return { texture, width, height };\n            }\n            if (this.url) {\n                return await new Promise((resolve, reject) => {\n                    twgl.createTexture(gl, {\n                        src: this.url,\n                        flipY: true\n                    }, (err, texture, source) => { \n                        if (err) {\n                            console.error(\"twgl failed to load texture from URL:\", err);\n                            resolve(null);\n                        } else {\n                            resolve({\n                                texture,\n                                width: source?.width ?? null,\n                                height: source?.height ?? null,\n                            });\n                        }\n                    });\n                });\n            }\n\n        } catch (e) {\n            console.error(\"Failed to decode blob or create texture:\", e);\n            return null;\n        }\n    }\n\n    static _onAcquireContext(gl, shared) {\n        shared.ownGlProgram = peekContextGlProgram(gl, 'gl_program.texture_tile');\n        shared.progWait = null;\n        const acquireToken = beginGlAcquire(shared, 'ownPendingGlProgram');\n\n        (async () => {\n            const vshaderName = 'lib/evilui/texture-tile-anchor';\n            const fshaderName = 'lib/evilui/texture-tile';\n            const ownGlProgram = await getContextGlProgram(gl, 'gl_program.texture_tile', async () => {\n                const [vsSrc, fsSrc] = await ewu.loadSource(vshaderName + '.vs.glsl', fshaderName + '.fs.glsl');\n                return twgl.createProgramInfo(gl, [vsSrc, fsSrc]);\n            });\n            if (!isCurrentGlAcquire(shared, acquireToken, 'ownPendingGlProgram')) {\n                return;\n            }\n            shared.ownGlProgram = ownGlProgram;\n\n            if (!shared.ownGlProgram) {\n                console.warn(`Shader ${fshaderName} not found. TextureTile tiles will not render.`);\n            }\n\n            // Create magenta/black checkerboard fallback texture\n            shared.ownGlErrorTexture = twgl.createTexture(gl, {\n                src: new Uint8Array([\n                    255, 0, 255, 255, 0, 0, 0, 255,\n                    0, 0, 0, 255, 255, 0, 255, 255\n                ]),\n                width: 2,\n                height: 2,\n                min: gl.NEAREST,\n                mag: gl.NEAREST,\n                wrap: gl.REPEAT\n            });\n\n            if (shared.nodes) {\n                for (const node of shared.nodes) {\n                    node._queueTextureAcquire(gl, shared);\n                }\n            }\n        })();  // fire-and-forget\n    }\n\n    static _onReleaseContext(gl, shared) {\n        invalidateGlAcquire(shared, 'ownPendingGlProgram');\n        super._onReleaseContext(gl, shared);\n\n        if (shared.ownGlErrorTexture) {\n            gl.deleteTexture(shared.ownGlErrorTexture);\n            shared.ownGlErrorTexture = null;\n        }\n        shared.ownGlProgram = null;\n\n        if (shared.nodes) {\n            for (const node of shared.nodes) {\n                node._invalidateTextureAcquire();\n                node._dropOwnGlTexture(gl);\n                node._dropOwnGlBufferInfo(gl);\n            }\n        }\n    }\n\n    _onReleaseNode(gl, shared) {\n        super._onReleaseNode(gl, shared);\n        this._invalidateTextureAcquire();\n        this._dropOwnGlTexture(gl);\n        this._dropOwnGlBufferInfo(gl);\n    }\n\n    _onDetachNode(shared) {\n        super._onDetachNode(shared);\n        this._invalidateTextureAcquire();\n    }\n\n    static _drawOpaque(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        status.response = ui.RENDER_STATUS.LOADING;\n\n        if (!shared.ownGlProgram) {\n            const n = shared.nodes?.length || 0;\n            warnProgramPending(shared, 'TextureTile batch', ` (nodes=${n})`);\n            return;\n        }\n\n        noteProgramReady(shared, 'TextureTile batch');\n\n        const sharedGlProgram = shared.ownGlProgram;\n        gl.useProgram(sharedGlProgram.program);\n\n        let allReady = true;\n        const needsBufferUpdate = hasAnyResourceDirty(shared, TEXTURE_TILE_BUFFER_KINDS);\n        const nodes = presentedTextureTileNodes(shared);\n        const anchorMatrix = nodes[0]?.anchorNode?.anchorToRoot ?? null;\n        const scopeNode = textureTileScopeNode(nodes);\n\n        for (const node of nodes) {\n            if (!node.ownGlBufferInfo || needsBufferUpdate) {\n                if (node.ownGlBufferInfo) {\n                    deleteBufferInfo(gl, node.ownGlBufferInfo);\n                }\n                node.ownGlBufferInfo = buildNodeBufferInfo(gl, node, shared);\n            }\n\n            if (!node.ownGlBufferInfo) {\n                allReady = false;\n                continue;\n            }\n\n            twgl.setBuffersAndAttributes(gl, sharedGlProgram, node.ownGlBufferInfo);\n\n            if (!node.ownGlTexture && !PORTAL_MIN_BUILD) {\n                console.log(`No texture found for node ${node.state?.name || 'unknown'}, using error texture.`);\n            }\n\n            twgl.setUniforms(sharedGlProgram, {\n                u_time: t,\n                u_viewMatrix: viewMatrix,\n                u_projectionMatrix: projectionMatrix,\n                u_anchorMatrix: anchorMatrix ?? twgl.m4.identity(),\n                ...ui.presentationOffsetUniformState(scopeNode, shared.scene, `TextureTile(${shared.resourceKey ?? 'unknown'})`),\n                u_texture: node.ownGlTexture || shared.ownGlErrorTexture // Graceful fallback\n            });\n\n            gl.drawArrays(gl.TRIANGLES, 0, node.ownGlBufferInfo.numElements);\n        }\n\n        if (needsBufferUpdate) {\n            clearNonPickerResourceDirty(shared);\n        }\n\n        status.response = allReady ? ui.RENDER_STATUS.READY : ui.RENDER_STATUS.LOADING;\n    }\n\n    static _drawTransparent(gl, shared, t, viewMatrix, projectionMatrix, status = null) {\n        return;\n    }\n\n    /* TextureTile currently renders through the opaque tile path; the transparent hook is a stubbed compatibility surface. */\n    static _batchPassForNode(_node) {\n        return 'opaque';\n    }\n\n    /* Shared TextureTile resources remain owned by the opaque pass. */\n    static _batchPassForShared(_shared) {\n        return 'opaque';\n    }\n}\n\n//Cannot use Tile yet as this is per node, not a static draw call\nexport function buildNodeBufferInfo(gl, node, shared) {\n\n    const positionData = node.getMesh?.() ?? null;\n    const baseuvsData = node.getUvs?.() ?? null;\n\n    if (!positionData || !baseuvsData) return null;\n\n    const scene = shared?.scene ?? null;\n    const localMatrix = textureTileLocalMatrix(node, scene);\n    if (!localMatrix) return null;\n\n    const vertexCount = positionData.length / 3;\n    if (!Number.isFinite(vertexCount) || vertexCount <= 0) return null;\n\n    const matrixData = new Float32Array(vertexCount * 16);\n    for (let i = 0; i < vertexCount; i++) {\n        matrixData.set(localMatrix, i * 16);\n    }\n\n    const width = Number(node.state?.width ?? node.width ?? 0);\n    const height = Number(node.state?.height ?? node.height ?? 0);\n    const depth = Number(node.state?.depth ?? 0);\n\n    const resolutionData = new Float32Array(vertexCount * 3);\n    for (let i = 0; i < vertexCount; i++) {\n        const offset = i * 3;\n        resolutionData[offset] = width;\n        resolutionData[offset + 1] = height;\n        resolutionData[offset + 2] = depth;\n    }\n\n    const colorSource = node.color ?? node.state?.color ?? [1, 1, 1, 1];\n    const colorData = new Float32Array(vertexCount * 4);\n    const alpha = (colorSource[3] ?? 1) * (node.computedOpacity ?? 1);\n    for (let i = 0; i < vertexCount; i++) {\n        const offset = i * 4;\n        colorData[offset] = colorSource[0] ?? 1;\n        colorData[offset + 1] = colorSource[1] ?? 1;\n        colorData[offset + 2] = colorSource[2] ?? 1;\n        colorData[offset + 3] = alpha;\n    }\n\n    // To be deprecated: legacy render_layer support\n    const layerID = Number(node.render_layer ?? 0);\n    const layerData = new Float32Array(vertexCount).fill(layerID);\n\n    return gpuDiagWithResourceOrigin('texture_tile.batch_buffer_info', () => twgl.createBufferInfoFromArrays(gl, {\n        position: { numComponents: 3, data: positionData },\n        matrix: { numComponents: 16, data: matrixData },\n        resolution: { numComponents: 3, data: resolutionData },\n        color: { numComponents: 4, data: colorData },\n        baseuvs: { numComponents: 2, data: baseuvsData },\n        layerID: { numComponents: 1, data: layerData }, //to deprecate\n    }));\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\nimport { normalizePadding, requestedContentRect, resolveAdaptivePadding } from './padding-layout.mjs';\nimport { layoutStackChildren, measureStackChildren } from './stack-layout.mjs';\n\nconst ORIENTATION_LABELS = Object.freeze(['horizontal', 'vertical']);\nconst ORIENTATION_INDEX = Object.freeze({\n    horizontal: 0,\n    horiz: 0,\n    h: 0,\n    row: 0,\n    rows: 0,\n    vertical: 1,\n    vert: 1,\n    v: 1,\n    column: 1,\n    columns: 1,\n    col: 1,\n});\n\nconst ALIGN_LABELS = Object.freeze(['start', 'center', 'end']);\nconst ALIGN_INDEX = Object.freeze({\n    start: 0,\n    begin: 0,\n    left: 0,\n    top: 0,\n    centre: 1,\n    center: 1,\n    middle: 1,\n    end: 2,\n    right: 2,\n    bottom: 2,\n});\n\nfunction normalizeStackOrientation(value, fallback) {\n    if (value == null) {\n        return fallback;\n    }\n    if (typeof value === 'number' && Number.isFinite(value)) {\n        const idx = Math.trunc(value);\n        return ORIENTATION_LABELS[idx] ? idx : fallback;\n    }\n    if (typeof value === 'string') {\n        const trimmed = value.trim().toLowerCase();\n        if (/^[01]$/.test(trimmed)) {\n            return Number.parseInt(trimmed, 10);\n        }\n        const key = trimmed.replace(/[\\s-]+/g, '_');\n        return ORIENTATION_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\nfunction normalizeStackAlignment(value, fallback) {\n    if (value == null) {\n        return fallback;\n    }\n    if (typeof value === 'number' && Number.isFinite(value)) {\n        const idx = Math.trunc(value);\n        return ALIGN_LABELS[idx] ? idx : fallback;\n    }\n    if (typeof value === 'string') {\n        const trimmed = value.trim().toLowerCase();\n        if (/^[012]$/.test(trimmed)) {\n            return Number.parseInt(trimmed, 10);\n        }\n        const key = trimmed.replace(/[\\s-]+/g, '_');\n        return ALIGN_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\nfunction normalizeStackSpacing(value, fallback) {\n    if (value == null) {\n        return fallback;\n    }\n    const num = Number(value);\n    if (!Number.isFinite(num)) {\n        return fallback;\n    }\n    return Math.max(0, num);\n}\n\nfunction coercePositiveNumber(value) {\n    const num = Number(value);\n    if (!Number.isFinite(num) || num <= 0) {\n        return 0;\n    }\n    return num;\n}\n\nfunction resolveDimension(source, key) {\n    if (!source) {\n        return 0;\n    }\n    const direct = coercePositiveNumber(source[key]);\n    if (direct > 0) {\n        return direct;\n    }\n    const state = source.state ?? null;\n    return coercePositiveNumber(state?.[key]);\n}\n\n/*\n * Automatic one-axis layout container. Child positions are refreshed asynchronously\n * after structural changes; use VBoxContainer/HBoxContainer when the orientation\n * is fixed. ScrollBox shares this positioning algorithm for hosted scroll content.\n */\nexport class Container extends ui.Placeholder {\n    // Stack child nodes along one axis with optional spacing and alignment controls.\n    #orientation = 0;\n    #spacing = 0;\n    #mainAlign = 0;\n    #crossAlign = 0;\n    #padding = normalizePadding(0);\n    #contentRect = Object.freeze({ x: 0, y: 0, width: 0, height: 0 });\n    #layoutPending = false;\n\n    constructor(state = {}) {\n        super(state);\n        this.#orientation = normalizeStackOrientation(\n            state?.orientation ?? state?.direction ?? state?.axis ?? this.#orientation,\n            this.#orientation,\n        );\n        this.#spacing = normalizeStackSpacing(state?.spacing, this.#spacing);\n        const align = state?.align ?? state?.alignment ?? state?.mainAlign ?? state?.mainAlignment;\n        const cross = state?.crossAlign ?? state?.crossAlignment ?? state?.secondaryAlign ?? state?.secondaryAlignment;\n        this.#mainAlign = normalizeStackAlignment(align, this.#mainAlign);\n        this.#crossAlign = normalizeStackAlignment(cross, this.#crossAlign);\n        this.#padding = normalizePadding(state?.padding ?? 0);\n        this.state.padding = this.#padding;\n    }\n\n    get orientation() {\n        return this.#orientation;\n    }\n\n    set orientation(value) {\n        const next = normalizeStackOrientation(value, this.#orientation);\n        if (next === this.#orientation) {\n            return;\n        }\n        this.#orientation = next;\n        this.#requestLayout();\n    }\n\n    get spacing() {\n        return this.#spacing;\n    }\n\n    set spacing(value) {\n        const next = normalizeStackSpacing(value, this.#spacing);\n        if (next === this.#spacing) {\n            return;\n        }\n        this.#spacing = next;\n        this.#requestLayout();\n    }\n\n    get mainAlign() {\n        return this.#mainAlign;\n    }\n\n    set mainAlign(value) {\n        const next = normalizeStackAlignment(value, this.#mainAlign);\n        if (next === this.#mainAlign) {\n            return;\n        }\n        this.#mainAlign = next;\n        this.#requestLayout();\n    }\n\n    get crossAlign() {\n        return this.#crossAlign;\n    }\n\n    get padding() {\n        return this.#padding;\n    }\n\n    set padding(value) {\n        this.#padding = normalizePadding(value);\n        this.state.padding = this.#padding;\n        this.#requestLayout();\n    }\n\n    get contentRect() {\n        return this.#contentRect;\n    }\n\n    get contentWidth() {\n        return this.#contentRect.width;\n    }\n\n    get contentHeight() {\n        return this.#contentRect.height;\n    }\n\n    get requestedContentRect() {\n        return requestedContentRect({\n            width: this.width,\n            height: this.height,\n            padding: this.#padding,\n        });\n    }\n\n    set crossAlign(value) {\n        const next = normalizeStackAlignment(value, this.#crossAlign);\n        if (next === this.#crossAlign) {\n            return;\n        }\n        this.#crossAlign = next;\n        this.#requestLayout();\n    }\n\n    get width() {\n        return this.state?.width;\n    }\n\n    set width(value) {\n        const next = Number.isFinite(value) ? value : undefined;\n        const prev = this.state?.width;\n        if (prev === next) {\n            return;\n        }\n        if (next === undefined) {\n            delete this.state.width;\n        } else {\n            this.state.width = next;\n        }\n        this.#requestLayout();\n    }\n\n    get height() {\n        return this.state?.height;\n    }\n\n    set height(value) {\n        const next = Number.isFinite(value) ? value : undefined;\n        const prev = this.state?.height;\n        if (prev === next) {\n            return;\n        }\n        if (next === undefined) {\n            delete this.state.height;\n        } else {\n            this.state.height = next;\n        }\n        this.#requestLayout();\n    }\n\n    invalidateLayout() {\n        this.#requestLayout();\n    }\n\n    mutate(newState) {\n        const patch = Object.hasOwn(newState, 'padding')\n            ? { ...newState, padding: normalizePadding(newState.padding) }\n            : newState;\n        super.mutate(patch);\n        if (Object.hasOwn(patch, 'padding')) {\n            this.#padding = patch.padding;\n        }\n        if (Object.hasOwn(patch, 'padding')\n                || Object.hasOwn(patch, 'width')\n                || Object.hasOwn(patch, 'height')) {\n            this.#requestLayout();\n        }\n    }\n\n    appendChild(child) {\n        const result = super.appendChild(child);\n        this.#requestLayout();\n        return result;\n    }\n\n    insertChildBefore(child, beforeChild = null) {\n        super.insertChildBefore(child, beforeChild);\n        this.#requestLayout();\n        return child;\n    }\n\n    replaceChild(oldChild, newChild) {\n        super.replaceChild(oldChild, newChild);\n        this.#requestLayout();\n        return newChild;\n    }\n\n    removeChild(child) {\n        super.removeChild(child);\n        this.#requestLayout();\n    }\n\n    removeAllChildren() {\n        super.removeAllChildren();\n        this.#requestLayout();\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#requestLayout();\n    }\n\n    #requestLayout() {\n        if (this.#layoutPending) {\n            return;\n        }\n        this.#layoutPending = true;\n        const flush = () => {\n            this.#layoutPending = false;\n            this.#layoutChildren();\n        };\n        if (typeof queueMicrotask === 'function') {\n            queueMicrotask(flush);\n            return;\n        }\n        Promise.resolve().then(flush);\n    }\n\n    #layoutChildren() {\n        const required = measureStackChildren({\n            children: this.children,\n            orientation: this.#orientation,\n            spacing: this.#spacing,\n        });\n        this.#contentRect = resolveAdaptivePadding({\n            width: this.width,\n            height: this.height,\n            requiredWidth: required.width,\n            requiredHeight: required.height,\n            padding: this.#padding,\n        });\n        layoutStackChildren({\n            children: this.children,\n            orientation: this.#orientation,\n            spacing: this.#spacing,\n            mainAlign: this.#mainAlign,\n            crossAlign: this.#crossAlign,\n            x: this.#contentRect.x,\n            y: this.#contentRect.y,\n            width: this.#contentRect.width,\n            height: this.#contentRect.height,\n        });\n    }\n\n}\n\nexport class HBoxContainer extends Container {\n    constructor(state = {}) {\n        super({\n            ...state,\n            orientation: 'horizontal',\n        });\n    }\n}\n\nexport class VBoxContainer extends Container {\n    constructor(state = {}) {\n        super({\n            ...state,\n            orientation: 'vertical',\n        });\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from '../evilui/evilui.mjs';\n\nconst ANCHOR_INDEX = Object.freeze({\n    top_left: 0,\n    topleft: 0,\n    top_right: 1,\n    topright: 1,\n    bottom_left: 2,\n    bottomleft: 2,\n    bot_left: 2,\n    botleft: 2,\n    bottom_right: 3,\n    bottomright: 3,\n    bot_right: 3,\n    botright: 3,\n    center: 4,\n    centre: 4,\n});\n\nconst ANCHOR_LABELS = Object.freeze([\n    'top_left',\n    'top_right',\n    'bottom_left',\n    'bottom_right',\n    'center',\n]);\n\nconst DIRECTION_INDEX = Object.freeze({\n    horizontal: 0,\n    horiz: 0,\n    x: 0,\n    row: 0,\n    rows: 0,\n    vertical: 1,\n    vert: 1,\n    y: 1,\n    column: 1,\n    columns: 1,\n    col: 1,\n});\n\nconst DEFAULT_ANCHOR = 1;\nconst DEFAULT_DIRECTION = 0;\n\nfunction normalizeAnchor(anchor, fallback = DEFAULT_ANCHOR) {\n    if (anchor == null) {\n        return fallback;\n    }\n    if (typeof anchor === 'number' && Number.isFinite(anchor)) {\n        const index = Math.trunc(anchor);\n        return ANCHOR_LABELS[index] ? index : fallback;\n    }\n    if (typeof anchor === 'string') {\n        const trimmed = anchor.trim().toLowerCase();\n        if (/^\\d+$/.test(trimmed)) {\n            const numericIndex = Number.parseInt(trimmed, 10);\n            return ANCHOR_LABELS[numericIndex] ? numericIndex : fallback;\n        }\n        const key = trimmed.replace(/[\\s-]+/g, '_');\n        return ANCHOR_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\nfunction normalizeDirection(direction, fallback = DEFAULT_DIRECTION) {\n    if (direction == null) {\n        return fallback;\n    }\n    if (typeof direction === 'number' && Number.isFinite(direction)) {\n        const index = Math.trunc(direction);\n        return index === 1 ? 1 : 0;\n    }\n    if (typeof direction === 'string') {\n        const trimmed = direction.trim().toLowerCase();\n        if (/^[01]$/.test(trimmed)) {\n            return Number.parseInt(trimmed, 10);\n        }\n        const key = trimmed.replace(/[\\s-]+/g, '_');\n        return DIRECTION_INDEX[key] ?? fallback;\n    }\n    return fallback;\n}\n\n/*\nInfoBar stacks chrome nodes along one axis and anchors the strip to a camera corner or the centre.\nIt keeps today\u2019s HUD elements simple while giving us a place to grow richer stage chrome later.\n*/\n\nexport class InfoBar extends ui.Placeholder {\n    #anchor = DEFAULT_ANCHOR;\n    #direction = DEFAULT_DIRECTION;\n  \n    constructor(state = {}) {\n        super(state);\n        this.#anchor = normalizeAnchor(state?.anchor, this.#anchor);\n        this.#direction = normalizeDirection(state?.direction, this.#direction);\n    }\n\n    get anchor() {\n        return this.#anchor;\n    }\n\n    set anchor(value) {\n        const next = normalizeAnchor(value, this.#anchor);\n        if (next === this.#anchor) {\n            return;\n        }\n        this.#anchor = next;\n        if (this.scene) {\n            this.#updateChildrenOffsets();\n        }\n    }\n\n    get direction() {\n        return this.#direction;\n    }\n\n    set direction(value) {\n        const next = normalizeDirection(value, this.#direction);\n        if (next === this.#direction) {\n            return;\n        }\n        this.#direction = next;\n        if (this.scene) {\n            this.#updateChildrenOffsets();\n        }\n    }\n\n    #updateChildrenOffsets() {\n        if (this.children.length === 0) {\n            return;\n        }\n\n        const anchorOffset = this.#getAnchorOffset();\n        if (!anchorOffset) {\n            return;\n        }\n\n        const [dirX, dirY] = this.#getDirectionVector();\n        const negativeAxis = dirX < 0 || dirY < 0;\n        let offset = 0;\n        for (const child of this.children) {\n            const [, , z = 0] = child.localPosition();\n            const extent = this.#measureChildExtent(child);\n            const placementOffset = negativeAxis ? offset + extent : offset;\n            child.setLocalPosition([\n                anchorOffset[0] + dirX * placementOffset,\n                anchorOffset[1] + dirY * placementOffset,\n                z,\n            ]);\n            offset += extent;\n        }\n    }\n\n    #measureChildExtent(child) {\n        const key = this.#direction === 1 ? 'height' : 'width';\n        const direct = this.#coerceDimension(child?.[key]);\n        if (direct > 0) {\n            return direct;\n        }\n        return this.#coerceDimension(child?.state?.[key]);\n    }\n\n    #coerceDimension(value) {\n        return Number.isFinite(value) && value > 0 ? value : 0;\n    }\n\n    #getDirectionVector() {\n        if (this.#direction === 1) {\n            return (this.#anchor === 2 || this.#anchor === 3) ? [0, -1] : [0, 1];\n        }\n        if (this.#anchor === 0 || this.#anchor === 2) {\n            return [1, 0];\n        }\n        if (this.#anchor === 1 || this.#anchor === 3) {\n            return [-1, 0];\n        }\n        return [1, 0];\n    }\n\n    #getAnchorOffset() {\n        const scene = this.scene;\n        if (!scene) {\n            return null;\n        }\n        const cam = scene.presentationCamera?.() ?? scene.camera ?? null;\n        if (!cam?.getViewportSize) {\n            return null;\n        }\n\n        const [vpWidth = 0, vpHeight = 0] = cam.getViewportSize();\n        switch (this.#anchor) {\n            case 0:\n                return [0, 0];\n            case 1:\n                return [vpWidth, 0];\n            case 2:\n                return [0, vpHeight];\n            case 3:\n                return [vpWidth, vpHeight];\n            case 4:\n                return [vpWidth * 0.5, vpHeight * 0.5];\n            default:\n                return [0, 0];\n        }\n    }\n\n    onViewportResized(_gl) {\n        this.#updateChildrenOffsets();\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#updateChildrenOffsets();\n    }\n\n   \n    appendChild(child) {\n        super.appendChild(child);\n        this.#updateChildrenOffsets();\n        return child;\n    }\n\n\n    removeChild(child) {\n        super.removeChild(child);\n        this.#updateChildrenOffsets();\n    }\n\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport './builtin-visualization-plugins.mjs';\nexport * from './base.mjs';\nexport * from './render-target.mjs';\nexport * from './stage.mjs';\nexport * from './scene.mjs';\nexport * from './scene-lighting.mjs';\nexport * from './backdrop.mjs';\nexport * from './tile.mjs';\nexport * from './tile-material.mjs';\nexport * from './tile-shape.mjs';\nexport * from './overlay.mjs';\nexport * from './caret.mjs';\nexport * from './caret-quad.mjs';\nexport * from './slab.mjs';\nexport * from './document.mjs';\nexport * from './documentview.mjs';\nexport * from './screen.mjs';\nexport * from './visualization-plugin.mjs';\nexport * from './primitive-shapes.mjs';\nexport * from './geometry-plot.mjs';\nexport * from './violin-plot.mjs';\nexport * from './tableview.mjs';\nexport * from './uniform-zebra-stripes.mjs';\nexport * from './button.mjs';\nexport * from './checkbox.mjs';\nexport * from './context-menu.mjs';\nexport * from './toolbar.mjs';\nexport * from './inner-shadow.mjs';\nexport * from './drop-shadow.mjs';\nexport * from './popup.mjs';\nexport * from './viewport.mjs';\nexport * from './ui-window.mjs';\nexport * from './ui-dialog.mjs';\nexport * from './search-puffbook.mjs';\nexport * from './dialog-panel.mjs';\nexport * from './window-manager.mjs';\nexport * from './input-cell.mjs';\nexport * from './close-button.mjs';\nexport * from './keyboard.mjs';\nexport * from './icon.mjs'\nexport * from './labelled-icon.mjs'\nexport * from './polygon.mjs'\nexport * from './scroll-box.mjs'\nexport * from './mesh-instance.mjs'\nexport * from './focus-manager.mjs';\nexport * from './dirty-flags.mjs';\nexport * from './loader-ui.mjs'\nexport * from './camera.mjs';\nexport * from './texture-tile.mjs'\nexport * from './container.mjs'\nexport * from './info-bar.mjs'\nimport * as quat from '../quat.mjs';\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Prefer the scene implied by the authoritative focus stack before stale pointer-history focus. */\nexport function resolveFocusScene({\n    activeScene = null,\n    interactiveScenes = [],\n    focusContainer = null,\n    focusedInputCell = null,\n} = {}) {\n    const stackScene = focusedInputCell?.scene ?? focusContainer?.scene ?? null;\n    if (stackScene && interactiveScenes.includes(stackScene)) {\n        return stackScene;\n    }\n    return activeScene ?? null;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport class Director {\n\n    constructor(scene){\n        Director.directorRoot = scene;\n    }\n\n    static directorRoot = null\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nconst HOST_ENV_MAP = {\n    \"portal.evilworks.com\": \"prod\",\n    \"portal.dev.evilwrks.com\": \"dev\",\n    \"portal.staging.evilwrks.com\": \"staging\",\n    \"hub.evilwrks.com\": \"hub\",\n};\nconst FDEV_HOST_RE = /^[a-z0-9-]+\\.fdev\\.evilwrks\\.com$/;\n\nconst LOCAL_HOSTS = new Set([\n    \"localhost\",\n    \"127.0.0.1\",\n]);\n\nexport function getPortalEnvironment() {\n    const baseEnv = defaultPortalEnvironment();\n    const override = getPortalEnvironmentOverride();\n    return override || baseEnv;\n}\n\nfunction defaultPortalEnvironment() {\n    // Host only picks the default shell. The real environment is whichever\n    // backend config we talk to, possibly via mixed mode below.\n    const host = window.location.hostname.toLowerCase();\n    const namedEnv = portalEnvForHost(host);\n    if (namedEnv === 'hub') {\n        return 'hub';\n    }\n\n    const portFamily = inferLocalPortFamily();\n\n    if (LOCAL_HOSTS.has(host)) {\n        if (portFamily === '7000' || portFamily === '7001') {\n            return 'e2e';\n        }\n        return \"local\";\n    }\n\n    return namedEnv || \"prod\";\n}\n\n// Resolve hostnames to a default portal environment, including fdev wildcard hosts.\nfunction portalEnvForHost(host) {\n    const namedEnv = HOST_ENV_MAP[host];\n    if (namedEnv) {\n        return namedEnv;\n    }\n    if (FDEV_HOST_RE.test(host)) {\n        return 'fdev';\n    }\n    return null;\n}\n\nexport function getPortalEnvironmentOverride() {\n    const env = new URLSearchParams(window.location.search).get('env');\n    if (!env) {\n        return null;\n    }\n    if (env.length >= 256 || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(env)) {\n        throw new Error(`Invalid portal environment override '${env}'.`);\n    }\n    // Mixed mode often points a local-like shell at dev or prod backends.\n    // Whether that is allowed is now decided by which config file exists.\n    return env;\n}\n\nexport function isLocalPortal() {\n    const env = getPortalEnvironment();\n    return env === 'local' || env === 'e2e' || env === 'hub';\n}\n\nexport function isDevelopmentPortal() {\n    const env = getPortalEnvironment();\n    return env === 'dev' || env === 'fdev';\n}\n\nexport function inferLocalPortFamily() {\n    const proxyMatch = window.location.pathname.match(/\\/proxy\\/(\\d+)(?:\\/|$)/);\n    if (proxyMatch) {\n        return proxyMatch[1];\n    }\n\n    if (window.location.port) {\n        return window.location.port;\n    }\n\n    return null;\n}\n", "export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n    return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n        let code = p.charCodeAt(0).toString(16).toUpperCase();\n        if (code.length < 2) {\n            code = \"0\" + code;\n        }\n        return \"%\" + code;\n    }));\n}\nfunction base64UrlDecode(str) {\n    let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    switch (output.length % 4) {\n        case 0:\n            break;\n        case 2:\n            output += \"==\";\n            break;\n        case 3:\n            output += \"=\";\n            break;\n        default:\n            throw new Error(\"base64 string is not of the correct length\");\n    }\n    try {\n        return b64DecodeUnicode(output);\n    }\n    catch (err) {\n        return atob(output);\n    }\n}\nexport function jwtDecode(token, options) {\n    if (typeof token !== \"string\") {\n        throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n    }\n    options || (options = {});\n    const pos = options.header === true ? 0 : 1;\n    const part = token.split(\".\")[pos];\n    if (typeof part !== \"string\") {\n        throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n    }\n    let decoded;\n    try {\n        decoded = base64UrlDecode(part);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n    }\n    try {\n        return JSON.parse(decoded);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\n/**\n * Native interface\n *\n * @public\n */\nexport interface ILogger {\n    debug(...args: unknown[]): void;\n    info(...args: unknown[]): void;\n    warn(...args: unknown[]): void;\n    error(...args: unknown[]): void;\n}\n\nconst nopLogger: ILogger = {\n    debug: () => undefined,\n    info: () => undefined,\n    warn: () => undefined,\n    error: () => undefined,\n};\n\nlet level: number;\nlet logger: ILogger;\n\n/**\n * Log levels\n *\n * @public\n */\nexport enum Log {\n    NONE,\n    ERROR,\n    WARN,\n    INFO,\n    DEBUG\n}\n\n/**\n * Log manager\n *\n * @public\n */\nexport namespace Log { // eslint-disable-line @typescript-eslint/no-namespace\n    export function reset(): void {\n        level = Log.INFO;\n        logger = nopLogger;\n    }\n\n    export function setLevel(value: Log): void {\n        if (!(Log.NONE <= value && value <= Log.DEBUG)) {\n            throw new Error(\"Invalid log level\");\n        }\n        level = value;\n    }\n\n    export function setLogger(value: ILogger): void {\n        logger = value;\n    }\n}\n\n/**\n * Internal logger instance\n *\n * @public\n */\nexport class Logger {\n    private _method?: string;\n    public constructor(private _name: string) {}\n\n    /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n    public debug(...args: unknown[]): void {\n        if (level >= Log.DEBUG) {\n            logger.debug(Logger._format(this._name, this._method), ...args);\n        }\n    }\n    public info(...args: unknown[]): void {\n        if (level >= Log.INFO) {\n            logger.info(Logger._format(this._name, this._method), ...args);\n        }\n    }\n    public warn(...args: unknown[]): void {\n        if (level >= Log.WARN) {\n            logger.warn(Logger._format(this._name, this._method), ...args);\n        }\n    }\n    public error(...args: unknown[]): void {\n        if (level >= Log.ERROR) {\n            logger.error(Logger._format(this._name, this._method), ...args);\n        }\n    }\n    /* eslint-enable @typescript-eslint/no-unsafe-enum-comparison */\n\n    public throw(err: Error): never {\n        this.error(err);\n        throw err;\n    }\n\n    public create(method: string): Logger {\n        const methodLogger: Logger = Object.create(this);\n        methodLogger._method = method;\n        methodLogger.debug(\"begin\");\n        return methodLogger;\n    }\n\n    public static createStatic(name: string, staticMethod: string): Logger {\n        const staticLogger = new Logger(`${name}.${staticMethod}`);\n        staticLogger.debug(\"begin\");\n        return staticLogger;\n    }\n\n    private static _format(name: string, method?: string) {\n        const prefix = `[${name}]`;\n        return method ? `${prefix} ${method}:` : prefix;\n    }\n\n    /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */\n    // helpers for static class methods\n    public static debug(name: string, ...args: unknown[]): void {\n        if (level >= Log.DEBUG) {\n            logger.debug(Logger._format(name), ...args);\n        }\n    }\n    public static info(name: string, ...args: unknown[]): void {\n        if (level >= Log.INFO) {\n            logger.info(Logger._format(name), ...args);\n        }\n    }\n    public static warn(name: string, ...args: unknown[]): void {\n        if (level >= Log.WARN) {\n            logger.warn(Logger._format(name), ...args);\n        }\n    }\n    public static error(name: string, ...args: unknown[]): void {\n        if (level >= Log.ERROR) {\n            logger.error(Logger._format(name), ...args);\n        }\n    }\n    /* eslint-enable @typescript-eslint/no-unsafe-enum-comparison */\n}\n\nLog.reset();\n", "import { jwtDecode } from \"jwt-decode\";\n\nimport { Logger } from \"./Logger\";\nimport type { JwtClaims } from \"../Claims\";\nimport { CryptoUtils } from \"./CryptoUtils\";\n\n/**\n * @internal\n */\nexport class JwtUtils {\n    // IMPORTANT: doesn't validate the token\n    public static decode(token: string): JwtClaims {\n        try {\n            return jwtDecode<JwtClaims>(token);\n        }\n        catch (err) {\n            Logger.error(\"JwtUtils.decode\", err);\n            throw err;\n        }\n    }\n\n    public static async generateSignedJwt(header: object, payload: object, privateKey: CryptoKey) : Promise<string> {\n        const encodedHeader = CryptoUtils.encodeBase64Url(new TextEncoder().encode(JSON.stringify(header)));\n        const encodedPayload = CryptoUtils.encodeBase64Url(new TextEncoder().encode(JSON.stringify(payload)));\n        const encodedToken = `${encodedHeader}.${encodedPayload}`;\n\n        const signature = await window.crypto.subtle.sign(\n            {\n                name: \"ECDSA\",\n                hash: { name: \"SHA-256\" },\n            },\n            privateKey,\n            new TextEncoder().encode(encodedToken),\n        );\n\n        const encodedSignature = CryptoUtils.encodeBase64Url(new Uint8Array(signature));\n        return `${encodedToken}.${encodedSignature}`;\n    }\n\n    public static async generateSignedJwtWithHmac(header: object, payload: object, secretKey: CryptoKey): Promise<string> {\n        const encodedHeader = CryptoUtils.encodeBase64Url(new TextEncoder().encode(JSON.stringify(header)));\n        const encodedPayload = CryptoUtils.encodeBase64Url(new TextEncoder().encode(JSON.stringify(payload)));\n        const encodedToken = `${encodedHeader}.${encodedPayload}`;\n\n        const signature = await window.crypto.subtle.sign(\n            \"HMAC\",\n            secretKey,\n            new TextEncoder().encode(encodedToken),\n        );\n\n        const encodedSignature = CryptoUtils.encodeBase64Url(new Uint8Array(signature));\n        return `${encodedToken}.${encodedSignature}`;\n    }\n}\n", "import { Logger } from \"./Logger\";\nimport { JwtUtils } from \"./JwtUtils\";\n\nexport interface GenerateDPoPProofOpts {\n    url: string;\n    accessToken?: string;\n    httpMethod?: string;\n    keyPair: CryptoKeyPair;\n    nonce?: string;\n}\n\nconst UUID_V4_TEMPLATE = \"10000000-1000-4000-8000-100000000000\";\n\nconst toBase64 = (val: ArrayBuffer | Uint8Array): string =>\n    btoa([...new Uint8Array(val)]\n        .map((chr) => String.fromCharCode(chr))\n        .join(\"\"));\n\n/**\n * @internal\n */\nexport class CryptoUtils {\n    private static _randomWord(): number {\n        const arr = new Uint32Array(1);\n        crypto.getRandomValues(arr);\n        return arr[0];\n    }\n\n    /**\n     * Generates RFC4122 version 4 guid\n     */\n    public static generateUUIDv4(): string {\n        const uuid = UUID_V4_TEMPLATE.replace(/[018]/g, c =>\n            (+c ^ CryptoUtils._randomWord() & 15 >> +c / 4).toString(16),\n        );\n        return uuid.replace(/-/g, \"\");\n    }\n\n    /**\n     * PKCE: Generate a code verifier\n     */\n    public static generateCodeVerifier(): string {\n        return CryptoUtils.generateUUIDv4() + CryptoUtils.generateUUIDv4() + CryptoUtils.generateUUIDv4();\n    }\n\n    /**\n     * PKCE: Generate a code challenge\n     */\n    public static async generateCodeChallenge(code_verifier: string): Promise<string> {\n        if (!crypto.subtle) {\n            throw new Error(\"Crypto.subtle is available only in secure contexts (HTTPS).\");\n        }\n\n        try {\n            const encoder = new TextEncoder();\n            const data = encoder.encode(code_verifier);\n            const hashed = await crypto.subtle.digest(\"SHA-256\", data);\n            return toBase64(hashed).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n        }\n        catch (err) {\n            Logger.error(\"CryptoUtils.generateCodeChallenge\", err);\n            throw err;\n        }\n    }\n\n    /**\n     * Generates a base64-encoded string for a basic auth header\n     */\n    public static generateBasicAuth(client_id: string, client_secret: string): string {\n        const encoder = new TextEncoder();\n        const data = encoder.encode([client_id, client_secret].join(\":\"));\n        return toBase64(data);\n    }\n\n    /**\n     * Generates a hash of a string using a given algorithm\n     * @param alg\n     * @param message\n     */\n    public static async hash(alg: string, message: string) : Promise<Uint8Array> {\n        const msgUint8 = new TextEncoder().encode(message);\n        const hashBuffer = await crypto.subtle.digest(alg, msgUint8);\n        return new Uint8Array(hashBuffer);\n    }\n\n    /**\n     * Generates a base64url encoded string\n     */\n    public static encodeBase64Url = (input: Uint8Array) => {\n        return toBase64(input).replace(/=/g, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n    };\n\n    /**\n     * Generates a rfc7638 compliant jwk thumbprint\n     * @param jwk\n     */\n    public static async customCalculateJwkThumbprint(jwk: JsonWebKey): Promise<string> {\n        let jsonObject: object;\n        switch (jwk.kty) {\n            case \"RSA\":\n                jsonObject = {\n                    \"e\": jwk.e,\n                    \"kty\": jwk.kty,\n                    \"n\": jwk.n,\n                };\n                break;\n            case \"EC\":\n                jsonObject = {\n                    \"crv\": jwk.crv,\n                    \"kty\": jwk.kty,\n                    \"x\": jwk.x,\n                    \"y\": jwk.y,\n                };\n                break;\n            case \"OKP\":\n                jsonObject = {\n                    \"crv\": jwk.crv,\n                    \"kty\": jwk.kty,\n                    \"x\": jwk.x,\n                };\n                break;\n            case \"oct\":\n                jsonObject = {\n                    \"crv\": jwk.k,\n                    \"kty\": jwk.kty,\n                };\n                break;\n            default:\n                throw new Error(\"Unknown jwk type\");\n        }\n        const utf8encodedAndHashed = await CryptoUtils.hash(\"SHA-256\", JSON.stringify(jsonObject));\n        return CryptoUtils.encodeBase64Url(utf8encodedAndHashed);\n    }\n\n    public static async generateDPoPProof({\n        url,\n        accessToken,\n        httpMethod,\n        keyPair,\n        nonce,\n    }: GenerateDPoPProofOpts): Promise<string> {\n        let hashedToken: Uint8Array;\n        let encodedHash: string;\n\n        const payload: Record<string, string | number> = {\n            \"jti\": window.crypto.randomUUID(),\n            \"htm\": httpMethod ?? \"GET\",\n            \"htu\": url,\n            \"iat\": Math.floor(Date.now() / 1000),\n        };\n\n        if (accessToken) {\n            hashedToken = await CryptoUtils.hash(\"SHA-256\", accessToken);\n            encodedHash = CryptoUtils.encodeBase64Url(hashedToken);\n            payload.ath = encodedHash;\n        }\n\n        if (nonce) {\n            payload.nonce = nonce;\n        }\n\n        try {\n            const publicJwk = await crypto.subtle.exportKey(\"jwk\", keyPair.publicKey);\n            const header = {\n                \"alg\": \"ES256\",\n                \"typ\": \"dpop+jwt\",\n                \"jwk\": {\n                    \"crv\": publicJwk.crv,\n                    \"kty\": publicJwk.kty,\n                    \"x\": publicJwk.x,\n                    \"y\": publicJwk.y,\n                },\n            };\n            return await JwtUtils.generateSignedJwt(header, payload, keyPair.privateKey);\n        } catch (err) {\n            if (err instanceof TypeError) {\n                throw new Error(`Error exporting dpop public key: ${err.message}`);\n            } else {\n                throw err;\n            }\n        }\n    }\n\n    public static async generateDPoPJkt(keyPair: CryptoKeyPair) : Promise<string> {\n        try {\n            const publicJwk = await crypto.subtle.exportKey(\"jwk\", keyPair.publicKey);\n            return await CryptoUtils.customCalculateJwkThumbprint(publicJwk);\n        } catch (err) {\n            if (err instanceof TypeError) {\n                throw new Error(`Could not retrieve dpop keys from storage: ${err.message}`);\n            } else {\n                throw err;\n            }\n        }\n    }\n\n    public static async generateDPoPKeys() : Promise<CryptoKeyPair> {\n        return await window.crypto.subtle.generateKey(\n            {\n                name: \"ECDSA\",\n                namedCurve: \"P-256\",\n            },\n            false,\n            [\"sign\", \"verify\"],\n        );\n    }\n\n    /**\n     * Generates a client assertion JWT for client_secret_jwt authentication\n     * @param client_id The client identifier\n     * @param client_secret The client secret\n     * @param audience The token endpoint URL (audience)\n     * @param algorithm The HMAC algorithm to use (HS256, HS384, HS512). Defaults to HS256\n     */\n    public static async generateClientAssertionJwt(client_id: string, client_secret: string, audience: string, algorithm: string = \"HS256\"): Promise<string> {\n        const now = Math.floor(Date.now() / 1000);\n\n        const header = {\n            \"alg\": algorithm,\n            \"typ\": \"JWT\",\n        };\n\n        const payload = {\n            \"iss\": client_id,\n            \"sub\": client_id,\n            \"aud\": audience,\n            \"jti\": CryptoUtils.generateUUIDv4(),\n            \"exp\": now + 300, // 5 minutes\n            \"iat\": now,\n        };\n\n        const hashMap: Record<string, string> = {\n            \"HS256\": \"SHA-256\",\n            \"HS384\": \"SHA-384\",\n            \"HS512\": \"SHA-512\",\n        };\n\n        const hashFunction = hashMap[algorithm];\n        if (!hashFunction) {\n            throw new Error(`Unsupported algorithm: ${algorithm}. Supported algorithms are: HS256, HS384, HS512`);\n        }\n\n        const encoder = new TextEncoder();\n        const secretKey = await crypto.subtle.importKey(\n            \"raw\",\n            encoder.encode(client_secret),\n            { name: \"HMAC\", hash: hashFunction },\n            false,\n            [\"sign\"],\n        );\n\n        return await JwtUtils.generateSignedJwtWithHmac(header, payload, secretKey);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./Logger\";\n\n/**\n * @internal\n */\nexport type Callback<EventType extends unknown[]> = (...ev: EventType) => (Promise<void> | void);\n\n/**\n * @internal\n */\nexport class Event<EventType extends unknown[]> {\n    protected readonly _logger: Logger;\n\n    private readonly _callbacks: Array<Callback<EventType>> = [];\n\n    public constructor(protected readonly _name: string) {\n        this._logger = new Logger(`Event('${this._name}')`);\n    }\n\n    public addHandler(cb: Callback<EventType>): () => void {\n        this._callbacks.push(cb);\n        return () => this.removeHandler(cb);\n    }\n\n    public removeHandler(cb: Callback<EventType>): void {\n        const idx = this._callbacks.lastIndexOf(cb);\n        if (idx >= 0) {\n            this._callbacks.splice(idx, 1);\n        }\n    }\n\n    public async raise(...ev: EventType): Promise<void> {\n        this._logger.debug(\"raise:\", ...ev);\n        for (const cb of this._callbacks) {\n            await cb(...ev);\n        }\n    }\n}\n", "/**\n *\n * @public\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/open#window_features\n */\nexport interface PopupWindowFeatures {\n    left?: number;\n    top?: number;\n    width?: number;\n    height?: number;\n    menubar?: boolean | string;\n    toolbar?: boolean | string;\n    location?: boolean | string;\n    status?: boolean | string;\n    resizable?: boolean | string;\n    scrollbars?: boolean | string;\n    /** Close popup window after time in seconds, by default it is -1. To enable this feature, set value greater than 0. */\n    closePopupWindowAfterInSeconds?: number;\n\n    [k: string]: boolean | string | number | undefined;\n}\n\nexport class PopupUtils {\n    /**\n     * Populates a map of window features with a placement centered in front of\n     * the current window. If no explicit width is given, a default value is\n     * binned into [800, 720, 600, 480, 360] based on the current window's width.\n     */\n    static center({ ...features }: PopupWindowFeatures): PopupWindowFeatures {\n        if (features.width == null)\n            features.width = [800, 720, 600, 480].find(width => width <= window.outerWidth / 1.618) ?? 360;\n        features.left ??= Math.max(0, Math.round(window.screenX + (window.outerWidth - features.width) / 2));\n        if (features.height != null)\n            features.top ??= Math.max(0, Math.round(window.screenY + (window.outerHeight - features.height) / 2));\n        return features;\n    }\n\n    static serialize(features: PopupWindowFeatures): string {\n        return Object.entries(features)\n            .filter(([, value]) => value != null)\n            .map(([key, value]) => `${key}=${typeof value !== \"boolean\" ? value as string : value ? \"yes\" : \"no\"}`)\n            .join(\",\");\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Event } from \"./Event\";\nimport { Logger } from \"./Logger\";\n\n/**\n * @internal\n */\nexport class Timer extends Event<[void]> {\n    protected readonly _logger = new Logger(`Timer('${this._name}')`);\n    private _timerHandle: ReturnType<typeof setInterval> | null = null;\n    private _expiration = 0;\n\n    // get the time\n    public static getEpochTime(): number {\n        return Math.floor(Date.now() / 1000);\n    }\n\n    public init(durationInSeconds: number): void {\n        const logger = this._logger.create(\"init\");\n        durationInSeconds = Math.max(Math.floor(durationInSeconds), 1);\n        const expiration = Timer.getEpochTime() + durationInSeconds;\n        if (this.expiration === expiration && this._timerHandle) {\n            // no need to reinitialize to same expiration, so bail out\n            logger.debug(\"skipping since already initialized for expiration at\", this.expiration);\n            return;\n        }\n\n        this.cancel();\n\n        logger.debug(\"using duration\", durationInSeconds);\n        this._expiration = expiration;\n\n        // we're using a fairly short timer and then checking the expiration in the\n        // callback to handle scenarios where the browser device sleeps, and then\n        // the timers end up getting delayed.\n        const timerDurationInSeconds = Math.min(durationInSeconds, 5);\n        this._timerHandle = setInterval(this._callback, timerDurationInSeconds * 1000);\n    }\n\n    public get expiration(): number {\n        return this._expiration;\n    }\n\n    public cancel(): void {\n        this._logger.create(\"cancel\");\n        if (this._timerHandle) {\n            clearInterval(this._timerHandle);\n            this._timerHandle = null;\n        }\n    }\n\n    protected _callback = (): void => {\n        const diff = this._expiration - Timer.getEpochTime();\n        this._logger.debug(\"timer completes in\", diff);\n\n        if (this._expiration <= Timer.getEpochTime()) {\n            this.cancel();\n            void super.raise();\n        }\n    };\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\n/**\n * @internal\n */\nexport class UrlUtils {\n    public static readParams(url: string, responseMode: \"query\" | \"fragment\" = \"query\"): URLSearchParams {\n        if (!url) throw new TypeError(\"Invalid URL\");\n        // the base URL is irrelevant, it's just here to support relative url arguments\n        const parsedUrl = new URL(url, \"http://127.0.0.1\");\n        const params = parsedUrl[responseMode === \"fragment\" ? \"hash\" : \"search\"];\n        return new URLSearchParams(params.slice(1));\n    }\n}\n\n/**\n * @internal\n */\nexport const URL_STATE_DELIMITER = \";\";", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"../utils\";\n\n/**\n * Error class thrown in case of an authentication error.\n *\n * @public\n * @see https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n */\nexport class ErrorResponse extends Error {\n    /** Marker to detect class: \"ErrorResponse\" */\n    public readonly name: string = \"ErrorResponse\";\n\n    /** An error code string that can be used to classify the types of errors that occur and to respond to errors. */\n    public readonly error: string | null;\n    /** additional information that can help a developer identify the cause of the error.*/\n    public readonly error_description: string | null;\n    /**\n     * URI identifying a human-readable web page with information about the error, used to provide the client\n       developer with additional information about the error.\n    */\n    public readonly error_uri: string | null;\n\n    /** custom state data set during the initial signin request */\n    public state?: unknown;\n\n    public readonly session_state: string | null;\n\n    public url_state?: string;\n\n    public constructor(\n        args: {\n            error?: string | null; error_description?: string | null; error_uri?: string | null;\n            userState?: unknown; session_state?: string | null; url_state?: string;\n        },\n        /** The x-www-form-urlencoded request body sent to the authority server */\n        public readonly form?: URLSearchParams,\n    ) {\n        super(args.error_description || args.error || \"\");\n\n        if (!args.error) {\n            Logger.error(\"ErrorResponse\", \"No error passed\");\n            throw new Error(\"No error passed\");\n        }\n\n        this.error = args.error;\n        this.error_description = args.error_description ?? null;\n        this.error_uri = args.error_uri ?? null;\n\n        this.state = args.userState;\n        this.session_state = args.session_state ?? null;\n        this.url_state = args.url_state;\n    }\n}\n", "// Copyright (C) 2021 AuthTS Contributors\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\n/**\n * Error class thrown in case of network timeouts (e.g IFrame time out).\n *\n * @public\n */\nexport class ErrorTimeout extends Error {\n    /** Marker to detect class: \"ErrorTimeout\" */\n    public readonly name: string = \"ErrorTimeout\";\n\n    public constructor(message?: string) {\n        super(message);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, Timer } from \"./utils\";\nimport type { User } from \"./User\";\n\n/**\n * @public\n */\nexport type AccessTokenCallback = (...ev: unknown[]) => (Promise<void> | void);\n\n/**\n * @public\n */\nexport class AccessTokenEvents {\n    protected readonly _logger = new Logger(\"AccessTokenEvents\");\n\n    private readonly _expiringTimer = new Timer(\"Access token expiring\");\n    private readonly _expiredTimer = new Timer(\"Access token expired\");\n    private readonly _expiringNotificationTimeInSeconds: number;\n\n    public constructor(args: { expiringNotificationTimeInSeconds: number }) {\n        this._expiringNotificationTimeInSeconds = args.expiringNotificationTimeInSeconds;\n    }\n\n    public async load(container: User): Promise<void> {\n        const logger = this._logger.create(\"load\");\n        // only register events if there's an access token and it has an expiration\n        if (container.access_token && container.expires_in !== undefined) {\n            const duration = container.expires_in;\n            logger.debug(\"access token present, remaining duration:\", duration);\n\n            if (duration > 0) {\n                // only register expiring if we still have time\n                let expiring = duration - this._expiringNotificationTimeInSeconds;\n                if (expiring <= 0) {\n                    expiring = 1;\n                }\n\n                logger.debug(\"registering expiring timer, raising in\", expiring, \"seconds\");\n                this._expiringTimer.init(expiring);\n            }\n            else {\n                logger.debug(\"canceling existing expiring timer because we're past expiration.\");\n                this._expiringTimer.cancel();\n            }\n\n            // if it's negative, it will still fire\n            const expired = duration + 1;\n            logger.debug(\"registering expired timer, raising in\", expired, \"seconds\");\n            this._expiredTimer.init(expired);\n        }\n        else {\n            this._expiringTimer.cancel();\n            this._expiredTimer.cancel();\n        }\n    }\n\n    public async unload(): Promise<void> {\n        this._logger.debug(\"unload: canceling existing access token timers\");\n        this._expiringTimer.cancel();\n        this._expiredTimer.cancel();\n    }\n\n    /**\n     * Add callback: Raised prior to the access token expiring.\n     */\n    public addAccessTokenExpiring(cb: AccessTokenCallback): () => void {\n        return this._expiringTimer.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised prior to the access token expiring.\n     */\n    public removeAccessTokenExpiring(cb: AccessTokenCallback): void {\n        this._expiringTimer.removeHandler(cb);\n    }\n\n    /**\n     * Add callback: Raised after the access token has expired.\n     */\n    public addAccessTokenExpired(cb: AccessTokenCallback): () => void {\n        return this._expiredTimer.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised after the access token has expired.\n     */\n    public removeAccessTokenExpired(cb: AccessTokenCallback): void {\n        this._expiredTimer.removeHandler(cb);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./utils\";\n\n/**\n * @internal\n */\nexport class CheckSessionIFrame {\n    private readonly _logger = new Logger(\"CheckSessionIFrame\");\n    private _frame_origin: string;\n    private _frame: HTMLIFrameElement;\n    private _timer: ReturnType<typeof setInterval> | null = null;\n    private _session_state: string | null = null;\n\n    public constructor(\n        private _callback: () => Promise<void>,\n        private _client_id: string,\n        url: string,\n        private _intervalInSeconds: number,\n        private _stopOnError: boolean,\n    ) {\n        const parsedUrl = new URL(url);\n        this._frame_origin = parsedUrl.origin;\n\n        this._frame = window.document.createElement(\"iframe\");\n\n        // shotgun approach\n        this._frame.style.visibility = \"hidden\";\n        this._frame.style.position = \"fixed\";\n        this._frame.style.left = \"-1000px\";\n        this._frame.style.top = \"0\";\n        this._frame.width = \"0\";\n        this._frame.height = \"0\";\n        this._frame.src = parsedUrl.href;\n    }\n\n    public load(): Promise<void> {\n        return new Promise<void>((resolve) => {\n            this._frame.onload = () => {\n                resolve();\n            };\n\n            window.document.body.appendChild(this._frame);\n            window.addEventListener(\"message\", this._message, false);\n        });\n    }\n\n    private _message = (e: MessageEvent<string>): void => {\n        if (e.origin === this._frame_origin &&\n            e.source === this._frame.contentWindow\n        ) {\n            if (e.data === \"error\") {\n                this._logger.error(\"error message from check session op iframe\");\n                if (this._stopOnError) {\n                    this.stop();\n                }\n            }\n            else if (e.data === \"changed\") {\n                this._logger.debug(\"changed message from check session op iframe\");\n                this.stop();\n                void this._callback();\n            }\n            else {\n                this._logger.debug(e.data + \" message from check session op iframe\");\n            }\n        }\n    };\n\n    public start(session_state: string): void {\n        if (this._session_state === session_state) {\n            return;\n        }\n\n        this._logger.create(\"start\");\n\n        this.stop();\n\n        this._session_state = session_state;\n\n        const send = () => {\n            if (!this._frame.contentWindow || !this._session_state) {\n                return;\n            }\n\n            this._frame.contentWindow.postMessage(this._client_id + \" \" + this._session_state, this._frame_origin);\n        };\n\n        // trigger now\n        send();\n\n        // and setup timer\n        this._timer = setInterval(send, this._intervalInSeconds * 1000);\n    }\n\n    public stop(): void {\n        this._logger.create(\"stop\");\n        this._session_state = null;\n\n        if (this._timer) {\n\n            clearInterval(this._timer);\n            this._timer = null;\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./utils\";\n\n/**\n * @public\n */\nexport class InMemoryWebStorage implements Storage {\n    private readonly _logger = new Logger(\"InMemoryWebStorage\");\n    private _data: Record<string, string> = {};\n\n    public clear(): void {\n        this._logger.create(\"clear\");\n        this._data = {};\n    }\n\n    public getItem(key: string): string {\n        this._logger.create(`getItem('${key}')`);\n        return this._data[key];\n    }\n\n    public setItem(key: string, value: string): void {\n        this._logger.create(`setItem('${key}')`);\n        this._data[key] = value;\n    }\n\n    public removeItem(key: string): void {\n        this._logger.create(`removeItem('${key}')`);\n        delete this._data[key];\n    }\n\n    public get length(): number {\n        return Object.getOwnPropertyNames(this._data).length;\n    }\n\n    public key(index: number): string {\n        return Object.getOwnPropertyNames(this._data)[index];\n    }\n}\n", "export class ErrorDPoPNonce extends Error {\n    /** Marker to detect class: \"ErrorDPoPNonce\" */\n    public readonly name: string = \"ErrorDPoPNonce\";\n    public readonly nonce: string;\n\n    public constructor(nonce: string, message?: string) {\n        super(message);\n        this.nonce = nonce;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { ErrorResponse, ErrorTimeout } from \"./errors\";\nimport type { ExtraHeader } from \"./OidcClientSettings\";\nimport { Logger } from \"./utils\";\nimport { ErrorDPoPNonce } from \"./errors/ErrorDPoPNonce\";\n\n/**\n * @internal\n */\nexport type JwtHandler = (text: string) => Promise<Record<string, unknown>>;\n\n/**\n * @internal\n */\nexport interface GetJsonOpts {\n    token?: string;\n    credentials?: RequestCredentials;\n    timeoutInSeconds?: number;\n}\n\n/**\n * @internal\n */\nexport interface PostFormOpts {\n    body: URLSearchParams;\n    basicAuth?: string;\n    timeoutInSeconds?: number;\n    initCredentials?: \"same-origin\" | \"include\" | \"omit\";\n    extraHeaders?: Record<string, ExtraHeader>;\n}\n\n/**\n * @internal\n */\nexport class JsonService {\n    private readonly _logger = new Logger(\"JsonService\");\n\n    private _contentTypes: string[] = [];\n\n    public constructor(\n        additionalContentTypes: string[] = [],\n        private _jwtHandler: JwtHandler | null = null,\n        private _extraHeaders: Record<string, ExtraHeader> = {},\n    ) {\n        this._contentTypes.push(...additionalContentTypes, \"application/json\");\n        if (_jwtHandler) {\n            this._contentTypes.push(\"application/jwt\");\n        }\n    }\n\n    protected async fetchWithTimeout(input: RequestInfo, init: RequestInit & { timeoutInSeconds?: number } = {}) {\n        const { timeoutInSeconds, ...initFetch } = init;\n        if (!timeoutInSeconds) {\n            return await fetch(input, initFetch);\n        }\n\n        const controller = new AbortController();\n        const timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);\n\n        try {\n            const response = await fetch(input, {\n                ...init,\n                signal: controller.signal,\n            });\n            return response;\n        }\n        catch (err) {\n            if (err instanceof DOMException && err.name === \"AbortError\") {\n                throw new ErrorTimeout(\"Network timed out\");\n            }\n            throw err;\n        }\n        finally {\n            clearTimeout(timeoutId);\n        }\n    }\n\n    public async getJson(url: string, {\n        token,\n        credentials,\n        timeoutInSeconds,\n    }: GetJsonOpts = {}): Promise<Record<string, unknown>> {\n        const logger = this._logger.create(\"getJson\");\n        const headers: HeadersInit = {\n            \"Accept\": this._contentTypes.join(\", \"),\n        };\n        if (token) {\n            logger.debug(\"token passed, setting Authorization header\");\n            headers[\"Authorization\"] = \"Bearer \" + token;\n        }\n\n        this._appendExtraHeaders(headers);\n\n        let response: Response;\n        try {\n            logger.debug(\"url:\", url);\n            response = await this.fetchWithTimeout(url, { method: \"GET\", headers, timeoutInSeconds, credentials });\n        }\n        catch (err) {\n            logger.error(\"Network Error\");\n            throw err;\n        }\n\n        logger.debug(\"HTTP response received, status\", response.status);\n        const contentType = response.headers.get(\"Content-Type\");\n        if (contentType && !this._contentTypes.find(item => contentType.startsWith(item))) {\n            logger.throw(new Error(`Invalid response Content-Type: ${(contentType ?? \"undefined\")}, from URL: ${url}`));\n        }\n        if (response.ok && this._jwtHandler && contentType?.startsWith(\"application/jwt\")) {\n            return await this._jwtHandler(await response.text());\n        }\n        let json: Record<string, unknown>;\n        try {\n            json = await response.json();\n        }\n        catch (err) {\n            logger.error(\"Error parsing JSON response\", err);\n            if (response.ok) throw err;\n            throw new Error(`${response.statusText} (${response.status})`);\n        }\n        if (!response.ok) {\n            logger.error(\"Error from server:\", json);\n            if (json.error) {\n                throw new ErrorResponse(json);\n            }\n            throw new Error(`${response.statusText} (${response.status}): ${JSON.stringify(json)}`);\n        }\n        return json;\n    }\n\n    public async postForm(url: string, {\n        body,\n        basicAuth,\n        timeoutInSeconds,\n        initCredentials,\n        extraHeaders,\n    }: PostFormOpts): Promise<Record<string, unknown>> {\n        const logger = this._logger.create(\"postForm\");\n        const headers: HeadersInit = {\n            \"Accept\": this._contentTypes.join(\", \"),\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n            ...extraHeaders,\n        };\n        if (basicAuth !== undefined) {\n            headers[\"Authorization\"] = \"Basic \" + basicAuth;\n        }\n\n        this._appendExtraHeaders(headers);\n\n        let response: Response;\n        try {\n            logger.debug(\"url:\", url);\n            response = await this.fetchWithTimeout(url, { method: \"POST\", headers, body, timeoutInSeconds, credentials: initCredentials });\n        }\n        catch (err) {\n            logger.error(\"Network error\");\n            throw err;\n        }\n\n        logger.debug(\"HTTP response received, status\", response.status);\n        const contentType = response.headers.get(\"Content-Type\");\n        if (contentType && !this._contentTypes.find(item => contentType.startsWith(item))) {\n            throw new Error(`Invalid response Content-Type: ${(contentType ?? \"undefined\")}, from URL: ${url}`);\n        }\n\n        const responseText = await response.text();\n\n        let json: Record<string, unknown> = {};\n        if (responseText) {\n            try {\n                json = JSON.parse(responseText);\n            }\n            catch (err) {\n                logger.error(\"Error parsing JSON response\", err);\n                if (response.ok) throw err;\n                throw new Error(`${response.statusText} (${response.status})`);\n            }\n        }\n\n        if (!response.ok) {\n            logger.error(\"Error from server:\", json);\n            if (response.headers.has(\"dpop-nonce\")) {\n                const nonce = response.headers.get(\"dpop-nonce\") as string;\n                throw new ErrorDPoPNonce(nonce, `${JSON.stringify(json)}`);\n            }\n            if (json.error) {\n                throw new ErrorResponse(json, body);\n            }\n            throw new Error(`${response.statusText} (${response.status}): ${JSON.stringify(json)}`);\n        }\n\n        return json;\n    }\n\n    private _appendExtraHeaders(\n        headers: Record<string, string>,\n    ): void {\n        const logger = this._logger.create(\"appendExtraHeaders\");\n        const customKeys = Object.keys(this._extraHeaders);\n        const protectedHeaders = [\n            \"accept\",\n            \"content-type\",\n        ];\n        const preventOverride = [\n            \"authorization\",\n        ];\n        if (customKeys.length === 0) {\n            return;\n        }\n        customKeys.forEach((headerName) => {\n            if (protectedHeaders.includes(headerName.toLocaleLowerCase())) {\n                logger.warn(\"Protected header could not be set\", headerName, protectedHeaders);\n                return;\n            }\n            if (preventOverride.includes(headerName.toLocaleLowerCase()) &&\n                Object.keys(headers).includes(headerName)) {\n                logger.warn(\"Header could not be overridden\", headerName, preventOverride);\n                return;\n            }\n            const content = (typeof this._extraHeaders[headerName] === \"function\") ?\n                (this._extraHeaders[headerName] as ()=>string)() :\n                this._extraHeaders[headerName];\n            if (content && content !== \"\") {\n                headers[headerName] = content;\n            }\n        });\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./utils\";\nimport { JsonService } from \"./JsonService\";\nimport type { OidcClientSettingsStore, SigningKey } from \"./OidcClientSettings\";\nimport type { OidcMetadata } from \"./OidcMetadata\";\n\n/**\n * @public\n * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata\n */\nexport class MetadataService {\n    private readonly _logger = new Logger(\"MetadataService\");\n    private readonly _jsonService;\n\n    // cache\n    private _metadataUrl: string;\n    private _signingKeys: SigningKey[] | null = null;\n    private _metadata: Partial<OidcMetadata> | null = null;\n    private _fetchRequestCredentials: RequestCredentials | undefined;\n\n    public constructor(private readonly _settings: OidcClientSettingsStore) {\n        this._metadataUrl = this._settings.metadataUrl;\n        this._jsonService = new JsonService(\n            [\"application/jwk-set+json\"],\n            null,\n            this._settings.extraHeaders,\n        );\n        if (this._settings.signingKeys) {\n            this._logger.debug(\"using signingKeys from settings\");\n            this._signingKeys = this._settings.signingKeys;\n        }\n\n        if (this._settings.metadata) {\n            this._logger.debug(\"using metadata from settings\");\n            this._metadata = this._settings.metadata;\n        }\n\n        if (this._settings.fetchRequestCredentials) {\n            this._logger.debug(\"using fetchRequestCredentials from settings\");\n            this._fetchRequestCredentials = this._settings.fetchRequestCredentials;\n        }\n    }\n\n    public resetSigningKeys(): void {\n        this._signingKeys = null;\n    }\n\n    public async getMetadata(): Promise<Partial<OidcMetadata>> {\n        const logger = this._logger.create(\"getMetadata\");\n        if (this._metadata) {\n            logger.debug(\"using cached values\");\n            return this._metadata;\n        }\n\n        if (!this._metadataUrl) {\n            logger.throw(new Error(\"No authority or metadataUrl configured on settings\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        logger.debug(\"getting metadata from\", this._metadataUrl);\n        const metadata = await this._jsonService.getJson(this._metadataUrl, { credentials: this._fetchRequestCredentials, timeoutInSeconds: this._settings.requestTimeoutInSeconds });\n\n        logger.debug(\"merging remote JSON with seed metadata\");\n        this._metadata = Object.assign({}, metadata, this._settings.metadataSeed);\n        return this._metadata;\n    }\n\n    public getIssuer(): Promise<string> {\n        return this._getMetadataProperty(\"issuer\") as Promise<string>;\n    }\n\n    public getAuthorizationEndpoint(): Promise<string> {\n        return this._getMetadataProperty(\"authorization_endpoint\") as Promise<string>;\n    }\n\n    public getUserInfoEndpoint(): Promise<string> {\n        return this._getMetadataProperty(\"userinfo_endpoint\") as Promise<string>;\n    }\n\n    public getTokenEndpoint(optional: false): Promise<string>;\n    public getTokenEndpoint(optional?: true): Promise<string | undefined>;\n    public getTokenEndpoint(optional = true): Promise<string | undefined> {\n        return this._getMetadataProperty(\"token_endpoint\", optional) as Promise<string | undefined>;\n    }\n\n    public getCheckSessionIframe(): Promise<string | undefined> {\n        return this._getMetadataProperty(\"check_session_iframe\", true) as Promise<string | undefined>;\n    }\n\n    public getEndSessionEndpoint(): Promise<string | undefined> {\n        return this._getMetadataProperty(\"end_session_endpoint\", true) as Promise<string | undefined>;\n    }\n\n    public getRevocationEndpoint(optional: false): Promise<string>;\n    public getRevocationEndpoint(optional?: true): Promise<string | undefined>;\n    public getRevocationEndpoint(optional = true): Promise<string | undefined> {\n        return this._getMetadataProperty(\"revocation_endpoint\", optional) as Promise<string | undefined>;\n    }\n\n    public getKeysEndpoint(optional: false): Promise<string>;\n    public getKeysEndpoint(optional?: true): Promise<string | undefined>;\n    public getKeysEndpoint(optional = true): Promise<string | undefined> {\n        return this._getMetadataProperty(\"jwks_uri\", optional) as Promise<string | undefined>;\n    }\n\n    protected async _getMetadataProperty(name: keyof OidcMetadata, optional=false): Promise<string | boolean | string[] | undefined> {\n        const logger = this._logger.create(`_getMetadataProperty('${name}')`);\n\n        const metadata = await this.getMetadata();\n        logger.debug(\"resolved\");\n\n        if (metadata[name] === undefined) {\n            if (optional === true) {\n                logger.warn(\"Metadata does not contain optional property\");\n                return undefined;\n            }\n\n            logger.throw(new Error(\"Metadata does not contain property \" + name));\n        }\n\n        return metadata[name];\n    }\n\n    public async getSigningKeys(): Promise<SigningKey[] | null> {\n        const logger = this._logger.create(\"getSigningKeys\");\n        if (this._signingKeys) {\n            logger.debug(\"returning signingKeys from cache\");\n            return this._signingKeys;\n        }\n\n        const jwks_uri = await this.getKeysEndpoint(false);\n        logger.debug(\"got jwks_uri\", jwks_uri);\n\n        const keySet = await this._jsonService.getJson(jwks_uri, { timeoutInSeconds: this._settings.requestTimeoutInSeconds });\n        logger.debug(\"got key set\", keySet);\n\n        if (!Array.isArray(keySet.keys)) {\n            logger.throw(new Error(\"Missing keys on keyset\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        this._signingKeys = keySet.keys;\n        return this._signingKeys;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./utils\";\nimport type { StateStore } from \"./StateStore\";\nimport type { AsyncStorage } from \"./AsyncStorage\";\n\n/**\n * @public\n */\nexport class WebStorageStateStore implements StateStore {\n    private readonly _logger = new Logger(\"WebStorageStateStore\");\n\n    private readonly _store: AsyncStorage | Storage;\n    private readonly _prefix: string;\n\n    public constructor({\n        prefix = \"oidc.\",\n        store = localStorage,\n    }: { prefix?: string; store?: AsyncStorage | Storage } = {}) {\n        this._store = store;\n        this._prefix = prefix;\n    }\n\n    public async set(key: string, value: string): Promise<void> {\n        this._logger.create(`set('${key}')`);\n\n        key = this._prefix + key;\n        await this._store.setItem(key, value);\n    }\n\n    public async get(key: string): Promise<string | null> {\n        this._logger.create(`get('${key}')`);\n\n        key = this._prefix + key;\n        const item = await this._store.getItem(key);\n        return item;\n    }\n\n    public async remove(key: string): Promise<string | null> {\n        this._logger.create(`remove('${key}')`);\n\n        key = this._prefix + key;\n        const item = await this._store.getItem(key);\n        await this._store.removeItem(key);\n        return item;\n    }\n\n    public async getAllKeys(): Promise<string[]> {\n        this._logger.create(\"getAllKeys\");\n        const len = await this._store.length;\n\n        const keys = [];\n        for (let index = 0; index < len; index++) {\n            const key = await this._store.key(index);\n            if (key && key.indexOf(this._prefix) === 0) {\n                keys.push(key.substr(this._prefix.length));\n            }\n        }\n        return keys;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { WebStorageStateStore } from \"./WebStorageStateStore\";\nimport type { OidcMetadata } from \"./OidcMetadata\";\nimport type { StateStore } from \"./StateStore\";\nimport { InMemoryWebStorage } from \"./InMemoryWebStorage\";\nimport type { DPoPStore } from \"./DPoPStore\";\n\nconst DefaultResponseType = \"code\";\nconst DefaultScope = \"openid\";\nconst DefaultClientAuthentication = \"client_secret_post\";\nconst DefaultStaleStateAgeInSeconds = 60 * 15;\n\n/**\n * @public\n */\nexport type SigningKey = Record<string, string | string[]>;\n\n/**\n * @public\n */\nexport type ExtraHeader = string | (() => string);\n\n/**\n * Optional DPoP settings\n * @public\n */\nexport interface DPoPSettings {\n    bind_authorization_code?: boolean;\n    store: DPoPStore;\n}\n\n/**\n * The settings used to configure the {@link OidcClient}.\n *\n * @public\n */\nexport interface OidcClientSettings {\n    /** The URL of the OIDC/OAuth2 provider */\n    authority: string;\n    metadataUrl?: string;\n    /** Provide metadata when authority server does not allow CORS on the metadata endpoint */\n    metadata?: Partial<OidcMetadata>;\n    /** Can be used to seed or add additional values to the results of the discovery request */\n    metadataSeed?: Partial<OidcMetadata>;\n    /** Provide signingKeys when authority server does not allow CORS on the jwks uri */\n    signingKeys?: SigningKey[];\n\n    /** Your client application's identifier as registered with the OIDC/OAuth2 */\n    client_id: string;\n    client_secret?: string;\n    /** The type of response desired from the OIDC/OAuth2 provider (default: \"code\") */\n    response_type?: string;\n    /** The scope being requested from the OIDC/OAuth2 provider (default: \"openid\") */\n    scope?: string;\n    /** The redirect URI of your client application to receive a response from the OIDC/OAuth2 provider */\n    redirect_uri: string;\n    /** The OIDC/OAuth2 post-logout redirect URI */\n    post_logout_redirect_uri?: string;\n\n    /**\n     * Client authentication method that is used to authenticate when using the token endpoint (default: \"client_secret_post\")\n     * - \"client_secret_basic\": using the HTTP Basic authentication scheme\n     * - \"client_secret_post\": including the client credentials in the request body\n     * - \"client_secret_jwt\": using a JWT signed with the client secret\n     *\n     * See https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication\n     */\n    client_authentication?: \"client_secret_basic\" | \"client_secret_post\" | \"client_secret_jwt\";\n\n    /**\n     * The signature algorithm to use for client_secret_jwt authentication (default: \"HS256\")\n     * Supported algorithms: HS256, HS384, HS512\n     */\n    token_endpoint_auth_signing_alg?: \"HS256\" | \"HS384\" | \"HS512\";\n\n    /** optional protocol param */\n    prompt?: string;\n    /** optional protocol param */\n    display?: string;\n    /** optional protocol param */\n    max_age?: number;\n    /** optional protocol param */\n    ui_locales?: string;\n    /** optional protocol param */\n    acr_values?: string;\n    /** optional protocol param */\n    resource?: string | string[];\n\n    /**\n     * Optional protocol param\n     * The response mode used by the authority server is defined by the response_type unless explicitly specified:\n     * - Response mode for the OAuth 2.0 response type \"code\" is the \"query\" encoding\n     * - Response mode for the OAuth 2.0 response type \"token\" is the \"fragment\" encoding\n     *\n     * @see https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html#ResponseModes\n     */\n    response_mode?: \"query\" | \"fragment\";\n\n    /**\n     * Should optional OIDC protocol claims be removed from profile or specify the ones to be removed (default: true)\n     * When true, the following claims are removed by default: [\"nbf\", \"jti\", \"auth_time\", \"nonce\", \"acr\", \"amr\", \"azp\", \"at_hash\"]\n     * When specifying claims, the following claims are not allowed: [\"sub\", \"iss\", \"aud\", \"exp\", \"iat\"]\n    */\n    filterProtocolClaims?: boolean | string[];\n    /** Flag to control if additional identity data is loaded from the user info endpoint in order to populate the user's profile (default: false) */\n    loadUserInfo?: boolean;\n    /** Number (in seconds) indicating the age of state entries in storage for authorize requests that are considered abandoned and thus can be cleaned up (default: 900) */\n    staleStateAgeInSeconds?: number;\n\n    /**\n     * Indicates how objects returned from the user info endpoint as claims (e.g. `address`) are merged into the claims from the\n     * id token as a single object.  (default: `{ array: \"replace\" }`)\n     * - array: \"replace\": natives (string, int, float) and arrays are replaced, objects are merged as distinct objects\n     * - array: \"merge\": natives (string, int, float) are replaced, arrays and objects are merged as distinct objects\n     */\n    mergeClaimsStrategy?: { array: \"replace\" | \"merge\" };\n\n    /**\n     * Storage object used to persist interaction state (default: window.localStorage, InMemoryWebStorage iff no window).\n     * E.g. `stateStore: new WebStorageStateStore({ store: window.localStorage })`\n     */\n    stateStore?: StateStore;\n\n    /**\n     * An object containing additional query string parameters to be including in the authorization request.\n     * E.g, when using Azure AD to obtain an access token an additional resource parameter is required. extraQueryParams: `{resource:\"some_identifier\"}`\n     */\n    extraQueryParams?: Record<string, string | number | boolean>;\n\n    extraTokenParams?: Record<string, unknown>;\n\n    /**\n     * An object containing additional header to be including in request.\n     */\n    extraHeaders?: Record<string, ExtraHeader>;\n\n    /**\n     * DPoP enabled or disabled\n     */\n    dpop?: DPoPSettings | undefined;\n\n    /**\n     * Will check the content type header of the response of the revocation endpoint to match these passed values (default: [])\n     */\n    revokeTokenAdditionalContentTypes?: string[];\n    /**\n     * Will disable PKCE validation, changing to true will not append to sign in request code_challenge and code_challenge_method. (default: false)\n     */\n    disablePKCE?: boolean;\n    /**\n     * Sets the credentials for fetch requests. (default: \"same-origin\")\n     * Use this if you need to send cookies to the OIDC/OAuth2 provider or if you are using a proxy that requires cookies\n     */\n    fetchRequestCredentials?: RequestCredentials;\n\n    /**\n     * Only scopes in this list will be passed in the token refresh request.\n     */\n    refreshTokenAllowedScope?: string | undefined;\n\n    /**\n     * Defines request timeouts globally across all requests made to the authorisation server\n     */\n    requestTimeoutInSeconds?: number | undefined;\n\n    /**\n     * https://datatracker.ietf.org/doc/html/rfc6749#section-3.3 describes behavior when omitting scopes from sign in requests\n     * If the IDP supports default scopes, this setting will ignore the scopes property passed to the config. (Default: false)\n     */\n    omitScopeWhenRequesting?: boolean;\n}\n\n/**\n * The settings with defaults applied of the {@link OidcClient}.\n *\n * @public\n * @see {@link OidcClientSettings}\n */\nexport class OidcClientSettingsStore {\n    // metadata\n    public readonly authority: string;\n    public readonly metadataUrl: string;\n    public readonly metadata: Partial<OidcMetadata> | undefined;\n    public readonly metadataSeed: Partial<OidcMetadata> | undefined;\n    public readonly signingKeys: SigningKey[] | undefined;\n\n    // client config\n    public readonly client_id: string;\n    public readonly client_secret: string | undefined;\n    public readonly response_type: string;\n    public readonly scope: string;\n    public readonly redirect_uri: string;\n    public readonly post_logout_redirect_uri: string | undefined;\n    public readonly client_authentication: \"client_secret_basic\" | \"client_secret_post\" | \"client_secret_jwt\";\n    public readonly token_endpoint_auth_signing_alg: \"HS256\" | \"HS384\" | \"HS512\";\n\n    // optional protocol params\n    public readonly prompt: string | undefined;\n    public readonly display: string | undefined;\n    public readonly max_age: number | undefined;\n    public readonly ui_locales: string | undefined;\n    public readonly acr_values: string | undefined;\n    public readonly resource: string | string[] | undefined;\n    public readonly response_mode: \"query\" | \"fragment\" | undefined;\n\n    // behavior flags\n    public readonly filterProtocolClaims: boolean | string[];\n    public readonly loadUserInfo: boolean;\n    public readonly staleStateAgeInSeconds: number;\n    public readonly mergeClaimsStrategy: { array: \"replace\" | \"merge\" };\n    public readonly omitScopeWhenRequesting: boolean;\n\n    public readonly stateStore: StateStore;\n\n    // extra\n    public readonly extraQueryParams: Record<string, string | number | boolean>;\n    public readonly extraTokenParams: Record<string, unknown>;\n    public readonly dpop: DPoPSettings | undefined;\n    public readonly extraHeaders: Record<string, ExtraHeader>;\n\n    public readonly revokeTokenAdditionalContentTypes?: string[];\n    public readonly fetchRequestCredentials: RequestCredentials;\n    public readonly refreshTokenAllowedScope: string | undefined;\n    public readonly disablePKCE: boolean;\n    public readonly requestTimeoutInSeconds: number | undefined;\n\n    public constructor({\n        // metadata related\n        authority, metadataUrl, metadata, signingKeys, metadataSeed,\n        // client related\n        client_id, client_secret, response_type = DefaultResponseType, scope = DefaultScope,\n        redirect_uri, post_logout_redirect_uri,\n        client_authentication = DefaultClientAuthentication,\n        token_endpoint_auth_signing_alg = \"HS256\",\n        // optional protocol\n        prompt, display, max_age, ui_locales, acr_values, resource, response_mode,\n        // behavior flags\n        filterProtocolClaims = true,\n        loadUserInfo = false,\n        requestTimeoutInSeconds,\n        staleStateAgeInSeconds = DefaultStaleStateAgeInSeconds,\n        mergeClaimsStrategy = { array: \"replace\" },\n        disablePKCE = false,\n        // other behavior\n        stateStore,\n        revokeTokenAdditionalContentTypes,\n        fetchRequestCredentials,\n        refreshTokenAllowedScope,\n        // extra\n        extraQueryParams = {},\n        extraTokenParams = {},\n        extraHeaders = {},\n        dpop,\n        omitScopeWhenRequesting = false,\n    }: OidcClientSettings) {\n\n        this.authority = authority;\n\n        if (metadataUrl) {\n            this.metadataUrl = metadataUrl;\n        } else {\n            this.metadataUrl = authority;\n            if (authority) {\n                if (!this.metadataUrl.endsWith(\"/\")) {\n                    this.metadataUrl += \"/\";\n                }\n                this.metadataUrl += \".well-known/openid-configuration\";\n            }\n        }\n\n        this.metadata = metadata;\n        this.metadataSeed = metadataSeed;\n        this.signingKeys = signingKeys;\n\n        this.client_id = client_id;\n        this.client_secret = client_secret;\n        this.response_type = response_type;\n        this.scope = scope;\n        this.redirect_uri = redirect_uri;\n        this.post_logout_redirect_uri = post_logout_redirect_uri;\n        this.client_authentication = client_authentication;\n        this.token_endpoint_auth_signing_alg = token_endpoint_auth_signing_alg;\n\n        this.prompt = prompt;\n        this.display = display;\n        this.max_age = max_age;\n        this.ui_locales = ui_locales;\n        this.acr_values = acr_values;\n        this.resource = resource;\n        this.response_mode = response_mode;\n\n        this.filterProtocolClaims = filterProtocolClaims ?? true;\n        this.loadUserInfo = !!loadUserInfo;\n        this.staleStateAgeInSeconds = staleStateAgeInSeconds;\n        this.mergeClaimsStrategy = mergeClaimsStrategy;\n        this.omitScopeWhenRequesting = omitScopeWhenRequesting;\n        this.disablePKCE = !!disablePKCE;\n        this.revokeTokenAdditionalContentTypes = revokeTokenAdditionalContentTypes;\n\n        this.fetchRequestCredentials = fetchRequestCredentials ? fetchRequestCredentials : \"same-origin\";\n        this.requestTimeoutInSeconds = requestTimeoutInSeconds;\n\n        if (stateStore) {\n            this.stateStore = stateStore;\n        }\n        else {\n            const store = typeof window !== \"undefined\" ? window.localStorage : new InMemoryWebStorage();\n            this.stateStore = new WebStorageStateStore({ store });\n        }\n\n        this.refreshTokenAllowedScope = refreshTokenAllowedScope;\n\n        this.extraQueryParams = extraQueryParams;\n        this.extraTokenParams = extraTokenParams;\n        this.extraHeaders = extraHeaders;\n\n        this.dpop = dpop;\n        if (this.dpop && !this.dpop?.store) {\n            throw new Error(\"A DPoPStore is required when dpop is enabled\");\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, JwtUtils } from \"./utils\";\nimport { JsonService } from \"./JsonService\";\nimport type { MetadataService } from \"./MetadataService\";\nimport type { JwtClaims } from \"./Claims\";\nimport type { OidcClientSettingsStore } from \"./OidcClientSettings\";\n\n/**\n * @internal\n */\nexport class UserInfoService {\n    protected readonly _logger = new Logger(\"UserInfoService\");\n    private readonly _jsonService: JsonService;\n\n    public constructor(private readonly _settings: OidcClientSettingsStore,\n        private readonly _metadataService: MetadataService,\n    ) {\n        this._jsonService = new JsonService(\n            undefined,\n            this._getClaimsFromJwt,\n            this._settings.extraHeaders,\n        );\n    }\n\n    public async getClaims(token: string): Promise<JwtClaims> {\n        const logger = this._logger.create(\"getClaims\");\n        if (!token) {\n            this._logger.throw(new Error(\"No token passed\"));\n        }\n\n        const url = await this._metadataService.getUserInfoEndpoint();\n        logger.debug(\"got userinfo url\", url);\n\n        const claims = await this._jsonService.getJson(url, {\n            token,\n            credentials: this._settings.fetchRequestCredentials,\n            timeoutInSeconds: this._settings.requestTimeoutInSeconds,\n        });\n        logger.debug(\"got claims\", claims);\n\n        return claims;\n    }\n\n    protected _getClaimsFromJwt = async (responseText: string): Promise<JwtClaims> => {\n        const logger = this._logger.create(\"_getClaimsFromJwt\");\n        try {\n            const payload = JwtUtils.decode(responseText);\n            logger.debug(\"JWT decoding successful\");\n\n            return payload;\n        } catch (err) {\n            logger.error(\"Error parsing JWT response\");\n            throw err;\n        }\n    };\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { CryptoUtils, Logger } from \"./utils\";\nimport { JsonService } from \"./JsonService\";\nimport type { MetadataService } from \"./MetadataService\";\nimport type { ExtraHeader, OidcClientSettingsStore } from \"./OidcClientSettings\";\n\n/**\n * @internal\n */\nexport interface ExchangeCodeArgs {\n    client_id?: string;\n    client_secret?: string;\n    redirect_uri?: string;\n\n    grant_type?: string;\n    code: string;\n    code_verifier?: string;\n\n    extraHeaders?: Record<string, ExtraHeader>;\n}\n\n/**\n * @internal\n */\nexport interface ExchangeCredentialsArgs {\n    client_id?: string;\n    client_secret?: string;\n\n    grant_type?: string;\n    scope?: string;\n\n    username: string;\n    password: string;\n}\n\n/**\n * @internal\n */\nexport interface ExchangeRefreshTokenArgs {\n    client_id?: string;\n    client_secret?: string;\n    redirect_uri?: string;\n\n    grant_type?: string;\n    refresh_token: string;\n    scope?: string;\n    resource?: string | string[];\n\n    timeoutInSeconds?: number;\n\n    extraHeaders?: Record<string, ExtraHeader>;\n}\n\n/**\n * @internal\n */\nexport interface RevokeArgs {\n    token: string;\n    token_type_hint?: \"access_token\" | \"refresh_token\";\n}\n\n/**\n * @internal\n */\nexport class TokenClient {\n    private readonly _logger = new Logger(\"TokenClient\");\n    private readonly _jsonService;\n\n    public constructor(\n        private readonly _settings: OidcClientSettingsStore,\n        private readonly _metadataService: MetadataService,\n    ) {\n        this._jsonService = new JsonService(\n            this._settings.revokeTokenAdditionalContentTypes,\n            null,\n            this._settings.extraHeaders,\n        );\n    }\n\n    /**\n     * Exchange code.\n     *\n     * @see https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3\n     */\n    public async exchangeCode({\n        grant_type = \"authorization_code\",\n        redirect_uri = this._settings.redirect_uri,\n        client_id = this._settings.client_id,\n        client_secret = this._settings.client_secret,\n        extraHeaders,\n        ...args\n    }: ExchangeCodeArgs): Promise<Record<string, unknown>> {\n        const logger = this._logger.create(\"exchangeCode\");\n        if (!client_id) {\n            logger.throw(new Error(\"A client_id is required\"));\n        }\n        if (!redirect_uri) {\n            logger.throw(new Error(\"A redirect_uri is required\"));\n        }\n        if (!args.code) {\n            logger.throw(new Error(\"A code is required\"));\n        }\n\n        const params = new URLSearchParams({ grant_type, redirect_uri });\n        for (const [key, value] of Object.entries(args)) {\n            if (value != null) {\n                params.set(key, value);\n            }\n        }\n\n        // Validate client_secret if required before making any external calls\n        if ((this._settings.client_authentication === \"client_secret_basic\" ||\n             this._settings.client_authentication === \"client_secret_jwt\") &&\n            (client_secret === undefined || client_secret === null)) {\n            logger.throw(new Error(\"A client_secret is required\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        let basicAuth: string | undefined;\n        const url = await this._metadataService.getTokenEndpoint(false);\n        switch (this._settings.client_authentication) {\n            case \"client_secret_basic\":\n                basicAuth = CryptoUtils.generateBasicAuth(client_id, client_secret!);\n                break;\n            case \"client_secret_post\":\n                params.append(\"client_id\", client_id);\n                if (client_secret) {\n                    params.append(\"client_secret\", client_secret);\n                }\n                break;\n            case \"client_secret_jwt\": {\n                const clientAssertion = await CryptoUtils.generateClientAssertionJwt(client_id, client_secret!, url, this._settings.token_endpoint_auth_signing_alg);\n                params.append(\"client_id\", client_id);\n                params.append(\"client_assertion_type\", \"urn:ietf:params:oauth:client-assertion-type:jwt-bearer\");\n                params.append(\"client_assertion\", clientAssertion);\n                break;\n            }\n        }\n        logger.debug(\"got token endpoint\");\n\n        const response = await this._jsonService.postForm(url, {\n            body: params,\n            basicAuth,\n            timeoutInSeconds: this._settings.requestTimeoutInSeconds,\n            initCredentials: this._settings.fetchRequestCredentials,\n            extraHeaders,\n        });\n\n        logger.debug(\"got response\");\n\n        return response;\n    }\n\n    /**\n     * Exchange credentials.\n     *\n     * @see https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2\n     */\n    public async exchangeCredentials({\n        grant_type = \"password\",\n        client_id = this._settings.client_id,\n        client_secret = this._settings.client_secret,\n        scope = this._settings.scope,\n        ...args\n    }: ExchangeCredentialsArgs): Promise<Record<string, unknown>> {\n        const logger = this._logger.create(\"exchangeCredentials\");\n\n        if (!client_id) {\n            logger.throw(new Error(\"A client_id is required\"));\n        }\n\n        const params = new URLSearchParams({ grant_type });\n        if (!this._settings.omitScopeWhenRequesting) {\n            params.set(\"scope\", scope);\n        }\n        for (const [key, value] of Object.entries(args)) {\n            if (value != null) {\n                params.set(key, value);\n            }\n        }\n\n        // Validate client_secret if required before making any external calls\n        if ((this._settings.client_authentication === \"client_secret_basic\" ||\n             this._settings.client_authentication === \"client_secret_jwt\") &&\n            (client_secret === undefined || client_secret === null)) {\n            logger.throw(new Error(\"A client_secret is required\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        let basicAuth: string | undefined;\n        const url = await this._metadataService.getTokenEndpoint(false);\n        switch (this._settings.client_authentication) {\n            case \"client_secret_basic\":\n                basicAuth = CryptoUtils.generateBasicAuth(client_id, client_secret!);\n                break;\n            case \"client_secret_post\":\n                params.append(\"client_id\", client_id);\n                if (client_secret) {\n                    params.append(\"client_secret\", client_secret);\n                }\n                break;\n            case \"client_secret_jwt\": {\n                const clientAssertion = await CryptoUtils.generateClientAssertionJwt(client_id, client_secret!, url, this._settings.token_endpoint_auth_signing_alg);\n                params.append(\"client_id\", client_id);\n                params.append(\"client_assertion_type\", \"urn:ietf:params:oauth:client-assertion-type:jwt-bearer\");\n                params.append(\"client_assertion\", clientAssertion);\n                break;\n            }\n        }\n        logger.debug(\"got token endpoint\");\n\n        const response = await this._jsonService.postForm(url, { body: params, basicAuth, timeoutInSeconds: this._settings.requestTimeoutInSeconds, initCredentials: this._settings.fetchRequestCredentials });\n        logger.debug(\"got response\");\n\n        return response;\n    }\n\n    /**\n     * Exchange a refresh token.\n     *\n     * @see https://www.rfc-editor.org/rfc/rfc6749#section-6\n     */\n    public async exchangeRefreshToken({\n        grant_type = \"refresh_token\",\n        client_id = this._settings.client_id,\n        client_secret = this._settings.client_secret,\n        timeoutInSeconds,\n        extraHeaders,\n        ...args\n    }: ExchangeRefreshTokenArgs): Promise<Record<string, unknown>> {\n        const logger = this._logger.create(\"exchangeRefreshToken\");\n        if (!client_id) {\n            logger.throw(new Error(\"A client_id is required\"));\n        }\n        if (!args.refresh_token) {\n            logger.throw(new Error(\"A refresh_token is required\"));\n        }\n\n        const params = new URLSearchParams({ grant_type });\n        for (const [key, value] of Object.entries(args)) {\n            if (Array.isArray(value)) {\n                value.forEach(param => params.append(key, param));\n            }\n            else if (value != null) {\n                params.set(key, value);\n            }\n        }\n\n        // Validate client_secret if required before making any external calls\n        if ((this._settings.client_authentication === \"client_secret_basic\" ||\n             this._settings.client_authentication === \"client_secret_jwt\") &&\n            (client_secret === undefined || client_secret === null)) {\n            logger.throw(new Error(\"A client_secret is required\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        let basicAuth: string | undefined;\n        const url = await this._metadataService.getTokenEndpoint(false);\n        switch (this._settings.client_authentication) {\n            case \"client_secret_basic\":\n                basicAuth = CryptoUtils.generateBasicAuth(client_id, client_secret!);\n                break;\n            case \"client_secret_post\":\n                params.append(\"client_id\", client_id);\n                if (client_secret) {\n                    params.append(\"client_secret\", client_secret);\n                }\n                break;\n            case \"client_secret_jwt\": {\n                const clientAssertion = await CryptoUtils.generateClientAssertionJwt(client_id, client_secret!, url, this._settings.token_endpoint_auth_signing_alg);\n                params.append(\"client_id\", client_id);\n                params.append(\"client_assertion_type\", \"urn:ietf:params:oauth:client-assertion-type:jwt-bearer\");\n                params.append(\"client_assertion\", clientAssertion);\n                break;\n            }\n        }\n        logger.debug(\"got token endpoint\");\n\n        const response = await this._jsonService.postForm(url, { body: params, basicAuth, timeoutInSeconds, initCredentials: this._settings.fetchRequestCredentials, extraHeaders });\n        logger.debug(\"got response\");\n\n        return response;\n    }\n\n    /**\n     * Revoke an access or refresh token.\n     *\n     * @see https://datatracker.ietf.org/doc/html/rfc7009#section-2.1\n     */\n    public async revoke(args: RevokeArgs): Promise<void> {\n        const logger = this._logger.create(\"revoke\");\n        if (!args.token) {\n            logger.throw(new Error(\"A token is required\"));\n        }\n\n        const url = await this._metadataService.getRevocationEndpoint(false);\n\n        logger.debug(`got revocation endpoint, revoking ${args.token_type_hint ?? \"default token type\"}`);\n\n        const params = new URLSearchParams();\n        for (const [key, value] of Object.entries(args)) {\n            if (value != null) {\n                params.set(key, value);\n            }\n        }\n        params.set(\"client_id\", this._settings.client_id);\n        if (this._settings.client_secret) {\n            params.set(\"client_secret\", this._settings.client_secret);\n        }\n\n        await this._jsonService.postForm(url, { body: params, timeoutInSeconds: this._settings.requestTimeoutInSeconds });\n        logger.debug(\"got response\");\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, JwtUtils } from \"./utils\";\nimport { ErrorResponse } from \"./errors\";\nimport type { MetadataService } from \"./MetadataService\";\nimport { UserInfoService } from \"./UserInfoService\";\nimport { TokenClient } from \"./TokenClient\";\nimport type { ExtraHeader, OidcClientSettingsStore } from \"./OidcClientSettings\";\nimport type { SigninState } from \"./SigninState\";\nimport type { SigninResponse } from \"./SigninResponse\";\nimport type { State } from \"./State\";\nimport type { SignoutResponse } from \"./SignoutResponse\";\nimport type { UserProfile } from \"./User\";\nimport type { RefreshState } from \"./RefreshState\";\nimport type { IdTokenClaims } from \"./Claims\";\nimport type { ClaimsService } from \"./ClaimsService\";\n\n/**\n * @internal\n */\nexport class ResponseValidator {\n    protected readonly _logger = new Logger(\"ResponseValidator\");\n    protected readonly _userInfoService: UserInfoService;\n    protected readonly _tokenClient: TokenClient;\n\n    public constructor(\n        protected readonly _settings: OidcClientSettingsStore,\n        protected readonly _metadataService: MetadataService,\n        protected readonly _claimsService: ClaimsService,\n    ) {\n        this._userInfoService = new UserInfoService(this._settings, this._metadataService);\n        this._tokenClient = new TokenClient(this._settings, this._metadataService);\n    }\n\n    public async validateSigninResponse(response: SigninResponse, state: SigninState, extraHeaders?: Record<string, ExtraHeader>): Promise<void> {\n        const logger = this._logger.create(\"validateSigninResponse\");\n\n        this._processSigninState(response, state);\n        logger.debug(\"state processed\");\n\n        await this._processCode(response, state, extraHeaders);\n        logger.debug(\"code processed\");\n\n        if (response.isOpenId) {\n            this._validateIdTokenAttributes(response, \"\", state.nonce);\n        }\n        logger.debug(\"tokens validated\");\n\n        await this._processClaims(response, state?.skipUserInfo, response.isOpenId);\n        logger.debug(\"claims processed\");\n    }\n\n    public async validateCredentialsResponse(response: SigninResponse, skipUserInfo: boolean): Promise<void> {\n        const logger = this._logger.create(\"validateCredentialsResponse\");\n        const shouldValidateSubClaim = response.isOpenId && !!response.id_token;\n\n        if (shouldValidateSubClaim) {\n            this._validateIdTokenAttributes(response);\n        }\n        logger.debug(\"tokens validated\");\n\n        await this._processClaims(response, skipUserInfo, shouldValidateSubClaim);\n        logger.debug(\"claims processed\");\n    }\n\n    public async validateRefreshResponse(response: SigninResponse, state: RefreshState): Promise<void> {\n        const logger = this._logger.create(\"validateRefreshResponse\");\n\n        response.userState = state.data;\n        // if there's no session_state on the response, copy over session_state from original request\n        response.session_state ??= state.session_state;\n        // if there's no scope on the response, then assume all scopes granted (per-spec) and copy over scopes from original request\n        response.scope ??= state.scope;\n\n        // OpenID Connect Core 1.0 says that id_token is optional in refresh response:\n        // https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokenResponse\n        if (response.isOpenId && !!response.id_token) {\n            this._validateIdTokenAttributes(response, state.id_token);\n            logger.debug(\"ID Token validated\");\n        }\n\n        if (!response.id_token) {\n            // if there's no id_token on the response, copy over id_token from original request\n            response.id_token = state.id_token;\n            // and decoded part too\n            response.profile = state.profile;\n        }\n\n        const hasIdToken = response.isOpenId && !!response.id_token;\n        await this._processClaims(response, false, hasIdToken);\n        logger.debug(\"claims processed\");\n    }\n\n    public validateSignoutResponse(response: SignoutResponse, state: State): void {\n        const logger = this._logger.create(\"validateSignoutResponse\");\n        if (state.id !== response.state) {\n            logger.throw(new Error(\"State does not match\"));\n        }\n\n        // now that we know the state matches, take the stored data\n        // and set it into the response so callers can get their state\n        // this is important for both success & error outcomes\n        logger.debug(\"state validated\");\n        response.userState = state.data;\n\n        if (response.error) {\n            logger.warn(\"Response was error\", response.error);\n            throw new ErrorResponse(response);\n        }\n    }\n\n    protected _processSigninState(response: SigninResponse, state: SigninState): void {\n        const logger = this._logger.create(\"_processSigninState\");\n        if (state.id !== response.state) {\n            logger.throw(new Error(\"State does not match\"));\n        }\n\n        if (!state.client_id) {\n            logger.throw(new Error(\"No client_id on state\"));\n        }\n\n        if (!state.authority) {\n            logger.throw(new Error(\"No authority on state\"));\n        }\n\n        // ensure we're using the correct authority\n        if (this._settings.authority !== state.authority) {\n            logger.throw(new Error(\"authority mismatch on settings vs. signin state\"));\n        }\n        if (this._settings.client_id && this._settings.client_id !== state.client_id) {\n            logger.throw(new Error(\"client_id mismatch on settings vs. signin state\"));\n        }\n\n        // now that we know the state matches, take the stored data\n        // and set it into the response so callers can get their state\n        // this is important for both success & error outcomes\n        logger.debug(\"state validated\");\n        response.userState = state.data;\n        response.url_state = state.url_state;\n        // if there's no scope on the response, then assume all scopes granted (per-spec) and copy over scopes from original request\n        response.scope ??= state.scope;\n\n        if (response.error) {\n            logger.warn(\"Response was error\", response.error);\n            throw new ErrorResponse(response);\n        }\n\n        if (state.code_verifier && !response.code) {\n            logger.throw(new Error(\"Expected code in response\"));\n        }\n\n    }\n\n    protected async _processClaims(response: SigninResponse, skipUserInfo = false, validateSub = true): Promise<void> {\n        const logger = this._logger.create(\"_processClaims\");\n        response.profile = this._claimsService.filterProtocolClaims(response.profile);\n\n        if (skipUserInfo || !this._settings.loadUserInfo || !response.access_token) {\n            logger.debug(\"not loading user info\");\n            return;\n        }\n\n        logger.debug(\"loading user info\");\n        const claims = await this._userInfoService.getClaims(response.access_token);\n        logger.debug(\"user info claims received from user info endpoint\");\n\n        if (validateSub && claims.sub !== response.profile.sub) {\n            logger.throw(new Error(\"subject from UserInfo response does not match subject in ID Token\"));\n        }\n\n        response.profile = this._claimsService.mergeClaims(response.profile, this._claimsService.filterProtocolClaims(claims as IdTokenClaims));\n        logger.debug(\"user info claims received, updated profile:\", response.profile);\n    }\n\n    protected async _processCode(response: SigninResponse, state: SigninState, extraHeaders?: Record<string, ExtraHeader>): Promise<void> {\n        const logger = this._logger.create(\"_processCode\");\n        if (response.code) {\n            logger.debug(\"Validating code\");\n            const tokenResponse = await this._tokenClient.exchangeCode({\n                client_id: state.client_id,\n                client_secret: state.client_secret,\n                code: response.code,\n                redirect_uri: state.redirect_uri,\n                code_verifier: state.code_verifier,\n                extraHeaders: extraHeaders,\n                ...state.extraTokenParams,\n            });\n            Object.assign(response, tokenResponse);\n        } else {\n            logger.debug(\"No code to process\");\n        }\n    }\n\n    protected _validateIdTokenAttributes(response: SigninResponse, existingToken?: string, nonce?: string): void {\n        const logger = this._logger.create(\"_validateIdTokenAttributes\");\n\n        logger.debug(\"decoding ID Token JWT\");\n        const incoming = JwtUtils.decode(response.id_token ?? \"\");\n\n        if (!incoming.sub) {\n            logger.throw(new Error(\"ID Token is missing a subject claim\"));\n        }\n\n        if (nonce && incoming.nonce !== nonce) {\n            logger.throw(new Error(\"nonce in id_token does not match nonce in client storage\"));\n        }\n\n        if (existingToken) {\n            const existing = JwtUtils.decode(existingToken);\n            if (incoming.sub !== existing.sub) {\n                logger.throw(new Error(\"sub in id_token does not match current sub\"));\n            }\n            if (incoming.auth_time && incoming.auth_time !== existing.auth_time) {\n                logger.throw(new Error(\"auth_time in id_token does not match original auth_time\"));\n            }\n            if (incoming.azp && incoming.azp !== existing.azp) {\n                logger.throw(new Error(\"azp in id_token does not match original azp\"));\n            }\n            if (!incoming.azp && existing.azp) {\n                logger.throw(new Error(\"azp not in id_token, but present in original id_token\"));\n            }\n        }\n\n        response.profile = incoming as UserProfile;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, CryptoUtils, Timer } from \"./utils\";\nimport type { StateStore } from \"./StateStore\";\n\n/**\n * @public\n */\nexport class State {\n    public readonly id: string;\n    public readonly created: number;\n    public readonly request_type: string | undefined;\n    public readonly url_state: string | undefined;\n\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    public readonly data?: unknown;\n\n    public constructor(args: {\n        id?: string;\n        data?: unknown;\n        created?: number;\n        request_type?: string;\n        url_state?: string;\n    }) {\n        this.id = args.id || CryptoUtils.generateUUIDv4();\n        this.data = args.data;\n\n        if (args.created && args.created > 0) {\n            this.created = args.created;\n        }\n        else {\n            this.created = Timer.getEpochTime();\n        }\n        this.request_type = args.request_type;\n        this.url_state = args.url_state;\n    }\n\n    public toStorageString(): string {\n        new Logger(\"State\").create(\"toStorageString\");\n        return JSON.stringify({\n            id: this.id,\n            data: this.data,\n            created: this.created,\n            request_type: this.request_type,\n            url_state: this.url_state,\n        });\n    }\n\n    public static fromStorageString(storageString: string): Promise<State> {\n        Logger.createStatic(\"State\", \"fromStorageString\");\n        return Promise.resolve(new State(JSON.parse(storageString)));\n    }\n\n    public static async clearStaleState(storage: StateStore, age: number): Promise<void> {\n        const logger = Logger.createStatic(\"State\", \"clearStaleState\");\n        const cutoff = Timer.getEpochTime() - age;\n\n        const keys = await storage.getAllKeys();\n        logger.debug(\"got keys\", keys);\n\n        for (let i = 0; i < keys.length; i++) {\n            const key = keys[i];\n            const item = await storage.get(key);\n            let remove = false;\n\n            if (item) {\n                try {\n                    const state = await State.fromStorageString(item);\n\n                    logger.debug(\"got item from key:\", key, state.created);\n                    if (state.created <= cutoff) {\n                        remove = true;\n                    }\n                }\n                catch (err) {\n                    logger.error(\"Error parsing state for key:\", key, err);\n                    remove = true;\n                }\n            }\n            else {\n                logger.debug(\"no item in storage for key:\", key);\n                remove = true;\n            }\n\n            if (remove) {\n                logger.debug(\"removed item for key:\", key);\n                void storage.remove(key);\n            }\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, CryptoUtils } from \"./utils\";\nimport { State } from \"./State\";\n\n/** @public */\nexport interface SigninStateArgs {\n    id?: string;\n    data?: unknown;\n    created?: number;\n    request_type?: string;\n\n    code_verifier?: string;\n    code_challenge?: string;\n    authority: string;\n    client_id: string;\n    redirect_uri: string;\n    scope: string;\n    client_secret?: string;\n    extraTokenParams?: Record<string, unknown>;\n    response_mode?: \"query\" | \"fragment\";\n    skipUserInfo?: boolean;\n    url_state?: string;\n    nonce?: string;\n}\n\n/** @public */\nexport type SigninStateCreateArgs = Omit<SigninStateArgs, \"code_verifier\"> & {\n    code_verifier?: string | boolean;\n};\n\n/**\n * @public\n */\nexport class SigninState extends State {\n    // isCode\n    /** The same code_verifier that was used to obtain the authorization_code via PKCE. */\n    public readonly code_verifier: string | undefined;\n    /** Used to secure authorization code grants via Proof Key for Code Exchange (PKCE). */\n    public readonly code_challenge: string | undefined;\n\n    // to ensure state still matches settings\n    /** @see {@link OidcClientSettings.authority} */\n    public readonly authority: string;\n    /** @see {@link OidcClientSettings.client_id} */\n    public readonly client_id: string;\n    /** @see {@link OidcClientSettings.redirect_uri} */\n    public readonly redirect_uri: string;\n    /** @see {@link OidcClientSettings.scope} */\n    public readonly scope: string;\n    /** @see {@link OidcClientSettings.client_secret} */\n    public readonly client_secret: string | undefined;\n    /** @see {@link OidcClientSettings.extraTokenParams} */\n    public readonly extraTokenParams: Record<string, unknown> | undefined;\n    /** @see {@link OidcClientSettings.response_mode} */\n    public readonly response_mode: \"query\" | \"fragment\" | undefined;\n\n    public readonly skipUserInfo: boolean | undefined;\n    /** @see {@link SigninRequestCreateArgs.nonce} */\n    public readonly nonce: string | undefined;\n\n    private constructor(args: SigninStateArgs) {\n        super(args);\n\n        this.code_verifier = args.code_verifier;\n        this.code_challenge = args.code_challenge;\n        this.authority = args.authority;\n        this.client_id = args.client_id;\n        this.redirect_uri = args.redirect_uri;\n        this.scope = args.scope;\n        this.client_secret = args.client_secret;\n        this.extraTokenParams = args.extraTokenParams;\n\n        this.response_mode = args.response_mode;\n        this.skipUserInfo = args.skipUserInfo;\n        this.nonce = args.nonce;\n    }\n\n    public static async create(args: SigninStateCreateArgs): Promise<SigninState> {\n        const code_verifier = args.code_verifier === true ? CryptoUtils.generateCodeVerifier() : (args.code_verifier || undefined);\n        const code_challenge = code_verifier ? (await CryptoUtils.generateCodeChallenge(code_verifier)) : undefined;\n\n        return new SigninState({\n            ...args,\n            code_verifier,\n            code_challenge,\n        });\n    }\n\n    public toStorageString(): string {\n        new Logger(\"SigninState\").create(\"toStorageString\");\n        return JSON.stringify({\n            id: this.id,\n            data: this.data,\n            created: this.created,\n            request_type: this.request_type,\n            url_state: this.url_state,\n\n            code_verifier: this.code_verifier,\n            authority: this.authority,\n            client_id: this.client_id,\n            redirect_uri: this.redirect_uri,\n            scope: this.scope,\n            client_secret: this.client_secret,\n            extraTokenParams : this.extraTokenParams,\n            response_mode: this.response_mode,\n            skipUserInfo: this.skipUserInfo,\n            nonce: this.nonce,\n        });\n    }\n\n    public static fromStorageString(storageString: string): Promise<SigninState> {\n        Logger.createStatic(\"SigninState\", \"fromStorageString\");\n        const data = JSON.parse(storageString);\n        return SigninState.create(data);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, URL_STATE_DELIMITER } from \"./utils\";\nimport { SigninState } from \"./SigninState\";\n\n/**\n * @public\n * @see https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest\n */\nexport interface SigninRequestCreateArgs {\n    // mandatory\n    url: string;\n    authority: string;\n    client_id: string;\n    redirect_uri: string;\n    response_type: string;\n    scope: string;\n\n    // optional\n    response_mode?: \"query\" | \"fragment\";\n    nonce?: string;\n    display?: string;\n    dpopJkt?: string;\n    prompt?: string;\n    max_age?: number;\n    ui_locales?: string;\n    id_token_hint?: string;\n    login_hint?: string;\n    acr_values?: string;\n\n    // other\n    resource?: string | string[];\n    request?: string;\n    request_uri?: string;\n    request_type?: string;\n    extraQueryParams?: Record<string, string | number | boolean>;\n\n    // special\n    extraTokenParams?: Record<string, unknown>;\n    client_secret?: string;\n    skipUserInfo?: boolean;\n    disablePKCE?: boolean;\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    state_data?: unknown;\n    url_state?: string;\n    omitScopeWhenRequesting?: boolean;\n}\n\n/**\n * @public\n */\nexport class SigninRequest {\n    private static readonly _logger = new Logger(\"SigninRequest\");\n\n    public readonly url: string;\n    public readonly state: SigninState;\n\n    private constructor(args: {\n        url: string;\n        state: SigninState;\n    }) {\n        this.url = args.url;\n        this.state = args.state;\n    }\n\n    public static async create({\n        // mandatory\n        url, authority, client_id, redirect_uri, response_type, scope,\n        // optional\n        state_data, response_mode, request_type, client_secret, nonce, url_state,\n        resource,\n        skipUserInfo,\n        extraQueryParams,\n        extraTokenParams,\n        disablePKCE,\n        dpopJkt,\n        omitScopeWhenRequesting,\n        ...optionalParams\n    }: SigninRequestCreateArgs): Promise<SigninRequest> {\n        if (!url) {\n            this._logger.error(\"create: No url passed\");\n            throw new Error(\"url\");\n        }\n        if (!client_id) {\n            this._logger.error(\"create: No client_id passed\");\n            throw new Error(\"client_id\");\n        }\n        if (!redirect_uri) {\n            this._logger.error(\"create: No redirect_uri passed\");\n            throw new Error(\"redirect_uri\");\n        }\n        if (!response_type) {\n            this._logger.error(\"create: No response_type passed\");\n            throw new Error(\"response_type\");\n        }\n        if (!scope) {\n            this._logger.error(\"create: No scope passed\");\n            throw new Error(\"scope\");\n        }\n        if (!authority) {\n            this._logger.error(\"create: No authority passed\");\n            throw new Error(\"authority\");\n        }\n\n        const state = await SigninState.create({\n            data: state_data,\n            request_type,\n            url_state,\n            code_verifier: !disablePKCE,\n            client_id, authority, redirect_uri,\n            response_mode,\n            client_secret, scope, extraTokenParams,\n            skipUserInfo,\n            nonce,\n        });\n\n        const parsedUrl = new URL(url);\n        parsedUrl.searchParams.append(\"client_id\", client_id);\n        parsedUrl.searchParams.append(\"redirect_uri\", redirect_uri);\n        parsedUrl.searchParams.append(\"response_type\", response_type);\n        if (!omitScopeWhenRequesting) {\n            parsedUrl.searchParams.append(\"scope\", scope);\n        }\n        if (nonce) {\n            parsedUrl.searchParams.append(\"nonce\", nonce);\n        }\n\n        if (dpopJkt) {\n            parsedUrl.searchParams.append(\"dpop_jkt\", dpopJkt);\n        }\n\n        let stateParam = state.id;\n        if (url_state) {\n            stateParam = `${stateParam}${URL_STATE_DELIMITER}${url_state}`;\n        }\n        parsedUrl.searchParams.append(\"state\", stateParam);\n        if (state.code_challenge) {\n            parsedUrl.searchParams.append(\"code_challenge\", state.code_challenge);\n            parsedUrl.searchParams.append(\"code_challenge_method\", \"S256\");\n        }\n\n        if (resource) {\n            // https://datatracker.ietf.org/doc/html/rfc8707\n            const resources = Array.isArray(resource) ? resource : [resource];\n            resources\n                .forEach(r => parsedUrl.searchParams.append(\"resource\", r));\n        }\n\n        for (const [key, value] of Object.entries({ response_mode, ...optionalParams, ...extraQueryParams })) {\n            if (value != null) {\n                parsedUrl.searchParams.append(key, value.toString());\n            }\n        }\n\n        return new SigninRequest({\n            url: parsedUrl.href,\n            state,\n        });\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Timer, URL_STATE_DELIMITER } from \"./utils\";\nimport type { UserProfile } from \"./User\";\n\nconst OidcScope = \"openid\";\n\n/**\n * @public\n * @see https://openid.net/specs/openid-connect-core-1_0.html#AuthResponse\n * @see https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n */\nexport class SigninResponse {\n    // props present in the initial callback response regardless of success\n    public readonly state: string | null;\n    /** @see {@link User.session_state} */\n    public session_state: string | null;\n\n    // error props\n    /** @see {@link ErrorResponse.error} */\n    public readonly error: string | null;\n    /** @see {@link ErrorResponse.error_description} */\n    public readonly error_description: string | null;\n    /** @see {@link ErrorResponse.error_uri} */\n    public readonly error_uri: string | null;\n\n    // success props\n    public readonly code: string | null;\n\n    // props set after validation\n    /** @see {@link User.id_token} */\n    public id_token?: string;\n    /** @see {@link User.access_token} */\n    public access_token = \"\";\n    /** @see {@link User.token_type} */\n    public token_type = \"\";\n    /** @see {@link User.refresh_token} */\n    public refresh_token?: string;\n    /** @see {@link User.scope} */\n    public scope?: string;\n    /** @see {@link User.expires_at} */\n    public expires_at?: number;\n\n    /** custom state data set during the initial signin request */\n    public userState: unknown;\n    public url_state?: string;\n\n    /** @see {@link User.profile} */\n    public profile: UserProfile = {} as UserProfile;\n\n    public constructor(params: URLSearchParams) {\n        this.state = params.get(\"state\");\n        this.session_state = params.get(\"session_state\");\n        if (this.state) {\n            const splitState = decodeURIComponent(this.state).split(URL_STATE_DELIMITER);\n            this.state = splitState[0];\n            if (splitState.length > 1) {\n                this.url_state = splitState.slice(1).join(URL_STATE_DELIMITER);\n            }\n        }\n\n        this.error = params.get(\"error\");\n        this.error_description = params.get(\"error_description\");\n        this.error_uri = params.get(\"error_uri\");\n\n        this.code = params.get(\"code\");\n    }\n\n    public get expires_in(): number | undefined {\n        if (this.expires_at === undefined) {\n            return undefined;\n        }\n        return this.expires_at - Timer.getEpochTime();\n    }\n    public set expires_in(value: number | undefined) {\n        // spec expects a number, but normalize here just in case\n        if (typeof value === \"string\") value = Number(value);\n        if (value !== undefined && value >= 0) {\n            this.expires_at = Math.floor(value) + Timer.getEpochTime();\n        }\n    }\n\n    public get isOpenId(): boolean {\n        return this.scope?.split(\" \").includes(OidcScope) || !!this.id_token;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, URL_STATE_DELIMITER } from \"./utils\";\nimport { State } from \"./State\";\n\n/**\n * @public\n * @see https://openid.net/specs/openid-connect-rpinitiated-1_0.html#RPLogout\n */\nexport interface SignoutRequestArgs {\n    // mandatory\n    url: string;\n\n    // optional\n    id_token_hint?: string;\n    client_id?: string;\n    post_logout_redirect_uri?: string;\n    extraQueryParams?: Record<string, string | number | boolean>;\n\n    // special\n    request_type?: string;\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    state_data?: unknown;\n    url_state?: string;\n}\n\n/**\n * @public\n */\nexport class SignoutRequest {\n    private readonly _logger = new Logger(\"SignoutRequest\");\n\n    public readonly url: string;\n    public readonly state?: State;\n\n    public constructor({\n        url,\n        state_data, id_token_hint, post_logout_redirect_uri, extraQueryParams, request_type, client_id, url_state,\n    }: SignoutRequestArgs) {\n        if (!url) {\n            this._logger.error(\"ctor: No url passed\");\n            throw new Error(\"url\");\n        }\n\n        const parsedUrl = new URL(url);\n        if (id_token_hint) {\n            parsedUrl.searchParams.append(\"id_token_hint\", id_token_hint);\n        }\n        if (client_id) {\n            parsedUrl.searchParams.append(\"client_id\", client_id);\n        }\n\n        if (post_logout_redirect_uri) {\n            parsedUrl.searchParams.append(\"post_logout_redirect_uri\", post_logout_redirect_uri);\n\n            // Add state if either data needs to be stored, or url_state set for an intermediate proxy\n            if (state_data || url_state) {\n                this.state = new State({ data: state_data, request_type, url_state });\n\n                let stateParam = this.state.id;\n                if (url_state) {\n                    stateParam = `${stateParam}${URL_STATE_DELIMITER}${url_state}`;\n                }\n                parsedUrl.searchParams.append(\"state\", stateParam);\n            }\n        }\n\n        for (const [key, value] of Object.entries({ ...extraQueryParams })) {\n            if (value != null) {\n                parsedUrl.searchParams.append(key, value.toString());\n            }\n        }\n\n        this.url = parsedUrl.href;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { URL_STATE_DELIMITER } from \"./utils\";\n\n/**\n * @public\n * @see https://openid.net/specs/openid-connect-core-1_0.html#AuthError\n */\nexport class SignoutResponse {\n    public readonly state: string | null;\n\n    // error props\n    /** @see {@link ErrorResponse.error} */\n    public error: string | null;\n    /** @see {@link ErrorResponse.error_description} */\n    public error_description: string | null;\n    /** @see {@link ErrorResponse.error_uri} */\n    public error_uri: string | null;\n\n    /** custom state data set during the initial signin request */\n    public userState: unknown;\n    public url_state?: string;\n\n    public constructor(params: URLSearchParams) {\n        this.state = params.get(\"state\");\n        if (this.state) {\n            const splitState = decodeURIComponent(this.state).split(URL_STATE_DELIMITER);\n            this.state = splitState[0];\n            if (splitState.length > 1) {\n                this.url_state = splitState.slice(1).join(URL_STATE_DELIMITER);\n            }\n        }\n\n        this.error = params.get(\"error\");\n        this.error_description = params.get(\"error_description\");\n        this.error_uri = params.get(\"error_uri\");\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport type { JwtClaims } from \"./Claims\";\nimport type { OidcClientSettingsStore } from \"./OidcClientSettings\";\nimport type { UserProfile } from \"./User\";\nimport { Logger } from \"./utils\";\n\n/**\n * Protocol claims that could be removed by default from profile.\n * Derived from the following sets of claims:\n * - {@link https://datatracker.ietf.org/doc/html/rfc7519.html#section-4.1}\n * - {@link https://openid.net/specs/openid-connect-core-1_0.html#IDToken}\n * - {@link https://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken}\n *\n * @internal\n */\nconst DefaultProtocolClaims = [\n    \"nbf\",\n    \"jti\",\n    \"auth_time\",\n    \"nonce\",\n    \"acr\",\n    \"amr\",\n    \"azp\",\n    \"at_hash\", // https://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken\n] as const;\n\n/**\n * Protocol claims that should never be removed from profile.\n * \"sub\" is needed internally and others should remain required as per the OIDC specs.\n *\n * @internal\n */\nconst InternalRequiredProtocolClaims = [\"sub\", \"iss\", \"aud\", \"exp\", \"iat\"];\n\n/**\n * @internal\n */\nexport class ClaimsService {\n    protected readonly _logger = new Logger(\"ClaimsService\");\n    public constructor(\n        protected readonly _settings: OidcClientSettingsStore,\n    ) {}\n\n    public filterProtocolClaims(claims: UserProfile): UserProfile {\n        const result = { ...claims };\n\n        if (this._settings.filterProtocolClaims) {\n            let protocolClaims;\n            if (Array.isArray(this._settings.filterProtocolClaims)) {\n                protocolClaims = this._settings.filterProtocolClaims;\n            } else {\n                protocolClaims = DefaultProtocolClaims;\n            }\n\n            for (const claim of protocolClaims) {\n                if (!InternalRequiredProtocolClaims.includes(claim)) {\n                    delete result[claim];\n                }\n            }\n        }\n\n        return result;\n    }\n\n    public mergeClaims(claims1: JwtClaims, claims2: JwtClaims): UserProfile;\n    public mergeClaims(claims1: UserProfile, claims2: JwtClaims): UserProfile {\n        const result = { ...claims1 };\n        for (const [claim, values] of Object.entries(claims2)) {\n            if (result[claim] !== values) {\n                if (Array.isArray(result[claim]) || Array.isArray(values)) {\n                    if (this._settings.mergeClaimsStrategy.array == \"replace\") {\n                        result[claim] = values;\n                    } else {\n                        const mergedValues = Array.isArray(result[claim]) ? result[claim] as unknown[] : [result[claim]];\n                        for (const value of Array.isArray(values) ? values : [values]) {\n                            if (!mergedValues.includes(value)) {\n                                mergedValues.push(value);\n                            }\n                        }\n                        result[claim] = mergedValues;\n                    }\n                } else if (typeof result[claim] === \"object\" && typeof values === \"object\") {\n                    result[claim] = this.mergeClaims(result[claim] as JwtClaims, values as JwtClaims);\n                } else {\n                    result[claim] = values;\n                }\n            }\n        }\n\n        return result;\n    }\n}\n", "/**\n * @public\n */\nexport interface DPoPStore {\n    set(key: string, value: DPoPState): Promise<void>;\n    get(key: string): Promise<DPoPState>;\n    remove(key: string): Promise<DPoPState>;\n    getAllKeys(): Promise<string[]>;\n}\n\n/**\n * @public\n */\nexport class DPoPState {\n    public constructor(\n        public readonly keys: CryptoKeyPair,\n        public nonce?: string,\n    ) { }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { CryptoUtils, Logger, UrlUtils } from \"./utils\";\nimport { ErrorResponse } from \"./errors\";\nimport { type ExtraHeader, type OidcClientSettings, OidcClientSettingsStore } from \"./OidcClientSettings\";\nimport { ResponseValidator } from \"./ResponseValidator\";\nimport { MetadataService } from \"./MetadataService\";\nimport type { RefreshState } from \"./RefreshState\";\nimport { SigninRequest, type SigninRequestCreateArgs } from \"./SigninRequest\";\nimport { SigninResponse } from \"./SigninResponse\";\nimport { SignoutRequest, type SignoutRequestArgs } from \"./SignoutRequest\";\nimport { SignoutResponse } from \"./SignoutResponse\";\nimport { SigninState } from \"./SigninState\";\nimport { State } from \"./State\";\nimport { TokenClient } from \"./TokenClient\";\nimport { ClaimsService } from \"./ClaimsService\";\nimport { DPoPState, type DPoPStore } from \"./DPoPStore\";\nimport { ErrorDPoPNonce } from \"./errors/ErrorDPoPNonce\";\n\n/**\n * @public\n */\nexport interface CreateSigninRequestArgs\n    extends Omit<SigninRequestCreateArgs, \"url\" | \"authority\" | \"client_id\" | \"redirect_uri\" | \"response_type\" | \"scope\" | \"state_data\"> {\n    redirect_uri?: string;\n    response_type?: string;\n    scope?: string;\n    dpopJkt?: string;\n\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    state?: unknown;\n}\n\n/**\n * @public\n */\nexport interface UseRefreshTokenArgs {\n    redirect_uri?: string;\n    resource?: string | string[];\n    extraTokenParams?: Record<string, unknown>;\n    timeoutInSeconds?: number;\n\n    state: RefreshState;\n\n    extraHeaders?: Record<string, ExtraHeader>;\n}\n\n/**\n * @public\n */\nexport type CreateSignoutRequestArgs = Omit<SignoutRequestArgs, \"url\" | \"state_data\"> & {\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    state?: unknown;\n};\n\n/**\n * @public\n */\nexport type ProcessResourceOwnerPasswordCredentialsArgs = {\n    username: string;\n    password: string;\n    skipUserInfo?: boolean;\n    extraTokenParams?: Record<string, unknown>;\n};\n\n/**\n * Provides the raw OIDC/OAuth2 protocol support for the authorization endpoint and the end session endpoint in the\n * authorization server. It provides a bare-bones protocol implementation and is used by the UserManager class.\n * Only use this class if you simply want protocol support without the additional management features of the\n * UserManager class.\n *\n * @public\n */\nexport class OidcClient {\n    public readonly settings: OidcClientSettingsStore;\n    protected readonly _logger = new Logger(\"OidcClient\");\n\n    public readonly metadataService: MetadataService;\n    protected readonly _claimsService: ClaimsService;\n    protected readonly _validator: ResponseValidator;\n    protected readonly _tokenClient: TokenClient;\n\n    public constructor(settings: OidcClientSettings);\n    public constructor(settings: OidcClientSettingsStore, metadataService: MetadataService);\n    public constructor(settings: OidcClientSettings | OidcClientSettingsStore, metadataService?: MetadataService) {\n        this.settings = settings instanceof OidcClientSettingsStore ? settings : new OidcClientSettingsStore(settings);\n\n        this.metadataService = metadataService ?? new MetadataService(this.settings);\n        this._claimsService = new ClaimsService(this.settings);\n        this._validator = new ResponseValidator(this.settings, this.metadataService, this._claimsService);\n        this._tokenClient = new TokenClient(this.settings, this.metadataService);\n    }\n\n    public async createSigninRequest({\n        state,\n        request,\n        request_uri,\n        request_type,\n        id_token_hint,\n        login_hint,\n        skipUserInfo,\n        nonce,\n        url_state,\n        response_type = this.settings.response_type,\n        scope = this.settings.scope,\n        redirect_uri = this.settings.redirect_uri,\n        prompt = this.settings.prompt,\n        display = this.settings.display,\n        max_age = this.settings.max_age,\n        ui_locales = this.settings.ui_locales,\n        acr_values = this.settings.acr_values,\n        resource = this.settings.resource,\n        response_mode = this.settings.response_mode,\n        extraQueryParams = this.settings.extraQueryParams,\n        extraTokenParams = this.settings.extraTokenParams,\n        dpopJkt,\n        omitScopeWhenRequesting = this.settings.omitScopeWhenRequesting,\n    }: CreateSigninRequestArgs): Promise<SigninRequest> {\n        const logger = this._logger.create(\"createSigninRequest\");\n\n        if (response_type !== \"code\") {\n            throw new Error(\"Only the Authorization Code flow (with PKCE) is supported\");\n        }\n\n        const url = await this.metadataService.getAuthorizationEndpoint();\n        logger.debug(\"Received authorization endpoint\", url);\n\n        const signinRequest = await SigninRequest.create({\n            url,\n            authority: this.settings.authority,\n            client_id: this.settings.client_id,\n            redirect_uri,\n            response_type,\n            scope,\n            state_data: state,\n            url_state,\n            prompt, display, max_age, ui_locales, id_token_hint, login_hint, acr_values, dpopJkt,\n            resource, request, request_uri, extraQueryParams, extraTokenParams, request_type, response_mode,\n            client_secret: this.settings.client_secret,\n            skipUserInfo,\n            nonce,\n            disablePKCE: this.settings.disablePKCE,\n            omitScopeWhenRequesting,\n        });\n\n        // house cleaning\n        await this.clearStaleState();\n\n        const signinState = signinRequest.state;\n        await this.settings.stateStore.set(signinState.id, signinState.toStorageString());\n        return signinRequest;\n    }\n\n    public async readSigninResponseState(url: string, removeState = false): Promise<{ state: SigninState; response: SigninResponse }> {\n        const logger = this._logger.create(\"readSigninResponseState\");\n\n        const response = new SigninResponse(UrlUtils.readParams(url, this.settings.response_mode));\n        if (!response.state) {\n            logger.throw(new Error(\"No state in response\"));\n            // need to throw within this function's body for type narrowing to work\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        const storedStateString = await this.settings.stateStore[removeState ? \"remove\" : \"get\"](response.state);\n        if (!storedStateString) {\n            logger.throw(new Error(\"No matching state found in storage\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        const state = await SigninState.fromStorageString(storedStateString);\n        return { state, response };\n    }\n\n    public async processSigninResponse(url: string, extraHeaders?: Record<string, ExtraHeader>, removeState = true): Promise<SigninResponse> {\n        const logger = this._logger.create(\"processSigninResponse\");\n\n        const { state, response } = await this.readSigninResponseState(url, removeState);\n        logger.debug(\"received state from storage; validating response\");\n\n        if (this.settings.dpop && this.settings.dpop.store) {\n            const dpopProof = await this.getDpopProof(this.settings.dpop.store);\n            extraHeaders = { ...extraHeaders, \"DPoP\": dpopProof };\n        }\n\n        /**\n         * The DPoP spec describes a method for Authorization Servers to supply a nonce value\n         * in order to limit the lifetime of a given DPoP proof.\n         * See https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n         * This involves the AS returning a 400 bad request with a DPoP-Nonce header containing\n         * the nonce value. The client must then retry the request with a recomputed DPoP proof\n         * containing the supplied nonce value.\n         */\n        try {\n            await this._validator.validateSigninResponse(response, state, extraHeaders);\n        }\n        catch (err) {\n            if (err instanceof ErrorDPoPNonce && this.settings.dpop) {\n                const dpopProof = await this.getDpopProof(this.settings.dpop.store, err.nonce);\n                extraHeaders![\"DPoP\"] = dpopProof;\n                await this._validator.validateSigninResponse(response, state, extraHeaders);\n            } else {\n                throw err;\n            }\n        }\n\n        return response;\n    }\n\n    async getDpopProof(dpopStore: DPoPStore, nonce?: string): Promise<string> {\n        let keyPair: CryptoKeyPair;\n        let dpopState: DPoPState;\n\n        if (!(await dpopStore.getAllKeys()).includes(this.settings.client_id)) {\n            keyPair = await CryptoUtils.generateDPoPKeys();\n            dpopState = new DPoPState(keyPair, nonce);\n            await dpopStore.set(this.settings.client_id, dpopState);\n        } else {\n            dpopState = await dpopStore.get(this.settings.client_id);\n\n            // if the server supplied nonce has changed since the last request, update the nonce\n            if (dpopState.nonce !== nonce && nonce) {\n                dpopState.nonce = nonce;\n                await dpopStore.set(this.settings.client_id, dpopState);\n            }\n        }\n\n        return await CryptoUtils.generateDPoPProof({\n            url: await this.metadataService.getTokenEndpoint(false),\n            httpMethod: \"POST\",\n            keyPair: dpopState.keys,\n            nonce: dpopState.nonce,\n        });\n    }\n\n    public async processResourceOwnerPasswordCredentials({\n        username,\n        password,\n        skipUserInfo = false,\n        extraTokenParams = {},\n    }: ProcessResourceOwnerPasswordCredentialsArgs): Promise<SigninResponse> {\n        const tokenResponse: Record<string, unknown> = await this._tokenClient.exchangeCredentials({ username, password, ...extraTokenParams });\n        const signinResponse: SigninResponse = new SigninResponse(new URLSearchParams());\n        Object.assign(signinResponse, tokenResponse);\n        await this._validator.validateCredentialsResponse(signinResponse, skipUserInfo);\n        return signinResponse;\n    }\n\n    public async useRefreshToken({\n        state,\n        redirect_uri,\n        resource,\n        timeoutInSeconds,\n        extraHeaders,\n        extraTokenParams,\n    }: UseRefreshTokenArgs): Promise<SigninResponse> {\n        const logger = this._logger.create(\"useRefreshToken\");\n\n        // https://github.com/authts/oidc-client-ts/issues/695\n        // In some cases (e.g. AzureAD), not all granted scopes are allowed on token refresh requests.\n        // Therefore, we filter all granted scopes by a list of allowable scopes.\n        let scope;\n        if (this.settings.refreshTokenAllowedScope === undefined) {\n            scope = state.scope;\n        } else {\n            const allowableScopes = this.settings.refreshTokenAllowedScope.split(\" \");\n            const providedScopes = state.scope?.split(\" \") || [];\n\n            scope = providedScopes.filter(s => allowableScopes.includes(s)).join(\" \");\n        }\n\n        if (this.settings.dpop && this.settings.dpop.store) {\n            const dpopProof = await this.getDpopProof(this.settings.dpop.store);\n            extraHeaders = { ...extraHeaders, \"DPoP\": dpopProof };\n        }\n\n        /**\n         * The DPoP spec describes a method for Authorization Servers to supply a nonce value\n         * in order to limit the lifetime of a given DPoP proof.\n         * See https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n         * This involves the AS returning a 400 bad request with a DPoP-Nonce header containing\n         * the nonce value. The client must then retry the request with a recomputed DPoP proof\n         * containing the supplied nonce value.\n         */\n        let result;\n        try {\n            result = await this._tokenClient.exchangeRefreshToken({\n                refresh_token: state.refresh_token,\n                // provide the (possible filtered) scope list\n                scope,\n                redirect_uri,\n                resource,\n                timeoutInSeconds,\n                extraHeaders,\n                ...extraTokenParams,\n            });\n        } catch (err) {\n            if (err instanceof ErrorDPoPNonce && this.settings.dpop) {\n                extraHeaders![\"DPoP\"] = await this.getDpopProof(this.settings.dpop.store, err.nonce);\n                result = await this._tokenClient.exchangeRefreshToken({\n                    refresh_token: state.refresh_token,\n                    // provide the (possible filtered) scope list\n                    scope,\n                    redirect_uri,\n                    resource,\n                    timeoutInSeconds,\n                    extraHeaders,\n                    ...extraTokenParams,\n                });\n            } else {\n                throw err;\n            }\n        }\n\n        const response = new SigninResponse(new URLSearchParams());\n        Object.assign(response, result);\n        logger.debug(\"validating response\", response);\n        await this._validator.validateRefreshResponse(response, {\n            ...state,\n            // override the scope in the state handed over to the validator\n            // so it can set the granted scope to the requested scope in case none is included in the response\n            scope,\n        });\n        return response;\n    }\n\n    public async createSignoutRequest({\n        state,\n        id_token_hint,\n        client_id,\n        request_type,\n        url_state,\n        post_logout_redirect_uri = this.settings.post_logout_redirect_uri,\n        extraQueryParams = this.settings.extraQueryParams,\n    }: CreateSignoutRequestArgs = {}): Promise<SignoutRequest> {\n        const logger = this._logger.create(\"createSignoutRequest\");\n\n        const url = await this.metadataService.getEndSessionEndpoint();\n        if (!url) {\n            logger.throw(new Error(\"No end session endpoint\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        logger.debug(\"Received end session endpoint\", url);\n\n        // specify the client identifier when post_logout_redirect_uri is used but id_token_hint is not\n        if (!client_id && post_logout_redirect_uri && !id_token_hint) {\n            client_id = this.settings.client_id;\n        }\n\n        const request = new SignoutRequest({\n            url,\n            id_token_hint,\n            client_id,\n            post_logout_redirect_uri,\n            state_data: state,\n            extraQueryParams,\n            request_type,\n            url_state,\n        });\n\n        // house cleaning\n        await this.clearStaleState();\n\n        const signoutState = request.state;\n        if (signoutState) {\n            logger.debug(\"Signout request has state to persist\");\n            await this.settings.stateStore.set(signoutState.id, signoutState.toStorageString());\n        }\n\n        return request;\n    }\n\n    public async readSignoutResponseState(url: string, removeState = false): Promise<{ state: State | undefined; response: SignoutResponse }> {\n        const logger = this._logger.create(\"readSignoutResponseState\");\n\n        const response = new SignoutResponse(UrlUtils.readParams(url, this.settings.response_mode));\n        if (!response.state) {\n            logger.debug(\"No state in response\");\n\n            if (response.error) {\n                logger.warn(\"Response was error:\", response.error);\n                throw new ErrorResponse(response);\n            }\n\n            return { state: undefined, response };\n        }\n\n        const storedStateString = await this.settings.stateStore[removeState ? \"remove\" : \"get\"](response.state);\n        if (!storedStateString) {\n            logger.throw(new Error(\"No matching state found in storage\"));\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw null; // https://github.com/microsoft/TypeScript/issues/46972\n        }\n\n        const state = await State.fromStorageString(storedStateString);\n        return { state, response };\n    }\n\n    public async processSignoutResponse(url: string): Promise<SignoutResponse> {\n        const logger = this._logger.create(\"processSignoutResponse\");\n\n        const { state, response } = await this.readSignoutResponseState(url, true);\n        if (state) {\n            logger.debug(\"Received state from storage; validating response\");\n            this._validator.validateSignoutResponse(response, state);\n        } else {\n            logger.debug(\"No state from storage; skipping response validation\");\n        }\n\n        return response;\n    }\n\n    public clearStaleState(): Promise<void> {\n        this._logger.create(\"clearStaleState\");\n        return State.clearStaleState(this.settings.stateStore, this.settings.staleStateAgeInSeconds);\n    }\n\n    public async revokeToken(token: string, type?: \"access_token\" | \"refresh_token\"): Promise<void> {\n        this._logger.create(\"revokeToken\");\n        return await this._tokenClient.revoke({\n            token,\n            token_type_hint: type,\n        });\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"./utils\";\nimport { CheckSessionIFrame } from \"./CheckSessionIFrame\";\nimport type { UserManager } from \"./UserManager\";\nimport type { User } from \"./User\";\n\n/**\n * @public\n */\nexport class SessionMonitor {\n    private readonly _logger = new Logger(\"SessionMonitor\");\n\n    private _sub: string | undefined;\n    private _checkSessionIFrame?: CheckSessionIFrame;\n\n    public constructor(private readonly _userManager: UserManager) {\n        if (!_userManager) {\n            this._logger.throw(new Error(\"No user manager passed\"));\n        }\n\n        this._userManager.events.addUserLoaded(this._start);\n        this._userManager.events.addUserUnloaded(this._stop);\n\n        this._init().catch((err: unknown) => {\n            // catch to suppress errors since we're in a ctor\n            this._logger.error(err);\n        });\n    }\n\n    protected async _init(): Promise<void> {\n        this._logger.create(\"_init\");\n        const user = await this._userManager.getUser();\n        // doing this manually here since calling getUser\n        // doesn't trigger load event.\n        if (user) {\n            void this._start(user);\n        }\n        else if (this._userManager.settings.monitorAnonymousSession) {\n            const session = await this._userManager.querySessionStatus();\n            if (session) {\n                const tmpUser = {\n                    session_state: session.session_state,\n                    profile: session.sub ? {\n                        sub: session.sub,\n                    } : null,\n                };\n                void this._start(tmpUser);\n            }\n        }\n    }\n\n    protected _start = async (\n        user: User | {\n            session_state: string;\n            profile: { sub: string } | null;\n        },\n    ): Promise<void> => {\n        const session_state = user.session_state;\n        if (!session_state) {\n            return;\n        }\n        const logger = this._logger.create(\"_start\");\n\n        if (user.profile) {\n            this._sub = user.profile.sub;\n            logger.debug(\"session_state\", session_state, \", sub\", this._sub);\n        }\n        else {\n            this._sub = undefined;\n            logger.debug(\"session_state\", session_state, \", anonymous user\");\n        }\n\n        if (this._checkSessionIFrame) {\n            this._checkSessionIFrame.start(session_state);\n            return;\n        }\n\n        try {\n            const url = await this._userManager.metadataService.getCheckSessionIframe();\n            if (url) {\n                logger.debug(\"initializing check session iframe\");\n\n                const client_id = this._userManager.settings.client_id;\n                const intervalInSeconds = this._userManager.settings.checkSessionIntervalInSeconds;\n                const stopOnError = this._userManager.settings.stopCheckSessionOnError;\n\n                const checkSessionIFrame = new CheckSessionIFrame(this._callback, client_id, url, intervalInSeconds, stopOnError);\n                await checkSessionIFrame.load();\n                this._checkSessionIFrame = checkSessionIFrame;\n                checkSessionIFrame.start(session_state);\n            }\n            else {\n                logger.warn(\"no check session iframe found in the metadata\");\n            }\n        }\n        catch (err) {\n            // catch to suppress errors since we're in non-promise callback\n            logger.error(\"Error from getCheckSessionIframe:\", err instanceof Error ? err.message : err);\n        }\n    };\n\n    protected _stop = (): void => {\n        const logger = this._logger.create(\"_stop\");\n        this._sub = undefined;\n\n        if (this._checkSessionIFrame) {\n            this._checkSessionIFrame.stop();\n        }\n\n        if (this._userManager.settings.monitorAnonymousSession) {\n            // using a timer to delay re-initialization to avoid race conditions during signout\n            // TODO rewrite to use promise correctly\n            // eslint-disable-next-line @typescript-eslint/no-misused-promises\n            const timerHandle = setInterval(async () => {\n                clearInterval(timerHandle);\n\n                try {\n                    const session = await this._userManager.querySessionStatus();\n                    if (session) {\n                        const tmpUser = {\n                            session_state: session.session_state,\n                            profile: session.sub ? {\n                                sub: session.sub,\n                            } : null,\n                        };\n                        void this._start(tmpUser);\n                    }\n                }\n                catch (err) {\n                    // catch to suppress errors since we're in a callback\n                    logger.error(\"error from querySessionStatus\", err instanceof Error ? err.message : err);\n                }\n            }, 1000);\n        }\n    };\n\n    protected _callback = async (): Promise<void> => {\n        const logger = this._logger.create(\"_callback\");\n        try {\n            const session = await this._userManager.querySessionStatus();\n            let raiseEvent = true;\n\n            if (session && this._checkSessionIFrame) {\n                if (session.sub === this._sub) {\n                    raiseEvent = false;\n                    this._checkSessionIFrame.start(session.session_state);\n\n                    logger.debug(\"same sub still logged in at OP, session state has changed, restarting check session iframe; session_state\", session.session_state);\n                    await this._userManager.events._raiseUserSessionChanged();\n                }\n                else {\n                    logger.debug(\"different subject signed into OP\", session.sub);\n                }\n            }\n            else {\n                logger.debug(\"subject no longer signed into OP\");\n            }\n\n            if (raiseEvent) {\n                if (this._sub) {\n                    await this._userManager.events._raiseUserSignedOut();\n                }\n                else {\n                    await this._userManager.events._raiseUserSignedIn();\n                }\n            } else {\n                logger.debug(\"no change in session detected, no event to raise\");\n            }\n        }\n        catch (err) {\n            if (this._sub) {\n                logger.debug(\"Error calling queryCurrentSigninSession; raising signed out event\", err);\n                await this._userManager.events._raiseUserSignedOut();\n            }\n        }\n    };\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, Timer } from \"./utils\";\nimport type { IdTokenClaims } from \"./Claims\";\n\n/**\n * Holds claims represented by a combination of the `id_token` and the user info endpoint.\n *\n * @public\n */\nexport type UserProfile = IdTokenClaims;\n\n/**\n * @public\n */\nexport class User {\n    /**\n     * A JSON Web Token (JWT). Only provided if `openid` scope was requested.\n     * The application can access the data decoded by using the `profile` property.\n     */\n    public id_token?: string;\n\n    /** The session state value returned from the OIDC provider. */\n    public session_state: string | null;\n\n    /**\n     * The requested access token returned from the OIDC provider. The application can use this token to\n     * authenticate itself to the secured resource.\n     */\n    public access_token: string;\n\n    /**\n     * An OAuth 2.0 refresh token. The app can use this token to acquire additional access tokens after the\n     * current access token expires. Refresh tokens are long-lived and can be used to maintain access to resources\n     * for extended periods of time.\n     */\n    public refresh_token?: string;\n\n    /** Typically \"Bearer\" */\n    public token_type: string;\n\n    /** The scopes that the requested access token is valid for. */\n    public scope?: string;\n\n    /** The claims represented by a combination of the `id_token` and the user info endpoint. */\n    public profile: UserProfile;\n\n    /** The expires at returned from the OIDC provider. */\n    public expires_at?: number;\n\n    /** custom state data set during the initial signin request */\n    public readonly state: unknown;\n    public readonly url_state?: string;\n\n    public constructor(args: {\n        id_token?: string;\n        session_state?: string | null;\n        access_token: string;\n        refresh_token?: string;\n        token_type: string;\n        scope?: string;\n        profile: UserProfile;\n        expires_at?: number;\n        userState?: unknown;\n        url_state?: string;\n    }) {\n        this.id_token = args.id_token;\n        this.session_state = args.session_state ?? null;\n        this.access_token = args.access_token;\n        this.refresh_token = args.refresh_token;\n\n        this.token_type = args.token_type;\n        this.scope = args.scope;\n        this.profile = args.profile;\n        this.expires_at = args.expires_at;\n        this.state = args.userState;\n        this.url_state = args.url_state;\n    }\n\n    /** Computed number of seconds the access token has remaining. */\n    public get expires_in(): number | undefined {\n        if (this.expires_at === undefined) {\n            return undefined;\n        }\n        return this.expires_at - Timer.getEpochTime();\n    }\n\n    public set expires_in(value: number | undefined) {\n        if (value !== undefined) {\n            this.expires_at = Math.floor(value) + Timer.getEpochTime();\n        }\n    }\n\n    /** Computed value indicating if the access token is expired. */\n    public get expired(): boolean | undefined {\n        const expires_in = this.expires_in;\n        if (expires_in === undefined) {\n            return undefined;\n        }\n        return expires_in <= 0;\n    }\n\n    /** Array representing the parsed values from the `scope`. */\n    public get scopes(): string[] {\n        return this.scope?.split(\" \") ?? [];\n    }\n\n    public toStorageString(): string {\n        new Logger(\"User\").create(\"toStorageString\");\n        return JSON.stringify({\n            id_token: this.id_token,\n            session_state: this.session_state,\n            access_token: this.access_token,\n            refresh_token: this.refresh_token,\n            token_type: this.token_type,\n            scope: this.scope,\n            profile: this.profile,\n            expires_at: this.expires_at,\n        });\n    }\n\n    public static fromStorageString(storageString: string): User {\n        Logger.createStatic(\"User\", \"fromStorageString\");\n        return new User(JSON.parse(storageString));\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Event, Logger, UrlUtils } from \"../utils\";\nimport type { IWindow, NavigateParams, NavigateResponse } from \"./IWindow\";\n\nconst messageSource = \"oidc-client\";\n\ninterface MessageData {\n    source: string;\n    url: string;\n    keepOpen: boolean;\n}\n\n/**\n * Window implementation which resolves via communication from a child window\n * via the `Window.postMessage()` interface.\n *\n * @internal\n */\nexport abstract class AbstractChildWindow implements IWindow {\n    protected abstract readonly _logger: Logger;\n    protected readonly _abort = new Event<[reason: Error]>(\"Window navigation aborted\");\n    protected readonly _disposeHandlers = new Set<() => void>();\n\n    protected _window: WindowProxy | null = null;\n\n    public async navigate(params: NavigateParams): Promise<NavigateResponse> {\n        const logger = this._logger.create(\"navigate\");\n        if (!this._window) {\n            throw new Error(\"Attempted to navigate on a disposed window\");\n        }\n\n        logger.debug(\"setting URL in window\");\n        this._window.location.replace(params.url);\n\n        const { url, keepOpen } = await new Promise<MessageData>((resolve, reject) => {\n            const listener = (e: MessageEvent) => {\n                const data: MessageData | undefined = e.data;\n                const origin = params.scriptOrigin ?? window.location.origin;\n                if (e.origin !== origin || data?.source !== messageSource) {\n                    // silently discard events not intended for us\n                    return;\n                }\n                try {\n                    const state = UrlUtils.readParams(data.url, params.response_mode).get(\"state\");\n                    if (!state) {\n                        logger.warn(\"no state found in response url\");\n                    }\n                    if (e.source !== this._window && state !== params.state) {\n                        // MessageEvent source is a relatively modern feature, we can't rely on it\n                        // so we also inspect the payload for a matching state key as an alternative\n                        return;\n                    }\n                }\n                catch {\n                    this._dispose();\n                    reject(new Error(\"Invalid response from window\"));\n                }\n                resolve(data);\n            };\n            window.addEventListener(\"message\", listener, false);\n            this._disposeHandlers.add(() => window.removeEventListener(\"message\", listener, false));\n            const channel = new BroadcastChannel(`oidc-client-popup-${params.state}`);\n            channel.addEventListener(\"message\", listener, false);\n            this._disposeHandlers.add(() => channel.close());\n            this._disposeHandlers.add(this._abort.addHandler((reason) => {\n                this._dispose();\n                reject(reason);\n            }));\n        });\n        logger.debug(\"got response from window\");\n        this._dispose();\n\n        if (!keepOpen) {\n            this.close();\n        }\n\n        return { url };\n    }\n\n    public abstract close(): void;\n\n    private _dispose(): void {\n        this._logger.create(\"_dispose\");\n\n        for (const dispose of this._disposeHandlers) {\n            dispose();\n        }\n        this._disposeHandlers.clear();\n    }\n\n    protected static _notifyParent(parent: Window | null, url: string, keepOpen = false, targetOrigin = window.location.origin): void {\n        const msgData: MessageData = {\n            source: messageSource,\n            url,\n            keepOpen,\n        };\n        const logger = new Logger(\"_notifyParent\");\n        if (parent) {\n            logger.debug(\"With parent. Using parent.postMessage.\");\n            parent.postMessage(msgData, targetOrigin);\n        } else {\n            logger.debug(\"No parent. Using BroadcastChannel.\");\n            const state = new URL(url).searchParams.get(\"state\");\n            if (!state) {\n                throw new Error(\"No parent and no state in URL. Can't complete notification.\");\n            }\n            const channel = new BroadcastChannel(`oidc-client-popup-${state}`);\n            channel.postMessage(msgData);\n            channel.close();\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { type OidcClientSettings, OidcClientSettingsStore } from \"./OidcClientSettings\";\nimport type { PopupWindowFeatures } from \"./utils/PopupUtils\";\nimport { WebStorageStateStore } from \"./WebStorageStateStore\";\nimport { InMemoryWebStorage } from \"./InMemoryWebStorage\";\nimport type { StateStore } from \"./StateStore\";\n\nexport const DefaultPopupWindowFeatures: PopupWindowFeatures = {\n    location: false,\n    toolbar: false,\n    height: 640,\n    closePopupWindowAfterInSeconds: -1,\n};\nexport const DefaultPopupTarget = \"_blank\";\nconst DefaultAccessTokenExpiringNotificationTimeInSeconds = 60;\nconst DefaultCheckSessionIntervalInSeconds = 2;\nexport const DefaultSilentRequestTimeoutInSeconds = 10;\n\n/**\n * The settings used to configure the {@link UserManager}.\n *\n * @public\n */\nexport interface UserManagerSettings extends OidcClientSettings {\n    /** The URL for the page containing the call to signinPopupCallback to handle the callback from the OIDC/OAuth2 */\n    popup_redirect_uri?: string;\n    popup_post_logout_redirect_uri?: string;\n    /**\n     * The features parameter to window.open for the popup signin window. By default, the popup is\n     * placed centered in front of the window opener.\n     * (default: \\{ location: false, menubar: false, height: 640, closePopupWindowAfterInSeconds: -1 \\})\n     */\n    popupWindowFeatures?: PopupWindowFeatures;\n    /** The target parameter to window.open for the popup signin window (default: \"_blank\") */\n    popupWindowTarget?: string;\n    /** The methods window.location method used to redirect (default: \"assign\") */\n    redirectMethod?: \"replace\" | \"assign\";\n    /** The methods target window being redirected (default: \"self\") */\n    redirectTarget?: \"top\" | \"self\";\n\n    /** The target to pass while calling postMessage inside iframe for callback (default: window.location.origin) */\n    iframeNotifyParentOrigin?: string;\n\n    /** The script origin to check during 'message' callback execution while performing silent auth via iframe (default: window.location.origin) */\n    iframeScriptOrigin?: string;\n\n    /** The URL for the page containing the code handling the silent renew */\n    silent_redirect_uri?: string;\n    /** Number of seconds to wait for the silent renew to return before assuming it has failed or timed out (default: 10) */\n    silentRequestTimeoutInSeconds?: number;\n    /** Flag to indicate if there should be an automatic attempt to renew the access token prior to its expiration. The automatic renew attempt starts 1 minute before the access token expires (default: true) */\n    automaticSilentRenew?: boolean;\n    /** Flag to validate user.profile.sub in silent renew calls (default: true) */\n    validateSubOnSilentRenew?: boolean;\n    /** Flag to control if id_token is included as id_token_hint in silent renew calls (default: false) */\n    includeIdTokenInSilentRenew?: boolean;\n\n    /** Will raise events for when user has performed a signout at the OP (default: false) */\n    monitorSession?: boolean;\n    monitorAnonymousSession?: boolean;\n    /** Interval in seconds to check the user's session (default: 2) */\n    checkSessionIntervalInSeconds?: number;\n    query_status_response_type?: string;\n    stopCheckSessionOnError?: boolean;\n\n    /**\n     * The `token_type_hint`s to pass to the authority server by default (default: [\"access_token\", \"refresh_token\"])\n     *\n     * Token types will be revoked in the same order as they are given here.\n     */\n    revokeTokenTypes?: (\"access_token\" | \"refresh_token\")[];\n    /** Will invoke the revocation endpoint on signout if there is an access token for the user (default: false) */\n    revokeTokensOnSignout?: boolean;\n    /** Flag to control if id_token is included as id_token_hint in silent signout calls (default: false) */\n    includeIdTokenInSilentSignout?: boolean;\n\n    /** The number of seconds before an access token is to expire to raise the accessTokenExpiring event (default: 60) */\n    accessTokenExpiringNotificationTimeInSeconds?: number;\n\n    /**\n     * Maximum number of timeout retries before raising silentRenewError event.\n     * Set to 0 to fail immediately on timeout.\n     * Undefined means infinite retries (maintains backward compatibility, default behavior).\n     */\n    maxSilentRenewTimeoutRetries?: number;\n\n    /**\n     * Storage object used to persist User for currently authenticated user (default: window.sessionStorage, InMemoryWebStorage iff no window).\n     *  E.g. `userStore: new WebStorageStateStore({ store: window.localStorage })`\n     */\n    userStore?: StateStore;\n}\n\n/**\n * The settings with defaults applied of the {@link UserManager}.\n * @see {@link UserManagerSettings}\n *\n * @public\n */\nexport class UserManagerSettingsStore extends OidcClientSettingsStore {\n    public readonly popup_redirect_uri: string;\n    public readonly popup_post_logout_redirect_uri: string | undefined;\n    public readonly popupWindowFeatures: PopupWindowFeatures;\n    public readonly popupWindowTarget: string;\n    public readonly redirectMethod: \"replace\" | \"assign\";\n    public readonly redirectTarget: \"top\" | \"self\";\n\n    public readonly iframeNotifyParentOrigin: string | undefined;\n    public readonly iframeScriptOrigin: string | undefined;\n\n    public readonly silent_redirect_uri: string;\n    public readonly silentRequestTimeoutInSeconds: number;\n    public readonly automaticSilentRenew: boolean;\n    public readonly validateSubOnSilentRenew: boolean;\n    public readonly includeIdTokenInSilentRenew: boolean;\n\n    public readonly monitorSession: boolean;\n    public readonly monitorAnonymousSession: boolean;\n    public readonly checkSessionIntervalInSeconds: number;\n    public readonly query_status_response_type: string;\n    public readonly stopCheckSessionOnError: boolean;\n\n    public readonly revokeTokenTypes: (\"access_token\" | \"refresh_token\")[];\n    public readonly revokeTokensOnSignout: boolean;\n    public readonly includeIdTokenInSilentSignout: boolean;\n\n    public readonly accessTokenExpiringNotificationTimeInSeconds: number;\n    public readonly maxSilentRenewTimeoutRetries?: number;\n\n    public readonly userStore: StateStore;\n\n    public constructor(args: UserManagerSettings) {\n        const {\n            popup_redirect_uri = args.redirect_uri,\n            popup_post_logout_redirect_uri = args.post_logout_redirect_uri,\n            popupWindowFeatures = DefaultPopupWindowFeatures,\n            popupWindowTarget = DefaultPopupTarget,\n            redirectMethod = \"assign\",\n            redirectTarget = \"self\",\n\n            iframeNotifyParentOrigin = args.iframeNotifyParentOrigin,\n            iframeScriptOrigin = args.iframeScriptOrigin,\n\n            requestTimeoutInSeconds,\n            silent_redirect_uri = args.redirect_uri,\n            silentRequestTimeoutInSeconds,\n            automaticSilentRenew = true,\n            validateSubOnSilentRenew = true,\n            includeIdTokenInSilentRenew = false,\n\n            monitorSession = false,\n            monitorAnonymousSession = false,\n            checkSessionIntervalInSeconds = DefaultCheckSessionIntervalInSeconds,\n            query_status_response_type = \"code\",\n            stopCheckSessionOnError = true,\n\n            revokeTokenTypes = [\"access_token\", \"refresh_token\"],\n            revokeTokensOnSignout = false,\n            includeIdTokenInSilentSignout = false,\n\n            accessTokenExpiringNotificationTimeInSeconds = DefaultAccessTokenExpiringNotificationTimeInSeconds,\n\n            maxSilentRenewTimeoutRetries,\n\n            userStore,\n        } = args;\n\n        super(args);\n\n        this.popup_redirect_uri = popup_redirect_uri;\n        this.popup_post_logout_redirect_uri = popup_post_logout_redirect_uri;\n        this.popupWindowFeatures = popupWindowFeatures;\n        this.popupWindowTarget = popupWindowTarget;\n        this.redirectMethod = redirectMethod;\n        this.redirectTarget = redirectTarget;\n\n        this.iframeNotifyParentOrigin = iframeNotifyParentOrigin;\n        this.iframeScriptOrigin = iframeScriptOrigin;\n\n        this.silent_redirect_uri = silent_redirect_uri;\n        this.silentRequestTimeoutInSeconds = silentRequestTimeoutInSeconds || requestTimeoutInSeconds || DefaultSilentRequestTimeoutInSeconds;\n        this.automaticSilentRenew = automaticSilentRenew;\n        this.validateSubOnSilentRenew = validateSubOnSilentRenew;\n        this.includeIdTokenInSilentRenew = includeIdTokenInSilentRenew;\n\n        this.monitorSession = monitorSession;\n        this.monitorAnonymousSession = monitorAnonymousSession;\n        this.checkSessionIntervalInSeconds = checkSessionIntervalInSeconds;\n        this.stopCheckSessionOnError = stopCheckSessionOnError;\n        this.query_status_response_type = query_status_response_type;\n\n        this.revokeTokenTypes = revokeTokenTypes;\n        this.revokeTokensOnSignout = revokeTokensOnSignout;\n        this.includeIdTokenInSilentSignout = includeIdTokenInSilentSignout;\n\n        this.accessTokenExpiringNotificationTimeInSeconds = accessTokenExpiringNotificationTimeInSeconds;\n        this.maxSilentRenewTimeoutRetries = maxSilentRenewTimeoutRetries;\n\n        if (userStore) {\n            this.userStore = userStore;\n        }\n        else {\n            const store = typeof window !== \"undefined\" ? window.sessionStorage : new InMemoryWebStorage();\n            this.userStore = new WebStorageStateStore({ store });\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"../utils\";\nimport { ErrorTimeout } from \"../errors\";\nimport type { NavigateParams, NavigateResponse } from \"./IWindow\";\nimport { AbstractChildWindow } from \"./AbstractChildWindow\";\nimport { DefaultSilentRequestTimeoutInSeconds } from \"../UserManagerSettings\";\n\n/**\n * @public\n */\nexport interface IFrameWindowParams {\n    silentRequestTimeoutInSeconds?: number;\n}\n\n/**\n * @internal\n */\nexport class IFrameWindow extends AbstractChildWindow {\n    protected readonly _logger = new Logger(\"IFrameWindow\");\n    private _frame: HTMLIFrameElement | null;\n    private _timeoutInSeconds: number;\n\n    public constructor({\n        silentRequestTimeoutInSeconds = DefaultSilentRequestTimeoutInSeconds,\n    }: IFrameWindowParams) {\n        super();\n        this._timeoutInSeconds = silentRequestTimeoutInSeconds;\n\n        this._frame = IFrameWindow.createHiddenIframe();\n        this._window = this._frame.contentWindow;\n    }\n\n    private static createHiddenIframe(): HTMLIFrameElement {\n        const iframe = window.document.createElement(\"iframe\");\n\n        // shotgun approach\n        iframe.style.visibility = \"hidden\";\n        iframe.style.position = \"fixed\";\n        iframe.style.left = \"-1000px\";\n        iframe.style.top = \"0\";\n        iframe.width = \"0\";\n        iframe.height = \"0\";\n\n        window.document.body.appendChild(iframe);\n        return iframe;\n    }\n\n    public async navigate(params: NavigateParams): Promise<NavigateResponse> {\n        this._logger.debug(\"navigate: Using timeout of:\", this._timeoutInSeconds);\n        const timer = setTimeout(() => void this._abort.raise(new ErrorTimeout(\"IFrame timed out without a response\")), this._timeoutInSeconds * 1000);\n        this._disposeHandlers.add(() => clearTimeout(timer));\n\n        return await super.navigate(params);\n    }\n\n    public close(): void {\n        if (this._frame) {\n            if (this._frame.parentNode) {\n                this._frame.addEventListener(\"load\", (ev) => {\n                    const frame = ev.target as HTMLIFrameElement;\n                    frame.parentNode?.removeChild(frame);\n                    void this._abort.raise(new Error(\"IFrame removed from DOM\"));\n                }, true);\n                this._frame.contentWindow?.location.replace(\"about:blank\");\n            }\n            this._frame = null;\n        }\n        this._window = null;\n    }\n\n    public static notifyParent(url: string, targetOrigin?: string): void {\n        return super._notifyParent(window.parent, url, false, targetOrigin);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"../utils\";\nimport type { UserManagerSettingsStore } from \"../UserManagerSettings\";\nimport { IFrameWindow, type IFrameWindowParams } from \"./IFrameWindow\";\nimport type { INavigator } from \"./INavigator\";\n\n/**\n * @internal\n */\nexport class IFrameNavigator implements INavigator {\n    private readonly _logger = new Logger(\"IFrameNavigator\");\n\n    constructor(private _settings: UserManagerSettingsStore) {}\n\n    public async prepare({\n        silentRequestTimeoutInSeconds = this._settings.silentRequestTimeoutInSeconds,\n    }: IFrameWindowParams): Promise<IFrameWindow> {\n        return new IFrameWindow({ silentRequestTimeoutInSeconds });\n    }\n\n    public async callback(url: string): Promise<void> {\n        this._logger.create(\"callback\");\n        IFrameWindow.notifyParent(url, this._settings.iframeNotifyParentOrigin);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, PopupUtils, type PopupWindowFeatures } from \"../utils\";\nimport { DefaultPopupWindowFeatures, DefaultPopupTarget } from \"../UserManagerSettings\";\nimport { AbstractChildWindow } from \"./AbstractChildWindow\";\nimport type { NavigateParams, NavigateResponse } from \"./IWindow\";\n\nconst checkForPopupClosedInterval = 500;\nconst second = 1000;\n\n/**\n * @public\n */\nexport interface PopupWindowParams {\n    popupWindowFeatures?: PopupWindowFeatures;\n    popupWindowTarget?: string;\n    /** An AbortSignal to set request's signal. */\n    popupSignal?: AbortSignal | null;\n    /** Abort navigator when the popup is lost */\n    popupAbortOnClose?: boolean;\n}\n\n/**\n * @internal\n */\nexport class PopupWindow extends AbstractChildWindow {\n    protected readonly _logger = new Logger(\"PopupWindow\");\n\n    protected _window: WindowProxy | null;\n\n    protected abortOnClose: boolean;\n\n    public constructor({\n        popupWindowTarget = DefaultPopupTarget,\n        popupWindowFeatures = {},\n        popupSignal,\n        popupAbortOnClose,\n    }: PopupWindowParams) {\n        super();\n        const centeredPopup = PopupUtils.center({ ...DefaultPopupWindowFeatures, ...popupWindowFeatures });\n        this._window = window.open(undefined, popupWindowTarget, PopupUtils.serialize(centeredPopup));\n        this.abortOnClose = Boolean(popupAbortOnClose);\n\n        if (popupSignal) {\n            popupSignal.addEventListener(\"abort\", () => {\n                void this._abort.raise(new Error(popupSignal.reason ?? \"Popup aborted\"));\n            });\n        }\n\n        if (popupWindowFeatures.closePopupWindowAfterInSeconds && popupWindowFeatures.closePopupWindowAfterInSeconds > 0) {\n            setTimeout(() => {\n                if (!this._window || typeof this._window.closed !== \"boolean\" || this._window.closed) {\n                    void this._abort.raise(new Error(\"Popup blocked by user\"));\n                    return;\n                }\n\n                this.close();\n            }, popupWindowFeatures.closePopupWindowAfterInSeconds * second);\n        }\n    }\n\n    public async navigate(params: NavigateParams): Promise<NavigateResponse> {\n        this._window?.focus();\n\n        const popupClosedInterval = setInterval(() => {\n            if (!this._window || this._window.closed) {\n                this._logger.debug(\"Popup closed by user or isolated by redirect\");\n                clearPopupClosedInterval();\n                this._disposeHandlers.delete(clearPopupClosedInterval);\n                \n                if (this.abortOnClose) {\n                    void this._abort.raise(new Error(\"Popup closed by user\"));\n                }\n            }\n        }, checkForPopupClosedInterval);\n        const clearPopupClosedInterval = () => clearInterval(popupClosedInterval);\n        this._disposeHandlers.add(clearPopupClosedInterval);\n\n        return await super.navigate(params);\n    }\n\n    public close(): void {\n        if (this._window) {\n            if (!this._window.closed) {\n                this._window.close();\n                void this._abort.raise(new Error(\"Popup closed\"));\n            }\n        }\n        this._window = null;\n    }\n\n    public static notifyOpener(url: string, keepOpen: boolean): void {\n        super._notifyParent(window.opener, url, keepOpen);\n        if (!keepOpen && !window.opener) {\n            window.close();\n        }\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"../utils\";\nimport { PopupWindow, type PopupWindowParams } from \"./PopupWindow\";\nimport type { INavigator } from \"./INavigator\";\nimport type { UserManagerSettingsStore } from \"../UserManagerSettings\";\n\n/**\n * @internal\n */\nexport class PopupNavigator implements INavigator {\n    private readonly _logger = new Logger(\"PopupNavigator\");\n\n    constructor(private _settings: UserManagerSettingsStore) { }\n\n    public async prepare({\n        popupWindowFeatures = this._settings.popupWindowFeatures,\n        popupWindowTarget = this._settings.popupWindowTarget,\n        popupSignal,\n        popupAbortOnClose,\n    }: PopupWindowParams): Promise<PopupWindow> {\n        return new PopupWindow({\n            popupWindowFeatures,\n            popupWindowTarget,\n            popupSignal,\n            popupAbortOnClose,\n        });\n    }\n\n    public async callback(url: string, { keepOpen = false }): Promise<void> {\n        this._logger.create(\"callback\");\n\n        PopupWindow.notifyOpener(url, keepOpen);\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger } from \"../utils\";\nimport type { UserManagerSettingsStore } from \"../UserManagerSettings\";\nimport type { INavigator } from \"./INavigator\";\nimport type { IWindow, NavigateResponse } from \"./IWindow\";\n\n/**\n * @public\n */\nexport interface RedirectParams {\n    redirectMethod?: \"replace\" | \"assign\";\n    redirectTarget?: \"top\" | \"self\";\n}\n\n/**\n * @internal\n */\nexport class RedirectNavigator implements INavigator {\n    private readonly _logger = new Logger(\"RedirectNavigator\");\n\n    constructor(private _settings: UserManagerSettingsStore) {}\n\n    public async prepare({\n        redirectMethod = this._settings.redirectMethod,\n        redirectTarget = this._settings.redirectTarget,\n    }: RedirectParams): Promise<IWindow> {\n        this._logger.create(\"prepare\");\n        let targetWindow = window.self as Window;\n\n        if (redirectTarget === \"top\") {\n            targetWindow = window.top ?? window.self;\n        }\n    \n        const redirect = targetWindow.location[redirectMethod].bind(targetWindow.location) as (url: string) => void;\n        let abort: (reason: Error) => void;\n        return {\n            navigate: async (params): Promise<NavigateResponse> => {\n                this._logger.create(\"navigate\");\n                const promise = new Promise((resolve, reject) => {\n                    abort = reject;\n                    window.addEventListener(\"pageshow\", () => resolve(window.location.href));\n                    redirect(params.url);\n                });\n                return await (promise as Promise<NavigateResponse>);\n            },\n            close: () => {\n                this._logger.create(\"close\");\n                abort?.(new Error(\"Redirect aborted\"));\n                targetWindow.stop();\n            },\n        };\n    }\n\n    public async callback(): Promise<void> {\n        return;\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, Event } from \"./utils\";\nimport { AccessTokenEvents } from \"./AccessTokenEvents\";\nimport type { UserManagerSettingsStore } from \"./UserManagerSettings\";\nimport type { User } from \"./User\";\n\n/**\n * @public\n */\nexport type UserLoadedCallback = (user: User) => Promise<void> | void;\n/**\n * @public\n */\nexport type UserUnloadedCallback = () => Promise<void> | void;\n/**\n * @public\n */\nexport type SilentRenewErrorCallback = (error: Error) => Promise<void> | void;\n/**\n * @public\n */\nexport type UserSignedInCallback = () => Promise<void> | void;\n/**\n * @public\n */\nexport type UserSignedOutCallback = () => Promise<void> | void;\n/**\n * @public\n */\nexport type UserSessionChangedCallback = () => Promise<void> | void;\n\n/**\n * @public\n */\nexport class UserManagerEvents extends AccessTokenEvents {\n    protected readonly _logger = new Logger(\"UserManagerEvents\");\n\n    private readonly _userLoaded = new Event<[User]>(\"User loaded\");\n    private readonly _userUnloaded = new Event<[]>(\"User unloaded\");\n    private readonly _silentRenewError = new Event<[Error]>(\"Silent renew error\");\n    private readonly _userSignedIn = new Event<[]>(\"User signed in\");\n    private readonly _userSignedOut = new Event<[]>(\"User signed out\");\n    private readonly _userSessionChanged = new Event<[]>(\"User session changed\");\n\n    public constructor(settings: UserManagerSettingsStore) {\n        super({ expiringNotificationTimeInSeconds: settings.accessTokenExpiringNotificationTimeInSeconds });\n    }\n\n    public async load(user: User, raiseEvent=true): Promise<void> {\n        await super.load(user);\n        if (raiseEvent) {\n            await this._userLoaded.raise(user);\n        }\n    }\n\n    public async unload(): Promise<void> {\n        await super.unload();\n        await this._userUnloaded.raise();\n    }\n\n    /**\n     * Add callback: Raised when a user session has been established (or re-established).\n     */\n    public addUserLoaded(cb: UserLoadedCallback): () => void {\n        return this._userLoaded.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when a user session has been established (or re-established).\n     */\n    public removeUserLoaded(cb: UserLoadedCallback): void {\n        return this._userLoaded.removeHandler(cb);\n    }\n\n    /**\n     * Add callback: Raised when a user session has been terminated.\n     */\n    public addUserUnloaded(cb: UserUnloadedCallback): () => void {\n        return this._userUnloaded.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when a user session has been terminated.\n     */\n    public removeUserUnloaded(cb: UserUnloadedCallback): void {\n        return this._userUnloaded.removeHandler(cb);\n    }\n\n    /**\n     * Add callback: Raised when the automatic silent renew has failed.\n     */\n    public addSilentRenewError(cb: SilentRenewErrorCallback): () => void {\n        return this._silentRenewError.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when the automatic silent renew has failed.\n     */\n    public removeSilentRenewError(cb: SilentRenewErrorCallback): void {\n        return this._silentRenewError.removeHandler(cb);\n    }\n    /**\n     * @internal\n     */\n    public async _raiseSilentRenewError(e: Error): Promise<void> {\n        await this._silentRenewError.raise(e);\n    }\n\n    /**\n     * Add callback: Raised when the user is signed in (when `monitorSession` is set).\n     * @see {@link UserManagerSettings.monitorSession}\n     */\n    public addUserSignedIn(cb: UserSignedInCallback): () => void {\n        return this._userSignedIn.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when the user is signed in (when `monitorSession` is set).\n     */\n    public removeUserSignedIn(cb: UserSignedInCallback): void {\n        this._userSignedIn.removeHandler(cb);\n    }\n    /**\n     * @internal\n     */\n    public async _raiseUserSignedIn(): Promise<void> {\n        await this._userSignedIn.raise();\n    }\n\n    /**\n     * Add callback: Raised when the user's sign-in status at the OP has changed (when `monitorSession` is set).\n     * @see {@link UserManagerSettings.monitorSession}\n     */\n    public addUserSignedOut(cb: UserSignedOutCallback): () => void {\n        return this._userSignedOut.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when the user's sign-in status at the OP has changed (when `monitorSession` is set).\n     */\n    public removeUserSignedOut(cb: UserSignedOutCallback): void {\n        this._userSignedOut.removeHandler(cb);\n    }\n    /**\n     * @internal\n     */\n    public async _raiseUserSignedOut(): Promise<void> {\n        await this._userSignedOut.raise();\n    }\n\n    /**\n     * Add callback: Raised when the user session changed (when `monitorSession` is set).\n     * @see {@link UserManagerSettings.monitorSession}\n     */\n    public addUserSessionChanged(cb: UserSessionChangedCallback): () => void {\n        return this._userSessionChanged.addHandler(cb);\n    }\n    /**\n     * Remove callback: Raised when the user session changed (when `monitorSession` is set).\n     */\n    public removeUserSessionChanged(cb: UserSessionChangedCallback): void {\n        this._userSessionChanged.removeHandler(cb);\n    }\n    /**\n     * @internal\n     */\n    public async _raiseUserSessionChanged(): Promise<void> {\n        await this._userSessionChanged.raise();\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { Logger, Timer } from \"./utils\";\nimport { ErrorTimeout } from \"./errors\";\nimport type { UserManager } from \"./UserManager\";\nimport type { AccessTokenCallback } from \"./AccessTokenEvents\";\n\n/**\n * @internal\n */\nexport class SilentRenewService {\n    protected _logger = new Logger(\"SilentRenewService\");\n    private _isStarted = false;\n    private readonly _retryTimer = new Timer(\"Retry Silent Renew\");\n    private _timeoutRetryCount = 0;\n\n    public constructor(private _userManager: UserManager) {}\n\n    public async start(): Promise<void> {\n        const logger = this._logger.create(\"start\");\n        if (!this._isStarted) {\n            this._isStarted = true;\n            this._userManager.events.addAccessTokenExpiring(this._tokenExpiring);\n            this._retryTimer.addHandler(this._tokenExpiring);\n\n            // this will trigger loading of the user so the expiring events can be initialized\n            try {\n                await this._userManager.getUser();\n                // deliberate nop\n            }\n            catch (err) {\n                // catch to suppress errors since we're in a ctor\n                logger.error(\"getUser error\", err);\n            }\n        }\n    }\n\n    public stop(): void {\n        if (this._isStarted) {\n            this._retryTimer.cancel();\n            this._retryTimer.removeHandler(this._tokenExpiring);\n            this._userManager.events.removeAccessTokenExpiring(this._tokenExpiring);\n            this._isStarted = false;\n        }\n    }\n\n    protected _tokenExpiring: AccessTokenCallback = async () => {\n        const logger = this._logger.create(\"_tokenExpiring\");\n        try {\n            await this._userManager.signinSilent();\n            this._timeoutRetryCount = 0;\n            logger.debug(\"silent token renewal successful\");\n        }\n        catch (err) {\n            if (err instanceof ErrorTimeout) {\n                // Increment timeout retry counter\n                this._timeoutRetryCount++;\n\n                // Check if a max timeout retry limit is configured\n                const maxRetries = this._userManager.settings.maxSilentRenewTimeoutRetries;\n                const hasReachedLimit = maxRetries !== undefined && this._timeoutRetryCount > maxRetries;\n\n                if (hasReachedLimit) {\n                    // Limit reached: raise event to notify application and stop retrying\n                    logger.error(\n                        `Timeout retry limit reached (${this._timeoutRetryCount} > ${maxRetries}), ` +\n                        \"raising silentRenewError:\",\n                        err,\n                    );\n                    this._timeoutRetryCount = 0;\n                    await this._userManager.events._raiseSilentRenewError(err as Error);\n                    return;\n                }\n\n                // No limit configured (undefined) or limit not reached: continue retrying\n                // no response from authority server, e.g. IFrame timeout, ...\n                logger.warn(\n                    `ErrorTimeout from signinSilent (attempt ${this._timeoutRetryCount}), retry in 5s:`,\n                    err,\n                );\n                this._retryTimer.init(5);\n                return;\n            }\n\n            // Non-timeout error: reset counter and raise event immediately\n            logger.error(\"Error from signinSilent:\", err);\n            this._timeoutRetryCount = 0;\n            await this._userManager.events._raiseSilentRenewError(err as Error);\n        }\n    };\n}\n", "// Copyright (C) AuthTS Contributors\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport type { UserProfile } from \"./User\";\n\n/**\n * Fake state store implementation necessary for validating refresh token requests.\n *\n * @public\n */\nexport class RefreshState {\n    /** custom \"state\", which can be used by a caller to have \"data\" round tripped */\n    public readonly data?: unknown;\n\n    public readonly refresh_token: string;\n    public readonly id_token?: string;\n    public readonly session_state: string | null;\n    public readonly scope?: string;\n    public readonly profile: UserProfile;\n\n    constructor(args: {\n        refresh_token: string;\n        id_token?: string;\n        session_state: string | null;\n        scope?: string;\n        profile: UserProfile;\n\n        state?: unknown;\n    }) {\n        this.refresh_token = args.refresh_token;\n        this.id_token = args.id_token;\n        this.session_state = args.session_state;\n        this.scope = args.scope;\n        this.profile = args.profile;\n\n        this.data = args.state;\n\n    }\n}\n", "// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n\nimport { CryptoUtils, Logger } from \"./utils\";\nimport { ErrorResponse } from \"./errors\";\nimport { type NavigateResponse, type PopupWindowParams, type IWindow, type IFrameWindowParams, type RedirectParams, RedirectNavigator, PopupNavigator, IFrameNavigator, type INavigator } from \"./navigators\";\nimport { OidcClient, type CreateSigninRequestArgs, type CreateSignoutRequestArgs, type ProcessResourceOwnerPasswordCredentialsArgs, type UseRefreshTokenArgs } from \"./OidcClient\";\nimport { type UserManagerSettings, UserManagerSettingsStore } from \"./UserManagerSettings\";\nimport { User } from \"./User\";\nimport { UserManagerEvents } from \"./UserManagerEvents\";\nimport { SilentRenewService } from \"./SilentRenewService\";\nimport { SessionMonitor } from \"./SessionMonitor\";\nimport type { SessionStatus } from \"./SessionStatus\";\nimport type { SignoutResponse } from \"./SignoutResponse\";\nimport type { MetadataService } from \"./MetadataService\";\nimport { RefreshState } from \"./RefreshState\";\nimport type { SigninResponse } from \"./SigninResponse\";\nimport type { ExtraHeader, DPoPSettings } from \"./OidcClientSettings\";\nimport { DPoPState } from \"./DPoPStore\";\n\n/**\n * @public\n */\nexport type ExtraSigninRequestArgs = Pick<CreateSigninRequestArgs, \"nonce\" | \"extraQueryParams\" | \"extraTokenParams\" | \"state\" | \"redirect_uri\" | \"prompt\" | \"acr_values\" | \"login_hint\" | \"scope\" | \"max_age\" | \"ui_locales\" | \"resource\" | \"url_state\">;\n/**\n * @public\n */\nexport type ExtraSignoutRequestArgs = Pick<CreateSignoutRequestArgs, \"extraQueryParams\" | \"state\" | \"id_token_hint\" | \"post_logout_redirect_uri\" | \"url_state\">;\n\n/**\n * @public\n */\nexport type RevokeTokensTypes = UserManagerSettings[\"revokeTokenTypes\"];\n\n/**\n * @public\n */\nexport type SigninRedirectArgs = RedirectParams & ExtraSigninRequestArgs;\n\n/**\n * @public\n */\nexport type SigninPopupArgs = PopupWindowParams & ExtraSigninRequestArgs;\n\n/**\n * @public\n */\nexport type ExtraSignInSilentArgs = { \n    // forceIframeAuth bypasses refresh token usage and forces iframe-based silent authentication\n    forceIframeAuth?: boolean;\n};\n\n/**\n * @public\n */\nexport type SigninSilentArgs = IFrameWindowParams & ExtraSigninRequestArgs & ExtraSignInSilentArgs;\n\n/**\n * @public\n */\nexport type SigninResourceOwnerCredentialsArgs = ProcessResourceOwnerPasswordCredentialsArgs;\n\n/**\n * @public\n */\nexport type QuerySessionStatusArgs = IFrameWindowParams & ExtraSigninRequestArgs;\n\n/**\n * @public\n */\nexport type SignoutRedirectArgs = RedirectParams & ExtraSignoutRequestArgs;\n\n/**\n * @public\n */\nexport type SignoutPopupArgs = PopupWindowParams & ExtraSignoutRequestArgs;\n\n/**\n * @public\n */\nexport type SignoutSilentArgs = IFrameWindowParams & ExtraSignoutRequestArgs;\n\n/**\n * Provides a higher level API for signing a user in, signing out, managing the user's claims returned from the identity provider,\n * and managing an access token returned from the identity provider (OAuth2/OIDC).\n *\n * @public\n */\nexport class UserManager {\n    /** Get the settings used to configure the `UserManager`. */\n    public readonly settings: UserManagerSettingsStore;\n    protected readonly _logger = new Logger(\"UserManager\");\n\n    protected readonly _client: OidcClient;\n    protected readonly _redirectNavigator: INavigator;\n    protected readonly _popupNavigator: INavigator;\n    protected readonly _iframeNavigator: INavigator;\n    protected readonly _events: UserManagerEvents;\n    protected readonly _silentRenewService: SilentRenewService;\n    protected readonly _sessionMonitor: SessionMonitor | null;\n\n    public constructor(settings: UserManagerSettings, redirectNavigator?: INavigator, popupNavigator?: INavigator, iframeNavigator?: INavigator) {\n        this.settings = new UserManagerSettingsStore(settings);\n\n        this._client = new OidcClient(settings);\n\n        this._redirectNavigator = redirectNavigator ?? new RedirectNavigator(this.settings);\n        this._popupNavigator = popupNavigator ?? new PopupNavigator(this.settings);\n        this._iframeNavigator = iframeNavigator ?? new IFrameNavigator(this.settings);\n\n        this._events = new UserManagerEvents(this.settings);\n        this._silentRenewService = new SilentRenewService(this);\n\n        // order is important for the following properties; these services depend upon the events.\n        if (this.settings.automaticSilentRenew) {\n            this.startSilentRenew();\n        }\n\n        this._sessionMonitor = null;\n        if (this.settings.monitorSession) {\n            this._sessionMonitor = new SessionMonitor(this);\n        }\n    }\n\n    /**\n     * Get object used to register for events raised by the `UserManager`.\n     */\n    public get events(): UserManagerEvents {\n        return this._events;\n    }\n\n    /**\n     * Get object used to access the metadata configuration of the identity provider.\n     */\n    public get metadataService(): MetadataService {\n        return this._client.metadataService;\n    }\n\n    /**\n     * Load the `User` object for the currently authenticated user.\n     *\n     * @param raiseEvent - If `true`, the `UserLoaded` event will be raised. Defaults to false.\n     * @returns A promise\n     */\n    public async getUser(raiseEvent = false): Promise<User | null> {\n        const logger = this._logger.create(\"getUser\");\n        const user = await this._loadUser();\n        if (user) {\n            logger.info(\"user loaded\");\n            await this._events.load(user, raiseEvent);\n            return user;\n        }\n\n        logger.info(\"user not found in storage\");\n        return null;\n    }\n\n    /**\n     * Remove from any storage the currently authenticated user.\n     *\n     * @returns A promise\n     */\n    public async removeUser(): Promise<void> {\n        const logger = this._logger.create(\"removeUser\");\n        await this.storeUser(null);\n        logger.info(\"user removed from storage\");\n        await this._events.unload();\n    }\n\n    /**\n     * Trigger a redirect of the current window to the authorization endpoint.\n     *\n     * @returns A promise\n     *\n     * @throws `Error` In cases of wrong authentication.\n     */\n    public async signinRedirect(args: SigninRedirectArgs = {}): Promise<void> {\n        this._logger.create(\"signinRedirect\");\n        const {\n            redirectMethod,\n            ...requestArgs\n        } = args;\n\n        let dpopJkt: string | undefined;\n        if (this.settings.dpop?.bind_authorization_code) {\n            dpopJkt = await this.generateDPoPJkt(this.settings.dpop);\n        }\n\n        const handle = await this._redirectNavigator.prepare({ redirectMethod });\n        await this._signinStart({\n            request_type: \"si:r\",\n            dpopJkt,\n            ...requestArgs,\n        }, handle);\n    }\n\n    /**\n     * Process the response (callback) from the authorization endpoint.\n     * It is recommended to use {@link UserManager.signinCallback} instead.\n     *\n     * @returns A promise containing the authenticated `User`.\n     *\n     * @see {@link UserManager.signinCallback}\n     */\n    public async signinRedirectCallback(url = window.location.href): Promise<User> {\n        const logger = this._logger.create(\"signinRedirectCallback\");\n        const user = await this._signinEnd(url);\n        if (user.profile && user.profile.sub) {\n            logger.info(\"success, signed in subject\", user.profile.sub);\n        }\n        else {\n            logger.info(\"no subject\");\n        }\n\n        return user;\n    }\n\n    /**\n     * Trigger the signin with user/password.\n     *\n     * @returns A promise containing the authenticated `User`.\n     * @throws {@link ErrorResponse} In cases of wrong authentication.\n     */\n    public async signinResourceOwnerCredentials({\n        username,\n        password,\n        skipUserInfo = false,\n    }: SigninResourceOwnerCredentialsArgs): Promise<User> {\n        const logger = this._logger.create(\"signinResourceOwnerCredential\");\n\n        const signinResponse = await this._client.processResourceOwnerPasswordCredentials({\n            username,\n            password,\n            skipUserInfo,\n            extraTokenParams: this.settings.extraTokenParams,\n        });\n        logger.debug(\"got signin response\");\n\n        const user = await this._buildUser(signinResponse);\n        if (user.profile && user.profile.sub) {\n            logger.info(\"success, signed in subject\", user.profile.sub);\n        } else {\n            logger.info(\"no subject\");\n        }\n        return user;\n    }\n\n    /**\n     * Trigger a request (via a popup window) to the authorization endpoint.\n     *\n     * @returns A promise containing the authenticated `User`.\n     * @throws `Error` In cases of wrong authentication.\n     */\n    public async signinPopup(args: SigninPopupArgs = {}): Promise<User> {\n        const logger = this._logger.create(\"signinPopup\");\n\n        let dpopJkt: string | undefined;\n        if (this.settings.dpop?.bind_authorization_code) {\n            dpopJkt = await this.generateDPoPJkt(this.settings.dpop);\n        }\n\n        const {\n            popupWindowFeatures,\n            popupWindowTarget,\n            popupSignal,\n            popupAbortOnClose,\n            ...requestArgs\n        } = args;\n        const url = this.settings.popup_redirect_uri;\n        if (!url) {\n            logger.throw(new Error(\"No popup_redirect_uri configured\"));\n        }\n\n        const handle = await this._popupNavigator.prepare({ popupWindowFeatures, popupWindowTarget, popupSignal, popupAbortOnClose });\n        const user = await this._signin({\n            request_type: \"si:p\",\n            redirect_uri: url,\n            display: \"popup\",\n            dpopJkt,\n            ...requestArgs,\n        }, handle);\n        if (user) {\n            if (user.profile && user.profile.sub) {\n                logger.info(\"success, signed in subject\", user.profile.sub);\n            } else {\n                logger.info(\"no subject\");\n            }\n        }\n\n        return user;\n    }\n\n    /**\n     * Notify the opening window of response (callback) from the authorization endpoint.\n     * It is recommended to use {@link UserManager.signinCallback} instead.\n     *\n     * @returns A promise\n     *\n     * @see {@link UserManager.signinCallback}\n     */\n    public async signinPopupCallback(url = window.location.href, keepOpen = false): Promise<void> {\n        const logger = this._logger.create(\"signinPopupCallback\");\n        await this._popupNavigator.callback(url, { keepOpen });\n        logger.info(\"success\");\n    }\n\n    /**\n     * Trigger a silent request (via refresh token or an iframe) to the authorization endpoint.\n     *\n     * @returns A promise that contains the authenticated `User`.\n     */\n    public async signinSilent(args: SigninSilentArgs = {}): Promise<User | null> {\n        const logger = this._logger.create(\"signinSilent\");\n        const {\n            silentRequestTimeoutInSeconds,\n            ...requestArgs\n        } = args;\n        // first determine if we have a refresh token, or need to use iframe\n        let user = await this._loadUser();\n        // use refresh token unless forceIframeAuth is explicitly true\n        if (!args.forceIframeAuth && user?.refresh_token) {\n            logger.debug(\"using refresh token\");\n            const state = new RefreshState(user as Required<User>);\n            return await this._useRefreshToken({\n                state,\n                redirect_uri: requestArgs.redirect_uri,\n                resource: requestArgs.resource,\n                extraTokenParams: requestArgs.extraTokenParams,\n                timeoutInSeconds: silentRequestTimeoutInSeconds,\n            });\n        }\n\n        let dpopJkt: string | undefined;\n        if (this.settings.dpop?.bind_authorization_code) {\n            dpopJkt = await this.generateDPoPJkt(this.settings.dpop);\n        }\n\n        const url = this.settings.silent_redirect_uri;\n        if (!url) {\n            logger.throw(new Error(\"No silent_redirect_uri configured\"));\n        }\n\n        let verifySub: string | undefined;\n        if (user && this.settings.validateSubOnSilentRenew) {\n            logger.debug(\"subject prior to silent renew:\", user.profile.sub);\n            verifySub = user.profile.sub;\n        }\n\n        const handle = await this._iframeNavigator.prepare({ silentRequestTimeoutInSeconds });\n        user = await this._signin({\n            request_type: \"si:s\",\n            redirect_uri: url,\n            prompt: \"none\",\n            id_token_hint: this.settings.includeIdTokenInSilentRenew ? user?.id_token : undefined,\n            dpopJkt,\n            ...requestArgs,\n        }, handle, verifySub);\n        if (user) {\n            if (user.profile?.sub) {\n                logger.info(\"success, signed in subject\", user.profile.sub);\n            }\n            else {\n                logger.info(\"no subject\");\n            }\n        }\n\n        return user;\n    }\n\n    protected async _useRefreshToken(args: UseRefreshTokenArgs): Promise<User> {\n        const response = await this._client.useRefreshToken({\n            timeoutInSeconds: this.settings.silentRequestTimeoutInSeconds,\n            ...args,\n        });\n        const user = new User({ ...args.state, ...response });\n\n        await this.storeUser(user);\n        await this._events.load(user);\n        return user;\n    }\n\n    /**\n     *\n     * Notify the parent window of response (callback) from the authorization endpoint.\n     * It is recommended to use {@link UserManager.signinCallback} instead.\n     *\n     * @returns A promise\n     *\n     * @see {@link UserManager.signinCallback}\n     */\n    public async signinSilentCallback(url = window.location.href): Promise<void> {\n        const logger = this._logger.create(\"signinSilentCallback\");\n        await this._iframeNavigator.callback(url);\n        logger.info(\"success\");\n    }\n\n    /**\n     * Process any response (callback) from the authorization endpoint, by dispatching the request_type\n     * and executing one of the following functions:\n     * - {@link UserManager.signinRedirectCallback}\n     * - {@link UserManager.signinPopupCallback}\n     * - {@link UserManager.signinSilentCallback}\n     *\n     * @throws `Error` If request_type is unknown or signin cannot be processed.\n     */\n    public async signinCallback(url = window.location.href): Promise<User | undefined> {\n        const { state } = await this._client.readSigninResponseState(url);\n        switch (state.request_type) {\n            case \"si:r\":\n                return await this.signinRedirectCallback(url);\n            case \"si:p\":\n                await this.signinPopupCallback(url);\n                break;\n            case \"si:s\":\n                await this.signinSilentCallback(url);\n                break;\n            default:\n                throw new Error(\"invalid request_type in state\");\n        }\n        return undefined;\n    }\n\n    /**\n     * Process any response (callback) from the end session endpoint, by dispatching the request_type\n     * and executing one of the following functions:\n     * - {@link UserManager.signoutRedirectCallback}\n     * - {@link UserManager.signoutPopupCallback}\n     * - {@link UserManager.signoutSilentCallback}\n     *\n     * @throws `Error` If request_type is unknown or signout cannot be processed.\n     */\n    public async signoutCallback(url = window.location.href, keepOpen = false): Promise<SignoutResponse | undefined> {\n        const { state } = await this._client.readSignoutResponseState(url);\n        if (!state) {\n            return undefined;\n        }\n\n        switch (state.request_type) {\n            case \"so:r\":\n                return await this.signoutRedirectCallback(url);\n            case \"so:p\":\n                await this.signoutPopupCallback(url, keepOpen);\n                break;\n            case \"so:s\":\n                await this.signoutSilentCallback(url);\n                break;\n            default:\n                throw new Error(\"invalid request_type in state\");\n        }\n        return undefined;\n    }\n\n    /**\n     * Query OP for user's current signin status.\n     *\n     * @returns A promise object with session_state and subject identifier.\n     */\n    public async querySessionStatus(args: QuerySessionStatusArgs = {}): Promise<SessionStatus | null> {\n        const logger = this._logger.create(\"querySessionStatus\");\n        const {\n            silentRequestTimeoutInSeconds,\n            ...requestArgs\n        } = args;\n        const url = this.settings.silent_redirect_uri;\n        if (!url) {\n            logger.throw(new Error(\"No silent_redirect_uri configured\"));\n        }\n\n        const user = await this._loadUser();\n        const handle = await this._iframeNavigator.prepare({ silentRequestTimeoutInSeconds });\n        const navResponse = await this._signinStart({\n            request_type: \"si:s\", // this acts like a signin silent\n            redirect_uri: url,\n            prompt: \"none\",\n            id_token_hint: this.settings.includeIdTokenInSilentRenew ? user?.id_token : undefined,\n            response_type: this.settings.query_status_response_type,\n            scope: \"openid\",\n            skipUserInfo: true,\n            ...requestArgs,\n        }, handle);\n        try {\n            const extraHeaders: Record<string, ExtraHeader> = {};\n            const signinResponse = await this._client.processSigninResponse(navResponse.url, extraHeaders);\n            logger.debug(\"got signin response\");\n\n            if (signinResponse.session_state && signinResponse.profile.sub) {\n                logger.info(\"success for subject\", signinResponse.profile.sub);\n                return {\n                    session_state: signinResponse.session_state,\n                    sub: signinResponse.profile.sub,\n                };\n            }\n\n            logger.info(\"success, user not authenticated\");\n            return null;\n        } catch (err) {\n            if (this.settings.monitorAnonymousSession && err instanceof ErrorResponse) {\n                switch (err.error) {\n                    case \"login_required\":\n                    case \"consent_required\":\n                    case \"interaction_required\":\n                    case \"account_selection_required\":\n                        logger.info(\"success for anonymous user\");\n                        return {\n                            session_state: err.session_state!,\n                        };\n                }\n            }\n            throw err;\n        }\n    }\n\n    protected async _signin(args: CreateSigninRequestArgs, handle: IWindow, verifySub?: string): Promise<User> {\n        const navResponse = await this._signinStart(args, handle);\n        return await this._signinEnd(navResponse.url, verifySub);\n    }\n\n    protected async _signinStart(args: CreateSigninRequestArgs, handle: IWindow): Promise<NavigateResponse> {\n        const logger = this._logger.create(\"_signinStart\");\n\n        try {\n            const signinRequest = await this._client.createSigninRequest(args);\n            logger.debug(\"got signin request\");\n\n            return await handle.navigate({\n                url: signinRequest.url,\n                state: signinRequest.state.id,\n                response_mode: signinRequest.state.response_mode,\n                scriptOrigin: this.settings.iframeScriptOrigin,\n            });\n        } catch (err) {\n            logger.debug(\"error after preparing navigator, closing navigator window\");\n            handle.close();\n            throw err;\n        }\n    }\n\n    protected async _signinEnd(url: string, verifySub?: string): Promise<User> {\n        const logger = this._logger.create(\"_signinEnd\");\n        const extraHeaders: Record<string, ExtraHeader> = {};\n        const signinResponse = await this._client.processSigninResponse(url, extraHeaders);\n        logger.debug(\"got signin response\");\n\n        const user = await this._buildUser(signinResponse, verifySub);\n        return user;\n    }\n\n    protected async _buildUser(signinResponse: SigninResponse, verifySub?: string) {\n        const logger = this._logger.create(\"_buildUser\");\n        const user = new User(signinResponse);\n        if (verifySub) {\n            if (verifySub !== user.profile.sub) {\n                logger.debug(\"current user does not match user returned from signin. sub from signin:\", user.profile.sub);\n                throw new ErrorResponse({ ...signinResponse, error: \"login_required\" });\n            }\n            logger.debug(\"current user matches user returned from signin\");\n        }\n\n        await this.storeUser(user);\n        logger.debug(\"user stored\");\n        await this._events.load(user);\n\n        return user;\n    }\n\n    /**\n     * Trigger a redirect of the current window to the end session endpoint.\n     *\n     * @returns A promise\n     */\n    public async signoutRedirect(args: SignoutRedirectArgs = {}): Promise<void> {\n        const logger = this._logger.create(\"signoutRedirect\");\n        const {\n            redirectMethod,\n            ...requestArgs\n        } = args;\n        const handle = await this._redirectNavigator.prepare({ redirectMethod });\n        await this._signoutStart({\n            request_type: \"so:r\",\n            post_logout_redirect_uri: this.settings.post_logout_redirect_uri,\n            ...requestArgs,\n        }, handle);\n        logger.info(\"success\");\n    }\n\n    /**\n     * Process response (callback) from the end session endpoint.\n     * It is recommended to use {@link UserManager.signoutCallback} instead.\n     *\n     * @returns A promise containing signout response\n     *\n     * @see {@link UserManager.signoutCallback}\n     */\n    public async signoutRedirectCallback(url = window.location.href): Promise<SignoutResponse> {\n        const logger = this._logger.create(\"signoutRedirectCallback\");\n        const response = await this._signoutEnd(url);\n        logger.info(\"success\");\n        return response;\n    }\n\n    /**\n     * Trigger a redirect of a popup window to the end session endpoint.\n     *\n     * @returns A promise\n     */\n    public async signoutPopup(args: SignoutPopupArgs = {}): Promise<void> {\n        const logger = this._logger.create(\"signoutPopup\");\n        const {\n            popupWindowFeatures,\n            popupWindowTarget,\n            popupSignal,\n            ...requestArgs\n        } = args;\n        const url = this.settings.popup_post_logout_redirect_uri;\n\n        const handle = await this._popupNavigator.prepare({ popupWindowFeatures, popupWindowTarget, popupSignal });\n        await this._signout({\n            request_type: \"so:p\",\n            post_logout_redirect_uri: url,\n            // we're putting a dummy entry in here because we\n            // need a unique id from the state for notification\n            // to the parent window, which is necessary if we\n            // plan to return back to the client after signout\n            // and so we can close the popup after signout\n            state: url == null ? undefined : {},\n            ...requestArgs,\n        }, handle);\n        logger.info(\"success\");\n    }\n\n    /**\n     * Process response (callback) from the end session endpoint from a popup window.\n     * It is recommended to use {@link UserManager.signoutCallback} instead.\n     *\n     * @returns A promise\n     *\n     * @see {@link UserManager.signoutCallback}\n     */\n    public async signoutPopupCallback(url = window.location.href, keepOpen = false): Promise<void> {\n        const logger = this._logger.create(\"signoutPopupCallback\");\n        await this._popupNavigator.callback(url, { keepOpen });\n        logger.info(\"success\");\n    }\n\n    protected async _signout(args: CreateSignoutRequestArgs, handle: IWindow): Promise<SignoutResponse> {\n        const navResponse = await this._signoutStart(args, handle);\n        return await this._signoutEnd(navResponse.url);\n    }\n\n    protected async _signoutStart(args: CreateSignoutRequestArgs = {}, handle: IWindow): Promise<NavigateResponse> {\n        const logger = this._logger.create(\"_signoutStart\");\n\n        try {\n            const user = await this._loadUser();\n            logger.debug(\"loaded current user from storage\");\n\n            if (this.settings.revokeTokensOnSignout) {\n                await this._revokeInternal(user);\n            }\n\n            const id_token = args.id_token_hint || user && user.id_token;\n            if (id_token) {\n                logger.debug(\"setting id_token_hint in signout request\");\n                args.id_token_hint = id_token;\n            }\n\n            await this.removeUser();\n            logger.debug(\"user removed, creating signout request\");\n\n            const signoutRequest = await this._client.createSignoutRequest(args);\n            logger.debug(\"got signout request\");\n\n            return await handle.navigate({\n                url: signoutRequest.url,\n                state: signoutRequest.state?.id,\n                scriptOrigin: this.settings.iframeScriptOrigin,\n            });\n        } catch (err) {\n            logger.debug(\"error after preparing navigator, closing navigator window\");\n            handle.close();\n            throw err;\n        }\n    }\n\n    protected async _signoutEnd(url: string): Promise<SignoutResponse> {\n        const logger = this._logger.create(\"_signoutEnd\");\n        const signoutResponse = await this._client.processSignoutResponse(url);\n        logger.debug(\"got signout response\");\n\n        return signoutResponse;\n    }\n\n    /**\n     * Trigger a silent request (via an iframe) to the end session endpoint.\n     *\n     * @returns A promise\n     */\n    public async signoutSilent(args: SignoutSilentArgs = {}): Promise<void> {\n        const logger = this._logger.create(\"signoutSilent\");\n        const {\n            silentRequestTimeoutInSeconds,\n            ...requestArgs\n        } = args;\n\n        const id_token_hint = this.settings.includeIdTokenInSilentSignout\n            ? (await this._loadUser())?.id_token\n            : undefined;\n\n        const url = this.settings.popup_post_logout_redirect_uri;\n        const handle = await this._iframeNavigator.prepare({ silentRequestTimeoutInSeconds });\n        await this._signout({\n            request_type: \"so:s\",\n            post_logout_redirect_uri: url,\n            id_token_hint: id_token_hint,\n            ...requestArgs,\n        }, handle);\n\n        logger.info(\"success\");\n    }\n\n    /**\n     * Notify the parent window of response (callback) from the end session endpoint.\n     * It is recommended to use {@link UserManager.signoutCallback} instead.\n     *\n     * @returns A promise\n     *\n     * @see {@link UserManager.signoutCallback}\n     */\n    public async signoutSilentCallback(url = window.location.href): Promise<void> {\n        const logger = this._logger.create(\"signoutSilentCallback\");\n        await this._iframeNavigator.callback(url);\n        logger.info(\"success\");\n    }\n\n    public async revokeTokens(types?: RevokeTokensTypes): Promise<void> {\n        const user = await this._loadUser();\n        await this._revokeInternal(user, types);\n    }\n\n    protected async _revokeInternal(user: User | null, types = this.settings.revokeTokenTypes): Promise<void> {\n        const logger = this._logger.create(\"_revokeInternal\");\n        if (!user) return;\n\n        const typesPresent = types.filter(type => typeof user[type] === \"string\");\n\n        if (!typesPresent.length) {\n            logger.debug(\"no need to revoke due to no token(s)\");\n            return;\n        }\n\n        // don't Promise.all, order matters\n        for (const type of typesPresent) {\n            await this._client.revokeToken(\n                user[type]!,\n                type,\n            );\n            logger.info(`${type} revoked successfully`);\n            if (type !== \"access_token\") {\n                user[type] = null as never;\n            }\n        }\n\n        await this.storeUser(user);\n        logger.debug(\"user stored\");\n        await this._events.load(user);\n    }\n\n    /**\n     * Enables silent renew for the `UserManager`.\n     */\n    public startSilentRenew(): void {\n        this._logger.create(\"startSilentRenew\");\n        void this._silentRenewService.start();\n    }\n\n    /**\n     * Disables silent renew for the `UserManager`.\n     */\n    public stopSilentRenew(): void {\n        this._silentRenewService.stop();\n    }\n\n    protected get _userStoreKey(): string {\n        return `user:${this.settings.authority}:${this.settings.client_id}`;\n    }\n\n    protected async _loadUser(): Promise<User | null> {\n        const logger = this._logger.create(\"_loadUser\");\n        const storageString = await this.settings.userStore.get(this._userStoreKey);\n        if (storageString) {\n            logger.debug(\"user storageString loaded\");\n            return User.fromStorageString(storageString);\n        }\n\n        logger.debug(\"no user storageString\");\n        return null;\n    }\n\n    public async storeUser(user: User | null): Promise<void> {\n        const logger = this._logger.create(\"storeUser\");\n        if (user) {\n            logger.debug(\"storing user\");\n            const storageString = user.toStorageString();\n            await this.settings.userStore.set(this._userStoreKey, storageString);\n        } else {\n            this._logger.debug(\"removing user\");\n            await this.settings.userStore.remove(this._userStoreKey);\n            if (this.settings.dpop) {\n                await this.settings.dpop.store.remove(this.settings.client_id);\n            }\n        }\n    }\n\n    /**\n     * Removes stale state entries in storage for incomplete authorize requests.\n     */\n    public async clearStaleState(): Promise<void> {\n        await this._client.clearStaleState();\n    }\n\n    /**\n     * Dynamically generates a DPoP proof for a given user, URL and optional Http method.\n     * This method is useful when you need to make a request to a resource server\n     * with fetch or similar, and you need to include a DPoP proof in a DPoP header.\n     * @param url - The URL to generate the DPoP proof for\n     * @param user - The user to generate the DPoP proof for\n     * @param httpMethod - Optional, defaults to \"GET\"\n     * @param nonce - Optional nonce provided by the resource server\n     *\n     * @returns A promise containing the DPoP proof or undefined if DPoP is not enabled/no user is found.\n     */\n    public async dpopProof(url: string, user: User, httpMethod?: string, nonce?: string): Promise<string | undefined> {\n        const dpopState = await this.settings.dpop?.store?.get(this.settings.client_id);\n        if (dpopState) {\n            return await CryptoUtils.generateDPoPProof({\n                url,\n                accessToken: user?.access_token,\n                httpMethod: httpMethod,\n                keyPair: dpopState.keys,\n                nonce,\n            });\n        }\n        return undefined;\n    }\n\n    async generateDPoPJkt(dpopSettings: DPoPSettings): Promise<string | undefined> {\n        let dpopState = await dpopSettings.store.get(this.settings.client_id);\n        if (!dpopState) {\n            const dpopKeys = await CryptoUtils.generateDPoPKeys();\n            dpopState = new DPoPState(dpopKeys);\n            await dpopSettings.store.set(this.settings.client_id, dpopState);\n        }\n        return await CryptoUtils.generateDPoPJkt(dpopState.keys);\n    }\n}\n", "{\n  \"name\": \"oidc-client-ts\",\n  \"version\": \"3.5.0\",\n  \"description\": \"OpenID Connect (OIDC) & OAuth2 client library\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/authts/oidc-client-ts.git\"\n  },\n  \"homepage\": \"https://github.com/authts/oidc-client-ts#readme\",\n  \"license\": \"Apache-2.0\",\n  \"main\": \"dist/umd/oidc-client-ts.js\",\n  \"types\": \"dist/types/oidc-client-ts.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/oidc-client-ts.d.ts\",\n      \"import\": \"./dist/esm/oidc-client-ts.js\",\n      \"require\": \"./dist/umd/oidc-client-ts.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"keywords\": [\n    \"authentication\",\n    \"oauth2\",\n    \"oidc\",\n    \"openid\",\n    \"OpenID Connect\"\n  ],\n  \"scripts\": {\n    \"build\": \"node scripts/build.js && npm run build-types\",\n    \"build-types\": \"tsc -p tsconfig.build.json && api-extractor run\",\n    \"clean\": \"git clean -fdX dist lib *.tsbuildinfo\",\n    \"prepack\": \"npm run build\",\n    \"test\": \"tsc && vitest run\",\n    \"typedoc\": \"typedoc\",\n    \"lint\": \"eslint --max-warnings=0 --cache .\",\n    \"prepare\": \"husky\"\n  },\n  \"dependencies\": {\n    \"jwt-decode\": \"^4.0.0\"\n  },\n  \"devDependencies\": {\n    \"@eslint/eslintrc\": \"^3.2.0\",\n    \"@eslint/js\": \"^9.18.0\",\n    \"@microsoft/api-extractor\": \"^7.49.1\",\n    \"@stylistic/eslint-plugin\": \"^2.13.0\",\n    \"@testing-library/jest-dom\": \"^6.6.3\",\n    \"@types/node\": \"^24.10.1\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.20.0\",\n    \"@typescript-eslint/parser\": \"^8.20.0\",\n    \"@vitest/coverage-v8\": \"^4.0.16\",\n    \"esbuild\": \"^0.27.0\",\n    \"eslint\": \"^9.18.0\",\n    \"eslint-plugin-testing-library\": \"^7.1.1\",\n    \"fake-indexeddb\": \"^6.0.0\",\n    \"globals\": \"^17.0.0\",\n    \"http-proxy-middleware\": \"^3.0.3\",\n    \"husky\": \"^9.1.7\",\n    \"jose\": \"^5.9.6\",\n    \"jsdom\": \"^27.3.0\",\n    \"lint-staged\": \"^16.1.0\",\n    \"typedoc\": \"^0.28.0\",\n    \"typescript\": \"~5.8.2\",\n    \"vitest\": \"^4.0.16\",\n    \"yn\": \"^5.0.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"lint-staged\": {\n    \"*.{js,jsx,ts,tsx}\": \"eslint --cache --fix\"\n  }\n}\n", "// @ts-expect-error avoid enabling resolveJsonModule to keep build process simple\nimport { version } from \"../package.json\";\n\n/**\n * @public\n */\nexport const Version: string = version;\n", "import { DPoPState, type DPoPStore } from \"./DPoPStore\";\n\n/**\n * Provides a default implementation of the DPoP store using IndexedDB.\n *\n * @public\n */\nexport class IndexedDbDPoPStore implements DPoPStore {\n    readonly _dbName: string = \"oidc\";\n    readonly _storeName: string = \"dpop\";\n\n    public async set(key: string, value: DPoPState): Promise<void> {\n        const store = await this.createStore(this._dbName, this._storeName);\n        await store(\"readwrite\", (str: IDBObjectStore) => {\n            str.put(value, key);\n            return this.promisifyRequest(str.transaction);\n        });\n    }\n\n    public async get(key: string): Promise<DPoPState> {\n        const store = await this.createStore(this._dbName, this._storeName);\n        return await store(\"readonly\", (str) => {\n            return this.promisifyRequest(str.get(key));\n        }) as DPoPState;\n    }\n\n    public async remove(key: string): Promise<DPoPState> {\n        const item = await this.get(key);\n        const store = await this.createStore(this._dbName, this._storeName);\n        await store(\"readwrite\", (str) => {\n            return this.promisifyRequest(str.delete(key));\n        });\n        return item;\n    }\n\n    public async getAllKeys(): Promise<string[]> {\n        const store = await this.createStore(this._dbName, this._storeName);\n        return await store(\"readonly\", (str) => {\n            return this.promisifyRequest(str.getAllKeys());\n        }) as string[];\n    }\n\n    promisifyRequest<T = undefined>(\n        request: IDBRequest<T> | IDBTransaction): Promise<T> {\n        return new Promise<T>((resolve, reject) => {\n            (request as IDBTransaction).oncomplete = (request as IDBRequest<T>).onsuccess = () => resolve((request as IDBRequest<T>).result);\n            (request as IDBTransaction).onabort = (request as IDBRequest<T>).onerror = () => reject((request as IDBRequest<T>).error as Error);\n        });\n    }\n\n    async createStore<T>(\n        dbName: string,\n        storeName: string,\n    ): Promise<(txMode: IDBTransactionMode, callback: (store: IDBObjectStore) => T | PromiseLike<T>) => Promise<T>> {\n        const request = indexedDB.open(dbName);\n        request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n        const db = await this.promisifyRequest<IDBDatabase>(request);\n\n        return async (\n            txMode: IDBTransactionMode,\n            callback: (store: IDBObjectStore) => T | PromiseLike<T>,\n        ) => {\n            const tx = db.transaction(storeName, txMode);\n            const store = tx.objectStore(storeName);\n            return await callback(store);\n        };\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nconst MISSING_OIDC_STATE_TEXT = 'no matching state found in storage';\n\nexport class AuthRequiredError extends Error {\n    constructor(message, cause = null) {\n        super(message);\n        this.name = 'AuthRequiredError';\n        this.code = 'auth/required';\n        this.cause = cause;\n    }\n}\n\nexport class AuthRenewalError extends Error {\n    constructor(cause) {\n        super('Silent authentication is temporarily unavailable.', { cause });\n        this.name = 'AuthRenewalError';\n        this.code = 'auth/renewal_unavailable';\n    }\n}\n\nexport function describeError(err) {\n    if (err?.message) {\n        return err.message;\n    }\n    return String(err);\n}\n\nexport function contextualError(context, err) {\n    return new Error(`${context}: ${describeError(err)}`);\n}\n\nexport function portalURL(origin, path) {\n    return new URL(path, origin).toString();\n}\n\nexport function authCallbackURL(origin) {\n    return `${origin}/authcallback`;\n}\n\nexport function oidcMetadata(authority) {\n    return {\n        issuer: authority,\n        authorization_endpoint: 'https://auth.evilworks.com/application/o/authorize/',\n        token_endpoint: 'https://auth.evilworks.com/application/o/token/',\n        userinfo_endpoint: 'https://auth.evilworks.com/application/o/userinfo/',\n        end_session_endpoint: new URL('end-session/', authority).toString(),\n        jwks_uri: new URL('jwks/', authority).toString(),\n    };\n}\n\nexport function buildOidcSettings(auth, { origin, userStore, postLogoutPath = '/' } = {}) {\n    return {\n        authority: auth.authority,\n        client_id: auth.client_id,\n        redirect_uri: authCallbackURL(origin),\n        silent_redirect_uri: portalURL(origin, '/auth-silent-callback.html'),\n        post_logout_redirect_uri: portalURL(origin, postLogoutPath),\n        response_type: 'code',\n        scope: 'openid profile email offline_access',\n        automaticSilentRenew: false,\n        monitorSession: false,\n        requestTimeoutInSeconds: 30,\n        silentRequestTimeoutInSeconds: 30,\n        loadUserInfo: true,\n        metadata: oidcMetadata(auth.authority),\n        userStore,\n    };\n}\n\nexport function isMissingOidcStateError(err) {\n    return describeError(err).toLowerCase().includes(MISSING_OIDC_STATE_TEXT);\n}\n\n/* The OIDC client uses plain Error for both validation and gateway failures.\n * Retry its transport/HTTP response failures while keeping validation terminal. */\nexport function isTerminalSilentRenewError(err) {\n    if (err?.code === 'auth/required') {\n        return true;\n    }\n    const code = err?.error;\n    if (typeof code === 'string' && code !== '') {\n        return code !== 'server_error' && code !== 'temporarily_unavailable';\n    }\n    const message = describeError(err);\n    return err?.name !== 'ErrorTimeout'\n        && err?.name !== 'TypeError'\n        && !message.startsWith('Invalid response Content-Type:')\n        && !/\\(5\\d\\d\\)(?::|$)/.test(message);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { UserManager, WebStorageStateStore } from 'oidc-client-ts';\nimport { getPortalEnvironment } from \"./env.mjs\";\nimport { AuthRequiredError, buildOidcSettings } from './lib/auth-policy.mjs';\n\nfunction authConfigCandidates() {\n  const env = getPortalEnvironment();\n  return [`${env}.conf.json`];\n}\n\nasync function loadAuthConfig() {\n  for (const fileName of authConfigCandidates()) {\n    try {\n      const resp = await fetch(fileName, { cache: \"no-store\" });\n      if (!resp.ok) {\n        continue;\n      }\n\n      const config = await resp.json();\n      const auth = config?.auth;\n      if (!auth?.authority || !auth?.client_id) {\n        console.warn(`Skipping ${fileName}: missing auth.authority/auth.client_id.`);\n        continue;\n      }\n\n      return auth;\n    } catch (e) {\n      console.warn(`Skipping ${fileName}: could not parse/read config.`, e);\n      continue;\n    }\n  }\n\n  throw new Error(\"Could not load portal config with auth section.\");\n}\n\nlet g_userManagerPromise = null;\nlet g_lastWhoamiLogSignature = null;\n\n/* Mirror backend username canonicalisation so browser diagnostics match the principal used by tranquility. */\nfunction canonicalUsername(username) {\n  return String(username ?? '').trim().replace(/^user-/, '');\n}\n\n/* Resolve one human-meaningful principal from the cached OIDC user payload. */\nfunction principalFromUser(user) {\n  const profile = user?.profile ?? null;\n  const raw = profile?.preferred_username\n    ?? profile?.username\n    ?? profile?.email\n    ?? profile?.sub\n    ?? '';\n  return canonicalUsername(raw);\n}\n\n/* Quote one principal consistently so empty usernames stay visibly distinct in the console. */\nfunction quotedPrincipal(principal) {\n  const text = String(principal ?? '');\n  return `'${text.replaceAll('\\\\', '\\\\\\\\').replaceAll('\\'', '\\\\\\'')}'`;\n}\n\n/* Log one stable principal summary when a session becomes usable or a silent renew replaces its user payload. */\nexport function logWhoami(user, reason = 'session') {\n  const principal = principalFromUser(user);\n  const signature = `${reason}:${principal}`;\n  if (g_lastWhoamiLogSignature === signature) {\n    return principal;\n  }\n  g_lastWhoamiLogSignature = signature;\n  console.info(`[auth] whoami reason=${reason} principal=${quotedPrincipal(principal)} refresh_token_present=${Boolean(user?.refresh_token)}`);\n  return principal;\n}\n\nexport async function getUserManager() {\n  if (!g_userManagerPromise) {\n    g_userManagerPromise = loadAuthConfig()\n      .then((config) => new UserManager(buildOidcSettings(config, {\n        origin: window.location.origin,\n        userStore: new WebStorageStateStore({ store: window.localStorage }),\n        postLogoutPath: '/',\n      })));\n  }\n  return await g_userManagerPromise;\n}\n\nexport async function getCurrentUser() {\n  const userManager = await getUserManager();\n  return await userManager.getUser();\n}\n\n/* Renew without navigation; a live provider session may restore access when a refresh grant cannot. */\nexport async function renewUserSilently(userManager, previousUser, { forceIframeAuth = false } = {}) {\n  let renewed;\n  try {\n    renewed = forceIframeAuth\n      ? await userManager.signinSilent({ forceIframeAuth: true })\n      : await userManager.signinSilent();\n  } catch (refreshError) {\n    if (forceIframeAuth || !previousUser?.refresh_token\n      || (refreshError?.error !== 'invalid_grant' && refreshError?.error !== 'login_required')) {\n      throw refreshError;\n    }\n    console.warn('OIDC refresh token was rejected; trying hidden-iframe renewal.', refreshError);\n    try {\n      renewed = await userManager.signinSilent({ forceIframeAuth: true });\n    } catch (iframeError) {\n      console.warn('OIDC hidden-iframe renewal failed.', iframeError);\n      throw iframeError;\n    }\n  }\n  if (previousUser && (!previousUser.profile?.sub || !renewed?.profile?.sub)) {\n    throw new AuthRequiredError('Silent authentication requires the existing and renewed OIDC subject.');\n  }\n  if (previousUser && renewed.profile.sub !== previousUser.profile.sub) {\n    throw new AuthRequiredError('Silent authentication changed the signed-in subject; interactive sign-in is required.');\n  }\n  return renewed;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { getPortalEnvironment } from './env.mjs';\n\n/* Expand the local proxy placeholder in API URLs that need the current notebook prefix. */\nfunction expandAPIBaseUrl(url) {\n    if (!url.includes('${portal_proxy_prefix}')) {\n        return url;\n    }\n\n    const match = window.location.pathname.match(/^(.*\\/proxy\\/)\\d+(?:\\/|$)/);\n    if (!match) {\n        throw new Error(`Cannot resolve portal proxy prefix from '${window.location.pathname}'.`);\n    }\n    return url.replaceAll('${portal_proxy_prefix}', match[1]);\n}\n\n/* Resolve the configured API URL from one loaded portal config object. */\nfunction configAPIBaseUrl(config) {\n    const url = config?.api_base_url;\n    if (url === undefined || url === null || url === '') {\n        return '';\n    }\n    if (typeof url !== 'string') {\n        throw new Error(`Portal config field 'api_base_url' must be a string.`);\n    }\n    // Routing is now explicit config, but hub still needs one runtime piece:\n    // the current proxy prefix in front of the browser-facing port.\n    return expandAPIBaseUrl(url).replace(/\\/+$/, '');\n}\n\n/* Load one portal environment config and resolve the configured API base URL. */\nexport async function loadPortalAPIConfig() {\n    const env = getPortalEnvironment();\n    const configFile = `${env}.conf.json`;\n    try {\n        const resp = await fetch(configFile, { cache: 'no-store' });\n        if (!resp.ok) {\n            throw new Error(`HTTP ${resp.status}`);\n        }\n\n        const config = await resp.json();\n        const apiBaseUrl = configAPIBaseUrl(config);\n        if (!apiBaseUrl) {\n            throw new Error(`Missing required 'api_base_url' field in ${configFile}.`);\n        }\n\n        return { env, configFile, config, apiBaseUrl };\n    } catch (e) {\n        throw new Error(`Could not read portal config file '${configFile}' for env=${env}: ${e}`);\n    }\n}\n\n/* Resolve the configured API base URL without opening a WebSocket or creating API state. */\nexport async function resolveConfiguredAPIBaseUrl() {\n    const loaded = await loadPortalAPIConfig();\n    return loaded.apiBaseUrl;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ptl from './lib/ptrless/ptrless.mjs';\nimport { requestFrame } from './lib/frame-wakeup.mjs';\nimport { PORTAL_MIN_BUILD } from './lib/build-flags.mjs';\nimport { withPortalTimingScope } from './lib/evilui/testing-trace.mjs';\nimport { getPortalEnvironment } from './env.mjs';\nimport { getUserManager, logWhoami, renewUserSilently } from './auth.mjs';\nimport { AuthRequiredError, AuthRenewalError, isTerminalSilentRenewError } from './lib/auth-policy.mjs';\nimport { loadPortalAPIConfig } from './api-config.mjs';\nimport { editChainAt, editChainLen, editParts } from './puffbook-editchain.mjs';\nimport { castPtrlessNamed } from './lib/puffrpc/puffrpc.ptrless.mjs';\nexport { resolveConfiguredAPIBaseUrl } from './api-config.mjs';\n\nconst textEncoder = new TextEncoder();\n\nfunction castPuffbookWireEvent(body) {\n    const eventType = testingFieldText(body, 'event_type');\n    const nominal = {\n        viewport_window: 'puff_PuffbookViewportWindow',\n        source_edit_applied: 'puff_PuffbookSourceEditApplied',\n        apply_line_changes: 'puff_PuffbookApplyLineChanges',\n    }[eventType];\n    if (!nominal) {\n        throw new TypeError(`Unsupported Puffbook wire event type ${JSON.stringify(eventType)}.`);\n    }\n    castPtrlessNamed(nominal, body);\n}\n\n/* Decode retained recovery frames without applying them to any live stream. */\nexport function decodePuffbookRecoveryFrameTail(codec, frames, expectedCount = frames?.length ?? null) {\n    if (!codec || typeof codec.readFrame !== 'function' || !Array.isArray(frames)\n        || !Number.isInteger(expectedCount) || expectedCount < 0) {\n        return { status: 'unavailable', envelopes: [], error: 'recovery frame-tail decoder context is unavailable' };\n    }\n    const envelopes = [];\n    try {\n        for (const [index, frame] of frames.entries()) {\n            if (!(frame instanceof Uint8Array) || frame.byteLength === 0) {\n                throw new Error(`recovery frame-tail row ${index} is not non-empty binary data`);\n            }\n            envelopes.push(codec.readFrame(frame));\n        }\n    } catch (err) {\n        return {\n            status: 'decode_failed',\n            envelopes: [],\n            error: `${err?.message || err || ''}`,\n        };\n    }\n    return {\n        status: envelopes.length === expectedCount ? 'complete' : 'truncated',\n        envelopes,\n        error: null,\n    };\n}\n\nclass PlainPortalRPCCodec {\n    constructor() {\n        this.codec = new ptl.SessionCodec();\n    }\n\n    async writeFrame(env) {\n        return await this.codec.writeFrame(env);\n    }\n\n    readFrame(data) {\n        return this.codec.readFrame(data);\n    }\n\n    stats() {\n        return this.codec.stats();\n    }\n}\n\nlet g_silentRenewPromise = null;\nlet g_silentRenewForceIframeAuth = false;\n\nconst API_CONNECTION_STATES = Object.freeze({\n    IDLE: 'idle',\n    CONNECTING: 'connecting',\n    READY: 'ready',\n    RECONNECTING: 'reconnecting',\n    DISCONNECTED: 'disconnected',\n});\n\nconst API_AUTH_STATES = Object.freeze({\n    LOCAL: 'local',\n    AUTHENTICATED: 'authenticated',\n    RENEWING: 'renewing',\n    REAUTH_REQUIRED: 'reauth_required',\n});\n\nconst PUFFWORKER_ENSURE_TIMEOUT_MS = 15_000;\nconst PORTAL_OBSERVABILITY_REPORT_METHOD = 'observability_report';\nconst PORTAL_OBSERVABILITY_BATCH_LIMIT = 32;\nconst PORTAL_OBSERVABILITY_QUEUE_LIMIT = 128;\nconst PORTAL_OBSERVABILITY_FLUSH_MS = 2_000;\nconst PORTAL_OBSERVABILITY_MAX_DURATION_MS = 120_000;\nconst PORTAL_OBSERVABILITY_ENVIRONMENTS = new Set(['fdev', 'dev', 'staging', 'prod']);\nconst PORTAL_OBSERVABILITY_OPERATIONS = new Set(['compile', 'amend', 'puffbook_snapshot', 'puffbook_subscribe', 'puffbook_amend']);\n\nconst TESTING_PUFFBOOK_SUBSCRIBE_OPEN_SEAM_STORAGE_KEY = 'portal.testingPuffbookSubscribeOpenSeamArmed';\nconst TESTING_PORTAL_TELEMETRY_ENABLED = !PORTAL_MIN_BUILD;\n\n/* Delay only test puffbook mutates so browser-native transport repros can model one WAN leg. */\nfunction testingPuffbookMutateLagMS() {\n    const raw = new URLSearchParams(globalThis.location?.search ?? '').get('testing_mutate_lag_ms');\n    if (raw === null || raw === '') {\n        return 0;\n    }\n    const ms = Number.parseInt(raw, 10);\n    if (!Number.isInteger(ms) || ms < 0 || ms > 10_000) {\n        throw new Error(`Invalid testing_mutate_lag_ms: ${raw}`);\n    }\n    return ms;\n}\n\nfunction loadTestingPuffbookSubscribeOpenArmed() {\n    if (typeof window === 'undefined' || !window.sessionStorage) {\n        return 0;\n    }\n    const raw = window.sessionStorage.getItem(TESTING_PUFFBOOK_SUBSCRIBE_OPEN_SEAM_STORAGE_KEY);\n    if (raw === null) {\n        return 0;\n    }\n    const n = Number(raw);\n    if (!Number.isInteger(n) || n < 0) {\n        throw new Error(`Malformed sessionStorage value for ${TESTING_PUFFBOOK_SUBSCRIBE_OPEN_SEAM_STORAGE_KEY}: ${JSON.stringify(raw)}`);\n    }\n    return n;\n}\n\nfunction syncTestingPuffbookSubscribeOpenArmed() {\n    if (typeof window === 'undefined' || !window.sessionStorage) {\n        return;\n    }\n    if (g_testingPuffbookSubscribeOpenSeam.armed <= 0) {\n        window.sessionStorage.removeItem(TESTING_PUFFBOOK_SUBSCRIBE_OPEN_SEAM_STORAGE_KEY);\n        return;\n    }\n    window.sessionStorage.setItem(\n        TESTING_PUFFBOOK_SUBSCRIBE_OPEN_SEAM_STORAGE_KEY,\n        String(g_testingPuffbookSubscribeOpenSeam.armed),\n    );\n}\n\nconst g_testingPuffbookSubscribeOpenSeam = {\n    armed: loadTestingPuffbookSubscribeOpenArmed(),\n    nextId: 1,\n    held: new Map(),\n};\n\nconst g_testingPuffbookMutateSeam = {\n    nextSeq: 1,\n    calls: [],\n    holdNextEditEvents: 0,\n    nextHeldEditId: 1,\n    heldEditEvents: [],\n};\n\nconst TESTING_PORTAL_WS_TRACE_LIMIT = 256;\nconst TESTING_PORTAL_WS_LIFECYCLE_LIMIT = 64;\n\nconst g_testingPortalWSTrace = {\n    nextSeq: 1,\n    events: [],\n};\n\nconst g_testingPortalWSDebug = {\n    current: null,\n    lifecycle: [],\n    lastExplicitClose: null,\n    explicitCloseCount: 0,\n    lastMessageAtMS: 0,\n    lastSendAtMS: 0,\n    sendCount: 0,\n    sendBytes: 0,\n    lastSendBytes: 0,\n};\n\nfunction resolveAPIURL(baseUrl, endpoint) {\n    let resolvedBaseUrl = '';\n    try {\n        resolvedBaseUrl = new URL(baseUrl, window.location.href).toString().replace(/\\/+$/, '');\n    } catch (err) {\n        throw new Error(`Invalid API base URL '${baseUrl}': ${err}`);\n    }\n    const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n    return `${resolvedBaseUrl}${cleanEndpoint}`;\n}\n\nfunction pushTestingPortalWSTrace(event, fields = {}) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void event;\n        void fields;\n        return null;\n    }\n    const entry = {\n        at_ms: Date.now(),\n        event,\n        ...fields,\n    };\n    entry.seq = g_testingPortalWSTrace.nextSeq++;\n    g_testingPortalWSTrace.events.push(entry);\n    if (g_testingPortalWSTrace.events.length > TESTING_PORTAL_WS_TRACE_LIMIT) {\n        g_testingPortalWSTrace.events.splice(0, g_testingPortalWSTrace.events.length - TESTING_PORTAL_WS_TRACE_LIMIT);\n    }\n    return entry;\n}\n\nfunction pushTestingPortalWSLifecycle(event, fields = {}) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void event;\n        void fields;\n        return null;\n    }\n    const entry = {\n        at_ms: Date.now(),\n        event,\n        ...fields,\n    };\n    entry.seq = g_testingPortalWSTrace.nextSeq++;\n    g_testingPortalWSDebug.lifecycle.push(entry);\n    if (g_testingPortalWSDebug.lifecycle.length > TESTING_PORTAL_WS_LIFECYCLE_LIMIT) {\n        g_testingPortalWSDebug.lifecycle.splice(0, g_testingPortalWSDebug.lifecycle.length - TESTING_PORTAL_WS_LIFECYCLE_LIMIT);\n    }\n    return entry;\n}\n\nfunction testingEventLagMS(emittedAt) {\n    if (typeof emittedAt !== 'string' || emittedAt === '') {\n        return null;\n    }\n    const n = Number(emittedAt);\n    if (!Number.isFinite(n)) {\n        return null;\n    }\n    return Math.max(0, Date.now() - Math.round(n));\n}\n\nfunction testingStackTrace(skipLines = 1) {\n    try {\n        const stack = new Error().stack || '';\n        return stack\n            .split('\\n')\n            .slice(1 + skipLines)\n            .map((line) => line.trim())\n            .filter((line) => line !== '')\n            .join(' | ');\n    } catch (_err) {\n        return '';\n    }\n}\n\n// cloneWSMessageBuffer copies one websocket frame buffer so testing seams can replay it after later decodes.\nfunction cloneWSMessageBuffer(data) {\n    if (data instanceof ArrayBuffer) {\n        return data.slice(0);\n    }\n    if (ArrayBuffer.isView(data)) {\n        return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n    }\n    return null;\n}\n\nfunction wsReadyStateName(readyState) {\n    switch (readyState) {\n    case WebSocket.CONNECTING:\n        return 'CONNECTING';\n    case WebSocket.OPEN:\n        return 'OPEN';\n    case WebSocket.CLOSING:\n        return 'CLOSING';\n    case WebSocket.CLOSED:\n        return 'CLOSED';\n    default:\n        return `UNKNOWN(${readyState})`;\n    }\n}\n\nfunction noteTestingPortalWSLifecycle(event, fields = {}) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void event;\n        void fields;\n        return;\n    }\n    pushTestingPortalWSLifecycle(event, fields);\n    pushTestingPortalWSTrace(event, fields);\n}\n\nfunction installTestingPortalPageLifecycleHooks() {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        return;\n    }\n    if (typeof window === 'undefined'\n        || typeof window.addEventListener !== 'function'\n        || typeof document === 'undefined'\n        || typeof document.addEventListener !== 'function'\n        || window.__testingPortalWSLifecycleInstalled) {\n        return;\n    }\n    window.__testingPortalWSLifecycleInstalled = true;\n\n    const note = (event, fields = {}) => {\n        noteTestingPortalWSLifecycle(event, fields);\n    };\n\n    window.addEventListener('pagehide', (ev) => {\n        note('pagehide', { persisted: !!ev.persisted, visibility: document.visibilityState });\n    });\n    window.addEventListener('pageshow', (ev) => {\n        note('pageshow', { persisted: !!ev.persisted, visibility: document.visibilityState });\n    });\n    window.addEventListener('beforeunload', () => {\n        note('beforeunload', { visibility: document.visibilityState });\n    });\n    window.addEventListener('unload', () => {\n        note('unload', { visibility: document.visibilityState });\n    });\n    window.addEventListener('freeze', () => {\n        note('freeze', { visibility: document.visibilityState });\n    });\n    window.addEventListener('resume', () => {\n        note('resume', { visibility: document.visibilityState });\n    });\n    document.addEventListener('visibilitychange', () => {\n        note('visibilitychange', { visibility: document.visibilityState });\n    });\n}\n\nfunction snapshotTestingPortalWSDebugCurrent(extra = {}) {\n    const cur = g_testingPortalWSDebug.current;\n    return {\n        ...cur,\n        ...extra,\n    };\n}\n\nfunction noteTestingPortalWSCurrent(extra = {}) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void extra;\n        return null;\n    }\n    g_testingPortalWSDebug.current = snapshotTestingPortalWSDebugCurrent(extra);\n    return g_testingPortalWSDebug.current;\n}\n\nfunction testingPortalWSCodecStats(codec) {\n    if (!codec || typeof codec.stats !== 'function') {\n        return null;\n    }\n    return codec.stats();\n}\n\nfunction attachTestingPortalWSDebug(ws, connectSeq, getCounts) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void ws;\n        void connectSeq;\n        void getCounts;\n        return;\n    }\n    const counts = () => {\n        const next = typeof getCounts === 'function' ? getCounts() : {};\n        return {\n            pending_count: next?.pending_count ?? 0,\n            stream_count: next?.stream_count ?? 0,\n        };\n    };\n    const nativeClose = ws.close.bind(ws);\n    const nativeSend = ws.send.bind(ws);\n    ws.send = (data) => {\n        const bytes = data?.byteLength ?? data?.size ?? (typeof data === 'string' ? new TextEncoder().encode(data).byteLength : null);\n        g_testingPortalWSDebug.lastSendAtMS = Date.now();\n        g_testingPortalWSDebug.sendCount += 1;\n        if (Number.isFinite(bytes)) {\n            g_testingPortalWSDebug.sendBytes += bytes;\n            g_testingPortalWSDebug.lastSendBytes = bytes;\n        }\n        return nativeSend(data);\n    };\n    ws.close = (code, reason) => {\n        const live = counts();\n        const closeInfo = {\n            at_ms: Date.now(),\n            connect_seq: connectSeq,\n            code: code ?? null,\n            reason: reason ?? '',\n            url: ws.url,\n            ready_state: ws.readyState,\n            ready_state_name: wsReadyStateName(ws.readyState),\n            buffered_amount: ws.bufferedAmount,\n            pending_count: live.pending_count,\n            stream_count: live.stream_count,\n            last_message_at_ms: g_testingPortalWSDebug.lastMessageAtMS,\n            last_send_at_ms: g_testingPortalWSDebug.lastSendAtMS,\n            send_count: g_testingPortalWSDebug.sendCount,\n            send_bytes: g_testingPortalWSDebug.sendBytes,\n            last_send_bytes: g_testingPortalWSDebug.lastSendBytes,\n            stack: testingStackTrace(1),\n        };\n        g_testingPortalWSDebug.lastExplicitClose = closeInfo;\n        g_testingPortalWSDebug.explicitCloseCount += 1;\n        noteTestingPortalWSCurrent({\n            connect_seq: connectSeq,\n            url: ws.url,\n            ready_state: ws.readyState,\n            ready_state_name: wsReadyStateName(ws.readyState),\n            buffered_amount: ws.bufferedAmount,\n            protocol: ws.protocol,\n            extensions: ws.extensions,\n            pending_count: live.pending_count,\n            stream_count: live.stream_count,\n            last_event: 'ws_close_called',\n        });\n        noteTestingPortalWSLifecycle('ws_close_called', closeInfo);\n        return nativeClose(code, reason);\n    };\n\n    const live = counts();\n    noteTestingPortalWSCurrent({\n        connect_seq: connectSeq,\n        url: ws.url,\n        ready_state: ws.readyState,\n        ready_state_name: wsReadyStateName(ws.readyState),\n        buffered_amount: ws.bufferedAmount,\n        protocol: ws.protocol,\n        extensions: ws.extensions,\n        pending_count: live.pending_count,\n        stream_count: live.stream_count,\n        last_event: 'ws_created',\n    });\n}\n\nif (typeof globalThis !== 'undefined') {\n    globalThis.__testingPortalWSTracePush = pushTestingPortalWSTrace;\n}\n\ninstallTestingPortalPageLifecycleHooks();\n\nexport function testingPortalWSTrace() {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        return [];\n    }\n    return g_testingPortalWSTrace.events.map((entry) => ({ ...entry }));\n}\n\nexport function testingResetPortalWSTrace() {\n    g_testingPortalWSTrace.nextSeq = 1;\n    g_testingPortalWSTrace.events = [];\n    g_testingPortalWSDebug.lifecycle = [];\n    g_testingPortalWSDebug.current = null;\n    g_testingPortalWSDebug.lastExplicitClose = null;\n    g_testingPortalWSDebug.explicitCloseCount = 0;\n    g_testingPortalWSDebug.lastMessageAtMS = 0;\n    g_testingPortalWSDebug.lastSendAtMS = 0;\n    g_testingPortalWSDebug.sendCount = 0;\n    g_testingPortalWSDebug.sendBytes = 0;\n    g_testingPortalWSDebug.lastSendBytes = 0;\n    return true;\n}\n\nexport function testingPortalWSDebugState() {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        return {\n            current: null,\n            last_explicit_close: null,\n            explicit_close_count: 0,\n        last_message_at_ms: 0,\n        last_send_at_ms: 0,\n        send_count: 0,\n        send_bytes: 0,\n        last_send_bytes: 0,\n            lifecycle: [],\n        };\n    }\n    return {\n        current: g_testingPortalWSDebug.current ? { ...g_testingPortalWSDebug.current } : null,\n        last_explicit_close: g_testingPortalWSDebug.lastExplicitClose ? { ...g_testingPortalWSDebug.lastExplicitClose } : null,\n        explicit_close_count: g_testingPortalWSDebug.explicitCloseCount,\n        last_message_at_ms: g_testingPortalWSDebug.lastMessageAtMS,\n        last_send_at_ms: g_testingPortalWSDebug.lastSendAtMS,\n        send_count: g_testingPortalWSDebug.sendCount,\n        send_bytes: g_testingPortalWSDebug.sendBytes,\n        last_send_bytes: g_testingPortalWSDebug.lastSendBytes,\n        lifecycle: g_testingPortalWSDebug.lifecycle.map((entry) => ({ ...entry })),\n    };\n}\n\nfunction testingSafeField(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        return null;\n    }\n    try {\n        return obj.field(name);\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction testingFieldText(obj, name) {\n    const value = testingSafeField(obj, name);\n    if (!value || typeof value.toText !== 'function') {\n        return null;\n    }\n    try {\n        return value.toText();\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction testingFieldInt(obj, name) {\n    const value = testingSafeField(obj, name);\n    if (!value || typeof value.value !== 'function') {\n        return null;\n    }\n    try {\n        return value.value();\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction testingFieldIntText(obj, name) {\n    const value = testingSafeField(obj, name);\n    if (!value) {\n        return null;\n    }\n    if (typeof value.valueBig === 'function') {\n        try {\n            const big = value.valueBig();\n            if (big === null || big === undefined) {\n                return null;\n            }\n            return `${big}`;\n        } catch (_err) {\n            return null;\n        }\n    }\n    if (typeof value.value === 'function') {\n        try {\n            const n = value.value();\n            if (n === null || n === undefined) {\n                return null;\n            }\n            return `${n}`;\n        } catch (_err) {\n            return null;\n        }\n    }\n    return null;\n}\n\n// testingObjShape summarises one ptrless object shape for transport debugging.\nfunction testingObjShape(obj) {\n    if (!obj) {\n        return null;\n    }\n    let fieldNames = null;\n    if (typeof obj.fieldNames === 'function') {\n        try {\n            fieldNames = obj.fieldNames();\n        } catch (_err) {\n            fieldNames = null;\n        }\n    }\n    return {\n        type: obj?.constructor?.name ?? typeof obj,\n        logical_type: typeof obj.logicalType === 'function' ? obj.logicalType() : null,\n        physical_type: typeof obj.physicalType === 'function' ? obj.physicalType() : null,\n        length: typeof obj.length === 'function' ? obj.length() : null,\n        field_names: Array.isArray(fieldNames) ? [...fieldNames] : null,\n    };\n}\n\nfunction testingIntEntry(value, name, index) {\n    if (typeof value === 'number') {\n        if (!Number.isInteger(value)) {\n            throw new Error(`Expected integer list field ${name} entry ${index} to be an integer.`);\n        }\n        return value;\n    }\n    if (typeof value === 'bigint') {\n        return Number(value);\n    }\n    if (!value) {\n        throw new Error(`Expected integer list field ${name} entry ${index} to be Int.`);\n    }\n    if (typeof value.valueBig === 'function') {\n        const big = value.valueBig();\n        if (typeof big === 'bigint') {\n            return Number(big);\n        }\n    }\n    if (typeof value.value === 'function') {\n        const n = value.value();\n        if (!Number.isInteger(n)) {\n            throw new Error(`Expected integer list field ${name} entry ${index} to be an integer.`);\n        }\n        return n;\n    }\n    throw new Error(`Expected integer list field ${name} entry ${index} to be Int.`);\n}\n\nfunction testingIntList(obj, name) {\n    const value = testingSafeField(obj, name);\n    if (!value || typeof value.length !== 'function' || typeof value.at !== 'function') {\n        return [];\n    }\n    const out = [];\n    const n = value.length();\n    for (let i = 0; i < n; i++) {\n        out.push(testingIntEntry(value.at(i), name, i));\n    }\n    return out;\n}\n\nfunction testingRowsLike(obj) {\n    if (!obj) {\n        return [];\n    }\n    if (typeof obj.rowAt === 'function' && typeof obj.length === 'function') {\n        const out = [];\n        const n = obj.length();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.rowAt(i));\n        }\n        return out;\n    }\n    if (typeof obj.at === 'function' && typeof obj.length === 'function') {\n        const out = [];\n        const n = obj.length();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.at(i));\n        }\n        return out;\n    }\n    return [];\n}\n\nfunction testingProjectionOutputLineSample(body, limit = 8) {\n    const outputs = testingSafeField(body, 'outputs');\n    const lines = [];\n    for (const slot of testingRowsLike(outputs)) {\n        const line = testingFieldInt(slot, 'line');\n        if (Number.isInteger(line)) {\n            lines.push(line);\n            if (lines.length >= limit) {\n                break;\n            }\n        }\n    }\n    return lines;\n}\n\n// Claim one armed hold for a concrete subscribe contract.\nfunction claimTestingPuffbookSubscribeOpenHold(contract) {\n    if (g_testingPuffbookSubscribeOpenSeam.armed <= 0) {\n        return null;\n    }\n    if (contract !== 'projection' && contract !== 'legacy') {\n        throw new Error(`Unknown testing puffbook subscribe contract ${JSON.stringify(contract)}.`);\n    }\n    g_testingPuffbookSubscribeOpenSeam.armed -= 1;\n    syncTestingPuffbookSubscribeOpenArmed();\n    const hold = {\n        id: g_testingPuffbookSubscribeOpenSeam.nextId++,\n        contract,\n        released: false,\n        response: null,\n        stream: null,\n    };\n    g_testingPuffbookSubscribeOpenSeam.held.set(hold.id, hold);\n    return hold;\n}\n\nfunction forgetTestingPuffbookSubscribeOpenHold(hold) {\n    if (!hold) {\n        return;\n    }\n    g_testingPuffbookSubscribeOpenSeam.held.delete(hold.id);\n}\n\n// A connection failure before the held response is released must leave the next retry held.\nfunction returnTestingPuffbookSubscribeOpenHold(hold) {\n    if (!hold || hold.released) {\n        return;\n    }\n    forgetTestingPuffbookSubscribeOpenHold(hold);\n    g_testingPuffbookSubscribeOpenSeam.armed += 1;\n    syncTestingPuffbookSubscribeOpenArmed();\n}\n\nexport function testingPuffbookHoldNextSubscribeOpen() {\n    g_testingPuffbookSubscribeOpenSeam.armed += 1;\n    syncTestingPuffbookSubscribeOpenArmed();\n    return true;\n}\n\nexport function testingPuffbookReleaseHeldSubscribeOpen(id = null) {\n    let hold = null;\n    if (id === null || id === undefined) {\n        hold = g_testingPuffbookSubscribeOpenSeam.held.values().next().value ?? null;\n    } else {\n        hold = g_testingPuffbookSubscribeOpenSeam.held.get(id) ?? null;\n    }\n    if (!hold) {\n        return false;\n    }\n    hold.released = true;\n    if (hold.response && typeof hold.stream?.openResponse === 'function') {\n        hold.stream.openResponse(hold.response);\n    }\n    return true;\n}\n\n// testingPuffbookSubscribeOpenState exposes held-open queue contents so e2e can await a specific transition.\nexport function testingPuffbookSubscribeOpenState() {\n    return {\n        armed: g_testingPuffbookSubscribeOpenSeam.armed,\n        held: Array.from(g_testingPuffbookSubscribeOpenSeam.held.values()).map((hold) => ({\n            id: hold.id,\n            contract: hold.contract,\n            released: hold.released,\n            response_ready: !!hold.response,\n            queued_events: hold.stream?.queuedEvents?.length ?? 0,\n            queued_event_types: (hold.stream?.queuedEvents ?? []).map((event) => event?.event_type ?? testingFieldText(event?.body, 'event_type') ?? ''),\n            opened: !!hold.stream?.opened,\n        })),\n    };\n}\n\n// testingPuffbookHeldSubscribeOpenSummary exposes the next held open payload shape.\nexport function testingPuffbookHeldSubscribeOpenSummary(id = null) {\n    let hold = null;\n    if (id === null || id === undefined) {\n        hold = g_testingPuffbookSubscribeOpenSeam.held.values().next().value ?? null;\n    } else {\n        hold = g_testingPuffbookSubscribeOpenSeam.held.get(id) ?? null;\n    }\n    if (!hold?.response?.body) {\n        return null;\n    }\n    const body = hold.response.body;\n    const outputs = testingSafeField(body, 'outputs');\n    return {\n        hold_id: hold.id,\n        released: !!hold.released,\n        body: testingObjShape(body),\n        outputs: testingObjShape(outputs),\n    };\n}\n\nfunction recordTestingPuffbookMutateCall(subscriptionUUID, baseVersion, editOrdinal, change) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void subscriptionUUID;\n        void baseVersion;\n        void editOrdinal;\n        void change;\n        return;\n    }\n    let row = null;\n    if (change !== null && change !== undefined) {\n        const n = editChainLen(change, 'testing puffbook mutate change');\n        let rows = [];\n        for (let i = 0; i < n; i += 1) {\n            const item = editParts(editChainAt(change, i, 'testing puffbook mutate row'));\n            rows.push({\n                line: item.line,\n                col: item.col,\n                deleted_text: item.old_text,\n                inserted_text: item.new_text,\n            });\n        }\n        if (n > 0) {\n            row = editParts(editChainAt(change, 0, 'testing puffbook mutate change'), 'testing puffbook mutate row 0');\n        }\n        g_testingPuffbookMutateSeam.calls.push({\n            seq: g_testingPuffbookMutateSeam.nextSeq++,\n            subscription_uuid: subscriptionUUID,\n            base_version: baseVersion,\n            edit_ordinal: editOrdinal,\n            edit_count: n,\n            rows,\n            line: row?.line ?? null,\n            col: row?.col ?? null,\n            deleted_text: row?.old_text ?? null,\n            inserted_text: row?.new_text ?? null,\n        });\n        return;\n    }\n    g_testingPuffbookMutateSeam.calls.push({\n        seq: g_testingPuffbookMutateSeam.nextSeq++,\n        subscription_uuid: subscriptionUUID,\n        base_version: baseVersion,\n        edit_ordinal: editOrdinal,\n        edit_count: 0,\n        rows: [],\n        line: row?.line ?? null,\n        col: row?.col ?? null,\n        deleted_text: row?.old_text ?? null,\n        inserted_text: row?.new_text ?? null,\n    });\n}\n\nfunction recordTestingPuffbookAmendCall(subscriptionUUID, baseVersion, line, change) {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        void subscriptionUUID;\n        void baseVersion;\n        void line;\n        void change;\n        return;\n    }\n    g_testingPuffbookMutateSeam.calls.push({\n        seq: g_testingPuffbookMutateSeam.nextSeq++,\n        subscription_uuid: subscriptionUUID,\n        base_version: baseVersion,\n        line,\n        col: null,\n        deleted_text: null,\n        inserted_text: change,\n    });\n}\n\nfunction forgetTestingHeldEditEventsForStream(stream) {\n    void stream;\n    // Keep held edit events observable across transient stream retirement so\n    // the testing seam can inspect and release the captured source_edit_applied.\n}\n\n// maybeHoldTestingPuffbookEditEvent captures one edit edge while keeping its following stream frames ordered behind it.\nfunction maybeHoldTestingPuffbookEditEvent(stream, body, previewHints = null, dispatch = null) {\n    const eventType = testingFieldText(body, 'event_type');\n    const isEdit = eventType === 'source_edit_applied' || eventType === 'edit';\n    if (!isEdit) {\n        return false;\n    }\n    if (g_testingPuffbookMutateSeam.holdNextEditEvents <= 0) {\n        return false;\n    }\n    g_testingPuffbookMutateSeam.holdNextEditEvents -= 1;\n    const held = {\n        id: g_testingPuffbookMutateSeam.nextHeldEditId++,\n        stream,\n        body,\n        previewHints,\n        dispatch,\n        queuedEvents: [],\n    };\n    stream.testingHeldEdit = held;\n    g_testingPuffbookMutateSeam.heldEditEvents.push(held);\n    pushTestingPortalWSTrace('ws_stream_edit_hold', {\n        hold_id: held.id,\n        method: stream?.method ?? '',\n        event_type: eventType,\n        version: testingFieldInt(body, 'version') ?? '',\n        stream_seq: testingFieldIntText(body, 'seq') ?? '',\n        has_stream: !!stream,\n        has_dispatch: typeof dispatch === 'function',\n    });\n    return true;\n}\n\n// queueTestingHeldPuffbookEditEvent preserves stream order behind one explicitly held edit event.\nfunction queueTestingHeldPuffbookEditEvent(stream, body, previewHints = null, dispatch = null) {\n    const held = stream?.testingHeldEdit ?? null;\n    if (!held) {\n        return false;\n    }\n    held.queuedEvents.push({\n        body,\n        previewHints,\n        dispatch,\n    });\n    pushTestingPortalWSTrace('ws_stream_edit_hold_queue', {\n        hold_id: held.id,\n        method: stream?.method ?? '',\n        event_type: testingFieldText(body, 'event_type') ?? '',\n        version: testingFieldInt(body, 'version') ?? '',\n        stream_seq: testingFieldIntText(body, 'seq') ?? '',\n        queued_count: held.queuedEvents.length,\n        has_stream: !!stream,\n        has_dispatch: typeof dispatch === 'function',\n    });\n    return true;\n}\n\nexport function testingPuffbookResetMutateTrace() {\n    g_testingPuffbookMutateSeam.calls = [];\n    g_testingPuffbookMutateSeam.nextSeq = 1;\n    g_testingPuffbookMutateSeam.holdNextEditEvents = 0;\n    g_testingPuffbookMutateSeam.heldEditEvents = [];\n    return true;\n}\n\nexport function testingPuffbookMutateTrace() {\n    if (!TESTING_PORTAL_TELEMETRY_ENABLED) {\n        return [];\n    }\n    return g_testingPuffbookMutateSeam.calls.map((call) => ({ ...call }));\n}\n\nexport function testingPuffbookHoldNextEditEvent() {\n    g_testingPuffbookMutateSeam.holdNextEditEvents += 1;\n    return true;\n}\n\n// testingPuffbookHeldEditEventState exposes the held edge and its ordered tail for e2e diagnostics.\nexport function testingPuffbookHeldEditEventState() {\n    return {\n        armed: g_testingPuffbookMutateSeam.holdNextEditEvents,\n        held: g_testingPuffbookMutateSeam.heldEditEvents.map((held) => ({\n            id: held.id,\n            event_type: testingFieldText(held.body, 'event_type'),\n            version: testingFieldInt(held.body, 'version'),\n            queued_events: held.queuedEvents.length,\n        })),\n    };\n}\n\n// testingPuffbookReleaseHeldEditEvent releases one held edge followed by every later stream frame in order.\nexport function testingPuffbookReleaseHeldEditEvent(id = null) {\n    let idx = -1;\n    if (id === null || id === undefined) {\n        idx = g_testingPuffbookMutateSeam.heldEditEvents.length === 0 ? -1 : 0;\n    } else {\n        idx = g_testingPuffbookMutateSeam.heldEditEvents.findIndex((held) => held.id === id);\n    }\n    if (idx < 0) {\n        return false;\n    }\n    const [held] = g_testingPuffbookMutateSeam.heldEditEvents.splice(idx, 1);\n    pushTestingPortalWSTrace('ws_stream_edit_hold_release', {\n        hold_id: held.id,\n        method: held.stream?.method ?? '',\n        event_type: testingFieldText(held.body, 'event_type') ?? '',\n        version: testingFieldInt(held.body, 'version') ?? '',\n        stream_seq: testingFieldIntText(held.body, 'seq') ?? '',\n        queued_count: held.queuedEvents.length,\n        has_stream: !!held.stream,\n        has_dispatch: typeof held.dispatch === 'function',\n    });\n    if (held.stream?.testingHeldEdit === held) {\n        held.stream.testingHeldEdit = null;\n    }\n    if (typeof held.dispatch === 'function') {\n        held.dispatch();\n    } else {\n        held.stream?.onEvent?.({\n            body: held.body,\n            previewHints: held.previewHints ?? null,\n        });\n    }\n    for (const event of held.queuedEvents) {\n        if (typeof event?.dispatch === 'function') {\n            event.dispatch();\n        } else {\n            held.stream?.onEvent?.(event);\n        }\n    }\n    requestFrame('testing_release_held_edit');\n    return true;\n}\n\nfunction stateError(kind, err) {\n    if (!err) {\n        return null;\n    }\n    return {\n        kind,\n        message: err instanceof Error ? err.message : String(err),\n    };\n}\n\n/* Treat upstream/proxy gateway failures as backend-unavailable rather than generic transport noise. */\nfunction isBackendUnavailableStatus(status) {\n    return status === 502 || status === 503 || status === 504;\n}\n\n/* Recognise the API/backend-down family from either structured status or captured error text. */\nexport function isBackendUnavailableError(err) {\n    const status = err?.status;\n    if (isBackendUnavailableStatus(status)) {\n        return true;\n    }\n    const detail = (err instanceof Error ? err.message : String(err ?? '')).toLowerCase();\n    return (\n        (detail.includes('upstream') && detail.includes('is not running'))\n        || (detail.includes('backend') && detail.includes('unavailable'))\n        || (detail.includes('api error 503') && detail.includes('content-type=text/plain'))\n    );\n}\n\nfunction websocketCloseError(event) {\n    const suffix = event.reason\n        ? ` code=${event.code} reason=${JSON.stringify(event.reason)} wasClean=${event.wasClean}`\n        : ` code=${event.code} wasClean=${event.wasClean}`;\n    if (event.code === 1006) {\n        return new Error(`WebSocket connection dropped unexpectedly.${suffix} This usually indicates a proxy or transport interruption rather than an application-level access denial.`);\n    }\n    return new Error(`WebSocket connection closed.${suffix}`);\n}\n\nexport function parseDirectorySnapshotPayload(obj) {\n    if (!obj || typeof obj.field !== 'function') {\n        throw new Error('Directory subscription snapshot must be a ptrless struct.');\n    }\n    return parseDirectorySnapshotObj(obj);\n}\n\nexport function parseDirectoryDeltaPayload(obj) {\n    if (!obj || typeof obj.field !== 'function') {\n        throw new Error('Directory subscription delta must be a ptrless struct.');\n    }\n    return parseDirectoryDeltaObj(obj);\n}\n\nfunction directoryValueText(value, label) {\n    if (typeof value === 'string') {\n        return value;\n    }\n    if (!value || typeof value.toText !== 'function') {\n        throw new Error(`${label} must be text.`);\n    }\n    return value.toText();\n}\n\n// Decode both ptrless scalar wrappers and primitive values exposed by row views.\nfunction directoryValueInt(value, label) {\n    if (typeof value === 'number' && Number.isInteger(value)) {\n        return value;\n    }\n    if (typeof value === 'bigint') {\n        return Number(value);\n    }\n    if (!value) {\n        throw new Error(`${label} must be Int.`);\n    }\n    if (typeof value.length === 'function' && typeof value.at === 'function') {\n        const length = value.length();\n        if (length !== 1) {\n            throw new Error(`${label} must be scalar Int, got collection length ${length}.`);\n        }\n        return directoryValueInt(value.at(0), label);\n    }\n    if (typeof value.valueBig === 'function') {\n        const big = value.valueBig();\n        if (typeof big === 'bigint') {\n            return Number(big);\n        }\n    }\n    if (typeof value.value === 'function') {\n        const n = value.value();\n        if (Number.isInteger(n)) {\n            return n;\n        }\n    }\n    throw new Error(`${label} must be Int.`);\n}\n\nfunction directoryValueBool(value, label) {\n    if (typeof value === 'boolean') {\n        return value;\n    }\n    if (!value || typeof value.value !== 'function') {\n        throw new Error(`${label} must be Bool.`);\n    }\n    const ret = value.value();\n    if (typeof ret !== 'boolean') {\n        throw new Error(`${label} must be Bool.`);\n    }\n    return ret;\n}\n\nfunction directoryField(obj, name, shape) {\n    if (!obj || typeof obj.field !== 'function') {\n        throw new Error(`${shape} must be a ptrless struct.`);\n    }\n    try {\n        return obj.field(name);\n    } catch (err) {\n        throw new Error(`${shape} missing field ${JSON.stringify(name)}: ${err?.message || err}`);\n    }\n}\n\nfunction directoryMaybeField(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        return null;\n    }\n    try {\n        return obj.field(name);\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction directoryRejectRetiredBranchSeq(obj, shape) {\n    if (!obj || typeof obj.fieldNames !== 'function') {\n        throw new Error(`${shape} must expose canonical field names.`);\n    }\n    const names = obj.fieldNames();\n    if (!Array.isArray(names)) {\n        throw new Error(`${shape} field names must be an array.`);\n    }\n    if (names.includes('branch_seq')) {\n        throw new Error(`${shape} contains retired field \"branch_seq\"; use \"seq\" as the directory stream order.`);\n    }\n}\n\nfunction directoryItems(obj, label) {\n    if (!obj) {\n        return [];\n    }\n    if (Array.isArray(obj)) {\n        return obj;\n    }\n    if (typeof obj.numFields === 'function' && typeof obj.at === 'function') {\n        const out = [];\n        const n = obj.numFields();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.at(i));\n        }\n        return out;\n    }\n    if (typeof obj.length === 'function' && typeof obj.at === 'function') {\n        const out = [];\n        const n = obj.length();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.at(i));\n        }\n        return out;\n    }\n    throw new Error(`${label} must be a ptrless tuple or list.`);\n}\n\nfunction directoryRows(obj, label) {\n    if (!obj) {\n        return [];\n    }\n    if (Array.isArray(obj)) {\n        return obj;\n    }\n    if (typeof obj.rowAt === 'function' && typeof obj.length === 'function') {\n        let names = null;\n        try {\n            names = typeof obj.fieldNames === 'function' ? obj.fieldNames() : null;\n        } catch (_err) {\n            names = null;\n        }\n        if (!Array.isArray(names) || names.length === 0) {\n            return directoryItems(obj, label);\n        }\n        const out = [];\n        const n = obj.length();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.rowAt(i));\n        }\n        return out;\n    }\n    return directoryItems(obj, label);\n}\n\nfunction parseDirectoryArtObj(obj, label) {\n    castPtrlessNamed('puff_DirectoryWireArtifact', obj);\n    const out = {\n        name: directoryValueText(directoryField(obj, 'name', label), `${label}.name`),\n        type: directoryValueText(directoryField(obj, 'type', label), `${label}.type`),\n        owner: directoryValueText(directoryField(obj, 'owner', label), `${label}.owner`),\n        read_groups: directoryItems(directoryField(obj, 'read_groups', label), `${label}.read_groups`).map((item, i) => directoryValueText(item, `${label}.read_groups[${i}]`)),\n        write_groups: directoryItems(directoryField(obj, 'write_groups', label), `${label}.write_groups`).map((item, i) => directoryValueText(item, `${label}.write_groups[${i}]`)),\n    };\n    const canRead = directoryMaybeField(obj, 'can_read');\n    const canWrite = directoryMaybeField(obj, 'can_write');\n    if (canRead !== null) {\n        out.can_read = directoryValueBool(canRead, `${label}.can_read`);\n    }\n    if (canWrite !== null) {\n        out.can_write = directoryValueBool(canWrite, `${label}.can_write`);\n    }\n    return out;\n}\n\nfunction parseDirectoryNodeObj(obj, label) {\n    castPtrlessNamed('puff_DirectoryWireNode', obj);\n    const hasArtifact = directoryValueBool(directoryField(obj, 'has_artifact', label), `${label}.has_artifact`);\n    return {\n        name: directoryValueText(directoryField(obj, 'name', label), `${label}.name`),\n        kind: directoryValueText(directoryField(obj, 'kind', label), `${label}.kind`),\n        artifact: hasArtifact ? parseDirectoryArtObj(directoryField(obj, 'artifact', label), `${label}.artifact`) : undefined,\n        owner_path: directoryValueText(directoryField(obj, 'owner_path', label), `${label}.owner_path`),\n        conflicts: directoryItems(directoryField(obj, 'conflicts', label), `${label}.conflicts`).map((item, i) => directoryValueText(item, `${label}.conflicts[${i}]`)),\n    };\n}\n\nfunction parseDirectoryNameObj(obj, label) {\n    castPtrlessNamed('puff_DirectoryWireName', obj);\n    return {\n        name: directoryValueText(directoryField(obj, 'name', label), `${label}.name`),\n    };\n}\n\nfunction parseDirectoryGroupObj(obj, label) {\n    castPtrlessNamed('puff_DirectoryWireGroup', obj);\n    const hasSourceArtifact = directoryValueBool(directoryField(obj, 'has_source_artifact', label), `${label}.has_source_artifact`);\n    return {\n        key: directoryValueText(directoryField(obj, 'key', label), `${label}.key`),\n        source_name: directoryValueText(directoryField(obj, 'source_name', label), `${label}.source_name`),\n        source_path: directoryValueText(directoryField(obj, 'source_path', label), `${label}.source_path`),\n        source_artifact: hasSourceArtifact ? parseDirectoryArtObj(directoryField(obj, 'source_artifact', label), `${label}.source_artifact`) : undefined,\n        names: directoryRows(directoryField(obj, 'names', label), `${label}.names`).map((item, i) => parseDirectoryNameObj(item, `${label}.names[${i}]`)),\n    };\n}\n\nfunction parseDirectoryCountsObj(obj, label, publicationCounts = null) {\n    castPtrlessNamed('puff_DirectoryWireCounts', obj);\n    const symbolsField = directoryMaybeField(obj, 'symbols');\n    const conflictsField = directoryMaybeField(obj, 'conflicts');\n    const publicationSymbols = publicationCounts ? directoryMaybeField(publicationCounts, 'symbols') : null;\n    const publicationConflicts = publicationCounts ? directoryMaybeField(publicationCounts, 'conflicts') : null;\n    return {\n        children: directoryValueInt(directoryField(obj, 'children', label), `${label}.children`),\n        symbols: directoryValueInt(symbolsField ?? publicationSymbols ?? 0, `${label}.symbols`),\n        conflicts: directoryValueInt(conflictsField ?? publicationConflicts ?? 0, `${label}.conflicts`),\n    };\n}\n\nfunction parseDirectoryPublicationCountsObj(obj, label) {\n    if (!obj) {\n        return {\n            freshness: 'golden',\n            symbols: 0,\n            conflicts: 0,\n        };\n    }\n    castPtrlessNamed('puff_DirectoryWirePublicationCounts', obj);\n    return {\n        freshness: directoryValueText(directoryField(obj, 'freshness', label), `${label}.freshness`),\n        symbols: directoryValueInt(directoryField(obj, 'symbols', label), `${label}.symbols`),\n        conflicts: directoryValueInt(directoryField(obj, 'conflicts', label), `${label}.conflicts`),\n    };\n}\n\nfunction parseDirectoryKeyObj(obj, label) {\n    castPtrlessNamed('puff_DirectoryWireKey', obj);\n    return {\n        branch: directoryValueText(directoryField(obj, 'branch', label), `${label}.branch`),\n        path: directoryValueText(directoryField(obj, 'path', label), `${label}.path`),\n    };\n}\n\nfunction parseDirectoryEditObj(obj, label, parseRow) {\n    castPtrlessNamed(\n        parseRow === parseDirectoryNodeObj ? 'puff_DirectoryWireNodeEdit' : 'puff_DirectoryWireGroupEdit',\n        obj,\n    );\n    return {\n        kind: directoryValueText(directoryField(obj, 'kind', label), `${label}.kind`),\n        index: directoryValueInt(directoryField(obj, 'index', label), `${label}.index`),\n        count: directoryValueInt(directoryField(obj, 'count', label), `${label}.count`),\n        rows: directoryRows(directoryField(obj, 'rows', label), `${label}.rows`).map((item, i) => parseRow(item, `${label}.rows[${i}]`)),\n    };\n}\n\nfunction parseDirectorySnapshotObj(obj) {\n    directoryRejectRetiredBranchSeq(obj, 'DirectorySnapshot');\n    castPtrlessNamed('puff_DirectoryWireSnapshot', obj);\n    const publicationCounts = parseDirectoryPublicationCountsObj(\n        directoryMaybeField(obj, 'publication_counts'),\n        'DirectorySnapshot.publication_counts',\n    );\n    return {\n        key: parseDirectoryKeyObj(directoryField(obj, 'key', 'DirectorySnapshot'), 'DirectorySnapshot.key'),\n        seq: directoryValueInt(directoryField(obj, 'seq', 'DirectorySnapshot'), 'DirectorySnapshot.seq'),\n        projection: directoryValueText(directoryField(obj, 'projection', 'DirectorySnapshot'), 'DirectorySnapshot.projection'),\n        counts: parseDirectoryCountsObj(directoryField(obj, 'counts', 'DirectorySnapshot'), 'DirectorySnapshot.counts', directoryMaybeField(obj, 'publication_counts')),\n        publication_state: directoryValueText(directoryMaybeField(obj, 'publication_state') ?? 'golden', 'DirectorySnapshot.publication_state'),\n        publication_counts: publicationCounts,\n        alphabetical: directoryRows(directoryField(obj, 'alphabetical', 'DirectorySnapshot'), 'DirectorySnapshot.alphabetical').map((item, i) => parseDirectoryNodeObj(item, `DirectorySnapshot.alphabetical[${i}]`)),\n        by_source: directoryRows(directoryField(obj, 'by_source', 'DirectorySnapshot'), 'DirectorySnapshot.by_source').map((item, i) => parseDirectoryGroupObj(item, `DirectorySnapshot.by_source[${i}]`)),\n    };\n}\n\nfunction parseDirectoryDeltaObj(obj) {\n    directoryRejectRetiredBranchSeq(obj, 'DirectoryDelta');\n    castPtrlessNamed('puff_DirectoryWireDelta', obj);\n    const publicationCounts = parseDirectoryPublicationCountsObj(\n        directoryMaybeField(obj, 'publication_counts'),\n        'DirectoryDelta.publication_counts',\n    );\n    return {\n        key: parseDirectoryKeyObj(directoryField(obj, 'key', 'DirectoryDelta'), 'DirectoryDelta.key'),\n        seq: directoryValueInt(directoryField(obj, 'seq', 'DirectoryDelta'), 'DirectoryDelta.seq'),\n        projection: directoryValueText(directoryField(obj, 'projection', 'DirectoryDelta'), 'DirectoryDelta.projection'),\n        counts: parseDirectoryCountsObj(directoryField(obj, 'counts', 'DirectoryDelta'), 'DirectoryDelta.counts', directoryMaybeField(obj, 'publication_counts')),\n        publication_state: directoryValueText(directoryMaybeField(obj, 'publication_state') ?? 'golden', 'DirectoryDelta.publication_state'),\n        publication_counts: publicationCounts,\n        alphabetical: directoryRows(directoryField(obj, 'alphabetical', 'DirectoryDelta'), 'DirectoryDelta.alphabetical').map((item, i) => parseDirectoryEditObj(item, `DirectoryDelta.alphabetical[${i}]`, parseDirectoryNodeObj)),\n        by_source: directoryRows(directoryField(obj, 'by_source', 'DirectoryDelta'), 'DirectoryDelta.by_source').map((item, i) => parseDirectoryEditObj(item, `DirectoryDelta.by_source[${i}]`, parseDirectoryGroupObj)),\n    };\n}\n\nfunction configDebugJSBackdoor(config) {\n    const enabled = config?.debug?.js_backdoor;\n    if (enabled === undefined) {\n        return false;\n    }\n    if (typeof enabled !== 'boolean') {\n        throw new Error(`Portal config field 'debug.js_backdoor' must be a boolean.`);\n    }\n    return enabled;\n}\n\nexport function testingConfigDebugJSBackdoor(config) {\n    return configDebugJSBackdoor(config);\n}\n\nfunction requireBrowserCrashReportStr(report, field) {\n    const value = report?.[field];\n    if (typeof value !== 'string') {\n        throw new Error(`browser crash report field '${field}' must be a string.`);\n    }\n    if (value.trim() === '') {\n        throw new Error(`browser crash report field '${field}' must not be blank.`);\n    }\n    return value;\n}\n\nfunction buildBrowserCrashReportRequest(report) {\n    const reportType = requireBrowserCrashReportStr(report, 'report_type');\n    const summary = requireBrowserCrashReportStr(report, 'summary');\n    const pageUrl = requireBrowserCrashReportStr(report, 'page_url');\n    const userAgent = requireBrowserCrashReportStr(report, 'user_agent');\n\n    let reportJSON = report?.report_json;\n    if (typeof reportJSON !== 'string') {\n        try {\n            reportJSON = JSON.stringify(reportJSON);\n        } catch (err) {\n            throw new Error(`browser crash report field 'report_json' must be JSON-serialisable: ${err}`);\n        }\n    }\n    if (typeof reportJSON !== 'string' || reportJSON.trim() === '') {\n        throw new Error(`browser crash report field 'report_json' must be non-empty JSON.`);\n    }\n    JSON.parse(reportJSON);\n\n    return {\n        report_type: reportType,\n        summary,\n        page_url: pageUrl,\n        user_agent: userAgent,\n        report_json: reportJSON,\n    };\n}\n\nexport function testingBuildBrowserCrashReportRequest(report) {\n    return buildBrowserCrashReportRequest(report);\n}\n\nexport function testingParsePuffbookMutateResponse(body) {\n    return parsePuffbookMutateResponseBody(body);\n}\n\nfunction describeWSConnectFailure(url, err) {\n    const detail = err instanceof Error ? err.message : String(err);\n    const proxyHint = /\\/proxy\\/\\d+(?:\\/|$)/.test(new URL(url, window.location.href).pathname)\n        ? ' If ordinary HTTP requests succeed but websocket open fails, the notebook proxy or its authentication layer is likely interrupting the websocket upgrade before tranquility sees it.'\n        : '';\n    return new Error(`Could not open websocket at ${url}: ${detail}.${proxyHint}`);\n}\n\nexport async function connectTranquility(user) {\n    const { env, config, apiBaseUrl } = await loadPortalAPIConfig();\n\n    // Mixed mode may point a local shell at dev or prod, so auth follows\n    // the selected config rather than the shell host.\n    const tokenProvider = config?.auth ? resolveFreshAccessToken : null;\n    const api = new TranquilityAPI(user, apiBaseUrl, tokenProvider, config);\n    void api.connect().catch((err) => {\n        const detail = err instanceof Error ? err.message : String(err);\n        const isWSFailure = detail.includes('WebSocket connection failed.');\n        if (isWSFailure) {\n            console.warn(describeWSConnectFailure(`${new URL(apiBaseUrl, window.location.href).toString().replace(/\\/+$/, '')}/ws?lane=control`, err));\n            return;\n        }\n        if (isBackendUnavailableError(err)) {\n            return;\n        }\n        console.warn(`Initial tranquility connect attempt failed for env=${env} at ${apiBaseUrl}: ${detail}`);\n    });\n    return api;\n}\n\nasync function signinSilentShared(userManager, previousUser, { forceIframeAuth = false } = {}) {\n    // An iframe recovery must not reuse a refresh-token exchange already in flight.\n    // Wait for it before starting iframe renewal so stored users cannot race.\n    if (g_silentRenewPromise && forceIframeAuth && !g_silentRenewForceIframeAuth) {\n        await g_silentRenewPromise;\n    }\n    if (!g_silentRenewPromise) {\n        g_silentRenewForceIframeAuth = forceIframeAuth;\n        g_silentRenewPromise = (async () => {\n            try {\n                return await renewUserSilently(userManager, previousUser, { forceIframeAuth });\n            } finally {\n                g_silentRenewPromise = null;\n            }\n        })();\n    }\n\n    return await g_silentRenewPromise;\n}\n\nasync function resolveFreshAccessToken({ forceRefresh = false, staleToken = null, forceIframeAuth = false } = {}) {\n    const userManager = await getUserManager();\n    let user = await userManager.getUser();\n    if (forceRefresh && staleToken && user && !user.expired && user.access_token\n        && user.access_token !== staleToken) {\n        return user.access_token;\n    }\n\n    if (!user || user.expired || !user.access_token || forceRefresh || forceIframeAuth) {\n        const previousToken = user?.access_token;\n        try {\n            user = await signinSilentShared(userManager, user, { forceIframeAuth });\n            logWhoami(user, forceIframeAuth ? 'silent_renew_iframe' : (forceRefresh ? 'silent_renew_forced' : 'silent_renew'));\n        } catch (err) {\n            console.warn('OIDC silent token renewal failed.', err);\n            const latest = await userManager.getUser();\n            if (latest && !latest.expired && latest.access_token && latest.access_token !== previousToken\n                && user?.profile?.sub && latest.profile?.sub === user.profile.sub) {\n                logWhoami(latest, 'silent_renew_shared');\n                return latest.access_token;\n            }\n            if (isTerminalSilentRenewError(err)) {\n                throw new AuthRequiredError('Authentication expired. Please sign in again.', err);\n            }\n            throw new AuthRenewalError(err);\n        }\n    }\n\n    if (!user || user.expired || !user.access_token) {\n        throw new AuthRequiredError('Authentication required. Please sign in again.');\n    }\n\n    return user.access_token;\n}\n\nconst MAX_EXPECTED_LATE_STREAM_CLOSES = 256;\n\n/* Retain only client-retired stream identities. This distinguishes their one\n * expected terminal frame from a genuinely unknown UUID without weakening the\n * strict response/event path. */\nfunction rememberExpectedLateStreamClose(retired, uuidHex, details) {\n    retired.delete(uuidHex);\n    retired.set(uuidHex, details);\n    while (retired.size > MAX_EXPECTED_LATE_STREAM_CLOSES) {\n        retired.delete(retired.keys().next().value);\n    }\n}\n\nfunction consumeExpectedLateStreamClose(retired, uuidHex, envType) {\n    if (envType !== ptl.Close || !retired.has(uuidHex)) {\n        return null;\n    }\n    const details = retired.get(uuidHex);\n    retired.delete(uuidHex);\n    return details;\n}\n\nexport function testingRememberExpectedLateStreamClose(retired, uuidHex, details = {}) {\n    rememberExpectedLateStreamClose(retired, uuidHex, details);\n}\n\nexport function testingConsumeExpectedLateStreamClose(retired, uuidHex, envType) {\n    return consumeExpectedLateStreamClose(retired, uuidHex, envType);\n}\n\nexport function testingExpectedLateStreamCloseLimit() {\n    return MAX_EXPECTED_LATE_STREAM_CLOSES;\n}\n\nclass TranquilityAPI {\n    #user;\n    #baseUrl;\n    #tokenProvider;\n    #config;\n    #state;\n    #stateListeners;\n    #puffworkerStateListeners;\n    #connectPromise;\n    #reconnectTask;\n    #wsConn;\n    #wsReady;\n    #wsPending;\n    #wsStreams;\n    #wsExpectedLateStreamCloses;\n    #wsConnectSeq;\n    #wsEverOpened;\n    #wsCodec;\n    #wsDataConn;\n    #wsDataReady;\n    #wsDataPending;\n    #wsDataConnectSeq;\n    #wsDataCodec;\n    #wsDataSubscriptions;\n    #wsDataReconnectTask;\n    #rejectedAccessToken;\n    #resolvedAccessToken;\n    #authGeneration;\n    #forcedTokenPromise;\n    #forcedTokenIframeAuth;\n    #observabilityReports;\n    #observabilityReportQueueDrops;\n    #observabilityReportTimer;\n    #observabilityReportFlushing;\n\n    constructor(user, baseUrl, tokenProvider = null, config = null) {\n        if (user === null) {\n            ;\n        } else if (user && user.access_token) {\n            ;\n        } else {\n            throw new Error(\"API initialization requires a valid user object with an access_token.\");\n        }\n        this.#user = user;\n        this.#baseUrl = baseUrl;\n        this.#tokenProvider = tokenProvider;\n        this.#config = config;\n        this.#state = Object.freeze({\n            connection: API_CONNECTION_STATES.IDLE,\n            auth: tokenProvider\n                ? (user && !user.expired && user.access_token\n                    ? API_AUTH_STATES.AUTHENTICATED\n                    : API_AUTH_STATES.RENEWING)\n                : API_AUTH_STATES.LOCAL,\n            lastError: null,\n        });\n        this.#stateListeners = new Set();\n        this.#puffworkerStateListeners = new Set();\n        this.#connectPromise = null;\n        this.#reconnectTask = null;\n        this.#wsConn = null;\n        this.#wsReady = null;\n        this.#wsPending = new Map();\n        this.#wsStreams = new Map();\n        this.#wsExpectedLateStreamCloses = new Map();\n        this.#wsConnectSeq = 0;\n        this.#wsEverOpened = false;\n        this.#wsCodec = null;\n        this.#wsDataConn = null;\n        this.#wsDataReady = null;\n        this.#wsDataPending = new Map();\n        this.#wsDataConnectSeq = 0;\n        this.#wsDataCodec = null;\n        this.#wsDataSubscriptions = new Set();\n        this.#wsDataReconnectTask = null;\n        this.#rejectedAccessToken = null;\n        this.#resolvedAccessToken = null;\n        this.#authGeneration = 0;\n        this.#forcedTokenPromise = null;\n        this.#forcedTokenIframeAuth = false;\n        this.#observabilityReports = [];\n        this.#observabilityReportQueueDrops = 0;\n        this.#observabilityReportTimer = null;\n        this.#observabilityReportFlushing = false;\n    }\n\n    getUser() {\n        return this.#user;\n    }\n    getBaseUrl() {\n        return this.#baseUrl;\n    }\n\n    state() {\n        return this.#state;\n    }\n\n    onStateChange(fn) {\n        if (typeof fn !== 'function') {\n            throw new Error('api.onStateChange(fn) requires a function callback.');\n        }\n        this.#stateListeners.add(fn);\n        return () => {\n            this.#stateListeners.delete(fn);\n        };\n    }\n\n    // onPuffworkerStateChange subscribes to server-owned worker connection edges.\n    onPuffworkerStateChange(fn) {\n        if (typeof fn !== 'function') {\n            throw new Error('api.onPuffworkerStateChange(fn) requires a function callback.');\n        }\n        this.#puffworkerStateListeners.add(fn);\n        return () => {\n            this.#puffworkerStateListeners.delete(fn);\n        };\n    }\n\n    async connect() {\n        if (this.#connectPromise) {\n            return await this.#connectPromise;\n        }\n        this.#connectPromise = (async () => {\n            try {\n                await this.#request('/status', { method: 'GET' });\n            } finally {\n                this.#connectPromise = null;\n            }\n            return this;\n        })();\n        return await this.#connectPromise;\n    }\n\n    #updateState(patch) {\n        const next = Object.freeze({\n            connection: patch.connection ?? this.#state.connection,\n            auth: patch.auth ?? this.#state.auth,\n            lastError: patch.lastError !== undefined ? patch.lastError : this.#state.lastError,\n        });\n        if (next.connection === this.#state.connection\n            && next.auth === this.#state.auth\n            && next.lastError?.kind === this.#state.lastError?.kind\n            && next.lastError?.message === this.#state.lastError?.message) {\n            return this.#state;\n        }\n\n        const prev = this.#state;\n        this.#state = next;\n        for (const fn of this.#stateListeners) {\n            try {\n                fn(next, prev);\n            } catch (err) {\n                console.error('Portal API state listener failed.', err);\n            }\n        }\n        return next;\n    }\n\n    #markConnectionTransition() {\n        if (this.#state.connection === API_CONNECTION_STATES.READY) {\n            return;\n        }\n        this.#updateState({\n            connection: this.#state.connection === API_CONNECTION_STATES.IDLE\n                ? API_CONNECTION_STATES.CONNECTING\n                : API_CONNECTION_STATES.RECONNECTING,\n        });\n    }\n\n    /* Only responses using the current credential generation may change session state. */\n    #markReady(requestAuthGeneration) {\n        if (this.#state.auth === API_AUTH_STATES.REAUTH_REQUIRED\n            || requestAuthGeneration !== this.#authGeneration) {\n            return;\n        }\n        this.#rejectedAccessToken = null;\n        this.#updateState({\n            connection: API_CONNECTION_STATES.READY,\n            auth: this.#tokenProvider ? API_AUTH_STATES.AUTHENTICATED : this.#state.auth,\n            lastError: null,\n        });\n    }\n\n    #markDisconnected(err) {\n        this.#updateState({\n            connection: API_CONNECTION_STATES.DISCONNECTED,\n            lastError: stateError('transport', err),\n        });\n        this.#scheduleReconnect();\n    }\n\n    #markBackendUnavailable(err) {\n        this.#updateState({\n            connection: API_CONNECTION_STATES.DISCONNECTED,\n            lastError: stateError('backend', err),\n        });\n        this.#scheduleReconnect();\n    }\n\n    /* Probe tranquility while disconnected so normal ready-state listeners can restore subscriptions. */\n    #scheduleReconnect() {\n        if (this.#reconnectTask || this.#state.auth === API_AUTH_STATES.REAUTH_REQUIRED) {\n            return;\n        }\n        this.#reconnectTask = (async () => {\n            try {\n                while (this.#state.auth !== API_AUTH_STATES.REAUTH_REQUIRED) {\n                    try {\n                        await this.connect();\n                        return;\n                    } catch (_err) {\n                        await new Promise((resolve) => setTimeout(resolve, 1000));\n                    }\n                }\n            } finally {\n                this.#reconnectTask = null;\n            }\n        })();\n    }\n\n    async #resolveAccessToken(options = {}) {\n        if (this.#tokenProvider) {\n            if (this.#state.auth === API_AUTH_STATES.REAUTH_REQUIRED) {\n                throw new AuthRequiredError('Silent authentication could not be renewed.');\n            }\n            const rejectedToken = this.#rejectedAccessToken;\n            // A previous 401/auth-forbidden must force renewal even if the cached token has not expired locally.\n            const request = rejectedToken && !options.forceRefresh\n                ? { forceRefresh: true, staleToken: rejectedToken }\n                : options;\n            if (this.#forcedTokenPromise) {\n                if (request.forceIframeAuth && !this.#forcedTokenIframeAuth) {\n                    await this.#forcedTokenPromise;\n                    return await this.#resolveAccessToken(options);\n                }\n                return await this.#forcedTokenPromise;\n            }\n            if (!request.forceRefresh && !request.forceIframeAuth) {\n                return await this.#readAccessToken(request);\n            }\n            // Starting renewal invalidates old responses immediately, including\n            // while the provider has not yet returned its replacement token.\n            this.#authGeneration += 1;\n            this.#forcedTokenIframeAuth = request.forceIframeAuth === true;\n            this.#forcedTokenPromise = Promise.resolve()\n                .then(() => this.#readAccessToken(request))\n                .finally(() => { this.#forcedTokenPromise = null; });\n            return await this.#forcedTokenPromise;\n        }\n        return { token: this.#user?.access_token ?? null, generation: this.#authGeneration };\n    }\n\n    async #readAccessToken(request) {\n        this.#updateState({\n            auth: request.forceRefresh || this.#state.auth !== API_AUTH_STATES.AUTHENTICATED\n                ? API_AUTH_STATES.RENEWING\n                : this.#state.auth,\n        });\n        const generation = this.#authGeneration;\n        let token;\n        try {\n            token = await this.#tokenProvider(request);\n        } catch (err) {\n            if (generation !== this.#authGeneration) {\n                return await this.#resolveAccessToken();\n            }\n            if (err?.code === 'auth/required') {\n                this.#updateState({\n                    auth: API_AUTH_STATES.REAUTH_REQUIRED,\n                    lastError: stateError('auth', err),\n                });\n            } else {\n                this.#updateState({\n                    auth: API_AUTH_STATES.RENEWING,\n                    lastError: stateError('auth', err),\n                });\n                this.#scheduleReconnect();\n            }\n            throw err;\n        }\n        // A cached read or failed renewal can finish after another request\n        // replaces/rejects its credential. Re-read the authoritative provider.\n        if (generation !== this.#authGeneration\n            && (token !== this.#resolvedAccessToken || token === this.#rejectedAccessToken)) {\n            return await this.#resolveAccessToken();\n        }\n        if (token !== this.#resolvedAccessToken) {\n            this.#resolvedAccessToken = token;\n            this.#authGeneration += 1;\n        }\n        return { token, generation: this.#authGeneration };\n    }\n\n    #artifactPath(prefix, path) {\n        if (!path && path !== '') {\n            throw new Error(`${prefix}: path argument must be provided.`);\n        }\n\n        const cleanPath = path.startsWith('/') ? path : `/${path}`;\n        return `/${prefix}${cleanPath.split('/').map(encodeURIComponent).join('/')}`;\n    }\n\n    async #request(endpoint, options = {}) {\n        if (typeof endpoint !== 'string' || endpoint.trim() === '') {\n            throw new Error(`API request endpoint must be a non-empty string (was '${endpoint}').`);\n        }\n\n        const okStatus = new Set(options.okStatus || []);\n        const req = { ...options };\n        delete req.okStatus;\n\n        const url = resolveAPIURL(this.#baseUrl, endpoint);\n        let credential = await this.#resolveAccessToken();\n        let renewalAttempts = 0;\n        this.#markConnectionTransition();\n\n        // Bound recovery to refresh, iframe and up to two retries with a newer\n        // credential. Every attempt retains the generation it actually used.\n        for (let attempt = 0; ; attempt += 1) {\n            const headers = { ...req.headers };\n            if (credential.token) {\n                headers.Authorization = `Bearer ${credential.token}`;\n            }\n            const fetchOptions = { ...req, headers };\n            let res;\n            try {\n                res = await fetch(url, fetchOptions);\n            } catch (err) {\n                this.#markDisconnected(err);\n                throw err;\n            }\n\n            if (res.ok || okStatus.has(res.status)) {\n                this.#markReady(credential.generation);\n                return res.status === 204 ? null : res;\n            }\n\n            const authForbidden = await isAuthForbiddenResponse(res.clone());\n            const err = await describeAPIError(res, url);\n            const authRejected = err.status === 401 || authForbidden;\n            if (authRejected && this.#tokenProvider && attempt < 4) {\n                if (credential.generation !== this.#authGeneration) {\n                    credential = await this.#resolveAccessToken();\n                    continue;\n                }\n                if (renewalAttempts < 2) {\n                    this.#rejectedAccessToken = credential.token;\n                    const renewal = { forceRefresh: true, staleToken: credential.token };\n                    if (renewalAttempts === 1) {\n                        renewal.forceIframeAuth = true;\n                    }\n                    renewalAttempts += 1;\n                    credential = await this.#resolveAccessToken(renewal);\n                    continue;\n                }\n            }\n\n            if (authRejected) {\n                // A delayed failure must never sign out a newer credential,\n                // including one whose backend verification is still in flight.\n                if (credential.generation === this.#authGeneration) {\n                    this.#updateState({\n                        auth: API_AUTH_STATES.REAUTH_REQUIRED,\n                        lastError: stateError('auth', err),\n                    });\n                }\n            } else if (isBackendUnavailableStatus(err.status)) {\n                this.#markBackendUnavailable(err);\n            } else {\n                this.#markReady(credential.generation);\n                this.#updateState({\n                    lastError: stateError('backend', err),\n                });\n            }\n            if (isBackendUnavailableError(err)) {\n                console.warn(`API backend unavailable at ${url} (${res.status}).`);\n            } else {\n                console.error(`API request to ${url}, and options ${fetchOptions}, failed with status ${res.status}.`);\n            }\n            throw err;\n        }\n    }\n\n    async status() {\n        const data = await this.#request(\"/status\", { method: \"GET\" });\n        return await data.json();\n    }\n\n    async puffAssistantUsage(options = {}) {\n        const resp = await this.#request('/puff-assistant/usage', {\n            method: 'GET',\n            cache: 'no-store',\n            ...options,\n        });\n        const payload = await resp.json();\n        if (!payload || typeof payload.data !== 'object' || payload.data === null) {\n            throw new Error('Puff assistant usage response did not contain data.');\n        }\n        return payload.data;\n    }\n\n    async ping(options = {}) {\n        const resp = await fetch(resolveAPIURL(this.#baseUrl, '/ping'), {\n            method: 'GET',\n            cache: 'no-store',\n            priority: 'high',\n            ...options,\n        });\n        if (!resp.ok) {\n            throw await describeAPIError(resp, resp.url);\n        }\n        return await resp.json();\n    }\n\n    async puffworkerPing(options = {}) {\n        const resp = await fetch(resolveAPIURL(this.#baseUrl, '/puffworker/ping'), {\n            method: 'GET',\n            cache: 'no-store',\n            priority: 'high',\n            ...options,\n        });\n        if (!resp.ok) {\n            throw await describeAPIError(resp, resp.url);\n        }\n        return await resp.json();\n    }\n\n    async puffworkerRestart(options = {}) {\n        const resp = await this.#request('/puffworker/restart', {\n            method: 'POST',\n            cache: 'no-store',\n            ...options,\n        });\n        return await resp.json();\n    }\n\n    async tranquilityRestart(options = {}) {\n        const resp = await this.#request('/tranquility/restart', {\n            method: 'POST',\n            cache: 'no-store',\n            ...options,\n        });\n        return await resp.json();\n    }\n\n    async #ensurePuffworker() {\n        for (let attempt = 1; attempt <= 2; attempt += 1) {\n            const controller = new AbortController();\n            const timeout = setTimeout(() => {\n                controller.abort(new Error(`Puffworker ensure timed out after ${PUFFWORKER_ENSURE_TIMEOUT_MS} ms.`));\n            }, PUFFWORKER_ENSURE_TIMEOUT_MS);\n            try {\n                await this.#request('/puffworker/ensure', {\n                    method: 'POST',\n                    cache: 'no-store',\n                    signal: controller.signal,\n                });\n                return;\n            } catch (err) {\n                const status = err?.status;\n                const retryable = err?.code !== 'auth/required'\n                    && (status === 404 || status >= 500 || status === undefined);\n                if (attempt === 2 || !retryable) {\n                    throw err;\n                }\n            } finally {\n                clearTimeout(timeout);\n            }\n            await new Promise((resolve) => setTimeout(resolve, 5000));\n        }\n    }\n\n    async fileAsBuffer({lake, path, branch}, options) {\n        const url = `${this.#artifactPath('file', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {\n            method: 'GET',\n            ...options\n        });\n        const buffer = await resp.arrayBuffer();\n\n        return buffer;\n    }\n\n    async fileAsBlob({ lake, path, branch }, options) {\n        const url = `${this.#artifactPath('file', path)}?lake=${lake}&branch=${branch}`;\n        try {\n            const resp = await this.#request(url, {\n                method: 'GET',\n                ...options\n            });\n            if(!resp) { return null }\n\n            const blob = await resp.blob();\n            return blob;\n        }\n        catch {\n            return null;\n        }\n    }\n\n    // async getImageFromAPI({ lake, path, branch }, options) {\n    //     const url = 'https://i.imgur.com/ZKMnXce.png';\n    //     const options = { mode: 'cors' };\n\n    //     fetch(url, options).then(function (response) {\n    //         if (!response.ok) {\n    //             throw response;\n    //         }\n    //         return response.blob();\n    //     }).then(function (blob) {\n    //         return createImageBitmap(blob, {\n    //             premultiplyAlpha: 'none',\n    //             colorSpaceConversion: 'none',\n    //         });\n    //     }).then(function (bitmap) {\n    //         // can pass bitmap to texImage2D \n    //     });\n\n    // }\n\n    async getPuffbook({lake, path, branch}, options) {\n        const url = `${this.#artifactPath('puffbook', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {method: 'GET', ...options});\n        return await resp.json();\n    }\n\n    async getConvo({lake, path, branch}, options) {\n        const url = `${this.#artifactPath('convo', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {method: 'GET', ...options});\n        return await resp.text();\n    }\n\n    async object({lake, path, branch}, options) {\n        const url = `/file/${path}?lake=${lake}&branch=${branch}&format=ptl`;\n        const resp = await this.#request(url, {method: 'GET', ...options});\n        const buffer = await resp.arrayBuffer();\n        const obj = ptl.importFile(buffer);\n\n        return obj;\n    }\n\n    async tableAsBuffer({lake, path, branch, format}, options) { //can be json//ptl//arrow\n        const url = `/table/${path}.${format}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {method: 'GET', ...options});\n        const buffer = await resp.arrayBuffer();\n\n        return buffer;\n    }\n\n    async uploadFile({lake, path, branch}, body, options = {}) {\n        const url = `${this.#artifactPath('file', path)}?lake=${lake}&branch=${branch}`;\n        const req = {...options};\n        delete req.contentType;\n\n        const headers = {...req.headers};\n        const type = options.contentType || body?.type;\n        const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === 'content-type');\n        if (type && !hasContentType) {\n            headers['Content-Type'] = type;\n        }\n\n        await this.#request(url, {\n            ...req,\n            method: 'PUT',\n            body,\n            headers,\n        });\n    }\n\n    async table({lake, path, branch}, options) { \n        const url = `/table/${path}.ptl?lake=${lake}&branch=${branch}`; //&limit={}&offset={}\n        const resp = await this.#request(url, {method: 'GET', ...options});\n        \n        const buffer = await resp.arrayBuffer();\n        \n        const table = ptl.import(buffer, 0);\n  \n        return table;\n    }\n    \n    async putPuffbook({lake, path, branch}, body, {waitForDurable = false} = {}) {\n        if (!path) {\n            throw new Error(`putPuffbook: path cannot be empty (was '${path}').`);\n        } else if (!body && body !== '') {\n            throw new Error(`putPuffbook: body argument must be provided.`);\n        }\n\n        const durableQuery = waitForDurable ? '&wait_for_durable=true' : '';\n        const url = `${this.#artifactPath('puffbook', path)}?lake=${lake}&branch=${branch}${durableQuery}`;\n        const resp = await this.#request(url, {\n            method: 'PUT',\n            body: body,\n            headers: { \"Content-Type\": \"text/plain; charset=utf-8\" },\n        });\n        return await resp.json();\n    }\n\n    async putConvo({lake, path, branch}, body) {\n        if (!path) {\n            throw new Error(`putConvo: path cannot be empty (was '${path}').`);\n        } else if (!body && body !== '') {\n            throw new Error('putConvo: body argument must be provided.');\n        }\n\n        const url = `${this.#artifactPath('convo', path)}?lake=${lake}&branch=${branch}`;\n        await this.#request(url, {\n            method: 'PUT',\n            body,\n            headers: { 'Content-Type': 'application/json; charset=utf-8' },\n        });\n    }\n\n    async makeDirectory({lake, path, branch}){\n         if (!path) {\n            throw new Error(`putPuffbook: path cannot be empty (was '${path}').`);\n        }\n        const url = `${this.#artifactPath('lake', path)}?lake=${lake}&branch=${branch}`;\n        await this.#request(url, {method: 'POST'});\n        return;\n    }   \n\n    async deletePuffbook({lake, path, branch}) {\n        const url = `${this.#artifactPath('puffbook', path)}?lake=${lake}&branch=${branch}`;\n        await this.#request(url, {method: 'DELETE'});\n    }\n\n    async deletePath({lake, path, branch}) {\n        const url = `${this.#artifactPath('lake', path)}?lake=${lake}&branch=${branch}`;\n        await this.#request(url, {method: 'DELETE'});\n    }\n\n    async grantArtifactAccess({lake, path, branch, principal, privilege = 'read', includeFiles = false}) {\n        if (!path) {\n            throw new Error('grantArtifactAccess: path cannot be empty.');\n        }\n        if (!principal || !`${principal}`.trim()) {\n            throw new Error('grantArtifactAccess: principal cannot be empty.');\n        }\n        if (!['read', 'write'].includes(privilege)) {\n            throw new Error(`grantArtifactAccess: privilege must be read or write (was ${JSON.stringify(privilege)}).`);\n        }\n        if (typeof includeFiles !== 'boolean') {\n            throw new Error('grantArtifactAccess: includeFiles must be a boolean.');\n        }\n        const url = `${this.#artifactPath('grant', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json; charset=utf-8' },\n            body: JSON.stringify({ data: { principal: `${principal}`.trim(), privilege, include_files: includeFiles } }),\n        });\n        return await resp.json();\n    }\n\n    async revokeArtifactAccess({lake, path, branch, principal, privilege = 'read'}) {\n        if (!path) {\n            throw new Error('revokeArtifactAccess: path cannot be empty.');\n        }\n        if (!principal || !`${principal}`.trim()) {\n            throw new Error('revokeArtifactAccess: principal cannot be empty.');\n        }\n        if (!['read', 'write'].includes(privilege)) {\n            throw new Error(`revokeArtifactAccess: privilege must be read or write (was ${JSON.stringify(privilege)}).`);\n        }\n        const url = `${this.#artifactPath('revoke', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json; charset=utf-8' },\n            body: JSON.stringify({ data: { principal: `${principal}`.trim(), privilege } }),\n        });\n        return await resp.json();\n    }\n\n    async rename({lake, path, branch}, newPath) {\n        if (!path) {\n            throw new Error(`rename: path cannot be empty (was '${path}').`);\n        }\n        if (!newPath) {\n            throw new Error(`rename: newPath cannot be empty (was '${newPath}').`);\n        }\n\n        const url = `${this.#artifactPath('lake', path)}?lake=${lake}&branch=${branch}`;\n        const destUrl = `${this.#artifactPath('v1/lake', newPath)}`\n\n        await this.#request(url, {\n            method: 'MOVE',\n            headers: {\n                Destination: destUrl,\n            }\n        });\n    }\n\n\n    async listPath({lake, path, branch}) {\n        const url = `${this.#artifactPath('list', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, { cache: 'no-store' });\n        return resp.json();\n    }\n\n    async pathExists({lake, path, branch}) {\n        if (!path) {\n            throw new Error('pathExists: path must be provided.');\n        }\n        const url = `${this.#artifactPath('exists', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, { cache: 'no-store' });\n        const payload = await resp.json();\n        if (typeof payload?.data?.exists !== 'boolean') {\n            throw new Error('Path existence response must contain a boolean data.exists.');\n        }\n        return payload.data.exists;\n    }\n\n    async statPath({lake, path, branch}) {\n        // Root routing is classified locally by the portal.  Do not turn an\n        // absent/empty item path into `/v1/stat/`, which asks the backend to\n        // stat the branch root and produces a noisy 400 for an unmaterialised\n        // branch during startup.\n        if (path == null || path === '') {\n            return null;\n        }\n        const url = `${this.#artifactPath('stat', path)}?lake=${lake}&branch=${branch}`;\n        const resp = await this.#request(url, { okStatus: [404] });\n        if (resp.status === 404) {\n            return null;\n        }\n        return await resp.json();\n    }\n\n    async llmCompletion(request, options = {}) {\n        const resp = await this.#request('/llm/completion', {\n            ...options,\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json; charset=utf-8',\n                ...(options.headers ?? {}),\n            },\n            body: JSON.stringify(request),\n        });\n        return await resp.json();\n    }\n\n\n    async compute(hash, line, timeout) {\n        let timeoutQuery = '';\n        if (timeout) {\n            timeoutQuery = `&timeout=${timeout}`;\n        }\n\n        const resp = await this.#request(`/puffbook-compute/${hash}?line=${line}${timeoutQuery}`, {\n            okStatus: [408],\n        });\n        if (resp === null || resp.status === 202 || resp.status === 408) {\n            return null;\n        }\n\n        const buffer = await resp.arrayBuffer();\n        const obj = ptl.import(buffer, 0);\n        return obj;\n    }\n\n    async wsCompile(src) {\n        const body = ptl.newStruct({\n            src: ptl.newStr(src),\n        });\n        const resp = await this.#wsCall('compile', body);\n        return this.#requireWSStrBody(resp, 'compile');\n    }\n\n    async wsAmend(handle, line, change) {\n        const body = ptl.newStruct({\n            handle: ptl.newStr(handle),\n            line_num: ptl.newInt(line),\n            change: ptl.newStr(change),\n        });\n        const resp = await this.#wsCall('amend', body);\n        return this.#requireWSStrBody(resp, 'amend');\n    }\n\n    async wsBrowserCrashReport(report) {\n        const req = buildBrowserCrashReportRequest(report);\n        const body = ptl.newStruct({\n            report_type: ptl.newStr(req.report_type),\n            summary: ptl.newStr(req.summary),\n            page_url: ptl.newStr(req.page_url),\n            user_agent: ptl.newStr(req.user_agent),\n            report_json: ptl.newStr(req.report_json),\n        });\n        const resp = await this.#wsCall('browser_crash_report', body);\n        const status = this.#requireWSStrField(resp.body, 'status', 'browser_crash_report');\n        if (status !== 'logged') {\n            throw new Error(`WebSocket browser_crash_report response status must be 'logged' (was ${JSON.stringify(status)}).`);\n        }\n        return status;\n    }\n\n    async wsOpenPuffbook(ref, handlers = {}, viewport = null) {\n        const uuid = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const uuidHex = ptl.uuidToHex(uuid);\n        const body = ptl.newStruct({\n            lake: ptl.newStr(ref.lake),\n            branch: ptl.newStr(ref.branch),\n            path: ptl.newStr(ref.path),\n            start_line: ptl.newInt(viewport?.start_line ?? 0),\n            end_line: ptl.newInt(viewport?.end_line ?? 64),\n        });\n        const ws = await this.#getWS();\n        const codec = this.#requireWSCodec();\n        const env = ptl.newRequest(uuid, 'puffbook_subscribe', body);\n        const frame = await codec.writeFrame(env);\n        console.log('Puffbook subscription opening', {\n            subscription_uuid: uuidHex,\n            file_ref: ref,\n            requested_start_line: viewport?.start_line ?? 0,\n            requested_end_line: viewport?.end_line ?? 64,\n            ws_url: ws.url,\n        });\n        const holdOpen = claimTestingPuffbookSubscribeOpenHold('projection');\n\n        const opened = new Promise((resolve, reject) => {\n            const stream = {\n                method: 'puffbook_subscribe',\n                opened: false,\n                dispatchReady: false,\n                closed: false,\n                closing: false,\n                queuedEvents: [],\n                holdOpen,\n                resolve,\n                reject,\n                onEvent: handlers.onEvent ?? (() => {}),\n                onClose: handlers.onClose ?? (() => {}),\n                onComputeAvailability: handlers.onComputeAvailability ?? (() => {}),\n            };\n            stream.openResponse = (resp) => {\n                this.#resolveWSStreamOpen(stream, resp);\n            };\n            if (holdOpen) {\n                holdOpen.stream = stream;\n            }\n            this.#wsStreams.set(uuidHex, stream);\n        });\n\n        let observabilityStarted = null;\n        try {\n            pushTestingPortalWSTrace('ws_send_stream_open', {\n                connect_seq: this.#wsConnectSeq,\n                uuid: uuidHex,\n            method: 'puffbook_subscribe',\n            bytes: frame.byteLength ?? null,\n            ready_state: ws.readyState,\n        });\n            this.#noteTestingPortalWSCurrent({\n                connect_seq: this.#wsConnectSeq,\n                url: ws.url,\n                ready_state: ws.readyState,\n                ready_state_name: wsReadyStateName(ws.readyState),\n                buffered_amount: ws.bufferedAmount,\n                protocol: ws.protocol,\n                extensions: ws.extensions,\n                pending_count: this.#wsPending.size,\n                stream_count: this.#wsStreams.size,\n                last_event: 'ws_send_stream_open',\n                last_send_method: 'puffbook_subscribe',\n                last_send_uuid: uuidHex,\n                last_send_bytes: frame.byteLength ?? null,\n            });\n            observabilityStarted = performance.now();\n            ws.send(frame);\n        } catch (err) {\n            this.#wsStreams.delete(uuidHex);\n            throw err;\n        }\n\n        let resp;\n        try {\n            resp = await opened;\n        } finally {\n            if (observabilityStarted !== null) {\n                this.#queueObservabilityReport(uuid, performance.now() - observabilityStarted, true);\n            }\n        }\n        const openedSub = this.#parseProjectionSnapshot(resp.body, 'puffbook_subscribe', uuidHex);\n        console.log('Puffbook subscription opened', {\n            subscription_uuid: uuidHex,\n            version: openedSub.version,\n            body_bytes: textEncoder.encode(openedSub.body).length,\n            file_ref: ref,\n        });\n        return openedSub;\n    }\n\n    async wsSnapshotPuffbook(ref) {\n        const body = ptl.newStruct({\n            lake: ptl.newStr(ref.lake),\n            branch: ptl.newStr(ref.branch),\n            path: ptl.newStr(ref.path),\n        });\n        const resp = await this.#wsCall('puffbook_snapshot', body);\n        return this.#parseProjectionSnapshot(resp.body, 'puffbook_snapshot');\n    }\n\n    async wsPuffbookRecoveryCut(subscriptionUUID, lastGoodSeq) {\n        const body = ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            last_good_seq: ptl.newInt(lastGoodSeq),\n        });\n        const resp = await this.#wsCall('puffbook_recovery_cut', body);\n        const cut = resp.body;\n        const frameTail = this.#requireWSBinArrayField(cut, 'frame_tail', 'puffbook_recovery_cut');\n        const failedInput = this.#requireWSBinField(cut, 'failed_input', 'puffbook_recovery_cut');\n        const decodedTail = decodePuffbookRecoveryFrameTail(\n            this.#requireWSCodec(),\n            frameTail,\n            this.#requireWSIntField(cut, 'frame_tail_count', 'puffbook_recovery_cut'),\n        );\n        return {\n            subscription_uuid: this.#requireWSStrField(cut, 'subscription_uuid', 'puffbook_recovery_cut'),\n            diagnostic_id: this.#requireWSStrField(cut, 'diagnostic_id', 'puffbook_recovery_cut'),\n            last_good_seq: this.#requireWSIntField(cut, 'last_good_seq', 'puffbook_recovery_cut'),\n            recovery_attempt: this.#requireWSIntField(cut, 'recovery_attempt', 'puffbook_recovery_cut'),\n            reason: this.#requireWSStrField(cut, 'reason', 'puffbook_recovery_cut'),\n            last_good_semantic_digest: this.#requireWSStrField(cut, 'last_good_semantic_digest', 'puffbook_recovery_cut'),\n            last_good_inventory_digest: this.#requireWSStrField(cut, 'last_good_inventory_digest', 'puffbook_recovery_cut'),\n            current_semantic_digest: this.#requireWSStrField(cut, 'current_semantic_digest', 'puffbook_recovery_cut'),\n            current_inventory_digest: this.#requireWSStrField(cut, 'current_inventory_digest', 'puffbook_recovery_cut'),\n            evidence_status: this.#requireWSStrField(cut, 'evidence_status', 'puffbook_recovery_cut'),\n            checkpoint_tail_count: this.#requireWSIntField(cut, 'checkpoint_tail_count', 'puffbook_recovery_cut'),\n            last_good_body_bytes: this.#requireWSIntField(cut, 'last_good_body_bytes', 'puffbook_recovery_cut'),\n            current_body_bytes: this.#requireWSIntField(cut, 'current_body_bytes', 'puffbook_recovery_cut'),\n            body_first_mismatch: this.#requireWSIntField(cut, 'body_first_mismatch', 'puffbook_recovery_cut'),\n            frame_tail_count: this.#requireWSIntField(cut, 'frame_tail_count', 'puffbook_recovery_cut'),\n            frame_tail_bytes: this.#requireWSIntField(cut, 'frame_tail_bytes', 'puffbook_recovery_cut'),\n            frame_tail_first_seq: this.#requireWSIntField(cut, 'frame_tail_first_seq', 'puffbook_recovery_cut'),\n            frame_tail_last_seq: this.#requireWSIntField(cut, 'frame_tail_last_seq', 'puffbook_recovery_cut'),\n            frame_tail: frameTail,\n            frame_tail_decode_status: decodedTail.status,\n            frame_tail_decode_error: decodedTail.error,\n            frame_tail_envelopes: decodedTail.envelopes,\n            failed_input_kind: this.#requireWSStrField(cut, 'failed_input_kind', 'puffbook_recovery_cut'),\n            failed_input_major: this.#requireWSIntField(cut, 'failed_input_major', 'puffbook_recovery_cut'),\n            failed_input_minor: this.#requireWSIntField(cut, 'failed_input_minor', 'puffbook_recovery_cut'),\n            failed_input_bytes: this.#requireWSIntField(cut, 'failed_input_bytes', 'puffbook_recovery_cut'),\n            failed_input_truncated: this.#requireWSBoolField(cut, 'failed_input_truncated', 'puffbook_recovery_cut'),\n            failed_input: failedInput,\n            stream_owner: this.#requireWSStrField(cut, 'stream_owner', 'puffbook_recovery_cut'),\n            request_ordinal: this.#requireWSIntField(cut, 'request_ordinal', 'puffbook_recovery_cut'),\n            outbound_queue_depth: this.#requireWSIntField(cut, 'outbound_queue_depth', 'puffbook_recovery_cut'),\n            outbound_queue_capacity: this.#requireWSIntField(cut, 'outbound_queue_capacity', 'puffbook_recovery_cut'),\n            snapshot: this.#parseProjectionSnapshot(\n                this.#requireWSField(cut, 'snapshot', 'puffbook_recovery_cut'),\n                'puffbook_recovery_cut',\n            ),\n        };\n    }\n\n    #parseProjectionSnapshot(body, method, subscriptionUUID = null) {\n        castPtrlessNamed('puff_PuffbookProjectionSnapshot', body);\n        return {\n            subscription_uuid: subscriptionUUID,\n            seq: this.#requireWSIntField(body, 'seq', method),\n            version: this.#requireWSIntField(body, 'version', method),\n            body: this.#requireWSStrField(body, 'body', method),\n            body_start_line: this.#optionalWSIntField(body, 'body_start_line'),\n            body_end_line: this.#optionalWSIntField(body, 'body_end_line'),\n            total_lines: this.#optionalWSIntField(body, 'total_lines'),\n            outputs: this.#requireWSField(body, 'outputs', method),\n            start_line: this.#optionalWSIntField(body, 'start_line'),\n            end_line: this.#optionalWSIntField(body, 'end_line'),\n        };\n    }\n\n    async wsMutatePuffbook(subscriptionUUID, puffbookInstanceID, baseVersion, editOrdinal, edits, opts = {}) {\n        recordTestingPuffbookMutateCall(subscriptionUUID, baseVersion, editOrdinal, edits);\n        pushTestingPortalWSTrace('ws_mutate_prepare_start', {\n            method: 'puffbook_mutate',\n        });\n        const body = ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            puffbook_instance_id: ptl.newStr(puffbookInstanceID),\n            base_version: ptl.newInt(baseVersion),\n            edit_ordinal: ptl.newInt(editOrdinal),\n            edits,\n        });\n        pushTestingPortalWSTrace('ws_mutate_body_ready', {\n            method: 'puffbook_mutate',\n        });\n        const resp = await this.#wsCall('puffbook_mutate', body);\n        return parsePuffbookMutateResponseBody(resp.body);\n    }\n\n    async wsPuffAssistantChat(ctx) {\n        const body = ptl.newStruct({\n            message: ptl.newStr(ctx.message ?? ''),\n            confirm_delete: ptl.newBool(ctx.confirm_delete === true),\n            subscription_uuid: ptl.newStr(ctx.subscription_uuid ?? ''),\n            base_version: ptl.newInt(ctx.base_version ?? 0),\n            cursor_line: ptl.newInt(ctx.cursor_line ?? 0),\n            cursor_col: ptl.newInt(ctx.cursor_col ?? 0),\n            selection_line: ptl.newInt(ctx.selection_line ?? -1),\n            selection_start: ptl.newInt(ctx.selection_start ?? 0),\n            selection_end: ptl.newInt(ctx.selection_end ?? 0),\n            selected_text: ptl.newStr(ctx.selected_text ?? ''),\n        });\n        const resp = await this.#wsCall('puff_assistant_chat', body);\n        return {\n            text: this.#requireWSStrField(resp.body, 'text', 'puff_assistant_chat'),\n            confirmation_required: this.#requireWSBoolField(resp.body, 'confirmation_required', 'puff_assistant_chat'),\n        };\n    }\n\n    async wsAmendPuffbook(subscriptionUUID, baseVersion, line, change, puffbookInstanceID, editOrdinal) {\n        recordTestingPuffbookAmendCall(subscriptionUUID, baseVersion, line, change);\n        const body = ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            base_version: ptl.newInt(baseVersion),\n            line: ptl.newInt(line),\n            change: ptl.newStr(change),\n            puffbook_instance_id: ptl.newStr(puffbookInstanceID),\n            edit_ordinal: ptl.newInt(editOrdinal),\n        });\n        const resp = await this.#wsCall('puffbook_amend', body);\n        return this.#requireWSIntField(resp.body, 'version', 'puffbook_amend');\n    }\n\n    async wsSetPuffbookViewport(subscriptionUUID, startLine, endLine) {\n        const request = buildPuffbookViewportCall(subscriptionUUID, startLine, endLine);\n        const resp = await this.#wsCall(request.method, request.body);\n        const returnedSub = this.#requireWSStrField(resp.body, 'subscription_uuid', request.method);\n        if (returnedSub !== subscriptionUUID) {\n            throw new Error(`${request.method} returned mismatched subscription_uuid ${JSON.stringify(returnedSub)}.`);\n        }\n        return true;\n    }\n\n    async wsClosePuffbook(subscriptionUUID) {\n        const stream = this.#wsStreams.get(subscriptionUUID);\n        if (stream) {\n            stream.closing = true;\n            forgetTestingHeldEditEventsForStream(stream);\n            pushTestingPortalWSTrace('ws_stream_closing', {\n                uuid: subscriptionUUID,\n                method: stream.method,\n                opened: stream.opened,\n            });\n        }\n        const body = ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n        });\n        try {\n            await this.#wsCall('puffbook_unsubscribe', body);\n        } finally {\n            this.#retireWSStream(subscriptionUUID, 'client_close');\n        }\n    }\n\n    async wsAttachPuffbookData(subscriptionUUID) {\n        this.#wsDataSubscriptions.add(subscriptionUUID);\n        if (this.#wsDataConn && this.#wsDataConn.readyState === WebSocket.OPEN) {\n            const resp = await this.#wsDataCall('puffbook_attach_data', ptl.newStruct({\n                subscription_uuid: ptl.newStr(subscriptionUUID),\n            }));\n            const returnedSub = this.#requireWSStrField(resp.body, 'subscription_uuid', 'puffbook_attach_data');\n            if (returnedSub !== subscriptionUUID) {\n                throw new Error(`puffbook_attach_data returned mismatched subscription_uuid ${JSON.stringify(returnedSub)}.`);\n            }\n            const refs = this.#wsField(resp.body, 'payload_refs')?.toArray?.();\n            if (!Array.isArray(refs) || refs.some((ref) => typeof ref !== 'string' || ref === '')) {\n                throw new Error(\"WebSocket puffbook_attach_data response field 'payload_refs' must be a string array.\");\n            }\n            return { subscription_uuid: returnedSub, payload_refs: refs };\n        }\n        await this.#getWSData();\n        return await this.wsAttachPuffbookData(subscriptionUUID);\n    }\n\n    async wsDetachPuffbookData(subscriptionUUID) {\n        this.#wsDataSubscriptions.delete(subscriptionUUID);\n        if (this.#wsDataConn && this.#wsDataConn.readyState === WebSocket.OPEN) {\n            await this.#wsDataCall('puffbook_detach_data', ptl.newStruct({\n                subscription_uuid: ptl.newStr(subscriptionUUID),\n            }));\n        }\n        this.#maybeCloseIdleWSData();\n    }\n\n    /* Forget one puffbook data attachment locally when its control subscription is already known dead. */\n    forgetWSPuffbookDataSubscription(subscriptionUUID) {\n        this.#wsDataSubscriptions.delete(subscriptionUUID);\n        this.#maybeCloseIdleWSData();\n    }\n\n    async wsNeedPuffbookPayload(subscriptionUUID, payloadRef) {\n        const resp = await this.#wsDataCall('puffbook_need_payload', ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            payload_ref: ptl.newStr(payloadRef),\n        }));\n        const returnedSub = this.#requireWSStrField(resp.body, 'subscription_uuid', 'puffbook_need_payload');\n        const returnedRef = this.#requireWSStrField(resp.body, 'payload_ref', 'puffbook_need_payload');\n        requirePuffbookPayloadResponseIdentity(subscriptionUUID, payloadRef, returnedSub, returnedRef);\n        const status = this.#wsField(resp.body, 'status')?.toText?.() ?? 'available';\n        if (status === 'unavailable') {\n            return {\n                subscription_uuid: returnedSub,\n                payload_ref: returnedRef,\n                status,\n            };\n        }\n        if (status !== 'available') {\n            throw new Error(`puffbook_need_payload returned unknown status ${JSON.stringify(status)}.`);\n        }\n        castPtrlessNamed('puff_PuffbookPayloadValue', resp.body);\n        return {\n            subscription_uuid: returnedSub,\n            payload_ref: returnedRef,\n            status,\n            value: this.#requireWSField(resp.body, 'value', 'puffbook_need_payload'),\n            preview_hints: this.#wsField(resp.body, 'preview_hints'),\n        };\n    }\n\n    async wsHavePuffbookPayload(subscriptionUUID, payloadRef) {\n        await this.#wsDataCall('puffbook_have_payload', ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            payload_ref: ptl.newStr(payloadRef),\n        }));\n    }\n\n    async wsReleasePuffbookPayload(subscriptionUUID, payloadRef) {\n        await this.#wsDataCall('puffbook_release_payload', ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n            payload_ref: ptl.newStr(payloadRef),\n        }));\n    }\n\n    async wsOpenDirectory(ref, handlers = {}) {\n        const uuid = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const uuidHex = ptl.uuidToHex(uuid);\n        const body = ptl.newStruct({\n            lake: ptl.newStr(ref.lake),\n            branch: ptl.newStr(ref.branch),\n            path: ptl.newStr(ref.path),\n            projection: ptl.newStr(ref.projection ?? 'alphabetical'),\n        });\n        const ws = await this.#getWS();\n        const codec = this.#requireWSCodec();\n        const env = ptl.newRequest(uuid, 'directory_subscribe', body);\n        const frame = await codec.writeFrame(env);\n        const opened = new Promise((resolve, reject) => {\n            const stream = {\n                method: 'directory_subscribe',\n                opened: false,\n                closed: false,\n                closing: false,\n                queuedEvents: [],\n                holdOpen: null,\n                resolve,\n                reject,\n                onEvent: handlers.onEvent ?? (() => {}),\n                onClose: handlers.onClose ?? (() => {}),\n                openResponse: (resp) => {\n                    this.#resolveWSStreamOpen(stream, resp);\n                },\n            };\n            this.#wsStreams.set(uuidHex, stream);\n        });\n        try {\n            ws.send(frame);\n        } catch (err) {\n            this.#wsStreams.delete(uuidHex);\n            throw err;\n        }\n        const resp = await opened;\n        castPtrlessNamed('puff_DirectoryWireSubscribeResponse', resp.body);\n        return {\n            subscription_uuid: this.#requireWSStrField(resp.body, 'subscription_uuid', 'directory_subscribe'),\n            snapshot: parseDirectorySnapshotPayload(this.#requireWSStructField(resp.body, 'snapshot', 'directory_subscribe')),\n        };\n    }\n\n    async wsCloseDirectory(subscriptionUUID) {\n        this.#retireWSStream(subscriptionUUID, 'client_close');\n        const body = ptl.newStruct({\n            subscription_uuid: ptl.newStr(subscriptionUUID),\n        });\n        await this.#wsCall('directory_unsubscribe', body);\n    }\n\n    async #wsCall(method, body) {\n        pushTestingPortalWSTrace('ws_call_start', {\n            method,\n        });\n        const ws = await this.#getWS();\n        pushTestingPortalWSTrace('ws_call_got_ws', {\n            method,\n            connect_seq: this.#wsConnectSeq,\n            ready_state: ws?.readyState ?? null,\n        });\n        const codec = this.#requireWSCodec();\n        const uuid = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const env = ptl.newRequest(uuid, method, body);\n        pushTestingPortalWSTrace('ws_call_frame_build_start', {\n            method,\n            connect_seq: this.#wsConnectSeq,\n        });\n        const frame = await codec.writeFrame(env);\n        pushTestingPortalWSTrace('ws_call_frame_build_done', {\n            method,\n            connect_seq: this.#wsConnectSeq,\n            bytes: frame.byteLength ?? null,\n        });\n        const uuidHex = ptl.uuidToHex(uuid);\n\n        const reply = new Promise((resolve, reject) => {\n            this.#wsPending.set(uuidHex, { resolve, reject, method });\n        });\n\n        let observabilityStarted = null;\n        try {\n            pushTestingPortalWSTrace('ws_send_pending', {\n                connect_seq: this.#wsConnectSeq,\n                uuid: uuidHex,\n                method,\n                bytes: frame.byteLength ?? null,\n                ready_state: ws.readyState,\n            });\n            this.#noteTestingPortalWSCurrent({\n                connect_seq: this.#wsConnectSeq,\n                url: ws.url,\n                ready_state: ws.readyState,\n                ready_state_name: wsReadyStateName(ws.readyState),\n                buffered_amount: ws.bufferedAmount,\n                protocol: ws.protocol,\n                extensions: ws.extensions,\n                pending_count: this.#wsPending.size,\n                stream_count: this.#wsStreams.size,\n                last_event: 'ws_send_pending',\n                last_send_method: method,\n                last_send_uuid: uuidHex,\n                last_send_bytes: frame.byteLength ?? null,\n            });\n            if (method === 'puffbook_mutate') {\n                const lagMS = testingPuffbookMutateLagMS();\n                if (lagMS > 0) {\n                    await new Promise((resolve) => window.setTimeout(resolve, lagMS));\n                }\n            }\n            observabilityStarted = performance.now();\n            ws.send(frame);\n        } catch (err) {\n            this.#wsPending.delete(uuidHex);\n            throw err;\n        }\n        try {\n            return await reply;\n        } finally {\n            if (observabilityStarted !== null && PORTAL_OBSERVABILITY_OPERATIONS.has(method)) {\n                this.#queueObservabilityReport(uuid, performance.now() - observabilityStarted);\n            }\n        }\n    }\n\n    #queueObservabilityReport(uuid, rawDurationMS, flushImmediately = false) {\n        let environment = '';\n        try {\n            environment = getPortalEnvironment();\n        } catch (_err) {\n            return;\n        }\n        if (!PORTAL_OBSERVABILITY_ENVIRONMENTS.has(environment)\n            || !(uuid instanceof Uint8Array)\n            || uuid.byteLength !== ptl.UUID_BYTES\n            || !Number.isFinite(rawDurationMS)) {\n            return;\n        }\n        const durationMS = Math.max(0, Math.min(\n            PORTAL_OBSERVABILITY_MAX_DURATION_MS,\n            Math.round(rawDurationMS),\n        ));\n        if (this.#observabilityReports.length >= PORTAL_OBSERVABILITY_QUEUE_LIMIT) {\n            this.#observabilityReports.shift();\n            this.#observabilityReportQueueDrops++;\n        }\n        this.#observabilityReports.push({ uuid: uuid.slice(), durationMS });\n        if (flushImmediately) {\n            globalThis.queueMicrotask(() => {\n                void this.#flushObservabilityReports();\n            });\n            return;\n        }\n        if (this.#observabilityReports.length >= PORTAL_OBSERVABILITY_BATCH_LIMIT) {\n            void this.#flushObservabilityReports();\n            return;\n        }\n        if (this.#observabilityReportTimer === null) {\n            this.#observabilityReportTimer = globalThis.setTimeout(() => {\n                this.#observabilityReportTimer = null;\n                void this.#flushObservabilityReports();\n            }, PORTAL_OBSERVABILITY_FLUSH_MS);\n        }\n    }\n\n    async #flushObservabilityReports() {\n        if (this.#observabilityReportFlushing || this.#observabilityReports.length === 0) {\n            return;\n        }\n        this.#observabilityReportFlushing = true;\n        if (this.#observabilityReportTimer !== null) {\n            globalThis.clearTimeout(this.#observabilityReportTimer);\n            this.#observabilityReportTimer = null;\n        }\n        const batch = this.#observabilityReports.splice(0, PORTAL_OBSERVABILITY_BATCH_LIMIT);\n        const queueDrops = this.#observabilityReportQueueDrops;\n        try {\n            const requestUUIDs = new Uint8Array(batch.length * ptl.UUID_BYTES);\n            const durations = new Uint8Array(batch.length * 4);\n            const dropped = new Uint8Array(4);\n            const durationView = new DataView(durations.buffer);\n            new DataView(dropped.buffer).setUint32(0, Math.min(queueDrops, 0xffffffff), true);\n            for (let i = 0; i < batch.length; i++) {\n                requestUUIDs.set(batch[i].uuid, i * ptl.UUID_BYTES);\n                durationView.setUint32(i * 4, batch[i].durationMS, true);\n            }\n            await this.#wsCall(PORTAL_OBSERVABILITY_REPORT_METHOD, ptl.newStruct({\n                request_uuids: ptl.newBin(requestUUIDs),\n                durations_ms: ptl.newBin(durations),\n                queue_drops: ptl.newBin(dropped),\n            }));\n            this.#observabilityReportQueueDrops = Math.max(0, this.#observabilityReportQueueDrops - queueDrops);\n        } catch (_err) {\n            // Best-effort diagnostics must never affect Portal RPC behaviour.\n        } finally {\n            this.#observabilityReportFlushing = false;\n            if (this.#observabilityReports.length > 0) {\n                // Drain reports queued during an in-flight flush immediately.\n                // This keeps stream-open roots complete without delaying Portal RPCs.\n                void this.#flushObservabilityReports();\n            }\n        }\n    }\n\n    async #wsDataCall(method, body) {\n        const ws = await this.#getWSData();\n        const codec = this.#requireWSDataCodec();\n        const uuid = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const env = ptl.newRequest(uuid, method, body);\n        const frame = await codec.writeFrame(env);\n        const uuidHex = ptl.uuidToHex(uuid);\n\n        const reply = new Promise((resolve, reject) => {\n            this.#wsDataPending.set(uuidHex, { resolve, reject, method });\n        });\n\n        try {\n            pushTestingPortalWSTrace('ws_data_send_pending', {\n                connect_seq: this.#wsDataConnectSeq,\n                uuid: uuidHex,\n                method,\n                bytes: frame.byteLength ?? null,\n                ready_state: ws.readyState,\n            });\n            ws.send(frame);\n        } catch (err) {\n            this.#wsDataPending.delete(uuidHex);\n            throw err;\n        }\n        return await reply;\n    }\n\n    async #openRPCSession(ws, codec, kind, connectSeq) {\n        const reqUUID = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const sessionUUID = crypto.getRandomValues(new Uint8Array(ptl.UUID_BYTES));\n        const env = ptl.newSessionOpenRequest(reqUUID, sessionUUID);\n        const frame = await codec.writeFrame(env);\n        const reqHex = ptl.uuidToHex(reqUUID);\n        const sessionHex = ptl.uuidToHex(sessionUUID);\n\n        pushTestingPortalWSTrace(`${kind}_session_open_send`, {\n            connect_seq: connectSeq,\n            uuid: reqHex,\n            session_uuid: sessionHex,\n            bytes: frame.byteLength ?? null,\n            ready_state: ws.readyState,\n            url: ws.url,\n        });\n\n        const event = await new Promise((resolve, reject) => {\n            const cleanup = () => {\n                ws.removeEventListener('message', onMessage);\n                ws.removeEventListener('close', onClose);\n                ws.removeEventListener('error', onError);\n            };\n            const onMessage = (messageEvent) => {\n                cleanup();\n                resolve(messageEvent);\n            };\n            const onClose = (closeEvent) => {\n                cleanup();\n                reject(new Error(`WebSocket ${kind} session_open closed before reply: code=${closeEvent.code} reason=${closeEvent.reason}`));\n            };\n            const onError = () => {\n                cleanup();\n                reject(new Error(`WebSocket ${kind} session_open failed.`));\n            };\n            ws.addEventListener('message', onMessage, { once: true });\n            ws.addEventListener('close', onClose, { once: true });\n            ws.addEventListener('error', onError, { once: true });\n            ws.send(frame);\n        });\n\n        const resp = codec.readFrame(event.data);\n        const respHex = ptl.uuidToHex(resp.uuid);\n        if (resp.type !== ptl.Response) {\n            throw new Error(`WebSocket ${kind} session_open reply type = '${resp.type}', want '${ptl.Response}'`);\n        }\n        if (resp.method !== ptl.MethodSessionOpen) {\n            throw new Error(`WebSocket ${kind} session_open reply method = '${resp.method}', want '${ptl.MethodSessionOpen}'`);\n        }\n        if (respHex !== reqHex) {\n            throw new Error(`WebSocket ${kind} session_open reply uuid = '${respHex}', want '${reqHex}'`);\n        }\n\n        pushTestingPortalWSTrace(`${kind}_session_open_recv`, {\n            connect_seq: connectSeq,\n            uuid: reqHex,\n            session_uuid: sessionHex,\n            bytes: event.data?.byteLength ?? null,\n            ready_state: ws.readyState,\n            url: ws.url,\n        });\n    }\n\n    async #getWS() {\n        if (this.#wsConn && this.#wsConn.readyState === WebSocket.OPEN) {\n            return this.#wsConn;\n        }\n        if (this.#wsReady) {\n            return await this.#wsReady;\n        }\n\n        this.#markConnectionTransition();\n\n        this.#wsReady = (async () => {\n            await this.#ensurePuffworker();\n            const { token, generation } = await this.#resolveAccessToken();\n            const protocols = ['ptl-rpc'];\n            if (token) {\n                protocols.push(`bearer.${token}`);\n            }\n            const connectSeq = ++this.#wsConnectSeq;\n            const url = this.#wsURL('control');\n            pushTestingPortalWSTrace('ws_connect_start', {\n                connect_seq: connectSeq,\n                url,\n            });\n            const ws = new WebSocket(url, protocols);\n            const codec = new PlainPortalRPCCodec();\n            ws.binaryType = 'arraybuffer';\n            attachTestingPortalWSDebug(ws, connectSeq, () => ({\n                pending_count: this.#wsPending.size,\n                stream_count: this.#wsStreams.size,\n            }));\n            await new Promise((resolve, reject) => {\n                const cleanup = () => {\n                    ws.removeEventListener('open', onOpen);\n                    ws.removeEventListener('error', onError);\n                };\n                const onOpen = () => {\n                    cleanup();\n                    this.#wsEverOpened = true;\n                    this.#markReady(generation);\n                    pushTestingPortalWSTrace('ws_open', {\n                        connect_seq: connectSeq,\n                        url: ws.url,\n                        ready_state: ws.readyState,\n                    });\n                    this.#noteTestingPortalWSCurrent({\n                        connect_seq: connectSeq,\n                        url: ws.url,\n                        ready_state: ws.readyState,\n                        ready_state_name: wsReadyStateName(ws.readyState),\n                        buffered_amount: ws.bufferedAmount,\n                        protocol: ws.protocol,\n                        extensions: ws.extensions,\n                        pending_count: this.#wsPending.size,\n                        stream_count: this.#wsStreams.size,\n                        last_event: 'ws_open',\n                    });\n                    resolve();\n                };\n                const onError = () => {\n                    cleanup();\n                    pushTestingPortalWSTrace('ws_open_error', {\n                        connect_seq: connectSeq,\n                        url,\n                    });\n                    reject(new Error('WebSocket connection failed.'));\n                };\n                ws.addEventListener('open', onOpen, { once: true });\n                ws.addEventListener('error', onError, { once: true });\n            });\n            try {\n                await this.#openRPCSession(ws, codec, 'control', connectSeq);\n            } catch (err) {\n                pushTestingPortalWSTrace('ws_session_open_error', {\n                    connect_seq: connectSeq,\n                    url: ws.url,\n                    ready_state: ws.readyState,\n                    error: err instanceof Error ? err.message : String(err),\n                });\n                ws.close();\n                throw err;\n            }\n            ws.addEventListener('message', (event) => {\n                void this.#handleWSMessage(event, codec);\n            });\n            ws.addEventListener('close', (event) => {\n                pushTestingPortalWSTrace('ws_close', {\n                    connect_seq: connectSeq,\n                    code: event.code,\n                    reason: event.reason,\n                    was_clean: event.wasClean,\n                    ready_state: ws.readyState,\n                    url: ws.url,\n                    last_message_at_ms: g_testingPortalWSDebug.lastMessageAtMS,\n                    last_send_at_ms: g_testingPortalWSDebug.lastSendAtMS,\n                    send_count: g_testingPortalWSDebug.sendCount,\n                    send_bytes: g_testingPortalWSDebug.sendBytes,\n                    last_send_bytes: g_testingPortalWSDebug.lastSendBytes,\n                    close_age_since_message_ms: g_testingPortalWSDebug.lastMessageAtMS\n                        ? Date.now() - g_testingPortalWSDebug.lastMessageAtMS\n                        : null,\n                });\n                this.#noteTestingPortalWSCurrent({\n                    connect_seq: connectSeq,\n                    url: ws.url,\n                    ready_state: ws.readyState,\n                    ready_state_name: wsReadyStateName(ws.readyState),\n                    buffered_amount: ws.bufferedAmount,\n                    protocol: ws.protocol,\n                    extensions: ws.extensions,\n                    pending_count: this.#wsPending.size,\n                    stream_count: this.#wsStreams.size,\n                    last_event: 'ws_close',\n                    last_close_code: event.code,\n                    last_close_reason: event.reason,\n                    last_close_was_clean: event.wasClean,\n                    last_message_at_ms: g_testingPortalWSDebug.lastMessageAtMS,\n                    last_send_at_ms: g_testingPortalWSDebug.lastSendAtMS,\n                    send_count: g_testingPortalWSDebug.sendCount,\n                    send_bytes: g_testingPortalWSDebug.sendBytes,\n                    last_send_bytes: g_testingPortalWSDebug.lastSendBytes,\n                });\n                console.error('Portal websocket closed', {\n                    connect_seq: connectSeq,\n                    code: event.code,\n                    reason: event.reason,\n                    wasClean: event.wasClean,\n                    readyState: ws.readyState,\n                    url: ws.url,\n                    lastMessageAtMS: g_testingPortalWSDebug.lastMessageAtMS,\n                    lastSendAtMS: g_testingPortalWSDebug.lastSendAtMS,\n                    sendCount: g_testingPortalWSDebug.sendCount,\n                    sendBytes: g_testingPortalWSDebug.sendBytes,\n                    lastSendBytes: g_testingPortalWSDebug.lastSendBytes,\n                    closeAgeSinceMessageMS: g_testingPortalWSDebug.lastMessageAtMS\n                        ? Date.now() - g_testingPortalWSDebug.lastMessageAtMS\n                        : null,\n                });\n                const err = websocketCloseError(event);\n                this.#markDisconnected(err);\n                this.#failAllWSPending(err);\n                this.#failAllWSStreams(err);\n                if (this.#wsConn === ws) {\n                    this.#wsConn = null;\n                    this.#wsCodec = null;\n                }\n            });\n            ws.addEventListener('error', (event) => {\n                pushTestingPortalWSTrace('ws_error', {\n                    connect_seq: connectSeq,\n                    ready_state: ws.readyState,\n                    url: ws.url,\n                    type: event.type,\n                });\n                this.#noteTestingPortalWSCurrent({\n                    connect_seq: connectSeq,\n                    url: ws.url,\n                    ready_state: ws.readyState,\n                    ready_state_name: wsReadyStateName(ws.readyState),\n                    buffered_amount: ws.bufferedAmount,\n                    protocol: ws.protocol,\n                    extensions: ws.extensions,\n                    pending_count: this.#wsPending.size,\n                    stream_count: this.#wsStreams.size,\n                    last_event: 'ws_error',\n                    last_error_type: event.type,\n                });\n                console.error('Portal websocket error', {\n                    connect_seq: connectSeq,\n                    readyState: ws.readyState,\n                    url: ws.url,\n                    type: event.type,\n                });\n                const err = new Error('WebSocket connection failed.');\n                this.#markDisconnected(err);\n                this.#failAllWSPending(err);\n                this.#failAllWSStreams(err);\n            });\n\n            this.#wsConn = ws;\n            this.#wsCodec = codec;\n            this.#wsReady = null;\n            const state = await this.#wsCall('puffworker_state_subscribe', ptl.newStruct({}));\n            const connected = this.#requireWSBoolField(state.body, 'connected', 'puffworker_state_subscribe');\n            for (const fn of this.#puffworkerStateListeners) {\n                try {\n                    fn(connected);\n                } catch (err) {\n                    console.error('Portal PuffWorker state listener failed.', err);\n                }\n            }\n            return ws;\n        })();\n\n        try {\n            return await this.#wsReady;\n        } catch (err) {\n            this.#wsReady = null;\n            if (err?.code !== 'auth/required') {\n                this.#markDisconnected(err);\n            }\n            throw err;\n        }\n    }\n\n    async #getWSData() {\n        if (this.#wsDataConn && this.#wsDataConn.readyState === WebSocket.OPEN) {\n            return this.#wsDataConn;\n        }\n        if (this.#wsDataReady) {\n            return await this.#wsDataReady;\n        }\n\n        this.#wsDataReady = (async () => {\n            await this.#ensurePuffworker();\n            const { token } = await this.#resolveAccessToken();\n            const protocols = ['ptl-rpc'];\n            if (token) {\n                protocols.push(`bearer.${token}`);\n            }\n            const connectSeq = ++this.#wsDataConnectSeq;\n            const url = this.#wsURL('data');\n            pushTestingPortalWSTrace('ws_data_connect_start', {\n                connect_seq: connectSeq,\n                url,\n            });\n            const ws = new WebSocket(url, protocols);\n            const codec = new PlainPortalRPCCodec();\n            ws.binaryType = 'arraybuffer';\n            await new Promise((resolve, reject) => {\n                const cleanup = () => {\n                    ws.removeEventListener('open', onOpen);\n                    ws.removeEventListener('error', onError);\n                };\n                const onOpen = () => {\n                    cleanup();\n                    pushTestingPortalWSTrace('ws_data_open', {\n                        connect_seq: connectSeq,\n                        url: ws.url,\n                    });\n                    resolve();\n                };\n                const onError = () => {\n                    cleanup();\n                    reject(new Error('WebSocket data connection failed.'));\n                };\n                ws.addEventListener('open', onOpen, { once: true });\n                ws.addEventListener('error', onError, { once: true });\n            });\n            try {\n                await this.#openRPCSession(ws, codec, 'data', connectSeq);\n            } catch (err) {\n                pushTestingPortalWSTrace('ws_data_session_open_error', {\n                    connect_seq: connectSeq,\n                    url: ws.url,\n                    ready_state: ws.readyState,\n                    error: err instanceof Error ? err.message : String(err),\n                });\n                ws.close();\n                throw err;\n            }\n            ws.addEventListener('message', (event) => {\n                void this.#handleWSDataMessage(event, codec);\n            });\n            ws.addEventListener('close', (event) => {\n                pushTestingPortalWSTrace('ws_data_close', {\n                    connect_seq: connectSeq,\n                    code: event.code,\n                    reason: event.reason,\n                    was_clean: event.wasClean,\n                    ready_state: ws.readyState,\n                    url: ws.url,\n                });\n                const err = websocketCloseError(event);\n                this.#failAllWSDataPending(err);\n                if (this.#wsDataConn === ws) {\n                    this.#wsDataConn = null;\n                    this.#wsDataCodec = null;\n                }\n                this.#scheduleWSDataReconnect();\n            });\n            ws.addEventListener('error', () => {\n                const err = new Error('WebSocket data connection failed.');\n                this.#failAllWSDataPending(err);\n            });\n\n            this.#wsDataConn = ws;\n            this.#wsDataCodec = codec;\n            this.#wsDataReady = null;\n            await this.#reattachWSDataSubscriptions();\n            return ws;\n        })();\n\n        try {\n            return await this.#wsDataReady;\n        } catch (err) {\n            this.#wsDataReady = null;\n            throw err;\n        }\n    }\n\n    #wsURL(lane = 'control') {\n        const url = new URL(this.#baseUrl, window.location.href);\n        url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n        url.pathname = `${url.pathname.replace(/\\/+$/, '')}/ws`;\n        url.searchParams.set('lane', lane);\n        return url.toString();\n    }\n\n    async #reattachWSDataSubscriptions() {\n        if (this.#wsDataSubscriptions.size === 0) {\n            return;\n        }\n        for (const subscriptionUUID of Array.from(this.#wsDataSubscriptions).sort()) {\n            // Reconnect uses the same strict response/manifest validation as\n            // an initial attach; there is no second reattachment contract.\n            await this.wsAttachPuffbookData(subscriptionUUID);\n        }\n    }\n\n    #scheduleWSDataReconnect() {\n        if (this.#wsDataSubscriptions.size === 0 || this.#wsDataReconnectTask\n            || this.#state.auth === API_AUTH_STATES.REAUTH_REQUIRED) {\n            return;\n        }\n        this.#wsDataReconnectTask = (async () => {\n            try {\n                while (this.#wsDataSubscriptions.size > 0 && this.#state.auth !== API_AUTH_STATES.REAUTH_REQUIRED) {\n                    if (this.#wsDataConn && this.#wsDataConn.readyState === WebSocket.OPEN) {\n                        return;\n                    }\n                    try {\n                        await this.#getWSData();\n                        return;\n                    } catch (err) {\n                        await new Promise((resolve) => setTimeout(resolve, 1000));\n                    }\n                }\n            } finally {\n                this.#wsDataReconnectTask = null;\n            }\n        })();\n    }\n\n    // dispatchWSStreamEvent applies one already-decoded stream frame through the ordinary handler and trace path.\n    #dispatchWSStreamEvent(stream, uuidHex, envType, body, previewHints = null, replay = null) {\n        const emittedAt = testingFieldIntText(body, 'emitted_at');\n        const seq = testingFieldIntText(body, 'seq');\n        const eventLagMS = testingEventLagMS(emittedAt);\n        const eventType = testingFieldText(body, 'event_type');\n        const line = testingFieldInt(body, 'line');\n    const viewportOutputSample = eventType === 'viewport_window'\n            ? testingProjectionOutputLineSample(body)\n            : [];\n        pushTestingPortalWSTrace('ws_stream_dispatch_start', {\n            uuid: uuidHex,\n            method: stream.method,\n            body_type: body?.constructor?.name ?? typeof body,\n            body_logical_type: typeof body?.logicalType === 'function' ? body.logicalType() : null,\n            event_type: eventType,\n            line,\n            body_start_line: eventType === 'viewport_window' ? (testingFieldInt(body, 'body_start_line') ?? '') : '',\n            body_end_line: eventType === 'viewport_window' ? (testingFieldInt(body, 'body_end_line') ?? '') : '',\n            start_line: eventType === 'viewport_window' ? (testingFieldInt(body, 'start_line') ?? '') : '',\n            end_line: eventType === 'viewport_window' ? (testingFieldInt(body, 'end_line') ?? '') : '',\n            output_line_sample: viewportOutputSample,\n            stream_seq: seq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: eventLagMS,\n        });\n        this.#noteTestingPortalWSCurrent({\n            connect_seq: this.#wsConnectSeq,\n            url: this.#wsConn?.url ?? null,\n            ready_state: this.#wsConn?.readyState ?? null,\n            ready_state_name: this.#wsConn ? wsReadyStateName(this.#wsConn.readyState) : null,\n            buffered_amount: this.#wsConn?.bufferedAmount ?? 0,\n            protocol: this.#wsConn?.protocol ?? '',\n            extensions: this.#wsConn?.extensions ?? '',\n            pending_count: this.#wsPending.size,\n            stream_count: this.#wsStreams.size,\n            last_event: 'ws_stream_dispatch_start',\n            last_env_uuid: uuidHex,\n            last_env_method: stream.method,\n            last_stream_event_type: eventType,\n            last_stream_line: line,\n            last_seq: seq ?? '',\n            last_stream_event_lag_ms: eventLagMS,\n            last_env_body_logical_type: typeof body?.logicalType === 'function' ? body.logicalType() : null,\n        });\n        const handlerStarted = performance.now();\n        try {\n            withPortalTimingScope('ws.stream_dispatch', {\n                uuid: uuidHex,\n                method: stream.method,\n                event_type: eventType,\n                line,\n            }, () => stream.onEvent({\n                body,\n                previewHints,\n                replay,\n            }));\n            requestFrame('ws_stream');\n        } catch (err) {\n            pushTestingPortalWSTrace('ws_stream_dispatch_error', {\n                uuid: uuidHex,\n                method: stream.method,\n                error: err instanceof Error ? err.message : String(err),\n            });\n            throw err;\n        }\n        pushTestingPortalWSTrace('ws_stream_dispatch_done', {\n            uuid: uuidHex,\n            method: stream.method,\n            event_type: eventType,\n            line,\n            stream_seq: seq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: eventLagMS,\n            duration_ms: Math.round((performance.now() - handlerStarted) * 1000) / 1000,\n        });\n        this.#noteTestingPortalWSCurrent({\n            connect_seq: this.#wsConnectSeq,\n            url: this.#wsConn?.url ?? null,\n            ready_state: this.#wsConn?.readyState ?? null,\n            ready_state_name: this.#wsConn ? wsReadyStateName(this.#wsConn.readyState) : null,\n            buffered_amount: this.#wsConn?.bufferedAmount ?? 0,\n            protocol: this.#wsConn?.protocol ?? '',\n            extensions: this.#wsConn?.extensions ?? '',\n            pending_count: this.#wsPending.size,\n            stream_count: this.#wsStreams.size,\n            last_event: 'ws_stream_dispatch_done',\n            last_env_uuid: uuidHex,\n            last_env_method: stream.method,\n            last_stream_event_type: eventType,\n            last_stream_line: line,\n            last_seq: seq ?? '',\n            last_stream_event_lag_ms: eventLagMS,\n            last_stream_dispatch_duration_ms: Math.round((performance.now() - handlerStarted) * 1000) / 1000,\n            last_env_body_logical_type: typeof body?.logicalType === 'function' ? body.logicalType() : null,\n        });\n    }\n\n    #maybeCloseIdleWSData() {\n        if (this.#wsDataSubscriptions.size !== 0) {\n            return;\n        }\n        if (this.#wsDataConn && this.#wsDataConn.readyState === WebSocket.OPEN) {\n            this.#wsDataConn.close(1000, 'idle');\n            this.#wsDataConn = null;\n            this.#wsDataCodec = null;\n        }\n    }\n\n    // handleWSMessage decodes one control frame and preserves each stream's event ordering through dispatch.\n    async #handleWSMessage(event, codec = this.#wsCodec) {\n        let env = null;\n        let decodeStarted = 0;\n        const bytes = event?.data instanceof ArrayBuffer\n            ? event.data.byteLength\n            : typeof event?.data?.byteLength === 'number'\n                ? event.data.byteLength\n                : typeof event?.data?.size === 'number'\n                    ? event.data.size\n                    : null;\n        pushTestingPortalWSTrace('ws_message', {\n            bytes,\n            data_type: event?.data?.constructor?.name ?? typeof event?.data,\n        });\n        g_testingPortalWSDebug.lastMessageAtMS = Date.now();\n        this.#noteTestingPortalWSCurrent({\n            connect_seq: this.#wsConnectSeq,\n            url: this.#wsConn?.url ?? null,\n            ready_state: this.#wsConn?.readyState ?? null,\n            ready_state_name: this.#wsConn ? wsReadyStateName(this.#wsConn.readyState) : null,\n            buffered_amount: this.#wsConn?.bufferedAmount ?? 0,\n            protocol: this.#wsConn?.protocol ?? '',\n            extensions: this.#wsConn?.extensions ?? '',\n            pending_count: this.#wsPending.size,\n            stream_count: this.#wsStreams.size,\n            last_event: 'ws_message',\n            last_message_bytes: bytes,\n        });\n        try {\n            decodeStarted = performance.now();\n            pushTestingPortalWSTrace('ws_decode_start', { bytes });\n            this.#noteTestingPortalWSCurrent({\n                connect_seq: this.#wsConnectSeq,\n                url: this.#wsConn?.url ?? null,\n                ready_state: this.#wsConn?.readyState ?? null,\n                ready_state_name: this.#wsConn ? wsReadyStateName(this.#wsConn.readyState) : null,\n                buffered_amount: this.#wsConn?.bufferedAmount ?? 0,\n                protocol: this.#wsConn?.protocol ?? '',\n                extensions: this.#wsConn?.extensions ?? '',\n                pending_count: this.#wsPending.size,\n                stream_count: this.#wsStreams.size,\n                last_event: 'ws_decode_start',\n                last_message_bytes: bytes,\n            });\n            env = withPortalTimingScope('ws.decode', {\n                bytes,\n            }, () => (codec ?? this.#requireWSCodec()).readFrame(event.data));\n            pushTestingPortalWSTrace('ws_decode_done', {\n                bytes,\n                duration_ms: Math.round((performance.now() - decodeStarted) * 1000) / 1000,\n                env_type: env?.type ?? null,\n                uuid: env?.uuid ? ptl.uuidToHex(env.uuid) : null,\n                method: env?.method ?? null,\n                body_type: env?.body?.constructor?.name ?? typeof env?.body,\n                body_logical_type: typeof env?.body?.logicalType === 'function' ? env.body.logicalType() : null,\n                body_physical_type: typeof env?.body?.physicalType === 'function' ? env.body.physicalType() : null,\n            });\n            this.#noteTestingPortalWSCurrent({\n                connect_seq: this.#wsConnectSeq,\n                url: this.#wsConn?.url ?? null,\n                ready_state: this.#wsConn?.readyState ?? null,\n                ready_state_name: this.#wsConn ? wsReadyStateName(this.#wsConn.readyState) : null,\n                buffered_amount: this.#wsConn?.bufferedAmount ?? 0,\n                protocol: this.#wsConn?.protocol ?? '',\n                extensions: this.#wsConn?.extensions ?? '',\n                pending_count: this.#wsPending.size,\n                stream_count: this.#wsStreams.size,\n                last_event: 'ws_decode_done',\n                last_message_bytes: bytes,\n                last_env_type: env?.type ?? null,\n                last_env_uuid: env?.uuid ? ptl.uuidToHex(env.uuid) : null,\n                last_env_method: env?.method ?? null,\n                last_env_body_logical_type: typeof env?.body?.logicalType === 'function' ? env.body.logicalType() : null,\n            });\n        } catch (err) {\n            pushTestingPortalWSTrace('ws_decode_error', {\n                bytes,\n                error: err instanceof Error ? err.message : String(err),\n            });\n            console.error('Portal websocket message decode failed', {\n                bytes,\n                error: err instanceof Error ? err.message : String(err),\n            });\n            this.#failAllWSPending(err);\n            return;\n        }\n\n        const uuidHex = ptl.uuidToHex(env.uuid);\n        if (env.type === ptl.Request) {\n            await this.#handleWSServerRequest(env);\n            return;\n        }\n        const stream = this.#wsStreams.get(uuidHex);\n        if (stream) {\n            if (stream.closing === true) {\n                pushTestingPortalWSTrace('ws_stream_closing_drop', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    env_type: env.type,\n                });\n                return;\n            }\n            if (env.type === ptl.Response) {\n                pushTestingPortalWSTrace('ws_stream_response', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    opened: stream.opened,\n                });\n                if (!stream.opened) {\n                    if (stream.holdOpen && !stream.holdOpen.released) {\n                        stream.holdOpen.response = env;\n                        return;\n                    }\n                    this.#resolveWSStreamOpen(stream, env);\n                    return;\n                }\n                if (stream.method === 'puffbook_subscribe') {\n                    castPuffbookWireEvent(env.body);\n                }\n                if (!stream.dispatchReady) {\n                    const queuedEnv = env;\n                    const dispatchQueued = () => {\n                        withPortalTimingScope('ws.stream_response_dispatch', {\n                            uuid: uuidHex,\n                            method: stream.method,\n                        }, () => stream.onEvent({\n                            body: queuedEnv.body,\n                            previewHints: queuedEnv.previewHints ?? null,\n                            replay: null,\n                        }));\n                        requestFrame('ws_stream_response');\n                    };\n                    stream.queuedEvents.push({\n                        event_type: testingFieldText(env.body, 'event_type') ?? '',\n                        dispatch: dispatchQueued,\n                    });\n                    pushTestingPortalWSTrace('ws_stream_response_queued_open', {\n                        uuid: uuidHex,\n                        method: stream.method,\n                        queued_count: stream.queuedEvents.length,\n                    });\n                    return;\n                }\n                const heldFrame = cloneWSMessageBuffer(event?.data);\n                const dispatchHeld = () => {\n                    if (heldFrame === null) {\n                        withPortalTimingScope('ws.stream_response_dispatch', {\n                            uuid: uuidHex,\n                            method: stream.method,\n                        }, () => stream.onEvent({\n                            body: env.body,\n                            previewHints: env.previewHints ?? null,\n                            replay: heldFrame === null\n                                ? null\n                                : () => (codec ?? this.#requireWSCodec()).readFrame(heldFrame),\n                        }));\n                        requestFrame('ws_stream_response');\n                        return;\n                    }\n                    const heldEnv = (codec ?? this.#requireWSCodec()).readFrame(heldFrame);\n                    withPortalTimingScope('ws.stream_response_dispatch', {\n                        uuid: uuidHex,\n                        method: stream.method,\n                    }, () => stream.onEvent({\n                        body: heldEnv.body,\n                        previewHints: heldEnv.previewHints ?? null,\n                        replay: () => (codec ?? this.#requireWSCodec()).readFrame(heldFrame),\n                    }));\n                    requestFrame('ws_stream_response');\n                };\n                if (queueTestingHeldPuffbookEditEvent(stream, env.body, env.previewHints ?? null, dispatchHeld)) {\n                    return;\n                }\n                pushTestingPortalWSTrace('ws_stream_response_dispatch_start', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    body_type: env?.body?.constructor?.name ?? typeof env?.body,\n                    body_logical_type: typeof env?.body?.logicalType === 'function' ? env.body.logicalType() : null,\n                });\n                if (maybeHoldTestingPuffbookEditEvent(stream, env.body, env.previewHints ?? null, dispatchHeld)) {\n                    return;\n                }\n                const handlerStarted = performance.now();\n                try {\n                    withPortalTimingScope('ws.stream_response_dispatch', {\n                        uuid: uuidHex,\n                        method: stream.method,\n                    }, () => stream.onEvent({\n                        body: env.body,\n                        previewHints: env.previewHints ?? null,\n                    }));\n                    requestFrame('ws_stream_response');\n                } catch (err) {\n                    pushTestingPortalWSTrace('ws_stream_response_dispatch_error', {\n                        uuid: uuidHex,\n                        method: stream.method,\n                        error: err instanceof Error ? err.message : String(err),\n                    });\n                    throw err;\n                }\n                pushTestingPortalWSTrace('ws_stream_response_dispatch_done', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    duration_ms: Math.round((performance.now() - handlerStarted) * 1000) / 1000,\n                });\n                return;\n            }\n            // Server stream frames carry application-level structural batches.\n            // The method on the envelope selects the decoder; the envelope\n            // type must not reject valid stream forms.\n            if (env.type === ptl.Stream || env.type === ptl.Partial) {\n                const emittedAt = testingFieldIntText(env.body, 'emitted_at');\n                const seq = testingFieldIntText(env.body, 'seq');\n                const eventLagMS = testingEventLagMS(emittedAt);\n                const eventType = testingFieldText(env.body, 'event_type');\n                const line = testingFieldInt(env.body, 'line');\n                pushTestingPortalWSTrace('ws_stream_received', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    opened: stream.opened,\n                    event_type: eventType,\n                    line,\n                    stream_seq: seq ?? '',\n                    emitted_at: emittedAt ?? '',\n                    event_lag_ms: eventLagMS,\n                });\n                if (!stream.opened || !stream.dispatchReady) {\n                    const queuedEnv = env;\n                    const dispatchQueued = () => {\n                        this.#dispatchWSStreamEvent(\n                            stream,\n                            uuidHex,\n                            queuedEnv.type,\n                            queuedEnv.body,\n                            queuedEnv.previewHints ?? null,\n                            null,\n                        );\n                    };\n                    stream.queuedEvents.push({\n                        event_type: eventType ?? '',\n                        dispatch: dispatchQueued,\n                    });\n                    pushTestingPortalWSTrace('ws_stream_queued_open', {\n                        uuid: uuidHex,\n                        method: stream.method,\n                        event_type: eventType,\n                        line,\n                        stream_seq: seq ?? '',\n                        queued_count: stream.queuedEvents.length,\n                        emitted_at: emittedAt ?? '',\n                        event_lag_ms: eventLagMS,\n                    });\n                    return;\n                }\n                const heldFrame = cloneWSMessageBuffer(event?.data);\n                const dispatchHeld = () => {\n                    if (heldFrame === null) {\n                        this.#dispatchWSStreamEvent(\n                            stream,\n                            uuidHex,\n                            env.type,\n                            env.body,\n                            env.previewHints ?? null,\n                            heldFrame === null\n                                ? null\n                                : () => (codec ?? this.#requireWSCodec()).readFrame(heldFrame),\n                        );\n                        return;\n                    }\n                    const heldEnv = (codec ?? this.#requireWSCodec()).readFrame(heldFrame);\n                    this.#dispatchWSStreamEvent(\n                        stream,\n                        uuidHex,\n                        heldEnv.type,\n                        heldEnv.body,\n                        heldEnv.previewHints ?? null,\n                        () => (codec ?? this.#requireWSCodec()).readFrame(heldFrame),\n                    );\n                };\n                if (queueTestingHeldPuffbookEditEvent(stream, env.body, env.previewHints ?? null, dispatchHeld)) {\n                    return;\n                }\n                if (maybeHoldTestingPuffbookEditEvent(stream, env.body, env.previewHints ?? null, dispatchHeld)) {\n                    return;\n                }\n                this.#dispatchWSStreamEvent(\n                    stream,\n                    uuidHex,\n                    env.type,\n                    env.body,\n                    env.previewHints ?? null,\n                    heldFrame === null\n                        ? null\n                        : () => (codec ?? this.#requireWSCodec()).readFrame(heldFrame),\n                );\n                return;\n            }\n            if (env.type === ptl.Close) {\n                pushTestingPortalWSTrace('ws_stream_close', {\n                    uuid: uuidHex,\n                    method: stream.method,\n                    opened: stream.opened,\n                });\n                const msg = this.#wsBodyText(env.body) || `WebSocket ${stream.method} closed.`;\n                const err = new Error(msg);\n                this.#retireWSStream(uuidHex, 'server_close', false);\n                if (!stream.opened) {\n                    stream.reject(err);\n                    return;\n                }\n                stream.onClose(err);\n                return;\n            }\n            return;\n        }\n\n        const pending = this.#wsPending.get(uuidHex);\n        if (!pending) {\n            const retired = consumeExpectedLateStreamClose(this.#wsExpectedLateStreamCloses, uuidHex, env.type);\n            if (retired) {\n                pushTestingPortalWSTrace('ws_expected_late_stream_close', {\n                    uuid: uuidHex,\n                    method: retired.method,\n                    reason: retired.reason,\n                });\n                return;\n            }\n            pushTestingPortalWSTrace('ws_unknown_uuid', {\n                uuid: uuidHex,\n                env_type: env.type,\n            });\n            console.warn(`Dropping websocket RPC response for unknown uuid=${uuidHex}.`);\n            return;\n        }\n        this.#wsPending.delete(uuidHex);\n\n        if (env.type === ptl.Close) {\n            pushTestingPortalWSTrace('ws_pending_close', {\n                uuid: uuidHex,\n                method: pending.method,\n                message: this.#wsBodyText(env.body) || '',\n            });\n            const msg = this.#wsBodyText(env.body) || `WebSocket ${pending.method} failed.`;\n            pending.reject(new Error(msg));\n            return;\n        }\n        if (env.type !== ptl.Response) {\n            pushTestingPortalWSTrace('ws_pending_unexpected_type', {\n                uuid: uuidHex,\n                method: pending.method,\n                env_type: env.type,\n            });\n            pending.reject(new Error(`Unexpected websocket RPC type '${env.type}'.`));\n            return;\n        }\n        pushTestingPortalWSTrace('ws_pending_response', {\n            uuid: uuidHex,\n            method: pending.method,\n        });\n        pending.resolve(env);\n    }\n\n    async #handleWSDataMessage(event, codec = this.#wsDataCodec) {\n        let env = null;\n        const bytes = event?.data instanceof ArrayBuffer\n            ? event.data.byteLength\n            : typeof event?.data?.byteLength === 'number'\n                ? event.data.byteLength\n                : typeof event?.data?.size === 'number'\n                    ? event.data.size\n                    : null;\n        pushTestingPortalWSTrace('ws_data_message', {\n            bytes,\n            data_type: event?.data?.constructor?.name ?? typeof event?.data,\n        });\n        try {\n            env = (codec ?? this.#requireWSDataCodec()).readFrame(event.data);\n        } catch (err) {\n            this.#failAllWSDataPending(err);\n            return;\n        }\n\n        const uuidHex = ptl.uuidToHex(env.uuid);\n        const pending = this.#wsDataPending.get(uuidHex);\n        if (!pending) {\n            console.warn(`Dropping websocket data response for unknown uuid=${uuidHex}.`);\n            return;\n        }\n        this.#wsDataPending.delete(uuidHex);\n        pushTestingPortalWSTrace('ws_data_decode_done', {\n            uuid: uuidHex,\n            method: pending.method,\n            env_type: env.type,\n            bytes,\n        });\n\n        if (env.type === ptl.Close) {\n            const msg = this.#wsBodyText(env.body) || `WebSocket ${pending.method} failed.`;\n            pushTestingPortalWSTrace('ws_data_pending_close', {\n                uuid: uuidHex,\n                method: pending.method,\n                message: msg,\n            });\n            pending.reject(new Error(msg));\n            return;\n        }\n        if (env.type !== ptl.Response) {\n            pending.reject(new Error(`Unexpected websocket data RPC type '${env.type}'.`));\n            return;\n        }\n        pushTestingPortalWSTrace('ws_data_pending_response', {\n            uuid: uuidHex,\n            method: pending.method,\n        });\n        pending.resolve(env);\n    }\n\n    async #handleWSServerRequest(env) {\n        if (env.method === 'puffworker_state') {\n            const connected = this.#requireWSBoolField(env.body, 'connected', env.method);\n            for (const fn of this.#puffworkerStateListeners) {\n                try {\n                    fn(connected);\n                } catch (err) {\n                    console.error('Portal PuffWorker state listener failed.', err);\n                }\n            }\n            return;\n        }\n        if (env.method === 'puffbook_compute_state') {\n            const subscriptionUUID = this.#requireWSStrField(env.body, 'subscription_uuid', env.method);\n            const available = this.#requireWSBoolField(env.body, 'available', env.method);\n            const stream = this.#wsStreams.get(subscriptionUUID);\n            if (stream?.method === 'puffbook_subscribe' && !stream.closed) {\n                stream.onComputeAvailability(available);\n            }\n            return;\n        }\n        if (env.method !== 'js_backdoor_eval') {\n            await this.#sendWSServerClose(env, `Unsupported server websocket method '${env.method}'.`);\n            return;\n        }\n        if (!configDebugJSBackdoor(this.#config)) {\n            const portalEnv = getPortalEnvironment();\n            const href = typeof location?.href === 'string' ? location.href : '';\n            await this.#sendWSServerClose(\n                env,\n                `Portal debug.js_backdoor is disabled. env=${portalEnv} href=${href}`,\n            );\n            return;\n        }\n        try {\n            const code = this.#requireWSStrField(env.body, 'code', env.method);\n            const run = (0, eval);\n            const value = await Promise.resolve(run(code));\n            const json = JSON.stringify(value);\n            if (typeof json !== 'string') {\n                throw new Error('js_backdoor_eval result must be JSON-serialisable.');\n            }\n            const body = ptl.newStruct({\n                json: ptl.newStr(json),\n            });\n            const resp = ptl.newResponse(env, body);\n            await this.#sendWSServerEnvelope(resp);\n        } catch (err) {\n            const msg = err instanceof Error ? err.message : String(err);\n            await this.#sendWSServerClose(env, msg);\n        }\n    }\n\n    async #sendWSServerEnvelope(env) {\n        const ws = this.#wsConn;\n        if (!ws || ws.readyState !== WebSocket.OPEN) {\n            throw new Error('WebSocket connection is not open.');\n        }\n        const frame = await this.#requireWSCodec().writeFrame(env);\n        ws.send(frame);\n    }\n\n    async #sendWSServerClose(req, message) {\n        const body = ptl.newStr(message);\n        const env = ptl.newClose(req, body);\n        await this.#sendWSServerEnvelope(env);\n    }\n\n    #requireWSCodec() {\n        if (!this.#wsCodec) {\n            throw new Error('WebSocket session codec is not ready.');\n        }\n        return this.#wsCodec;\n    }\n\n    #requireWSDataCodec() {\n        if (!this.#wsDataCodec) {\n            throw new Error('WebSocket data session codec is not ready.');\n        }\n        return this.#wsDataCodec;\n    }\n\n    #noteTestingPortalWSCurrent(extra = {}) {\n        return noteTestingPortalWSCurrent({\n            ws_codec_stats: testingPortalWSCodecStats(this.#wsCodec),\n            ws_data_codec_stats: testingPortalWSCodecStats(this.#wsDataCodec),\n            ...extra,\n        });\n    }\n\n    #resolveWSStreamOpen(stream, env) {\n        if (stream.opened) {\n            return;\n        }\n        forgetTestingPuffbookSubscribeOpenHold(stream.holdOpen);\n        stream.opened = true;\n        stream.resolve(env);\n    }\n\n    /* Retire one stream locally so late websocket frames cannot keep dispatching into a client-owned object after close.\n     * Legacy fallback preserves its test hold only long enough to transfer it to the replacement stream. */\n    #retireWSStream(uuidHex, reason = 'retired', preserveOpenHold = false) {\n        const stream = this.#wsStreams.get(uuidHex);\n        if (!stream) {\n            return null;\n        }\n        this.#wsStreams.delete(uuidHex);\n        stream.closed = true;\n        if (reason === 'client_close') {\n            rememberExpectedLateStreamClose(this.#wsExpectedLateStreamCloses, uuidHex, {\n                method: stream.method,\n                reason,\n            });\n        }\n        if (!preserveOpenHold) {\n            if (!stream.opened && reason !== 'client_close') {\n                returnTestingPuffbookSubscribeOpenHold(stream.holdOpen);\n            } else {\n                forgetTestingPuffbookSubscribeOpenHold(stream.holdOpen);\n            }\n        }\n        forgetTestingHeldEditEventsForStream(stream);\n        pushTestingPortalWSTrace('ws_stream_retire', {\n            uuid: uuidHex,\n            method: stream.method,\n            opened: stream.opened,\n            reason,\n        });\n        return stream;\n    }\n\n    drainWSStreamQueuedEvents(uuidHex) {\n        const stream = this.#wsStreams.get(uuidHex);\n        if (!stream || !stream.opened) {\n            return 0;\n        }\n        stream.dispatchReady = true;\n        if (stream.queuedEvents.length === 0) {\n            return 0;\n        }\n        const queued = stream.queuedEvents;\n        stream.queuedEvents = [];\n        pushTestingPortalWSTrace('ws_stream_queue_drain_start', {\n            uuid: uuidHex,\n            method: stream.method,\n            queued_count: queued.length,\n        });\n        for (const event of queued) {\n            if (typeof event?.dispatch === 'function') {\n                event.dispatch();\n            } else {\n                stream.onEvent(event);\n            }\n        }\n        pushTestingPortalWSTrace('ws_stream_queue_drain_done', {\n            uuid: uuidHex,\n            method: stream.method,\n            queued_count: queued.length,\n        });\n        return queued.length;\n    }\n\n    #requireWSStrBody(env, method) {\n        const text = this.#wsBodyText(env.body);\n        if (text === null) {\n            throw new Error(`WebSocket ${method} response body must be Str.`);\n        }\n        return text;\n    }\n\n    #requireWSIntField(obj, field, method) {\n        const value = this.#wsField(obj, field)?.value?.();\n        if (typeof value !== 'number') {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Int.`);\n        }\n        return value;\n    }\n\n    #requireWSBoolField(obj, field, method) {\n        const value = this.#wsField(obj, field)?.value?.();\n        if (typeof value !== 'boolean') {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Bool.`);\n        }\n        return value;\n    }\n\n    #optionalWSIntField(obj, field) {\n        const value = this.#wsField(obj, field)?.value?.();\n        return typeof value === 'number' ? value : null;\n    }\n\n    #requireWSStrField(obj, field, method) {\n        const text = this.#wsField(obj, field)?.toText?.();\n        if (typeof text !== 'string') {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Str.`);\n        }\n        return text;\n    }\n\n    #requireWSBinHexField(obj, field, method) {\n        const bytes = this.#wsField(obj, field)?.toUint8Array?.();\n        if (!(bytes instanceof Uint8Array) || bytes.byteLength !== ptl.UUID_BYTES) {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Bin(${ptl.UUID_BYTES}).`);\n        }\n        return ptl.uuidToHex(bytes);\n    }\n\n    #requireWSBinField(obj, field, method) {\n        const bytes = this.#wsField(obj, field)?.toUint8Array?.();\n        if (!(bytes instanceof Uint8Array)) {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Bin.`);\n        }\n        return bytes;\n    }\n\n    #requireWSBinArrayField(obj, field, method) {\n        const value = this.#wsField(obj, field);\n        if (!value || typeof value.length !== 'function'\n            || typeof value.rawOffsets !== 'function' || typeof value.rawValues !== 'function') {\n            throw new Error(`WebSocket ${method} response field '${field}' must be a binary array.`);\n        }\n        const offsets = value.rawOffsets();\n        const values = value.rawValues();\n        const length = value.length();\n        if (!ArrayBuffer.isView(offsets) || !ArrayBuffer.isView(values)\n            || offsets.length !== length + 1 || Number(offsets[0]) !== 0\n            || Number(offsets[length]) > values.length) {\n            throw new Error(`WebSocket ${method} response field '${field}' has invalid binary-array bounds.`);\n        }\n        const frames = [];\n        for (let i = 0; i < length; i += 1) {\n            const start = Number(offsets[i]);\n            const end = Number(offsets[i + 1]);\n            if (start < 0 || end < start || end > values.length) {\n                throw new Error(`WebSocket ${method} response field '${field}' has invalid row ${i}.`);\n            }\n            frames.push(new Uint8Array(values.slice(start, end)));\n        }\n        return frames;\n    }\n\n    #requireWSStructField(obj, field, method) {\n        const value = this.#wsField(obj, field);\n        if (!value || typeof value.field !== 'function') {\n            throw new Error(`WebSocket ${method} response field '${field}' must be Struct.`);\n        }\n        return value;\n    }\n\n    #requireWSField(obj, field, method) {\n        const value = this.#wsField(obj, field);\n        if (!value) {\n            throw new Error(`WebSocket ${method} response field '${field}' must be present.`);\n        }\n        return value;\n    }\n\n    #wsField(obj, field) {\n        if (!obj || typeof obj.field !== 'function') {\n            return null;\n        }\n        try {\n            return obj.field(field);\n        } catch (_err) {\n            return null;\n        }\n    }\n\n    #wsBodyText(obj) {\n        if (!obj) {\n            return null;\n        }\n        try {\n            if (typeof obj.toText === 'function') {\n                return obj.toText();\n            }\n        } catch (_err) {\n        }\n        try {\n            if (typeof obj.toString === 'function') {\n                const text = obj.toString();\n                return typeof text === 'string' ? text : null;\n            }\n        } catch (_err) {\n            return null;\n        }\n        return null;\n    }\n\n    #failAllWSPending(err) {\n        if (this.#wsPending.size === 0) {\n            return;\n        }\n        const pending = Array.from(this.#wsPending.values());\n        this.#wsPending.clear();\n        for (const item of pending) {\n            item.reject(err);\n        }\n    }\n\n    #failAllWSStreams(err) {\n        if (this.#wsStreams.size === 0) {\n            return;\n        }\n        const streams = Array.from(this.#wsStreams.values());\n        this.#wsStreams.clear();\n        for (const item of streams) {\n            if (!item.opened) {\n                returnTestingPuffbookSubscribeOpenHold(item.holdOpen);\n            } else {\n                forgetTestingPuffbookSubscribeOpenHold(item.holdOpen);\n            }\n            forgetTestingHeldEditEventsForStream(item);\n            if (!item.opened) {\n                item.reject(err);\n                continue;\n            }\n            item.onClose(err);\n            requestFrame('ws_stream_close');\n        }\n    }\n\n    #failAllWSDataPending(err) {\n        if (this.#wsDataPending.size === 0) {\n            return;\n        }\n        const pending = Array.from(this.#wsDataPending.values());\n        this.#wsDataPending.clear();\n        for (const item of pending) {\n            item.reject(err);\n        }\n    }\n}\n\nexport function testingNewTranquilityAPI(baseUrl, { user = null, tokenProvider = null } = {}) {\n    return new TranquilityAPI(user, baseUrl, tokenProvider);\n}\n\nfunction requirePuffbookPayloadResponseIdentity(subscriptionUUID, payloadRef, returnedSub, returnedRef) {\n    if (returnedSub === subscriptionUUID && returnedRef === payloadRef) {\n        return true;\n    }\n    throw new Error(\n        `puffbook_need_payload identity mismatch: requested subscription=${JSON.stringify(subscriptionUUID)} `\n        + `payload_ref=${JSON.stringify(payloadRef)}, returned subscription=${JSON.stringify(returnedSub)} `\n        + `payload_ref=${JSON.stringify(returnedRef)}.`,\n    );\n}\n\nexport function testingRequirePuffbookPayloadResponseIdentity(subscriptionUUID, payloadRef, returnedSub, returnedRef) {\n    return requirePuffbookPayloadResponseIdentity(subscriptionUUID, payloadRef, returnedSub, returnedRef);\n}\n\nfunction buildPuffbookViewportCall(subscriptionUUID, startLine, endLine) {\n    const fields = {\n        subscription_uuid: ptl.newStr(subscriptionUUID),\n        start_line: ptl.newInt(startLine),\n        end_line: ptl.newInt(endLine),\n    };\n    return {\n        method: 'puffbook_set_viewport',\n        fields,\n        body: ptl.newStruct(fields),\n    };\n}\n\nexport function testingBuildPuffbookViewportCall(subscriptionUUID, startLine, endLine) {\n    return buildPuffbookViewportCall(subscriptionUUID, startLine, endLine);\n}\n\nasync function describeAPIError(res, requestURL = '') {\n    const parts = [`API error ${res.status}`];\n    if (res.statusText) {\n        parts.push(res.statusText);\n    }\n    if (requestURL) {\n        parts.push(`url=${requestURL}`);\n    } else if (res.url) {\n        parts.push(`url=${res.url}`);\n    }\n\n    const contentType = res.headers.get('content-type') || '';\n    if (contentType) {\n        parts.push(`content-type=${contentType}`);\n    }\n\n    const bodyDetail = await extractAPIErrorDetail(res);\n    const safeDetail = redactSensitiveErrorText(bodyDetail);\n    if (safeDetail) {\n        parts.push(safeDetail);\n    }\n\n    const err = new Error(parts.join(': '));\n    err.status = res.status;\n    err.statusText = res.statusText;\n    err.detail = safeDetail;\n    return err;\n}\n\nasync function isAuthForbiddenResponse(res) {\n    if (res.status !== 403) {\n        return false;\n    }\n\n    const contentType = res.headers.get('content-type') || '';\n    if (!contentType.includes('application/json')) {\n        return false;\n    }\n\n    try {\n        const payload = await res.json();\n        return payload?.errors?.[0]?.code === 'auth/forbidden';\n    } catch (err) {\n        console.warn('Failed to parse API response body while checking auth/forbidden.', err);\n        return false;\n    }\n}\n\nasync function extractAPIErrorDetail(res) {\n    const contentType = res.headers.get('content-type') || '';\n\n    try {\n        if (contentType.includes('application/json')) {\n            const payload = await res.json();\n            const apiErr = payload?.errors?.[0];\n            if (apiErr) {\n                const bits = [];\n                if (apiErr.code) {\n                    bits.push(`code=${apiErr.code}`);\n                }\n                if (apiErr.title) {\n                    bits.push(`title=${apiErr.title}`);\n                }\n                if (apiErr.detail) {\n                    bits.push(`detail=${apiErr.detail}`);\n                }\n                if (apiErr.id) {\n                    bits.push(`id=${apiErr.id}`);\n                }\n                if (bits.length > 0) {\n                    return bits.join(' ');\n                }\n            }\n\n            return JSON.stringify(payload);\n        }\n\n        const text = (await res.text()).trim();\n        if (text !== '') {\n            if (contentType.includes('text/html') || /^<!doctype html\\b/i.test(text) || /^<html\\b/i.test(text)) {\n                const plain = text\n                    .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, ' ')\n                    .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, ' ')\n                    .replace(/<[^>]+>/g, ' ')\n                    .replace(/\\s+/g, ' ')\n                    .trim();\n                return plain ? `HTML error page: ${truncateText(plain, 160)}` : 'HTML error page.';\n            }\n            return truncateText(text.replace(/\\s+/g, ' '), 280);\n        }\n    } catch (err) {\n        console.warn('Failed to parse API error response body.', err);\n    }\n\n    return '';\n}\n\nfunction truncateText(text, limit) {\n    if (text.length <= limit) {\n        return text;\n    }\n    return `${text.slice(0, limit - 1)}\u2026`;\n}\n\nfunction redactSensitiveErrorText(text) {\n    return text\n        .replace(/\\bBearer\\s+[A-Za-z0-9._~+/=-]+\\b/gi, 'Bearer <redacted>')\n        .replace(/\\b(access_token|id_token|refresh_token|password|secret|authorization)\\b(\\s*[:=]\\s*)(\"[^\"]*\"|\\S+)/gi, '$1$2<redacted>');\n}\n\nfunction parsePuffbookMutateResponseBody(body) {\n    if (typeof body?.field !== 'function' && body !== null && body !== undefined) {\n        throw new Error('WebSocket puffbook_mutate response body must be Struct.');\n    }\n    const fieldNames = typeof body?.fieldNames === 'function' ? body.fieldNames() : null;\n    if (Array.isArray(fieldNames) && fieldNames.length === 0) {\n        return true;\n    }\n    const acceptedVersion = wsStructValue(body, 'accepted_version');\n    if (typeof acceptedVersion === 'number') {\n        return acceptedVersion;\n    }\n    const accepted = wsStructValue(body, 'accepted');\n    if (typeof accepted === 'boolean') {\n        if (accepted !== true) {\n            throw new Error(\"WebSocket puffbook_mutate response field 'accepted' must be true.\");\n        }\n        return true;\n    }\n    const legacyVersion = wsStructValue(body, 'version');\n    if (typeof legacyVersion === 'number') {\n        return legacyVersion;\n    }\n    throw new Error(\n        \"WebSocket puffbook_mutate response must be an empty Struct, \"\n        + \"or expose 'accepted' as Bool, 'accepted_version' as Int, or legacy 'version' as Int.\",\n    );\n}\n\nfunction wsStructValue(obj, field) {\n    try {\n        return obj?.field?.(field)?.value?.();\n    } catch (_err) {\n        return undefined;\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nconst BRIDGE_KEY = '__portalTestingBridge';\n\nfunction bridge() {\n    const w = typeof window !== 'undefined' ? window : null;\n    return w?.[BRIDGE_KEY] ?? null;\n}\n\nexport function installTestingBridge(nextBridge) {\n    const w = typeof window !== 'undefined' ? window : null;\n    if (!w) {\n        return;\n    }\n    w[BRIDGE_KEY] = nextBridge ?? null;\n}\n\nexport function getTestingCurrentDocument() {\n    return bridge()?.getCurrentDocument?.() ?? null;\n}\n\nexport function setTestingCurrentDocument(doc) {\n    bridge()?.setCurrentDocument?.(doc ?? null);\n}\n\nexport function getTestingCurrentScreen() {\n    return bridge()?.getCurrentScreen?.() ?? null;\n}\n\nexport function setTestingCurrentScreen(screen) {\n    bridge()?.setCurrentScreen?.(screen ?? null);\n}\n\nexport function getTestingLastPuffbookError() {\n    return bridge()?.getLastPuffbookError?.() ?? null;\n}\n\nexport function setTestingPuffbookError(err) {\n    bridge()?.setPuffbookError?.(err ?? null);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nlet g_currentDocument = null;\nlet g_currentScreen = null;\nlet g_lastPuffbookError = null;\n\nexport function getTestingCurrentDocument() {\n    return g_currentDocument;\n}\n\nexport function setTestingCurrentDocument(doc) {\n    g_currentDocument = doc ?? null;\n}\n\nexport function getTestingCurrentScreen() {\n    return g_currentScreen;\n}\n\nexport function setTestingCurrentScreen(screen) {\n    g_currentScreen = screen ?? null;\n}\n\nexport function getTestingLastPuffbookError() {\n    return g_lastPuffbookError;\n}\n\nexport function setTestingPuffbookError(err) {\n    if (!err) {\n        g_lastPuffbookError = null;\n        return;\n    }\n    g_lastPuffbookError = {\n        title: err?.title ?? null,\n        detail: err?.detail ?? err?.stack ?? null,\n        message: err?.message ?? String(err),\n        status: typeof err?.status === 'number' ? err.status : null,\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n// Imported only by the max-build testing bridge.\nimport { Viewport } from './evilui/viewport.mjs';\nimport { Anchor } from './evilui/base.mjs';\nimport { MSDFText, contextFontTextureState, peekContextFontTexture } from './evilfont/evilfont.mjs';\nimport { requestFrame } from './frame-wakeup.mjs';\n\n/* Mount real Portal text without creating or editing a data-lake document. */\nexport function createFontTestPreview({ mountRoot, fonts }) {\n    const byName = new Map(fonts.map(font => [font.name, font]));\n    let ownViewport = null;\n    let rows = [];\n\n    function drop() {\n        if (ownViewport) {\n            mountRoot.removeChild(ownViewport);\n            ownViewport = null;\n        }\n        rows = [];\n        requestFrame('font_test_preview_drop');\n    }\n\n    function show({ fontName, fontSize, lines }) {\n        const font = byName.get(fontName);\n        if (!font) throw new Error(`Unknown Portal test font '${fontName}'.`);\n        if (!Number.isFinite(fontSize) || fontSize <= 0) throw new Error('Font test size must be positive.');\n        if (!Array.isArray(lines) || lines.length === 0 || lines.some(line => typeof line !== 'string' || /[\\r\\n]/.test(line))) {\n            throw new Error('Font preview needs nonempty single-line string samples.');\n        }\n        drop();\n        const lineAdvance = Math.ceil(font.fontData.lineHeight * fontSize + 12);\n        ownViewport = new Viewport({ name: 'fontTestPreview',\n            x: 40, y: 80, z: -1, width: 1320, height: lineAdvance * lines.length + 40,\n            color: [0, 0, 0, 1] });\n        const scope = new Anchor({ textBatchScopeKey: 'fontTestPreview.text' });\n        ownViewport.appendChild(scope);\n        rows = lines.map((text, index) => {\n            const node = new MSDFText({ font, fontSize, text, x: 16, y: 16 + index * lineAdvance,\n                fontColor: [1, 1, 1, 1], textBatching: 'static_segmented', z: -1 });\n            scope.appendChild(node);\n            return node;\n        });\n        mountRoot.appendChild(ownViewport);\n        requestFrame('font_test_preview_show');\n    }\n\n    function snapshot() {\n        if (!ownViewport) return null;\n        const gl = mountRoot.scene.gl;\n        const rowSnapshots = rows.map(node => {\n            const font = node.state.font;\n            const palette = font.fontData.atlasFonts;\n            const data = node.glyphData();\n            const group = node._resources?.groupByFont?.get(font.name);\n            const position = node.worldPosition();\n            const glyphs = Array.from(node._layout.codepoints, (codepoint, index) => {\n                const atlasIndex = data.atlasIndices[index];\n                const selected = palette[atlasIndex];\n                const renderedCodepoint = selected.fontData.glyphs[String.fromCodePoint(codepoint)] ? codepoint : 0xfffd;\n                const native = selected.fontData.glyphs[String.fromCodePoint(renderedCodepoint)];\n                const [u, v, width, height] = native.tex_rect;\n                return { codepoint, renderedCodepoint, atlasIndex, fontName: selected.name,\n                    textureReady: contextFontTextureState(gl, selected) === 'idle' && !!peekContextFontTexture(gl, selected),\n                    texRect: Array.from(data.texRects.slice(index * 4, index * 4 + 4)),\n                    expectedTexRect: [u, 1 - v - height, u + width, 1 - v],\n                    screenRect: Array.from(data.rects.slice(index * 4, index * 4 + 4),\n                        (value, edge) => value + position[edge % 2]) };\n            });\n            const batchReady = data.glyphCount === 0 || !!group?.ownGlBufferInfo && group.instanceCount > 0\n                && group.dirtyKinds.size === 0 && node.computedVisible;\n            return { text: node.state.text, width: node.width(), glyphs, batchReady };\n        });\n        return { ready: rowSnapshots.every(row => row.batchReady && row.glyphs.every(glyph => glyph.textureReady)),\n            contextLost: gl.isContextLost(), rows: rowSnapshots };\n    }\n\n    return { show, snapshot, drop };\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Director } from './lib/director.mjs';\nimport * as ui from './lib/evilui/evilui.mjs';\nimport { Interactable } from './lib/evilui/button.mjs';\nimport { resolveFocusScene } from './lib/focus-scene.mjs';\nimport { installTestingBridge } from './lib/testing-bridge.mjs';\nimport {\n    testingPuffbookHeldEditEventState,\n    testingPuffbookHoldNextEditEvent,\n    testingPuffbookMutateTrace,\n    testingPortalWSDebugState,\n    testingPortalWSTrace,\n    testingResetPortalWSTrace,\n    testingPuffbookReleaseHeldEditEvent,\n    testingPuffbookResetMutateTrace,\n    testingPuffbookHoldNextSubscribeOpen,\n    testingPuffbookHeldSubscribeOpenSummary,\n    testingPuffbookReleaseHeldSubscribeOpen,\n    testingPuffbookSubscribeOpenState,\n} from './api.mjs';\nimport {\n    getTestingCurrentDocument,\n    getTestingCurrentScreen,\n    getTestingLastPuffbookError,\n    setTestingCurrentDocument,\n    setTestingCurrentScreen,\n    setTestingPuffbookError,\n} from './testing-state.mjs';\nimport {\n    testingPortalTimingTrace,\n    testingPuffbookTrace,\n    testingPuffbookForensics,\n    testingResetPuffbookForensics,\n    testingResetPortalTimingTrace,\n    testingResetPuffbookTrace,\n    testingResetTableviewTrace,\n    testingTableviewTrace,\n} from './lib/evilui/testing-trace.mjs';\nimport {\n    gpuDiagCompactSnapshot,\n    gpuDiagContextLossSummary,\n    gpuDiagHeartbeatTrendSummary,\n} from './lib/evilui/browser-gpu-diagnostics.mjs';\nimport { requestFrame } from './lib/frame-wakeup.mjs';\nimport { testingLiveTextGroupSummary } from './lib/evilfont/evilfont.mjs';\nimport { testingTableviewChunkLifecycleSummary } from './lib/evilui/tableview.mjs';\nimport { testingPtrlessLiveMemorySummary } from './lib/ptrless/builder.mjs';\nimport { createFontTestPreview } from './lib/font-test-preview.mjs';\n\nconst w = typeof window !== 'undefined' ? window : null;\nif (w) {\n    w.testingInstallFontSamples = options => {\n        const preview = createFontTestPreview(options);\n        w.testingShowFontSamples = preview.show;\n        w.testingFontSamplesSnapshot = preview.snapshot;\n        w.testingDropFontSamples = preview.drop;\n    };\n}\nconst DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_LINE = 3;\nconst DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_INTERVAL_MS = 10_000;\nlet g_testingTableChunkAllocLogger = null;\n\n/* Read one line-local chunk-allocation snapshot from the current puffbook screen. */\nfunction readTestingTableChunkAllocationForLine(lineNum) {\n    const screen = getTestingCurrentScreen();\n    if (!screen || typeof screen.testingTableChunkAllocationForLine !== 'function') {\n        return null;\n    }\n    return screen.testingTableChunkAllocationForLine(lineNum);\n}\n\n/* Read one retained document-view summary from the current puffbook screen. */\nfunction readTestingDocumentRetentionSummary() {\n    const screen = getTestingCurrentScreen();\n    if (!screen || typeof screen.testingDocumentRetentionSummary !== 'function') {\n        return null;\n    }\n    return screen.testingDocumentRetentionSummary();\n}\n\n/* Read one retained puffbook/model summary from the current document. */\nfunction readTestingPuffbookRetentionSummary() {\n    const doc = getTestingCurrentDocument();\n    if (!doc || typeof doc.testingRetentionSummary !== 'function') {\n        return null;\n    }\n    return doc.testingRetentionSummary();\n}\n\n/* Resolve the test keyboard target from the same focus-stack-first scene rule as the live portal. */\nfunction testingCurrentFocusScene() {\n    const screenScene = getTestingCurrentScreen()?.scene ?? null;\n    return resolveFocusScene({\n        activeScene: screenScene ?? Director.directorRoot ?? null,\n        interactiveScenes: [screenScene, Director.directorRoot].filter(Boolean),\n        focusContainer: ui.currentFocusContainer?.() ?? null,\n        focusedInputCell: ui.currentFocusedInputCell?.() ?? null,\n    });\n}\n\n/* Read one line-local ptrless summary so leak probes can compare chunk shells against imported-table wrappers. */\nfunction readTestingTablePtrlessMemoryForLine(lineNum) {\n    const screen = getTestingCurrentScreen();\n    if (!screen || typeof screen.testingTablePtrlessMemoryForLine !== 'function') {\n        return null;\n    }\n    return screen.testingTablePtrlessMemoryForLine(lineNum);\n}\n\n/* Read one global ptrless-live summary so leak probes can spot builder/cache growth across the whole page. */\nfunction readTestingPtrlessLiveMemorySummary() {\n    return testingPtrlessLiveMemorySummary();\n}\n\n/* Read one compact line-local ptrless delta so recurring logs show wrapper/cache growth directly. */\nfunction diffTestingTablePtrlessMemory(prev, next) {\n    if (!prev || !next) {\n        return null;\n    }\n    const prevBuilder = prev.builder ?? {};\n    const nextBuilder = next.builder ?? {};\n    const prevShells = prevBuilder.js_shells ?? {};\n    const nextShells = nextBuilder.js_shells ?? {};\n    return {\n        raw_bytes: (nextBuilder.raw_regions?.bytes ?? 0) - (prevBuilder.raw_regions?.bytes ?? 0),\n        cache_entries: (nextBuilder.cache?.entry_count ?? 0) - (prevBuilder.cache?.entry_count ?? 0),\n        strong_cache_entries: (nextBuilder.cache?.strong_entry_count ?? 0) - (prevBuilder.cache?.strong_entry_count ?? 0),\n        weak_live_cache_entries: (nextBuilder.cache?.weak_live_entry_count ?? 0) - (prevBuilder.cache?.weak_live_entry_count ?? 0),\n        weak_dead_cache_entries: (nextBuilder.cache?.weak_dead_entry_count ?? 0) - (prevBuilder.cache?.weak_dead_entry_count ?? 0),\n        live_wrappers: (nextBuilder.wrappers?.live_count ?? 0) - (prevBuilder.wrappers?.live_count ?? 0),\n        shell_buffer_views: (nextShells.buffer_views?.count ?? 0) - (prevShells.buffer_views?.count ?? 0),\n        shell_buffer_view_span_bytes: (nextShells.buffer_views?.total_span_bytes ?? 0) - (prevShells.buffer_views?.total_span_bytes ?? 0),\n        shell_arrays: (nextShells.arrays?.count ?? 0) - (prevShells.arrays?.count ?? 0),\n        shell_array_slots: (nextShells.arrays?.total_slots ?? 0) - (prevShells.arrays?.total_slots ?? 0),\n        shell_maps: (nextShells.maps?.count ?? 0) - (prevShells.maps?.count ?? 0),\n        shell_map_entries: (nextShells.maps?.total_entries ?? 0) - (prevShells.maps?.total_entries ?? 0),\n        shell_sets: (nextShells.sets?.count ?? 0) - (prevShells.sets?.count ?? 0),\n        shell_set_entries: (nextShells.sets?.total_entries ?? 0) - (prevShells.sets?.total_entries ?? 0),\n    };\n}\n\n/* Read one compact global ptrless delta so recurring logs show page-wide builder/cache growth directly. */\nfunction diffTestingPtrlessLiveMemory(prev, next) {\n    if (!prev || !next) {\n        return null;\n    }\n    const prevShells = prev.js_shells ?? {};\n    const nextShells = next.js_shells ?? {};\n    return {\n        builders_live: (next.builders_live ?? 0) - (prev.builders_live ?? 0),\n        unique_buffers: (next.raw_regions?.unique_buffers ?? 0) - (prev.raw_regions?.unique_buffers ?? 0),\n        unique_bytes: (next.raw_regions?.unique_bytes ?? 0) - (prev.raw_regions?.unique_bytes ?? 0),\n        strong_cache_entries: (next.cache?.strong_entry_count ?? 0) - (prev.cache?.strong_entry_count ?? 0),\n        weak_live_cache_entries: (next.cache?.weak_live_entry_count ?? 0) - (prev.cache?.weak_live_entry_count ?? 0),\n        weak_dead_cache_entries: (next.cache?.weak_dead_entry_count ?? 0) - (prev.cache?.weak_dead_entry_count ?? 0),\n        live_wrappers: (next.wrappers?.live_count ?? 0) - (prev.wrappers?.live_count ?? 0),\n        shell_buffer_views: (nextShells.buffer_views?.count ?? 0) - (prevShells.buffer_views?.count ?? 0),\n        shell_buffer_view_span_bytes: (nextShells.buffer_views?.total_span_bytes ?? 0) - (prevShells.buffer_views?.total_span_bytes ?? 0),\n        shell_arrays: (nextShells.arrays?.count ?? 0) - (prevShells.arrays?.count ?? 0),\n        shell_array_slots: (nextShells.arrays?.total_slots ?? 0) - (prevShells.arrays?.total_slots ?? 0),\n        shell_maps: (nextShells.maps?.count ?? 0) - (prevShells.maps?.count ?? 0),\n        shell_map_entries: (nextShells.maps?.total_entries ?? 0) - (prevShells.maps?.total_entries ?? 0),\n        shell_sets: (nextShells.sets?.count ?? 0) - (prevShells.sets?.count ?? 0),\n        shell_set_entries: (nextShells.sets?.total_entries ?? 0) - (prevShells.sets?.total_entries ?? 0),\n    };\n}\n\n/* Read one compact delta between two table-allocation bundles so recurring logs show growth direction clearly. */\nfunction diffTestingTableChunkAllocation(prevBundle, nextBundle) {\n    if (!prevBundle || !nextBundle) {\n        return null;\n    }\n    const prev = prevBundle.allocation ?? null;\n    const next = nextBundle.allocation ?? null;\n    if (!prev || !next) {\n        return null;\n    }\n    const prevAttached = prev.attached_chunks?.totals ?? {};\n    const nextAttached = next.attached_chunks?.totals ?? {};\n    const prevPrepared = prev.prepared_payloads ?? {};\n    const nextPrepared = next.prepared_payloads ?? {};\n    const prevQueued = prev.queued_requests ?? {};\n    const nextQueued = next.queued_requests ?? {};\n    const prevHeader = prev.header_window ?? {};\n    const nextHeader = next.header_window ?? {};\n    const prevRowBands = prev.row_bands ?? {};\n    const nextRowBands = next.row_bands ?? {};\n    const prevCache = prev.cache ?? {};\n    const nextCache = next.cache ?? {};\n    return {\n        loaded_row_bands: (nextCache.loaded_row_bands ?? 0) - (prevCache.loaded_row_bands ?? 0),\n        loaded_chunk_records: (nextCache.loaded_chunk_records ?? 0) - (prevCache.loaded_chunk_records ?? 0),\n        attached_chunks: (next.attached_chunks?.count ?? 0) - (prev.attached_chunks?.count ?? 0),\n        attached_rows: (nextAttached.rows ?? 0) - (prevAttached.rows ?? 0),\n        attached_text_nodes: (nextAttached.text_nodes ?? 0) - (prevAttached.text_nodes ?? 0),\n        attached_glyphs: (nextAttached.glyph_count ?? 0) - (prevAttached.glyph_count ?? 0),\n        attached_typed_array_bytes: (nextAttached.exact_typed_array_bytes?.total ?? 0) - (prevAttached.exact_typed_array_bytes?.total ?? 0),\n        prepared_payloads: (nextPrepared.count ?? 0) - (prevPrepared.count ?? 0),\n        prepared_text_payloads: (nextPrepared.text_payloads ?? 0) - (prevPrepared.text_payloads ?? 0),\n        prepared_glyphs: (nextPrepared.glyph_count ?? 0) - (prevPrepared.glyph_count ?? 0),\n        prepared_typed_array_bytes: (nextPrepared.exact_typed_array_bytes?.total ?? 0) - (prevPrepared.exact_typed_array_bytes?.total ?? 0),\n        queued_requests: (nextQueued.count ?? 0) - (prevQueued.count ?? 0),\n        queued_column_refs: (nextQueued.borrowed_refs?.column_refs ?? 0) - (prevQueued.borrowed_refs?.column_refs ?? 0),\n        row_band_rows: (nextRowBands.row_count ?? 0) - (prevRowBands.row_count ?? 0),\n        row_band_row_objects: (nextRowBands.shell_counts?.row_objects ?? 0) - (prevRowBands.shell_counts?.row_objects ?? 0),\n        header_text_nodes: (nextHeader.text_nodes ?? 0) - (prevHeader.text_nodes ?? 0),\n        header_glyphs: (nextHeader.glyph_count ?? 0) - (prevHeader.glyph_count ?? 0),\n        header_typed_array_bytes: (nextHeader.exact_typed_array_bytes?.total ?? 0) - (prevHeader.exact_typed_array_bytes?.total ?? 0),\n        separator_nodes: (nextHeader.shell_counts?.separator_nodes ?? 0) - (prevHeader.shell_counts?.separator_nodes ?? 0),\n        table_ptrless: diffTestingTablePtrlessMemory(prevBundle.table_ptrless_memory, nextBundle.table_ptrless_memory),\n        ptrless_live: diffTestingPtrlessLiveMemory(prevBundle.ptrless_live_memory, nextBundle.ptrless_live_memory),\n    };\n}\n\n/* Build one console-friendly bundle so repeated leak logs stay stable across long scrolling sessions. */\nfunction buildTestingTableChunkAllocationBundle({\n    lineNum,\n    seq,\n    prevBundle = null,\n    sinceAtMs = null,\n}) {\n    const summary = readTestingTableChunkAllocationForLine(lineNum);\n    if (!summary) {\n        return null;\n    }\n    const liveProbe = globalThis.__tableviewLiveProbe?.report?.({ sinceAtMs })?.summary ?? null;\n    const bundle = {\n        kind: 'tableview_chunk_alloc_bundle',\n        seq,\n        captured_at: new Date().toISOString(),\n        performance_now_ms: Math.round(performance.now()),\n        line: lineNum,\n        allocation: summary,\n        table_ptrless_memory: readTestingTablePtrlessMemoryForLine(lineNum),\n        ptrless_live_memory: readTestingPtrlessLiveMemorySummary(),\n        evilfont_live_groups: testingLiveTextGroupSummary(),\n        tableview_chunk_lifecycle: testingTableviewChunkLifecycleSummary(),\n        document_retained: readTestingDocumentRetentionSummary(),\n        puffbook_retained: readTestingPuffbookRetentionSummary(),\n        live_probe_window: liveProbe,\n    };\n    bundle.delta_since_last = diffTestingTableChunkAllocation(prevBundle, bundle);\n    return bundle;\n}\n\n/* Stop one recurring chunk-allocation logger so console noise does not outlive the current repro run. */\nfunction stopTestingTableChunkAllocLogger() {\n    if (!g_testingTableChunkAllocLogger) {\n        return {\n            active: false,\n            line: null,\n            interval_ms: null,\n        };\n    }\n    clearInterval(g_testingTableChunkAllocLogger.timerID);\n    const stopped = {\n        active: false,\n        line: g_testingTableChunkAllocLogger.lineNum,\n        interval_ms: g_testingTableChunkAllocLogger.intervalMS,\n        emitted: g_testingTableChunkAllocLogger.seq,\n    };\n    g_testingTableChunkAllocLogger = null;\n    return stopped;\n}\n\n/* Start one recurring chunk-allocation logger for the requested TableView line and emit the first bundle immediately. */\nfunction startTestingTableChunkAllocLogger(\n    lineNum = DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_LINE,\n    intervalMS = DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_INTERVAL_MS,\n    { warnUnavailable = true } = {},\n) {\n    stopTestingTableChunkAllocLogger();\n    if (!Number.isInteger(lineNum) || lineNum < 0) {\n        throw new Error(`testingStartTableChunkAllocLogger(${lineNum}): lineNum must be a non-negative integer.`);\n    }\n    if (!Number.isFinite(intervalMS) || intervalMS < 250) {\n        throw new Error(`testingStartTableChunkAllocLogger(${intervalMS}): intervalMS must be at least 250.`);\n    }\n    globalThis.__tableviewLiveProbe?.reset?.(`chunk_alloc_logger_line_${lineNum}`);\n    g_testingTableChunkAllocLogger = {\n        lineNum,\n        intervalMS,\n        seq: 0,\n        prevSummary: null,\n        lastAtMS: performance.now(),\n        warnUnavailable,\n        timerID: null,\n    };\n    const emit = () => {\n        if (!g_testingTableChunkAllocLogger) {\n            return null;\n        }\n        const bundle = buildTestingTableChunkAllocationBundle({\n            lineNum: g_testingTableChunkAllocLogger.lineNum,\n            seq: g_testingTableChunkAllocLogger.seq + 1,\n            prevBundle: g_testingTableChunkAllocLogger.prevSummary,\n            sinceAtMs: g_testingTableChunkAllocLogger.lastAtMS,\n        });\n        g_testingTableChunkAllocLogger.lastAtMS = performance.now();\n        if (!bundle) {\n            if (g_testingTableChunkAllocLogger.warnUnavailable) {\n                console.warn('TableView chunk allocation bundle unavailable.', {\n                    line: g_testingTableChunkAllocLogger.lineNum,\n                    seq: g_testingTableChunkAllocLogger.seq + 1,\n                });\n            }\n            return null;\n        }\n        g_testingTableChunkAllocLogger.seq += 1;\n        g_testingTableChunkAllocLogger.prevSummary = bundle;\n        console.log('TableView chunk allocation bundle', bundle);\n        return bundle;\n    };\n    const first = emit();\n    g_testingTableChunkAllocLogger.timerID = setInterval(emit, intervalMS);\n    return {\n        active: true,\n        line: lineNum,\n        interval_ms: intervalMS,\n        first_bundle: first,\n    };\n}\n\n/* Read the current recurring logger state without starting or stopping it. */\nfunction testingTableChunkAllocLoggerState() {\n    if (!g_testingTableChunkAllocLogger) {\n        return {\n            active: false,\n            line: null,\n            interval_ms: null,\n            emitted: 0,\n        };\n    }\n    return {\n        active: true,\n        line: g_testingTableChunkAllocLogger.lineNum,\n        interval_ms: g_testingTableChunkAllocLogger.intervalMS,\n        emitted: g_testingTableChunkAllocLogger.seq,\n    };\n}\n\nfunction supportsLongTaskObserver() {\n    if (typeof PerformanceObserver !== 'function') {\n        return false;\n    }\n    const ua = globalThis.navigator?.userAgent ?? '';\n    if (ua.includes('Firefox/')) {\n        return false;\n    }\n    return !!PerformanceObserver.supportedEntryTypes?.includes?.('longtask');\n}\n\nfunction installTestingAnimationSampler(win) {\n    const keepMS = 5000;\n    const frames = [];\n    const state = {\n        started_at_ms: Math.round(performance.now()),\n        last_frame_ms: null,\n        frame_count: 0,\n        gap_last_ms: null,\n        gap_max_ms: 0,\n        gap_over_50ms: 0,\n        gap_over_100ms: 0,\n        gap_over_250ms: 0,\n    };\n\n    function prune(now) {\n        const cutoff = now - keepMS;\n        while (frames.length > 0 && frames[0] < cutoff) {\n            frames.shift();\n        }\n    }\n\n    function tick(now) {\n        if (typeof now !== 'number') {\n            now = performance.now();\n        }\n        if (state.last_frame_ms !== null) {\n            const gap = now - state.last_frame_ms;\n            state.gap_last_ms = Math.round(gap * 10) / 10;\n            if (gap > state.gap_max_ms) {\n                state.gap_max_ms = Math.round(gap * 10) / 10;\n            }\n            if (gap >= 50) {\n                state.gap_over_50ms++;\n            }\n            if (gap >= 100) {\n                state.gap_over_100ms++;\n            }\n            if (gap >= 250) {\n                state.gap_over_250ms++;\n            }\n        }\n        state.last_frame_ms = now;\n        state.frame_count++;\n        frames.push(now);\n        prune(now);\n        win.requestAnimationFrame(tick);\n    }\n\n    win.requestAnimationFrame(tick);\n    return () => {\n        const now = performance.now();\n        prune(now);\n        const last1s = now - 1000;\n        const frames1s = frames.filter((t) => t >= last1s).length;\n        const frames5s = frames.length;\n        return {\n            now_ms: Math.round(now),\n            started_at_ms: state.started_at_ms,\n            frame_count: state.frame_count,\n            frame_age_ms: state.last_frame_ms === null ? null : Math.round((now - state.last_frame_ms) * 10) / 10,\n            fps_1s: Math.round(frames1s * 10) / 10,\n            fps_5s: Math.round((frames5s / 5) * 10) / 10,\n            gap_last_ms: state.gap_last_ms,\n            gap_max_ms: state.gap_max_ms,\n            gap_over_50ms: state.gap_over_50ms,\n            gap_over_100ms: state.gap_over_100ms,\n            gap_over_250ms: state.gap_over_250ms,\n            visibility: document.visibilityState,\n        };\n    };\n}\n\nfunction installTestingMainThreadProbe(win) {\n    const keepMS = 5000;\n    const longTasks = [];\n    const lags = [];\n    const state = {\n        started_at_ms: Math.round(performance.now()),\n        last_tick_ms: performance.now(),\n        tick_count: 0,\n        lag_last_ms: null,\n        lag_max_ms: 0,\n        lag_over_50ms: 0,\n        lag_over_100ms: 0,\n        lag_over_250ms: 0,\n        longtask_count: 0,\n        longtask_total_ms: 0,\n        longtask_max_ms: 0,\n    };\n\n    function prune(now) {\n        const cutoff = now - keepMS;\n        while (longTasks.length > 0 && longTasks[0].end_ms < cutoff) {\n            longTasks.shift();\n        }\n        while (lags.length > 0 && lags[0].at_ms < cutoff) {\n            lags.shift();\n        }\n    }\n\n    if (supportsLongTaskObserver()) {\n        try {\n            const obs = new PerformanceObserver((list) => {\n                for (const entry of list.getEntries()) {\n                    const dur = Number(entry.duration || 0);\n                    const startMS = Number(entry.startTime || 0);\n                    const endMS = startMS + dur;\n                    longTasks.push({\n                        start_ms: startMS,\n                        end_ms: endMS,\n                        duration_ms: dur,\n                    });\n                    state.longtask_count++;\n                    state.longtask_total_ms += dur;\n                    if (dur > state.longtask_max_ms) {\n                        state.longtask_max_ms = dur;\n                    }\n                    prune(performance.now());\n                }\n            });\n            obs.observe({ entryTypes: ['longtask'] });\n        } catch (_err) {\n        }\n    }\n\n    const intervalMS = 50;\n    function tick() {\n        const now = performance.now();\n        const lag = Math.max(0, now - state.last_tick_ms - intervalMS);\n        state.last_tick_ms = now;\n        state.tick_count++;\n        state.lag_last_ms = Math.round(lag * 10) / 10;\n        if (lag > state.lag_max_ms) {\n            state.lag_max_ms = Math.round(lag * 10) / 10;\n        }\n        if (lag >= 50) {\n            state.lag_over_50ms++;\n        }\n        if (lag >= 100) {\n            state.lag_over_100ms++;\n        }\n        if (lag >= 250) {\n            state.lag_over_250ms++;\n        }\n        lags.push({\n            at_ms: now,\n            lag_ms: lag,\n        });\n        prune(now);\n        win.setTimeout(tick, intervalMS);\n    }\n\n    win.setTimeout(tick, intervalMS);\n    return () => {\n        const now = performance.now();\n        prune(now);\n        const longtaskTotalMS = longTasks.reduce((sum, entry) => sum + entry.duration_ms, 0);\n        const longtaskMaxMS = longTasks.reduce((max, entry) => Math.max(max, entry.duration_ms), 0);\n        const lagMaxMS = lags.reduce((max, entry) => Math.max(max, entry.lag_ms), 0);\n        const lagAvgMS = lags.length === 0 ? null : lags.reduce((sum, entry) => sum + entry.lag_ms, 0) / lags.length;\n        // Keep the worst recent outliers so we can correlate visible hitching with\n        // real browser long tasks instead of only looking at rolled-up averages.\n        const worstLongTasks = [...longTasks]\n            .sort((a, b) => b.duration_ms - a.duration_ms)\n            .slice(0, 8)\n            .map((entry) => ({\n                start_ms: Math.round(entry.start_ms * 10) / 10,\n                end_ms: Math.round(entry.end_ms * 10) / 10,\n                duration_ms: Math.round(entry.duration_ms * 10) / 10,\n            }));\n        const worstLags = [...lags]\n            .sort((a, b) => b.lag_ms - a.lag_ms)\n            .slice(0, 8)\n            .map((entry) => ({\n                at_ms: Math.round(entry.at_ms * 10) / 10,\n                lag_ms: Math.round(entry.lag_ms * 10) / 10,\n            }));\n        return {\n            now_ms: Math.round(now),\n            started_at_ms: state.started_at_ms,\n            tick_count: state.tick_count,\n            longtask_count_5s: longTasks.length,\n            longtask_total_ms_5s: Math.round(longtaskTotalMS * 10) / 10,\n            longtask_max_ms_5s: Math.round(longtaskMaxMS * 10) / 10,\n            longtask_busy_pct_5s: Math.round((longtaskTotalMS / keepMS) * 1000) / 10,\n            worst_longtasks_5s: worstLongTasks,\n            lag_last_ms: state.lag_last_ms,\n            lag_max_ms_5s: Math.round(lagMaxMS * 10) / 10,\n            lag_avg_ms_5s: lagAvgMS === null ? null : Math.round(lagAvgMS * 10) / 10,\n            lag_over_50ms: state.lag_over_50ms,\n            lag_over_100ms: state.lag_over_100ms,\n            lag_over_250ms: state.lag_over_250ms,\n            worst_lags_5s: worstLags,\n        };\n    };\n}\n\nfunction installTestingQuietExplainer(win) {\n    const state = {\n        last_sig: null,\n        last_doc: null,\n        stable_since_ms: Date.now(),\n        last_change_keys: [],\n        last_change_output_lines: [],\n        last_change_detail: [],\n    };\n\n    function unresolvedLines(doc) {\n        if (!doc || !Array.isArray(doc.output_rows)) {\n            return [];\n        }\n        const out = [];\n        for (const row of doc.output_rows) {\n            if (!row?.tracked_row) {\n                continue;\n            }\n            if (!row?.resolved || row?.state === 'partial') {\n                out.push(row?.line ?? 0);\n            }\n        }\n        return out;\n    }\n\n    function docIsSettled(doc) {\n        if (!doc) {\n            return false;\n        }\n        return Number(doc?.unsettled ?? 1) === 0\n            && unresolvedLines(doc).length === 0;\n    }\n\n    function lastTraceAt(trace, pred = () => true) {\n        if (!Array.isArray(trace)) {\n            return null;\n        }\n        for (let i = trace.length - 1; i >= 0; i--) {\n            const ev = trace[i];\n            if (pred(ev)) {\n                return ev?.at_ms ?? null;\n            }\n        }\n        return null;\n    }\n\n    function lagSummary(trace, pred = () => true) {\n        if (!Array.isArray(trace)) {\n            return {\n                last_at_ms: null,\n                last_lag_ms: null,\n                max_lag_ms: null,\n            };\n        }\n        let lastAtMS = null;\n        let lastLagMS = null;\n        let maxLagMS = null;\n        for (const ev of trace) {\n            if (!pred(ev)) {\n                continue;\n            }\n            const lagMS = ev?.event_lag_ms;\n            if (typeof lagMS !== 'number' || !Number.isFinite(lagMS)) {\n                continue;\n            }\n            lastAtMS = ev?.at_ms ?? lastAtMS;\n            lastLagMS = lagMS;\n            if (maxLagMS === null || lagMS > maxLagMS) {\n                maxLagMS = lagMS;\n            }\n        }\n        return {\n            last_at_ms: lastAtMS,\n            last_lag_ms: lastLagMS,\n            max_lag_ms: maxLagMS,\n        };\n    }\n\n    function rowSig(row) {\n        return {\n            line: row?.line ?? -1,\n            resolved: !!row?.resolved,\n            tracked_row: !!row?.tracked_row,\n            state: row?.state ?? '',\n            visible: !!row?.visible,\n            block_type: row?.block_type ?? '',\n            preview: row?.preview ?? '',\n            payload_debug: row?.payload_debug ?? '',\n        };\n    }\n\n    function semanticDoc(doc) {\n        if (!doc) {\n            return null;\n        }\n        return {\n            file_ref_path: doc?.file_ref?.path ?? '',\n            server_version: doc?.server_version ?? 0,\n            current_revision: doc?.current_revision ?? 0,\n            body: doc?.body ?? '',\n            line_count: doc?.line_count ?? 0,\n            output_rows: Array.isArray(doc?.output_rows) ? doc.output_rows.map(rowSig) : [],\n            unsettled: doc?.unsettled ?? 0,\n            pending_edits: doc?.pending_edits ?? 0,\n            subscription_open: !!doc?.subscription_open,\n            read_only: !!doc?.read_only,\n            closed: !!doc?.closed,\n        };\n    }\n\n    function diffSemanticDoc(prev, next) {\n        if (!prev || !next) {\n            return {\n                keys: ['document'],\n                rows: [],\n                detail: [],\n            };\n        }\n        const keys = [];\n        const detail = [];\n        for (const key of [\n            'file_ref_path',\n            'server_version',\n            'current_revision',\n            'body',\n            'line_count',\n            'unsettled',\n            'pending_edits',\n            'subscription_open',\n            'read_only',\n            'closed',\n        ]) {\n            if (prev[key] !== next[key]) {\n                keys.push(key);\n            }\n        }\n        const prevRows = new Map(prev.output_rows.map((row) => [row.line, row]));\n        const nextRows = new Map(next.output_rows.map((row) => [row.line, row]));\n        const changedRows = [];\n        const rowFields = [];\n        const lines = new Set([...prevRows.keys(), ...nextRows.keys()]);\n        for (const line of [...lines].sort((a, b) => a - b)) {\n            const a = prevRows.get(line) ?? null;\n            const b = nextRows.get(line) ?? null;\n            if (JSON.stringify(a) === JSON.stringify(b)) {\n                continue;\n            }\n            changedRows.push(line);\n            const fields = [];\n            for (const key of ['resolved', 'tracked_row', 'state', 'visible', 'block_type', 'preview', 'payload_debug']) {\n                if ((a?.[key] ?? null) !== (b?.[key] ?? null)) {\n                    fields.push(key);\n                }\n            }\n            rowFields.push(`${line}:${fields.join('+') || 'row'}`);\n        }\n        if (changedRows.length > 0) {\n            keys.push('output_rows');\n        }\n        return {\n            keys,\n            rows: changedRows.slice(0, 12),\n            detail: rowFields.slice(0, 8),\n        };\n    }\n\n    return (settleMS = 1000) => {\n        const now = Date.now();\n        const snap = win.testingCurrentPuffbookSummary?.() ?? null;\n        const doc = snap?.document ?? null;\n        if (!doc) {\n            return {\n                quiet: false,\n                reason: 'no_document',\n                stable_for_ms: 0,\n                idle_for_ms: 0,\n                unresolved_lines: [],\n                changed_keys: [],\n                changed_output_lines: [],\n                changed_detail: [],\n            };\n        }\n\n        const semantic = semanticDoc(doc);\n        const sig = JSON.stringify(semantic);\n        if (sig !== state.last_sig) {\n            const diff = diffSemanticDoc(state.last_doc, semantic);\n            state.last_sig = sig;\n            state.last_doc = semantic;\n            state.stable_since_ms = now;\n            state.last_change_keys = diff.keys;\n            state.last_change_output_lines = diff.rows;\n            state.last_change_detail = diff.detail;\n        }\n        const portalTrace = win.testingPortalWSTrace?.() ?? [];\n        const puffbookTrace = win.testingPuffbookTrace?.() ?? [];\n        const portalWS = win.testingPortalWSDebugState?.() ?? null;\n        const lineChanges = doc?.testing_line_changes ?? {};\n        const unresolved = unresolvedLines(doc);\n        const stableForMS = Math.max(0, now - state.stable_since_ms);\n        const lastWSDispatchAtMS = lastTraceAt(\n            portalTrace,\n            (ev) => ev?.event === 'ws_stream_response_dispatch_done',\n        );\n        const lastPuffbookApplyAtMS = lastTraceAt(\n            puffbookTrace,\n            (ev) => typeof ev?.event === 'string' && ev.event.endsWith('_done'),\n        );\n        const wsLag = lagSummary(\n            portalTrace,\n            (ev) => ev?.event === 'ws_stream_response_dispatch_done',\n        );\n        const puffbookLag = lagSummary(\n            puffbookTrace,\n            (ev) => typeof ev?.event === 'string'\n                && ev.event.startsWith('puffbook_handle_server_')\n                && ev.event.endsWith('_done'),\n        );\n        const settled = docIsSettled(doc);\n        const quiet = settled && stableForMS >= Math.min(1000, settleMS);\n\n        let reason = 'quiet';\n        if (!settled) {\n            reason = `server_unsettled:${doc?.unsettled ?? 0}`;\n        } else if (stableForMS < Math.min(1000, settleMS)) {\n            reason = 'document_still_changing';\n        } else if (unresolved.length > 0) {\n            reason = 'unresolved_rows_present';\n        }\n\n        return {\n            quiet,\n            settled,\n            reason,\n            stable_for_ms: stableForMS,\n            unresolved_count: unresolved.length,\n            unresolved_lines: unresolved,\n            changed_keys: state.last_change_keys,\n            changed_output_lines: state.last_change_output_lines,\n            changed_detail: state.last_change_detail,\n            changed_sources: state.last_change_output_lines.map((line) => {\n                const ev = lineChanges?.[line] ?? null;\n                if (!ev) {\n                    return `${line}:`;\n                }\n                return `${line}:${ev.source ?? ''}:${Array.isArray(ev.changed_fields) ? ev.changed_fields.join('+') : ''}`;\n            }),\n            last_ws_dispatch_at_ms: lastWSDispatchAtMS,\n            last_ws_dispatch_age_ms: lastWSDispatchAtMS === null ? null : Math.max(0, now - lastWSDispatchAtMS),\n            last_ws_dispatch_lag_ms: wsLag.last_lag_ms,\n            max_ws_dispatch_lag_ms: wsLag.max_lag_ms,\n            last_portal_message_at_ms: portalWS?.last_message_at_ms ?? null,\n            last_portal_message_age_ms: portalWS?.last_message_at_ms ? Math.max(0, now - portalWS.last_message_at_ms) : null,\n            last_puffbook_apply_at_ms: lastPuffbookApplyAtMS,\n            last_puffbook_apply_age_ms: lastPuffbookApplyAtMS === null ? null : Math.max(0, now - lastPuffbookApplyAtMS),\n            last_puffbook_event_lag_ms: puffbookLag.last_lag_ms,\n            max_puffbook_event_lag_ms: puffbookLag.max_lag_ms,\n        };\n    };\n}\n\nif (w) {\n    const getTestingAnimationStats = installTestingAnimationSampler(w);\n    const getTestingMainThreadStats = installTestingMainThreadProbe(w);\n    const getTestingWhyNotQuiet = installTestingQuietExplainer(w);\n    installTestingBridge({\n        getCurrentDocument: () => getTestingCurrentDocument(),\n        setCurrentDocument: (doc) => {\n            setTestingCurrentDocument(doc);\n        },\n        getCurrentScreen: () => getTestingCurrentScreen(),\n        setCurrentScreen: (screen) => {\n            setTestingCurrentScreen(screen);\n        },\n        getLastPuffbookError: () => getTestingLastPuffbookError(),\n        setPuffbookError: (err) => {\n            setTestingPuffbookError(err);\n        },\n    });\n    w.testingCurrentDocument = () => getTestingCurrentDocument();\n    w.testingSetCurrentDocument = (doc) => {\n        setTestingCurrentDocument(doc);\n    };\n    w.testingCurrentScreen = () => getTestingCurrentScreen();\n    w.testingSetCurrentScreen = (screen) => {\n        setTestingCurrentScreen(screen);\n    };\n    w.testingAnimationStats = () => getTestingAnimationStats();\n    w.testingMainThreadStats = () => getTestingMainThreadStats();\n    w.testingPortalPerformance = () => ({\n        animation: getTestingAnimationStats(),\n        main_thread: getTestingMainThreadStats(),\n        evilui: globalThis.__eviluiPerformanceTracker?.snapshot?.() ?? null,\n    });\n    w.testingPortalJitter = () => globalThis.__portalJitterProbe?.report?.() ?? null;\n    w.testingResetPortalJitter = (label = 'manual') => globalThis.__portalJitterProbe?.reset?.(label) ?? null;\n    w.testingPortalTimingTrace = () => testingPortalTimingTrace();\n    w.testingResetPortalTimingTrace = () => testingResetPortalTimingTrace();\n    w.testingTableviewLiveProbe = () => globalThis.__tableviewLiveProbe?.report?.() ?? null;\n    w.testingResetTableviewLiveProbe = (label = 'manual') => globalThis.__tableviewLiveProbe?.reset?.(label) ?? null;\n    // Keep direct handles to the live diagnostics module so backdoor inspection\n    // does not depend on ad hoc globals being populated elsewhere.\n    w.__gpuDiagCompactSnapshot = gpuDiagCompactSnapshot;\n    w.__gpuDiagHeartbeatTrendSummary = gpuDiagHeartbeatTrendSummary;\n    w.__gpuDiagContextLossSummary = gpuDiagContextLossSummary;\n    w.testingCurrentInteractable = () => Interactable.testingState();\n    w.testingRequestFrame = (reason = 'testing') => requestFrame(reason);\n    w.testingRenderMode = () => new URLSearchParams(window.location.search).get('testing_render') || 'full';\n    w.testingWhyNotQuiet = (settleMS = 1000) => getTestingWhyNotQuiet(settleMS);\n    w.testingNotePuffbookError = (err) => {\n        setTestingPuffbookError(err);\n    };\n    w.testingCurrentPuffbookSummary = () => {\n        const doc = getTestingCurrentDocument();\n        const screen = getTestingCurrentScreen();\n        return {\n            has_document: !!doc,\n            has_screen: !!screen,\n            document: doc && typeof doc.testingSummary === 'function'\n                ? doc.testingSummary()\n                : null,\n            screen: screen && typeof screen.testingSnapshot === 'function'\n                ? screen.testingSnapshot()\n                : null,\n            last_error: getTestingLastPuffbookError(),\n        };\n    };\n    w.testingCurrentPuffbookFocus = () => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingSnapshot !== 'function') {\n            return null;\n        }\n        const snap = screen.testingSnapshot();\n        return snap?.focus ?? null;\n    };\n    w.testingPuffbookOutputForLine = (lineNum) => {\n        const doc = getTestingCurrentDocument();\n        if (!doc || typeof doc.testingOutputForLine !== 'function') {\n            return null;\n        }\n        return doc.testingOutputForLine(lineNum);\n    };\n    w.testingTableViewportForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingTableViewportForLine !== 'function') {\n            return null;\n        }\n        return screen.testingTableViewportForLine(lineNum);\n    };\n    w.testingTableControlsForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingTableControlsForLine !== 'function') {\n            return null;\n        }\n        return screen.testingTableControlsForLine(lineNum);\n    };\n    w.testingTablePerfForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingTablePerfForLine !== 'function') {\n            return null;\n        }\n        return screen.testingTablePerfForLine(lineNum);\n    };\n    w.testingTableChunkMemoryForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingTableChunkMemoryForLine !== 'function') {\n            return null;\n        }\n        return screen.testingTableChunkMemoryForLine(lineNum);\n    };\n    w.testingTableChunkAllocationForLine = (lineNum) => readTestingTableChunkAllocationForLine(lineNum);\n    w.testingDocumentRetentionSummary = () => readTestingDocumentRetentionSummary();\n    w.testingPuffbookRetentionSummary = () => readTestingPuffbookRetentionSummary();\n    w.testingEvilfontLiveTextGroupSummary = () => testingLiveTextGroupSummary();\n    w.testingTableviewChunkLifecycleSummary = () => testingTableviewChunkLifecycleSummary();\n    w.testingTablePtrlessMemoryForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingTablePtrlessMemoryForLine !== 'function') {\n            return null;\n        }\n        return screen.testingTablePtrlessMemoryForLine(lineNum);\n    };\n    w.testingStartTableChunkAllocLogger = (\n        lineNum = DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_LINE,\n        intervalMS = DEFAULT_TABLE_CHUNK_ALLOC_LOGGER_INTERVAL_MS,\n    ) => startTestingTableChunkAllocLogger(lineNum, intervalMS);\n    w.testingStopTableChunkAllocLogger = () => stopTestingTableChunkAllocLogger();\n    w.testingTableChunkAllocLoggerState = () => testingTableChunkAllocLoggerState();\n    w.testingPtrlessLiveMemorySummary = () => testingPtrlessLiveMemorySummary();\n    w.testingExpandTableForLine = (lineNum) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingExpandTableForLine !== 'function') {\n            return false;\n        }\n        return screen.testingExpandTableForLine(lineNum);\n    };\n    w.testingActivateTableControlForLine = (lineNum, control) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingActivateTableControlForLine !== 'function') {\n            return false;\n        }\n        return screen.testingActivateTableControlForLine(lineNum, control);\n    };\n    w.testingLeaveTableForLine = (lineNum, sendLeaveSignal = true) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingLeaveTableForLine !== 'function') {\n            return false;\n        }\n        return screen.testingLeaveTableForLine(lineNum, sendLeaveSignal);\n    };\n    w.testingResetPuffbookChurn = () => {\n        const doc = getTestingCurrentDocument();\n        if (!doc || typeof doc.testingResetChurn !== 'function') {\n            return false;\n        }\n        return doc.testingResetChurn();\n    };\n    w.testingCurrentPuffbookOutputText = () => {\n        const doc = getTestingCurrentDocument();\n        if (!doc || typeof doc.getCurrentOutputText !== 'function') {\n            return null;\n        }\n        return doc.getCurrentOutputText();\n    };\n    w.testingPuffbookHoldNextSubscribeOpen = () => testingPuffbookHoldNextSubscribeOpen();\n    w.testingPuffbookReleaseHeldSubscribeOpen = (id = null) => testingPuffbookReleaseHeldSubscribeOpen(id);\n    w.testingPuffbookSubscribeOpenState = () => testingPuffbookSubscribeOpenState();\n    w.testingPuffbookHeldSubscribeOpenSummary = (id = null) => testingPuffbookHeldSubscribeOpenSummary(id);\n    w.testingPuffbookResetMutateTrace = () => testingPuffbookResetMutateTrace();\n    w.testingPuffbookMutateTrace = () => testingPuffbookMutateTrace();\n    w.testingPortalWSTrace = () => testingPortalWSTrace();\n    w.testingPortalWSDebugState = () => testingPortalWSDebugState();\n    w.testingResetPortalWSTrace = () => testingResetPortalWSTrace();\n    w.testingPuffbookTrace = () => testingPuffbookTrace();\n    w.testingPuffbookForensics = () => testingPuffbookForensics();\n    w.testingResetPuffbookForensics = () => testingResetPuffbookForensics();\n    w.testingPortalTimingTrace = () => testingPortalTimingTrace();\n    w.testingResetPuffbookTrace = () => testingResetPuffbookTrace();\n    w.testingResetPortalTimingTrace = () => testingResetPortalTimingTrace();\n    w.testingTableviewTrace = () => testingTableviewTrace();\n    w.testingResetTableviewTrace = () => testingResetTableviewTrace();\n    w.testingPuffbookHoldNextEditEvent = () => testingPuffbookHoldNextEditEvent();\n    w.testingPuffbookHeldEditEventState = () => testingPuffbookHeldEditEventState();\n    w.testingPuffbookReleaseHeldEditEvent = (id = null) => testingPuffbookReleaseHeldEditEvent(id);\n    w.testingBrowserDiagnosticState = () => globalThis.__portalTestingBrowserDiagnosticState?.() ?? null;\n    w.testingBrowserDiagnosticSummaryText = () => globalThis.__portalTestingBrowserDiagnosticSummaryText?.() ?? '<none>';\n    w.testingApplyPuffbookKeyDown = (evt = {}, lineNum = 0, col = 0) => {\n        const doc = getTestingCurrentDocument();\n        if (!doc || typeof doc.applyKeyDown !== 'function') {\n            return { edited: false, cursor: null };\n        }\n        const screen = getTestingCurrentScreen();\n        const e = {\n            key: '',\n            keyCode: 0,\n            ctrlKey: false,\n            metaKey: false,\n            shiftKey: false,\n            altKey: false,\n            clipboardData: '',\n            ...evt,\n        };\n        if (!e.key && typeof evt === 'string') {\n            e.key = evt;\n        }\n        if (!e.key) {\n            throw new Error('testingApplyPuffbookKeyDown: key is required');\n        }\n        const [edited, cursor] = doc.applyKeyDown(e, [lineNum, col]);\n        if (edited && screen && typeof screen.testingFocusLine === 'function' && Array.isArray(cursor)) {\n            screen.testingFocusLine(cursor[0] ?? 0, cursor[1] ?? 0);\n        }\n        return {\n            edited: !!edited,\n            cursor: Array.isArray(cursor) ? cursor : null,\n        };\n    };\n    w.testingFocusPuffbookLine = (lineNum = 0, col = 0) => {\n        const screen = getTestingCurrentScreen();\n        if (!screen || typeof screen.testingFocusLine !== 'function') {\n            return {\n                ok: false,\n                focus: null,\n            };\n        }\n        const ok = screen.testingFocusLine(lineNum, col);\n        const snap = typeof screen.testingSnapshot === 'function'\n            ? screen.testingSnapshot()\n            : null;\n        return {\n            ok: !!ok,\n            focus: snap?.focus ?? null,\n        };\n    };\n    w.testingSendGlobalKeyDown = (evt = {}) => {\n        const scene = testingCurrentFocusScene();\n        if (!scene) {\n            throw new Error('testingSendGlobalKeyDown: no focus scene is available');\n        }\n\n        const e = {\n            key: '',\n            keyCode: 0,\n            ctrlKey: false,\n            metaKey: false,\n            shiftKey: false,\n            altKey: false,\n            clipboardData: '',\n            ...evt,\n        };\n\n        if (!e.key && typeof evt === 'string') {\n            e.key = evt;\n        }\n        if (!e.key) {\n            throw new Error('testingSendGlobalKeyDown: key is required');\n        }\n\n        if (!e.keyCode) {\n            if (e.key.length === 1) {\n                e.keyCode = e.key.toUpperCase().charCodeAt(0);\n            } else if (e.key === 'Enter') {\n                e.keyCode = 13;\n            } else if (e.key === 'Backspace') {\n                e.keyCode = 8;\n            } else if (e.key === 'Delete') {\n                e.keyCode = 46;\n            } else if (e.key === 'ArrowLeft') {\n                e.keyCode = 37;\n            } else if (e.key === 'ArrowUp') {\n                e.keyCode = 38;\n            } else if (e.key === 'ArrowRight') {\n                e.keyCode = 39;\n            } else if (e.key === 'ArrowDown') {\n                e.keyCode = 40;\n            } else if (e.key === 'Home') {\n                e.keyCode = 36;\n            } else if (e.key === 'End') {\n                e.keyCode = 35;\n            }\n        }\n\n        return scene.sendKeyDown(e);\n    };\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { configureFontFallbacks, FONT_FALLBACK_NAMES } from './lib/evilfont/font-asset.mjs';\nimport * as twgl from 'twgl';\n\nimport * as evilfont from './lib/evilfont/evilfont.mjs';\nimport * as ptl from './lib/ptrless/ptrless.mjs';\nimport * as ptlf from './lib/ptrless/flags.mjs';\nimport * as ui from './lib/evilui/evilui.mjs';\nimport * as ewu from './lib/evil-works-utils.mjs';\nimport { initEvilEpoch } from './lib/eviltime.mjs';\nimport { installFrameRequester } from './lib/frame-wakeup.mjs';\nimport { resolveFocusScene } from './lib/focus-scene.mjs';\nimport { installFocusAccessibility } from './lib/evilui/focus-accessibility.mjs';\nimport { handlePortalShortcut } from './lib/shortcut-glossary.mjs';\n\nimport { ensurePortalVersion } from './portal.entry.mjs';\nimport { Director } from './lib/director.mjs';\nimport { Controls } from './controls.mjs';\nimport { AgentChat } from './lib/evilui/agent-chat.mjs';\nimport { Mouse } from './controls.mjs';\nimport { PORTAL_MIN_BUILD } from './lib/build-flags.mjs';\nimport { setDiagnosticsCollectionEnabled } from './lib/evilui/diagnostics-control.mjs';\nimport {\n    connectTranquility,\n    isBackendUnavailableError,\n    testingPortalWSDebugState,\n} from \"./api.mjs\";\nimport { getCurrentUser, getUserManager, logWhoami } from \"./auth.mjs\";\nimport { isLocalPortal } from \"./env.mjs\";\nimport { FpsIndicator } from './fps-indicator.mjs';\nimport { installFileDrop } from './file-drop.mjs';\nimport { FileDropOverlay } from './lib/evilui/file-drop-overlay.mjs';\nimport { FileActivityIndicator } from './lib/evilui/file-activity-indicator.mjs';\nimport { Directory } from \"./lib/evilui/directory.mjs\"\nimport { Palette } from './lib/evilui/evil_palette.mjs';\nimport { isDocumentArtifactPath, routeArtifactLabel } from './lib/evilui/directory-utils.mjs';\nimport {\n    logPointerRoute,\n    shouldLogPointerRoute,\n    summarizePointerEvents,\n} from './lib/evilui/input-route-log.mjs';\nimport {\n    PortalInputRecorder,\n    snapshotBeforeInputEvent,\n    snapshotCompositionEvent,\n    snapshotMouseEvent,\n    snapshotWheelEvent,\n} from './lib/evilui/input-recorder.mjs';\nimport {\n    PORTAL_RECORDING_FORMAT,\n    PORTAL_RECORDING_SESSION_FORMAT,\n    PORTAL_RECORDING_CHUNK_INTERVAL_MS,\n    PORTAL_RECORDING_MAX_DURATION_MS,\n    PortalConsoleRecorder,\n    PortalRecordingLakeStore,\n    PortalRecordingRecoveryStore,\n    captureRecordingCanvas,\n} from './lib/evilui/bug-report-recorder.mjs';\nimport {\n    wantsDirectPick,\n    wantsPassivePick,\n} from './lib/input-pick-policy.mjs';\nimport { withPortalTimingScope } from './lib/evilui/testing-trace.mjs';\n\nfunction resolveAppVersion() {\n    if (typeof document === 'undefined') {\n        return null;\n    }\n    const meta = document.querySelector('meta[name=\"app-version\"]');\n    return meta?.content ?? null;\n}\n\nconst APP_VERSION = resolveAppVersion();\nif (typeof window !== 'undefined' && (APP_VERSION === null || APP_VERSION === '')) {\n    throw new Error('portal: meta[name=\"app-version\"] missing or empty.');\n}\nimport {\n    gpuDiagCompactSnapshot,\n    gpuDiagContextLossSummary,\n    gpuDiagHeartbeatTrendSummary,\n    gpuDiagInstallGlResourceTracker,\n    gpuDiagMaybeHeartbeat,\n    gpuDiagNoteContext,\n    gpuDiagNoteFrameActivity,\n    gpuDiagNoteDraw,\n    gpuDiagNoteFramePhase,\n} from './lib/evilui/browser-gpu-diagnostics.mjs';\nimport {\n    DEFAULT_PORTAL_RETURN_PATH,\n    portalReturnPath,\n    splitPortalLakeRoute,\n} from './portal-routes.mjs';\nimport { resolvePortalRouteTarget } from './portal-route-resolver.mjs';\nimport {\n    apiCanServeRoutes,\n    authRedirectBackoffRemainingMs,\n    callbackRetryAlreadyUsed,\n    callbackReturnPath,\n    clearAuthRedirectBackoff,\n    clearCallbackRetryUsed,\n    createNoComputeBadgeVisibility,\n    disconnectBadgeReconciliation,\n    isMissingOidcStateError,\n    markCallbackRetryUsed,\n    noComputeBadgeShouldBeVisible,\n    noteAuthRedirectAttempt,\n    shouldBootstrapRouteAfterAPIStateChange,\n} from './portal-policy.mjs';\nimport {\n    INVITE_FORCE_REAUTH_BROADCAST_KEY,\n    maybeConsumeCallbackInvite,\n    maybeConsumePendingInvite,\n    maybeHandleInviteRoute,\n} from './invite-links.mjs';\nimport { createPortalJitterProbe } from './jitter-probe.mjs';\nimport { PORTAL_DEBUG_BUILD_VERSION } from './debug-build-version.mjs';\nconst INVITE_FORCE_LOGIN_ONCE_KEY = 'portal.invite_force_login_once.v1';\n\nconst __PORTAL_VERSION_READY__ = await ensurePortalVersion(APP_VERSION);\nif (!__PORTAL_VERSION_READY__) {\n    // Reload scheduled; keep module pending so subsequent code does not run.\n    await new Promise(() => {});\n}\ntry {\n    globalThis.__PORTAL_APP_VERSION__ = APP_VERSION;\n    globalThis.__portalDebugBuildVersion__ = PORTAL_DEBUG_BUILD_VERSION;\n} catch (_err) {\n    // Ignore if globalThis is not writable (very old browsers).\n}\n\nif (!PORTAL_MIN_BUILD) {\n    await import('./testing-entry.mjs');\n    globalThis.__portalJitterProbe = createPortalJitterProbe({\n        printToConsole: true,\n        reportEveryMs: 10_000,\n    });\n}\n\nui.preloadIconAtlasHint();\n\n\nlet g_username = null;\nlet g_stage = null;\nlet g_scene = null;\nlet g_fullscreenScene = null;\nlet g_back = null;\nlet g_tagLine = null;\nlet g_damon = null;\nlet g_resizeObserver = null;\nlet g_circle = null;\nlet g_lastTime = 0;\nlet g_frameStamp = 0;\nlet g_canvas = null;\nlet g_frameQueued = false;\nlet g_frameRunning = false;\nlet g_frameWakeRequested = false;\nlet g_lastFrameWakeReason = '';\nlet g_nextPresentFrameAtMS = -Infinity;\nlet g_presenterHot = false;\nlet g_presenterHotUntilJSMs = -Infinity;\nlet g_presenterQuiescentSinceJSMs = null;\nlet g_presenterLastPromoteReason = '';\nlet g_rootViewport = null;\nlet g_fullscreenRootViewport = null;\nlet g_hudScene = null;\nlet g_hudRootViewport = null;\nlet g_hudChromeRoot = null;\nlet g_hudWindowRoot = null;\nlet g_hudContextMenuRoot = null;\nlet g_hudDialogRoot = null;\nlet g_hudTooltipRoot = null;\nlet g_hudInfoBarRoot = null;\n\nlet g_agentChatEnabled = false;\nlet g_agentChat = null;\n\nfunction agentChatBounds() {\n    return {\n        ...g_stage.viewportDimensions,\n        directoryRight: g_directory.sidebarRect()[2],\n    };\n}\n\nfunction toggleAgentChat() {\n    if (!g_agentChat) return;\n    if (g_agentChat.isOpen) g_agentChat.hide();\n    else {\n        g_agentChat.show(g_hudChromeRoot, agentChatBounds());\n        g_canvas.focus({ preventScroll: true });\n    }\n}\n\nlet g_hudToastRoot = null;\nlet g_directory = null;\nlet g_connectionInfoBar = null;\nlet g_disconnectBadge = null;\nlet g_disconnectBadgeTarget = { visible: false, labelText: 'Disconnected' };\nlet g_disconnectBadgeFadeToken = 0;\nlet g_disconnectBadgeDelayTimeout = null;\nlet g_pendingDisconnectBadgeLabel = 'Disconnected';\nlet g_noComputeBadge = null;\n/* Retain worker-health presentation decisions made before the HUD node exists. */\nlet g_noComputeBadgeDesiredVisible = false;\nlet g_noComputeBadgeStartupTimeout = null;\nconst requestNoComputeBadgeVisibility = createNoComputeBadgeVisibility(syncNoComputeBadge);\nlet g_puffworkerConnected = null;\nlet g_activePuffbookComputeAvailable = null;\nconst g_canvasToDisplaySizeMap = new Map();\nlet g_resizeApplyTimeout = null;\nlet g_resizeApplyDeadlineMS = -Infinity;\nlet g_fpsIndicator = null;\nlet g_fpsIndicatorFont = null;\nlet g_devHudEnabled = false;\nlet g_api = null;\nlet g_inputRecorder = null;\nconst g_consoleRecorder = new PortalConsoleRecorder();\nlet g_recordingStore = null;\nconst g_recordingRecoveryStore = new PortalRecordingRecoveryStore();\nlet g_activeRecording = null;\nlet g_recordingPreparing = false;\nlet g_recordingSaving = false;\nlet g_recordingRecovering = false;\nlet g_recordingRecoveryUsername = null;\nlet g_failedRecordingSave = null;\nconst g_pendingRecordingFrameCaptures = [];\nconst g_pendingRecordingPointerContexts = [];\nconst RECORDING_OWNER_TOKEN_KEY = 'portal.recording.owner-token.v1';\nconst RECORDING_OWNER_WINDOW_NAME_PREFIX = 'portal-recording-owner:';\n\nfunction recordingOwnerToken(\n    storage = globalThis.window?.sessionStorage,\n    windowTarget = globalThis.window,\n) {\n    const windowName = String(windowTarget?.name ?? '');\n    const markerAt = windowName.lastIndexOf(RECORDING_OWNER_WINDOW_NAME_PREFIX);\n    if (markerAt >= 0) {\n        const existing = windowName.slice(markerAt + RECORDING_OWNER_WINDOW_NAME_PREFIX.length).split('|')[0];\n        if (existing) return existing;\n    }\n    const token = globalThis.crypto?.randomUUID?.()\n        ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n    storage?.setItem(RECORDING_OWNER_TOKEN_KEY, token);\n    if (windowTarget) {\n        windowTarget.name = windowName\n            ? `${windowName}|${RECORDING_OWNER_WINDOW_NAME_PREFIX}${token}`\n            : `${RECORDING_OWNER_WINDOW_NAME_PREFIX}${token}`;\n    }\n    return token;\n}\n\nconst g_recordingOwnerToken = recordingOwnerToken();\nif (typeof window !== 'undefined') {\n    g_consoleRecorder.install(window);\n    window.addEventListener('beforeunload', (event) => {\n        if (!g_activeRecording && !g_recordingPreparing && !g_recordingSaving && !g_recordingRecovering) return;\n        event.preventDefault();\n        event.returnValue = '';\n    });\n}\nglobalThis.__portalPendingTextDebugVisible = false;\n\nfunction publishDevHudVisibility(enabled) {\n    globalThis.__portalPendingTextDebugVisible = enabled === true;\n    if (typeof globalThis?.dispatchEvent === 'function' && typeof globalThis?.CustomEvent === 'function') {\n        globalThis.dispatchEvent(new CustomEvent('portal:dev-hud-visibility', {\n            detail: { enabled: enabled === true },\n        }));\n    }\n}\n\nconst DISCONNECT_ICON_FADE_DURATION_S = 0.3;\nconst DISCONNECT_ICON_FADE_EASE = 'easeInOutSine';\nconst DISCONNECT_BADGE_SHOW_DELAY_MS = 5_000;\nconst NO_COMPUTE_STARTUP_GRACE_MS = 5_000;\nconst TOAST_DIRECTORY_OVERLAP_PENALTY = 0.5;\nconst MAX_PRESENT_FPS = 120;\nconst MIN_PRESENT_FRAME_INTERVAL_MS = 1000 / MAX_PRESENT_FPS;\nconst CANVAS_RESIZE_IDLE_APPLY_DELAY_MS = 500;\nfunction rectArea(rect) {\n    const w = Math.max(0, rect[2] - rect[0]);\n    const h = Math.max(0, rect[3] - rect[1]);\n    return w * h;\n}\n\nfunction rectOverlapArea(a, b) {\n    if (!a || !b) {\n        return 0;\n    }\n    const left = Math.max(a[0], b[0]);\n    const top = Math.max(a[1], b[1]);\n    const right = Math.min(a[2], b[2]);\n    const bottom = Math.min(a[3], b[3]);\n    return rectArea([left, top, right, bottom]);\n}\n\nfunction rectOutsideArea(rect, viewport) {\n    return rectArea(rect) - rectOverlapArea(rect, viewport);\n}\n\nfunction presentationPointToLocal(mountRoot, x, y) {\n    return twgl.m4.transformPoint(\n        twgl.m4.inverse(mountRoot.localToWorld()),\n        [x, y, 0],\n    );\n}\n\n/* Materialise the shared transport-drop badge once at portal scope so document shells do not own global connection chrome. */\nfunction makeDisconnectBadge(font) {\n    return new ui.LabelledIcon({\n        font,\n        iconWidth: 112,\n        iconHeight: 112,\n        iconTrimTop: 24,\n        iconTrimBottom: 24,\n        iconID: 22,\n        iconColor: Palette.yellow,\n        labelText: 'Disconnected',\n        labelFontSize: 18,\n        labelColor: Palette.yellow,\n        gap: 0,\n        labelOffsetY: -6,\n        backgroundColor: [0.18, 0.18, 0.2, 0.92],\n        paddingX: 12,\n        paddingY: 14,\n        visible: false,\n        opacity: 1.0,\n    });\n}\n\n/* Materialise a separate worker-health badge so transport availability and compute availability remain distinguishable. */\nfunction makeNoComputeBadge(font) {\n    return new ui.LabelledIcon({\n        font,\n        iconWidth: 80,\n        iconHeight: 80,\n        iconTrimTop: 16,\n        iconTrimBottom: 16,\n        iconID: 27,\n        iconColor: [0.95, 0.08, 0.08, 1.0],\n        labelText: 'No compute',\n        labelFontSize: 18,\n        labelColor: Palette.white,\n        labelPosition: 'above',\n        gap: 14,\n        labelOffsetY: 0,\n        backgroundColor: [0.18, 0.18, 0.2, 0.92],\n        paddingX: 12,\n        paddingY: 14,\n        visible: false,\n        opacity: 1.0,\n    });\n}\n\n/* Keep passive transport loss in one shared HUD seam with the same fade behaviour regardless of the current document shell. */\nfunction syncDisconnectBadge({ visible, labelText }) {\n    if (!g_disconnectBadge) {\n        return;\n    }\n    const reconciliation = disconnectBadgeReconciliation(\n        g_disconnectBadgeTarget,\n        { visible, labelText },\n    );\n    if (!reconciliation.changed) {\n        return;\n    }\n    g_disconnectBadgeTarget = reconciliation.target;\n    if (reconciliation.labelChanged) {\n        g_disconnectBadge.mutate({\n            labelText: reconciliation.target.labelText,\n        });\n    }\n    if (!reconciliation.visibilityChanged) {\n        return;\n    }\n    if (!g_disconnectBadge.scene) {\n        g_disconnectBadge.stopAnimation('opacity');\n        g_disconnectBadge.visible = reconciliation.target.visible;\n        g_disconnectBadge.opacity = reconciliation.target.visible ? 1.0 : 0.0;\n        return;\n    }\n    const fadeToken = ++g_disconnectBadgeFadeToken;\n    g_disconnectBadge.stopAnimation('opacity');\n    if (reconciliation.target.visible) {\n        if (!g_disconnectBadge.visible) {\n            g_disconnectBadge.opacity = 0.0;\n        }\n        g_disconnectBadge.visible = true;\n        g_disconnectBadge.animateTo({\n            opacity: 1.0,\n            duration_s: DISCONNECT_ICON_FADE_DURATION_S,\n            ease: DISCONNECT_ICON_FADE_EASE,\n        });\n        return;\n    }\n    g_disconnectBadge.animateTo({\n        opacity: 0.0,\n        duration_s: DISCONNECT_ICON_FADE_DURATION_S,\n        ease: DISCONNECT_ICON_FADE_EASE,\n        onFinish: () => {\n            if (g_disconnectBadgeFadeToken !== fadeToken || !g_disconnectBadge) {\n                return;\n            }\n            g_disconnectBadge.visible = false;\n        },\n    });\n}\n\n/* Avoid flashing transient transport states (for example, during a refresh) in the shared HUD. */\nfunction syncDelayedDisconnectBadge({ visible, labelText }) {\n    if (!visible) {\n        if (g_disconnectBadgeDelayTimeout !== null) {\n            clearTimeout(g_disconnectBadgeDelayTimeout);\n            g_disconnectBadgeDelayTimeout = null;\n        }\n        syncDisconnectBadge({ visible: false, labelText });\n        return;\n    }\n\n    g_pendingDisconnectBadgeLabel = labelText;\n    if (g_disconnectBadge?.visible || g_disconnectBadgeDelayTimeout !== null) {\n        if (g_disconnectBadge?.visible) {\n            syncDisconnectBadge({ visible: true, labelText });\n        }\n        return;\n    }\n\n    g_disconnectBadgeDelayTimeout = setTimeout(() => {\n        g_disconnectBadgeDelayTimeout = null;\n        syncDisconnectBadge({ visible: true, labelText: g_pendingDisconnectBadgeLabel });\n    }, DISCONNECT_BADGE_SHOW_DELAY_MS);\n}\n\n/* Keep worker loss visible without conflating it with the browser-to-tranquility transport state. */\nfunction syncNoComputeBadge(visible) {\n    const targetVisible = visible === true;\n    g_noComputeBadgeDesiredVisible = targetVisible;\n    if (!g_noComputeBadge) {\n        return;\n    }\n    const targetOpacity = targetVisible ? 1.0 : 0.0;\n    if (g_noComputeBadge.visible === targetVisible && g_noComputeBadge.opacity === targetOpacity) {\n        return;\n    }\n    g_noComputeBadge.stopAnimation('opacity');\n    g_noComputeBadge.opacity = targetOpacity;\n    g_noComputeBadge.visible = targetVisible;\n}\n\n/* Hide unknown startup worker state before applying the normal delayed display policy. */\nfunction beginNoComputeStartupGrace() {\n    if (g_noComputeBadgeStartupTimeout !== null) {\n        clearTimeout(g_noComputeBadgeStartupTimeout);\n    }\n    requestNoComputeBadgeVisibility(false);\n    g_noComputeBadgeStartupTimeout = setTimeout(() => {\n        g_noComputeBadgeStartupTimeout = null;\n        requestNoComputeBadgeVisibility(noComputeBadgeShouldBeVisible({\n            startupGraceActive: false,\n            workerConnected: g_puffworkerConnected,\n            activePuffbookComputeAvailable: g_activePuffbookComputeAvailable,\n        }));\n    }, NO_COMPUTE_STARTUP_GRACE_MS);\n}\n\n/* Reconcile worker health without exposing an unresolved initial connection during the startup grace period. */\nfunction syncNoComputeBadgeFromWorkerState() {\n    requestNoComputeBadgeVisibility(noComputeBadgeShouldBeVisible({\n        startupGraceActive: g_noComputeBadgeStartupTimeout !== null,\n        workerConnected: g_puffworkerConnected,\n        activePuffbookComputeAvailable: g_activePuffbookComputeAvailable,\n    }));\n}\n\n/* Apply the server-owned worker state to the global compute availability badge. */\nfunction syncPuffworkerState(connected) {\n    g_puffworkerConnected = connected === true;\n    if (g_puffworkerConnected && g_noComputeBadgeStartupTimeout !== null) {\n        clearTimeout(g_noComputeBadgeStartupTimeout);\n        g_noComputeBadgeStartupTimeout = null;\n    }\n    syncNoComputeBadgeFromWorkerState();\n}\n\nfunction syncActivePuffbookComputeAvailability(available) {\n    g_activePuffbookComputeAvailable = typeof available === 'boolean' ? available : null;\n    syncNoComputeBadgeFromWorkerState();\n}\n\n/* Merge API transport/auth state with the active puffbook lifecycle so one badge explains the current on-screen availability. */\nfunction syncConnectionInfoBar(state) {\n    if (state?.auth === 'renewing') {\n        if (g_disconnectBadgeDelayTimeout !== null) {\n            clearTimeout(g_disconnectBadgeDelayTimeout);\n            g_disconnectBadgeDelayTimeout = null;\n        }\n        syncDisconnectBadge({\n            visible: false,\n            labelText: 'Disconnected',\n        });\n        return;\n    }\n    if (state?.auth === 'reauth_required') {\n        if (g_disconnectBadgeDelayTimeout !== null) {\n            clearTimeout(g_disconnectBadgeDelayTimeout);\n            g_disconnectBadgeDelayTimeout = null;\n        }\n        syncDisconnectBadge({\n            visible: true,\n            labelText: 'Sign in required',\n        });\n        return;\n    }\n    switch (state?.connection) {\n    case 'connecting':\n        syncDelayedDisconnectBadge({\n            visible: true,\n            labelText: 'Connecting',\n        });\n        return;\n    case 'reconnecting':\n        syncDelayedDisconnectBadge({\n            visible: true,\n            labelText: 'Reconnecting',\n        });\n        return;\n    case 'disconnected':\n        syncDelayedDisconnectBadge({\n            visible: true,\n            labelText: 'Disconnected',\n        });\n        return;\n    default:\n        syncDelayedDisconnectBadge({\n            visible: false,\n            labelText: 'Disconnected',\n        });\n        return;\n    }\n}\n\n/* Score four toast candidates around the pointer and choose the one that least escapes the viewport while de-prioritising Directory overlap. */\nfunction resolveHudToastPlacement({\n    sourceNode,\n    mountRoot,\n    toastWidth,\n    toastHeight,\n    toastFont,\n    toastFontSize,\n    fallbackX,\n    fallbackY,\n}) {\n    const scene = sourceNode?.scene ?? g_hudScene;\n    const cam = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const [vpWidth = 0, vpHeight = 0] = cam?.getViewportSize?.() ?? [0, 0];\n    if (!mountRoot || !scene || vpWidth <= 0 || vpHeight <= 0 || !toastFont) {\n        return { x: fallbackX, y: fallbackY };\n    }\n    const hh = evilfont.MSDFText.measureFromState({\n        font: toastFont,\n        fontSize: toastFontSize,\n        text: 'x',\n    }).height;\n    const hw = evilfont.MSDFText.measureFromState({\n        font: toastFont,\n        fontSize: toastFontSize,\n        text: 'xxxx',\n    }).width;\n    const mouseX = Mouse.x * vpWidth;\n    const mouseY = Mouse.y * vpHeight;\n    const viewport = [0, 0, vpWidth, vpHeight];\n    const directoryRect = g_directory?.visible === false ? null : g_directory?.sidebarRect?.() ?? null;\n    const candidates = [\n        { x: mouseX + hw, y: mouseY + hh, pref: 0 },\n        { x: mouseX + hw, y: mouseY - hh - toastHeight, pref: 1 },\n        { x: mouseX - hw - toastWidth, y: mouseY + hh, pref: 2 },\n        { x: mouseX - hw - toastWidth, y: mouseY - hh - toastHeight, pref: 3 },\n    ];\n    let best = null;\n    for (const cand of candidates) {\n        const rect = [cand.x, cand.y, cand.x + toastWidth, cand.y + toastHeight];\n        const score = rectOutsideArea(rect, viewport)\n            + TOAST_DIRECTORY_OVERLAP_PENALTY * rectOverlapArea(rect, directoryRect);\n        if (!best || score < best.score || (score === best.score && cand.pref < best.pref)) {\n            best = { ...cand, score };\n        }\n    }\n    if (!best) {\n        return { x: fallbackX, y: fallbackY };\n    }\n    const local = presentationPointToLocal(mountRoot, best.x, best.y);\n    return {\n        x: local[0],\n        y: local[1],\n    };\n}\nlet g_authRedirectInFlight = false;\nconst g_disablePickingForExperiment = false;\nlet g_lastRafRequestAt = null;\nlet g_gpuDrawTimer = null;\nlet g_liveGL = null;\nlet g_prevCameraMatrix = null;\nlet g_portalJitterProbe = globalThis.__portalJitterProbe ?? null;\nconst BROWSER_CRASH_REPORT_MIN_INTERVAL_MS = 15_000;\nconst BROWSER_DIAGNOSTIC_DEDUPE_WINDOW_MS = 5_000;\nconst BROWSER_DIAGNOSTIC_QUEUE_LIMIT = 16;\nconst BROWSER_DIAGNOSTIC_LANGUAGE_LIMIT = 3;\nconst PERF_SUMMARY_TOP_LIMIT = 8;\nconst PERF_SUMMARY_BATCHER_GROUP_LIMIT = 4;\nconst PERF_SUMMARY_ROOT_CHILD_LIMIT = 4;\nconst PERF_SUMMARY_SCENE_LIMIT = 4;\nconst FULLSCREEN_SCENE_CACHE_MS = 60_000;\nconst HOT_LOOP_HYSTERESIS_MS = 1_000;\nconst WEBGL2_CONTEXT_ATTRIBUTES = Object.freeze({\n    antialias: true,\n    powerPreference: 'high-performance',\n});\nconst g_browserCrashReportState = {\n    nextContextId: 1,\n};\nconst g_browserDiagnosticRuntime = {\n    api: null,\n    ownOffApiState: null,\n    queue: [],\n    recentReports: [],\n    flushPromise: null,\n    suppressDepth: 0,\n    installed: false,\n    recentByKey: new Map(),\n    originalConsoleError: typeof globalThis.console?.error === 'function'\n        ? globalThis.console.error.bind(globalThis.console)\n        : null,\n};\nconst TESTING_BROWSER_DIAGNOSTIC_REPORT_LIMIT = 16;\nconst g_testingRenderMode = (() => {\n    const raw = runtimeParamValue('testing_render');\n    if (raw === null || raw === '') {\n        return 'full';\n    }\n    if (raw === 'full' || raw === 'none') {\n        return raw;\n    }\n    throw new Error(`Invalid testing_render: ${raw}`);\n})();\nconst g_testingFrameIntervalMS = (() => {\n    const raw = runtimeParamValue('testing_frame_interval_ms');\n    if (raw === null || raw === '') {\n        return 0;\n    }\n    const n = Number.parseInt(raw, 10);\n    if (!Number.isFinite(n) || n < 0) {\n        throw new Error(`Invalid testing_frame_interval_ms: ${raw}`);\n    }\n    return n;\n})();\nfunction testingRenderDisabled() {\n    return g_testingRenderMode === 'none';\n}\n\nlet controls = null;\n\nclass GpuDrawTimer {\n    constructor(gl) {\n        this.gl = gl;\n        this.ext = gl.getExtension?.('EXT_disjoint_timer_query_webgl2') ?? null;\n        this.supported = !!(this.ext && typeof gl.createQuery === 'function');\n        this.pending = [];\n        this.active = null;\n    }\n\n    begin(name) {\n        if (!this.supported || this.active) {\n            return;\n        }\n        const q = this.gl.createQuery();\n        if (!q) {\n            return;\n        }\n        this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, q);\n        this.active = { name, query: q };\n    }\n\n    end() {\n        if (!this.supported || !this.active) {\n            return;\n        }\n        this.gl.endQuery(this.ext.TIME_ELAPSED_EXT);\n        this.pending.push(this.active);\n        this.active = null;\n    }\n\n    /* Always retire completed WebGL queries, even when perf recording is disabled, so the pending queue cannot leak. */\n    poll(tracker) {\n        if (!this.supported) {\n            return;\n        }\n        if (this.gl.getParameter(this.ext.GPU_DISJOINT_EXT)) {\n            return;\n        }\n        while (this.pending.length > 0) {\n            const item = this.pending[0];\n            if (!this.gl.getQueryParameter(item.query, this.gl.QUERY_RESULT_AVAILABLE)) {\n                break;\n            }\n            const ns = this.gl.getQueryParameter(item.query, this.gl.QUERY_RESULT);\n            this.gl.deleteQuery(item.query);\n            this.pending.shift();\n            if (tracker?.enabled) {\n                tracker.recordDuration(item.name, ns / 1e6);\n            }\n        }\n    }\n}\n\nfunction runtimeParamValue(name) {\n    const params = new URLSearchParams(window.location.search);\n    const direct = params.get(name);\n    if (direct !== null) {\n        return direct;\n    }\n\n    const hash = window.location.hash || '';\n    const queryIndex = hash.indexOf('?');\n    if (queryIndex !== -1) {\n        const hashParams = new URLSearchParams(hash.substring(queryIndex + 1));\n        const hashQuery = hashParams.get(name);\n        if (hashQuery !== null) {\n            return hashQuery;\n        }\n    }\n\n    const prefix = `#${name}=`;\n    if (hash.startsWith(prefix)) {\n        return hash.substring(prefix.length);\n    }\n\n    return null;\n}\n\nfunction runtimeFlagEnabled(name) {\n    const raw = runtimeParamValue(name);\n    return raw === '1' || raw === 'true';\n}\n\nfunction incCount(map, key, delta = 1) {\n    map.set(key, (map.get(key) || 0) + delta);\n}\n\nfunction sortCountMap(map) {\n    return Object.fromEntries(Array.from(map.entries()).sort((a, b) => a[0].localeCompare(b[0])));\n}\n\n/* Project the hottest count entries first so crash bundles stay bounded and readable. */\nfunction topCountMap(map, limit = PERF_SUMMARY_TOP_LIMIT) {\n    return Object.fromEntries(\n        Array.from(map.entries())\n            .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n            .slice(0, limit),\n    );\n}\n\n/* Keep batcher detail high-signal by retaining only the busiest counters and groups. */\nfunction compactPerfBatcher(batch) {\n    const out = {\n        class_name: batch.class_name,\n        key: batch.key,\n        shared_count: batch.shared_count,\n        group_count: batch.group_count,\n    };\n    if (Number.isFinite(batch.node_count)) {\n        out.node_count = batch.node_count;\n    }\n    if (batch.group_node_count) {\n        out.group_node_count = topCountMap(new Map(Object.entries(batch.group_node_count)), PERF_SUMMARY_BATCHER_GROUP_LIMIT);\n    }\n    return out;\n}\n\n/* Preserve the existing scene-summary shape while trimming low-signal tail entries. */\nfunction compactPerfStructureSummary(summary) {\n    if (!summary) {\n        return null;\n    }\n    return {\n        scene_count: summary.scene_count,\n        scheduled_think_count: summary.scheduled_think_count,\n        node_count: summary.node_count,\n        by_class: topCountMap(new Map(Object.entries(summary.by_class))),\n        by_resource_key: topCountMap(new Map(Object.entries(summary.by_resource_key))),\n        batchers: Object.fromEntries(\n            Object.entries(summary.batchers)\n                .sort((a, b) => {\n                    const aNodes = a[1]?.node_count ?? 0;\n                    const bNodes = b[1]?.node_count ?? 0;\n                    return bNodes - aNodes || (b[1]?.group_count ?? 0) - (a[1]?.group_count ?? 0) || a[0].localeCompare(b[0]);\n                })\n                .slice(0, PERF_SUMMARY_TOP_LIMIT)\n                .map(([key, batch]) => [key, compactPerfBatcher(batch)]),\n        ),\n        scenes: summary.scenes.slice(0, PERF_SUMMARY_SCENE_LIMIT).map((scene) => ({\n            ...scene,\n            by_class: topCountMap(new Map(Object.entries(scene.by_class))),\n            by_resource_key: topCountMap(new Map(Object.entries(scene.by_resource_key))),\n            batchers: Object.fromEntries(\n                Object.entries(scene.batchers)\n                    .sort((a, b) => {\n                        const aNodes = a[1]?.node_count ?? 0;\n                        const bNodes = b[1]?.node_count ?? 0;\n                        return bNodes - aNodes || (b[1]?.group_count ?? 0) - (a[1]?.group_count ?? 0) || a[0].localeCompare(b[0]);\n                    })\n                    .slice(0, PERF_SUMMARY_TOP_LIMIT)\n                    .map(([key, batch]) => [key, compactPerfBatcher(batch)]),\n            ),\n            root_children: scene.root_children.slice(0, PERF_SUMMARY_ROOT_CHILD_LIMIT).map((child) => ({\n                ...child,\n                by_class: topCountMap(new Map(Object.entries(child.by_class))),\n                by_resource_key: topCountMap(new Map(Object.entries(child.by_resource_key))),\n            })),\n        })),\n        ptrless_io: summary.ptrless_io,\n    };\n}\n\nfunction summarizeNodeSubtree(node) {\n    const summary = {\n        node_count: 0,\n        by_class: new Map(),\n        by_resource_key: new Map(),\n    };\n    const visit = (cur) => {\n        summary.node_count += 1;\n        incCount(summary.by_class, cur?.constructor?.name ?? 'unknown');\n        if (typeof cur?._resourceKey === 'function') {\n            incCount(summary.by_resource_key, cur._resourceKey());\n        }\n        for (const ch of cur.children ?? []) {\n            visit(ch);\n        }\n    };\n    visit(node);\n    return {\n        label: `${node?.constructor?.name ?? 'unknown'}:${node?.state?.name ?? 'unnamed'}`,\n        node_count: summary.node_count,\n        by_class: sortCountMap(summary.by_class),\n        by_resource_key: sortCountMap(summary.by_resource_key),\n    };\n}\n\nfunction summarizeBatchers(scene, summary) {\n    const summarizePass = (passName, map) => {\n        for (const [key, res] of map ?? []) {\n            const batch = summary.batchers.get(key) || {\n                class_name: res?.classConstructor?.name ?? 'unknown',\n                key,\n                pass_name: passName,\n                shared_count: 0,\n                group_count: 0,\n            };\n            batch.shared_count += 1;\n            if (Array.isArray(res?.nodes)) {\n                batch.node_count = (batch.node_count || 0) + res.nodes.length;\n            }\n            if (res?.groupByFont instanceof Map) {\n                for (const [fontName, group] of res.groupByFont) {\n                    batch.group_count += 1;\n                    const label = `${key}.${fontName}`;\n                    batch.group_node_count = batch.group_node_count || {};\n                    batch.group_node_count[label] = (batch.group_node_count[label] || 0) + (group?.nodes?.length || 0);\n                }\n            }\n            summary.batchers.set(key, batch);\n        }\n    };\n    summarizePass('opaque', scene._opaqueBatchers);\n    summarizePass('text', scene._textBatchers);\n    summarizePass('transparent', scene._transparentBatchers);\n}\n\nfunction summarizeSceneGraph(scene, summary) {\n    if (!scene?.root) {\n        return;\n    }\n    summary.scene_count += 1;\n    summary.scheduled_think_count += scene._scheduledThinks?.size || 0;\n    summarizeBatchers(scene, summary);\n\n    const visit = (node) => {\n        summary.node_count += 1;\n        incCount(summary.by_class, node?.constructor?.name ?? 'unknown');\n        if (typeof node?._resourceKey === 'function') {\n            incCount(summary.by_resource_key, node._resourceKey());\n        }\n        for (const ch of node.children ?? []) {\n            visit(ch);\n        }\n    };\n    visit(scene.root);\n\n}\n\nfunction summarizeSceneStructure(scene, index = 0) {\n    const label = scene?._perfLabel || `scene_${index}`;\n    const summary = {\n        label,\n        scheduled_think_count: scene?._scheduledThinks?.size || 0,\n        node_count: 0,\n        by_class: new Map(),\n        by_resource_key: new Map(),\n        batchers: new Map(),\n        root_children: [],\n    };\n    summarizeBatchers(scene, summary);\n    if (scene?.root) {\n        const visit = (node) => {\n            summary.node_count += 1;\n            incCount(summary.by_class, node?.constructor?.name ?? 'unknown');\n            if (typeof node?._resourceKey === 'function') {\n                incCount(summary.by_resource_key, node._resourceKey());\n            }\n            for (const ch of node.children ?? []) {\n                visit(ch);\n            }\n        };\n        visit(scene.root);\n        summary.root_children = (scene.root.children ?? []).map((ch) => summarizeNodeSubtree(ch));\n    }\n    return {\n        label: summary.label,\n        scheduled_think_count: summary.scheduled_think_count,\n        node_count: summary.node_count,\n        by_class: sortCountMap(summary.by_class),\n        by_resource_key: sortCountMap(summary.by_resource_key),\n        batchers: Object.fromEntries(Array.from(summary.batchers.entries()).sort((a, b) => a[0].localeCompare(b[0]))),\n        root_children: summary.root_children,\n    };\n}\n\n/* Keep per-scene perf labels stable so diagnostics remain comparable run-to-run. */\nfunction assignScenePerfLabels(stage) {\n    const scenes = stage?.scenes ?? [];\n    for (let i = 0; i < scenes.length; i++) {\n        const scene = scenes[i];\n        if (scene === g_scene) {\n            scene._perfLabel = 'document_scene';\n        } else if (scene === g_hudScene) {\n            scene._perfLabel = 'hud_scene';\n        } else {\n            scene._perfLabel = `scene_${i}`;\n        }\n    }\n    return scenes;\n}\n\nfunction perfTraceTimingStats(events, name) {\n    const vals = [];\n    for (const ev of events) {\n        if (ev?.event !== name) {\n            continue;\n        }\n        const ms = Number(ev?.duration_ms);\n        if (Number.isFinite(ms)) {\n            vals.push(ms);\n        }\n    }\n    return makePerfStats(vals);\n}\n\nfunction makePerfStats(vals) {\n    if (!Array.isArray(vals) || vals.length === 0) {\n        return null;\n    }\n    let min = Infinity;\n    let max = -Infinity;\n    let sum = 0;\n    for (const v of vals) {\n        if (v < min) {\n            min = v;\n        }\n        if (v > max) {\n            max = v;\n        }\n        sum += v;\n    }\n    return {\n        samples: vals.length,\n        min_ms: Number(min.toFixed(3)),\n        avg_ms: Number((sum / vals.length).toFixed(3)),\n        max_ms: Number(max.toFixed(3)),\n    };\n}\n\nfunction lastTraceEvent(events, name) {\n    for (let i = events.length - 1; i >= 0; i--) {\n        if (events[i]?.event === name) {\n            return events[i];\n        }\n    }\n    return null;\n}\n\nfunction countTraceEvents(events, name) {\n    let n = 0;\n    for (const ev of events) {\n        if (ev?.event === name) {\n            n += 1;\n        }\n    }\n    return n;\n}\n\nfunction buildPerfPtrlessSummary() {\n    const portalWS = globalThis.testingPortalWSTrace?.() ?? [];\n    const puffbook = globalThis.testingPuffbookTrace?.() ?? [];\n    const doc = globalThis.testingCurrentPuffbookSummary?.()?.document ?? null;\n    if (portalWS.length === 0 && puffbook.length === 0 && !doc) {\n        return null;\n    }\n\n    const lastWS = portalWS.at(-1) ?? null;\n    const lastPuffbook = puffbook.at(-1) ?? null;\n    const lastDecode = lastTraceEvent(portalWS, 'ws_decode_done');\n    const lastDispatch = lastTraceEvent(portalWS, 'ws_stream_response_dispatch_done');\n    const lastHandleOutput = lastTraceEvent(puffbook, 'puffbook_handle_server_output_done');\n    const lastPreview = lastTraceEvent(puffbook, 'puffbook_output_preview_text');\n    const lastClassify = lastTraceEvent(puffbook, 'puffbook_classify_output_cell');\n    const lastOpen = lastTraceEvent(puffbook, 'puffbook_open_response');\n    const trackedRows = Array.isArray(doc?.output_rows) ? doc.output_rows.filter((row) => row?.tracked_row) : [];\n    const docSettled = doc\n        ? Number(doc.unsettled ?? 1) === 0 && trackedRows.every((row) => row?.resolved && row?.state !== 'partial')\n        : false;\n\n    return {\n        document: doc ? {\n            line_count: doc.line_count ?? 0,\n            output_line_count: trackedRows.length,\n            pending_edits: doc.pending_edits ?? 0,\n            unsettled: doc.unsettled ?? 0,\n            settled: docSettled,\n            subscription_open: !!doc.subscription_open,\n            output_rows: trackedRows\n                .map((row) => ({\n                    line: row.line,\n                    state: row.state,\n                    block_type: row.block_type,\n                    visible: row.visible,\n                    preview: row.preview,\n                })),\n        } : null,\n        portal_ws: {\n            events: portalWS.length,\n            last_event: lastWS ? {\n                seq: lastWS.seq ?? 0,\n                stream_seq: lastWS.stream_seq ?? '',\n                event: lastWS.event ?? '',\n                method: lastWS.method ?? '',\n                bytes: lastWS.bytes ?? null,\n                duration_ms: lastWS.duration_ms ?? null,\n                event_lag_ms: lastWS.event_lag_ms ?? null,\n            } : null,\n            message_count: countTraceEvents(portalWS, 'ws_message'),\n            response_count: countTraceEvents(portalWS, 'ws_stream_response'),\n            decode: {\n                stats: perfTraceTimingStats(portalWS, 'ws_decode_done'),\n                last_ms: lastDecode?.duration_ms ?? null,\n                last_bytes: lastDecode?.bytes ?? null,\n                last_body_type: lastDecode?.body_type ?? '',\n                last_body_logical_type: lastDecode?.body_logical_type ?? '',\n            },\n            dispatch: {\n                response_stats: perfTraceTimingStats(portalWS, 'ws_stream_response_dispatch_done'),\n                last_ms: lastDispatch?.duration_ms ?? null,\n                last_event: lastDispatch?.event ?? '',\n            },\n        },\n        puffbook: {\n            events: puffbook.length,\n            last_event: lastPuffbook ? {\n                seq: lastPuffbook.seq ?? 0,\n                event: lastPuffbook.event ?? '',\n                line: lastPuffbook.line ?? null,\n                duration_ms: lastPuffbook.duration_ms ?? null,\n                data_type: lastPuffbook.data_type ?? '',\n                block_type: lastPuffbook.block_type ?? '',\n                state: lastPuffbook.state ?? '',\n                result_kind: lastPuffbook.result_kind ?? '',\n            } : null,\n            open: {\n                stats: perfTraceTimingStats(puffbook, 'puffbook_open_response'),\n                last_ms: lastOpen?.duration_ms ?? null,\n                body_bytes: lastOpen?.body_bytes ?? null,\n                output_line_count: lastOpen?.output_line_count ?? null,\n            },\n            handle_server_output: {\n                stats: perfTraceTimingStats(puffbook, 'puffbook_handle_server_output_done'),\n                last_ms: lastHandleOutput?.duration_ms ?? null,\n                last_line: lastHandleOutput?.line ?? null,\n            },\n            preview_text: {\n                stats: perfTraceTimingStats(puffbook, 'puffbook_output_preview_text'),\n                last_ms: lastPreview?.duration_ms ?? null,\n                last_kind: lastPreview?.result_kind ?? '',\n                last_type: lastPreview?.data_type ?? '',\n            },\n            classify_output: {\n                stats: perfTraceTimingStats(puffbook, 'puffbook_classify_output_cell'),\n                last_ms: lastClassify?.duration_ms ?? null,\n                last_block_type: lastClassify?.block_type ?? '',\n                last_state: lastClassify?.state ?? '',\n            },\n        },\n    };\n}\n\nfunction buildPerfStructureSummary() {\n    if (!g_stage) {\n        return null;\n    }\n    const summary = {\n        scene_count: 0,\n        scheduled_think_count: 0,\n        node_count: 0,\n        by_class: new Map(),\n        by_resource_key: new Map(),\n        batchers: new Map(),\n    };\n    const stageScenes = assignScenePerfLabels(g_stage);\n    for (const scene of stageScenes) {\n        summarizeSceneGraph(scene, summary);\n    }\n    const scenes = stageScenes.map((scene, index) => summarizeSceneStructure(scene, index));\n    return compactPerfStructureSummary({\n        scene_count: summary.scene_count,\n        scheduled_think_count: summary.scheduled_think_count,\n        node_count: summary.node_count,\n        by_class: sortCountMap(summary.by_class),\n        by_resource_key: sortCountMap(summary.by_resource_key),\n        batchers: Object.fromEntries(Array.from(summary.batchers.entries()).sort((a, b) => a[0].localeCompare(b[0]))),\n        scenes,\n        ptrless_io: buildPerfPtrlessSummary(),\n    });\n}\n\nlet installPerformanceTracker = async function () {};\nif (__PORTAL_PERF_BUILD__) {\n    installPerformanceTracker = async function () {\n        const mod = await import('./lib/evilui/performance.mjs');\n        /* Keep the full tracker live in performance builds so hot-path draw instrumentation reaches jitter bundles. */\n        globalThis.__eviluiPerformanceTracker = new mod.PerformanceTracker({\n            label: 'portal',\n            sampleWindowMs: 10_000,\n            reportEveryMs: 10_000,\n            emitConsole: false,\n            maxTimerNames: 4096,\n            maxCounterNames: 4096,\n        });\n        globalThis.__eviluiPerformanceExtra = null;\n    };\n}\n\n/* Mount or remove the developer HUD so the default-off path avoids any live text-batcher churn. */\nfunction setDevHudEnabled(enabled) {\n    const next = !!enabled;\n    setDiagnosticsCollectionEnabled(next);\n    if (g_devHudEnabled === next) {\n        return;\n    }\n    g_devHudEnabled = next;\n    publishDevHudVisibility(next);\n    if (!g_hudInfoBarRoot || !g_fpsIndicatorFont) {\n        return;\n    }\n    if (next) {\n        attachDevHud();\n        return;\n    }\n    detachDevHud();\n}\n\n/* Toggle the developer HUD from the global key handler without routing the key into document input. */\nfunction toggleDevHud() {\n    setDevHudEnabled(!g_devHudEnabled);\n}\n\n/* Treat fullscreen as a whole-scene presentation flip rather than a document-scene viewport mode. */\nfunction fullscreenSceneActive() {\n    return g_stage?.activeScene === g_fullscreenScene;\n}\n\n/* Keep sidebar-mounted chrome hidden while a document viewport is expanded fullscreen. */\nfunction syncChromePresentationViewport() {\n    const fullscreenActive = fullscreenSceneActive();\n    if (g_directory) {\n        g_directory.visible = !fullscreenActive;\n    }\n}\n\n/* Keep fullscreen routing and developer HUD attachment in one sync seam. */\nfunction syncChromePresentation() {\n    syncChromePresentationViewport();\n    if (g_devHudEnabled) {\n        attachDevHud();\n    }\n}\n\n/* Remove only the HUD from the shared scene-chrome mount when the developer overlay is disabled. */\nfunction detachDevHud() {\n    if (!g_fpsIndicator) {\n        return;\n    }\n    g_fpsIndicator.dispose();\n    if (g_fpsIndicator.parentNode) {\n        g_fpsIndicator.parentNode.removeChild(g_fpsIndicator);\n    }\n    g_fpsIndicator = null;\n}\n\n/* Add the HUD under the shared scene-chrome mount once the font and mount exist. */\nfunction attachDevHud() {\n    if (!g_hudInfoBarRoot || !g_fpsIndicatorFont) {\n        return;\n    }\n    if (!g_fpsIndicator) {\n        g_fpsIndicator = new FpsIndicator({\n            api: g_api,\n            font: g_fpsIndicatorFont,\n            fontSize: 14,\n            getHoverText: hoverDebugText,\n        });\n    }\n    if (g_fpsIndicator.parentNode !== g_hudInfoBarRoot) {\n        if (g_fpsIndicator.parentNode) {\n            g_fpsIndicator.remount(g_hudInfoBarRoot);\n        } else {\n            g_hudInfoBarRoot.appendChild(g_fpsIndicator);\n        }\n    }\n}\n\n/* Route input front-to-back: the complete HUD, then the active world. */\nfunction interactiveScenes() {\n    const out = [];\n    if (g_hudScene) {\n        out.push(g_hudScene);\n    }\n    if (g_stage?.activeScene && !out.includes(g_stage.activeScene)) {\n        out.push(g_stage.activeScene);\n    }\n    return out;\n}\n\n/* Honour active drag capture before ordinary hit-testing so held gestures do not hop ownership mid-drag. */\nfunction capturedInputScene() {\n    for (const scene of interactiveScenes()) {\n        if (scene?.dragCapture) {\n            return scene;\n        }\n    }\n    return null;\n}\n\n/* Route input and picking through one scene at a time when capture is active. */\nfunction interactiveSceneOrder() {\n    const captured = capturedInputScene();\n    if (captured) {\n        return [captured];\n    }\n    return interactiveScenes();\n}\n\n/* Keep keyboard routing stable even when hover is empty by falling back to the document scene. */\nfunction currentFocusScene() {\n    return resolveFocusScene({\n        activeScene: g_stage?.activeScene ?? g_scene ?? null,\n        interactiveScenes: interactiveScenes(),\n        focusContainer: ui.currentFocusContainer?.() ?? null,\n        focusedInputCell: ui.currentFocusedInputCell?.() ?? null,\n    });\n}\n\n/* Resolve the hovered scene from the single interactive document scene. */\nfunction currentHoverScene() {\n    for (const scene of interactiveScenes()) {\n        if (scene?.selectedIteractable) {\n            return scene;\n        }\n    }\n    return currentFocusScene();\n}\n\n/* Mirror the existing direct-pick gate but against an explicit scene so stage arbitration can compare chrome and document. */\nfunction sceneWantsDirectPick(scene) {\n    if (!scene) {\n        return false;\n    }\n    return wantsDirectPick(controls, {\n        fullscreenViewportActive: scene === g_fullscreenScene,\n    });\n}\n\n/* Run one direct input pick across the chrome/document scene chain and return the scene that owns the hit, if any. */\nfunction runDirectPick(gl, frameStamp) {\n    g_stage?.activeDialog?.syncPlacement();\n    let pickedScene = null;\n    let picked = false;\n    for (const scene of interactiveSceneOrder()) {\n        if (!scene) {\n            continue;\n        }\n        scene.glPick(gl, frameStamp, { force: true });\n        scene.inputPickedInteractable = scene.selectedIteractable ?? 0;\n        picked = true;\n        pickedScene = scene;\n        if (scene.selectedIteractable) {\n            return {\n                scene,\n                didPick: true,\n                reason: 'forced_input_pick',\n            };\n        }\n    }\n    return {\n        scene: pickedScene ?? currentFocusScene(),\n        didPick: picked,\n        reason: picked ? 'forced_input_pick' : '',\n    };\n}\n\n/* Run passive hover picking chrome-first while preserving the prior scene when nothing currently needs a repick. */\nfunction runPassivePick(gl, frameStamp) {\n    let pickedScene = null;\n    let picked = false;\n    let reason = '';\n    for (const scene of interactiveSceneOrder()) {\n        if (!scene) {\n            continue;\n        }\n        const sceneReason = scene.getPickReason() ?? '';\n        if (wantsPassivePick({\n            gl,\n            sceneFullyRendered: scene.sceneFullyRendered,\n            needsPassiveHoverPick: scene.needsPassiveHoverPick(),\n            fullscreenViewportActive: scene === g_fullscreenScene,\n            pickReason: sceneReason,\n        })) {\n            scene.glPick(gl, frameStamp);\n            picked = true;\n            pickedScene = scene;\n            reason = sceneReason;\n            if (scene.selectedIteractable) {\n                break;\n            }\n        }\n    }\n    return {\n        scene: pickedScene ?? currentFocusScene(),\n        didPick: picked,\n        reason,\n    };\n}\n\n/* Propagate one frame of input to a specific scene, only falling through to camera motion when that scene actually owns the camera node. */\nfunction propagateSceneInput(scene, eventSet, routeTrace = null) {\n    if (!scene) {\n        return false;\n    }\n    const sceneTrace = routeTrace ? {\n        scene: describeScene(scene),\n        picked: null,\n        picked_id: scene.selectedIteractable ?? null,\n        steps: [],\n        handled: false,\n    } : null;\n    if (sceneTrace) {\n        routeTrace.scene_routes.push(sceneTrace);\n    }\n    let consumed = scene.propagatePointerInput(eventSet, sceneTrace);\n    if (!consumed) {\n        const handled = scene.stage?.onPointerInput?.(scene, eventSet) === true;\n        if (sceneTrace) {\n            sceneTrace.steps.push({\n                target: 'Stage',\n                via: 'stage',\n                outcome: handled ? 'consumed' : 'propagated',\n            });\n        }\n        consumed = handled;\n    }\n    if (sceneTrace) {\n        sceneTrace.handled = consumed;\n    }\n    return consumed;\n}\n\n/* Treat non-transferring pointer clicks as caret activity for the current focus owner. */\nfunction noteRetainedClickFocus(eventSet) {\n    if (!eventSet?.has) {\n        return false;\n    }\n    const hasClick = eventSet.has('L_MOUSE_DOWN')\n        || eventSet.has('L_MOUSE_UP')\n        || eventSet.has('R_MOUSE_DOWN')\n        || eventSet.has('R_MOUSE_UP')\n        || eventSet.has('DOUBLE_CLICK');\n    if (!hasClick) {\n        return false;\n    }\n    return ui.currentFocusContainer()?.noteRetainedPointerActivity?.() === true;\n}\n\nfunction hasUserInput() {\n    if (g_disablePickingForExperiment) {\n        return false;\n    }\n    if (!controls) {\n        return false;\n    }\n    return controls.has('L_MOUSE_DOWN')\n        || controls.has('L_MOUSE_UP')\n        || controls.has('L_MOUSE_DOWN_HOLD')\n        || controls.has('R_MOUSE_DOWN')\n        || controls.has('R_MOUSE_UP')\n        || controls.has('R_MOUSE_DOWN_HOLD')\n        || controls.has('SCROLL_LEFT')\n        || controls.has('SCROLL_RIGHT')\n        || controls.has('SCROLL_DOWN')\n        || controls.has('SCROLL_UP')\n        || controls.has('SCROLL_LEFT_PIXEL')\n        || controls.has('SCROLL_RIGHT_PIXEL')\n        || controls.has('SCROLL_DOWN_PIXEL')\n        || controls.has('SCROLL_UP_PIXEL');\n}\n\n/* Return a stable sorted copy of the current control events for per-frame diagnostics. */\nfunction activeControlEvents() {\n    if (!controls?.activeEvents) {\n        return [];\n    }\n    return Array.from(controls.activeEvents).sort();\n}\n\n/* Snapshot the presenter hot/cold state so frame diagnostics can report cooldown timing directly. */\nfunction presenterStateSnapshot(nowMS = performance.now()) {\n    return {\n        hot: g_presenterHot === true,\n        hot_until_ms: Number.isFinite(g_presenterHotUntilJSMs) ? g_presenterHotUntilJSMs : null,\n        quiescent_for_ms: g_presenterQuiescentSinceJSMs === null ? 0 : Math.max(0, nowMS - g_presenterQuiescentSinceJSMs),\n        last_promote_reason: g_presenterLastPromoteReason || '',\n    };\n}\n\n/* Promote the presenter into the hot loop immediately and extend its cooldown deadline. */\nfunction promotePresenter(reason = 'unspecified', nowMS = performance.now()) {\n    g_presenterHot = true;\n    g_presenterHotUntilJSMs = Math.max(g_presenterHotUntilJSMs, nowMS + HOT_LOOP_HYSTERESIS_MS);\n    g_presenterQuiescentSinceJSMs = null;\n    g_presenterLastPromoteReason = reason;\n    g_stage?.setColdScheduledThinkWakesEnabled(false);\n}\n\n/* Drop back to demand-driven presentation only after the hot-loop hysteresis window has expired. */\nfunction coolPresenter(nowMS = performance.now()) {\n    g_presenterHot = false;\n    g_presenterHotUntilJSMs = nowMS;\n    g_stage?.setColdScheduledThinkWakesEnabled(true);\n}\n\n/* Hidden documents must not keep the WebGL presenter alive in the background. */\nfunction presenterVisibilityAllowsFrames() {\n    if (typeof document === 'undefined') {\n        return true;\n    }\n    return document.visibilityState !== 'hidden';\n}\n\n/* Drop any queued presenter state while the document is hidden so resume starts from one fresh wake. */\nfunction suspendPresenter(reason = 'hidden', nowMS = performance.now()) {\n    g_frameWakeRequested = false;\n    g_nextPresentFrameAtMS = -Infinity;\n    g_presenterQuiescentSinceJSMs = nowMS;\n    coolPresenter(nowMS);\n    // A hidden document has no presentation path.  Leaving cold think timers\n    // armed makes a focused caret repeatedly wake the browser at its blink\n    // cadence even though requestMainLoop will discard every wake.\n    g_stage?.setColdScheduledThinkWakesEnabled(false);\n    g_lastFrameWakeReason = reason;\n}\n\n/* Decide whether the presenter must queue another frame from frame-tail demand plus hysteresis state. */\nfunction presenterShouldContinue({ demandHot = false, wakeRequested = false, nowMS = performance.now() } = {}) {\n    if (!presenterVisibilityAllowsFrames()) {\n        suspendPresenter('document_hidden', nowMS);\n        return false;\n    }\n    if (demandHot) {\n        promotePresenter('frame_demand', nowMS);\n    } else if (g_presenterQuiescentSinceJSMs === null) {\n        g_presenterQuiescentSinceJSMs = nowMS;\n    }\n    const keepHot = g_presenterHot && nowMS < g_presenterHotUntilJSMs;\n    if (wakeRequested || demandHot || keepHot) {\n        return true;\n    }\n    coolPresenter(nowMS);\n    return false;\n}\n\n/* Wake the binary frame scheduler from input, async transport, or dirty-resource paths. */\nfunction requestMainLoop(reason = 'unspecified') {\n    const pending = reason === 'scene_scheduled_think'\n        ? (g_stage?.debugScheduledThinkSummary?.() ?? null)\n        : null;\n    let wakeReason = reason;\n    if (reason === 'scene_scheduled_think') {\n        if ((pending?.total_pending ?? 0) === 0) {\n            wakeReason = 'scene_scheduled_think_orphan';\n            g_portalJitterProbe?.noteScheduledThink?.({\n                kind: 'orphan_request',\n                scene_label: 'stage',\n                owner_label: 'none',\n                reason: 'orphan_request',\n                pending_count: 0,\n            });\n        }\n    }\n    g_portalJitterProbe?.noteWake?.(wakeReason, performance.now(), {\n        stage_scheduled_think_total_pending: pending?.total_pending ?? null,\n        stage_scheduled_think_owners: pending?.scoped_owners ?? pending?.owners ?? [],\n    });\n    g_lastFrameWakeReason = wakeReason;\n    g_frameWakeRequested = true;\n    if (!presenterVisibilityAllowsFrames()) {\n        return false;\n    }\n    if (g_frameQueued || g_frameRunning) {\n        return false;\n    }\n    scheduleMainLoop();\n    return true;\n}\n\n/* Summarise whether the current portal state still requires another frame. */\nfunction frameDemandSnapshot() {\n    const reasons = [];\n    const stageDemand = g_stage?.quiescenceSnapshot?.() ?? {\n        hot: false,\n        reasons: [],\n        scheduled_think_owners: [],\n        pending_scheduled_think_owners: [],\n    };\n    reasons.push(...stageDemand.reasons);\n    if (hasUserInput() || Mouse.leftDown || Mouse.rightDown) {\n        reasons.push('active_input');\n    }\n    return {\n        hot: reasons.length > 0,\n        reasons,\n        scheduled_think_owners: stageDemand.scheduled_think_owners ?? [],\n        pending_scheduled_think_owners: stageDemand.pending_scheduled_think_owners ?? [],\n        presenter: presenterStateSnapshot(),\n    };\n}\n\n/* Compare 4x4 matrices exactly so redraw diagnostics can mirror picker camera-move semantics. */\nfunction sameMat16(a, b) {\n    if (!a || !b) {\n        return false;\n    }\n    for (let i = 0; i < 16; i++) {\n        if (a[i] !== b[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Build a compact per-frame activity snapshot explaining why the hot loop stayed active. */\nfunction buildFrameActivitySnapshot(scene, {\n    gl,\n    directPickReason = '',\n    passivePickReason = '',\n    didDirectPick = false,\n    didPassivePick = false,\n} = {}) {\n    const cam = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const camMatrix = cam?.localToWorld?.() ?? null;\n    const cameraMatrixChanged = !!camMatrix && !sameMat16(g_prevCameraMatrix, camMatrix);\n    const camera = typeof cam?.debugMotionState === 'function'\n        ? cam.debugMotionState()\n        : null;\n    const fullscreenViewportActive = scene === g_fullscreenScene;\n    const snap = {\n        frame_stamp: g_frameStamp,\n        raf_mode: g_testingFrameIntervalMS > 0 ? 'binary_raf_timeout' : 'binary_raf',\n        renderless: !gl,\n        scene_fully_rendered: !!scene?.sceneFullyRendered,\n        user_input: hasUserInput(),\n        direct_pick_input: sceneWantsDirectPick(scene),\n        mouse_inside: !!Mouse.inside,\n        mouse_moved: Mouse.mouseMoved(),\n        active_event_count: controls?.activeEvents?.size ?? 0,\n        active_events: activeControlEvents(),\n        click_events: clickTraceEvents(),\n        did_direct_pick: didDirectPick,\n        direct_pick_reason: directPickReason || '',\n        did_passive_pick: didPassivePick,\n        passive_pick_reason: passivePickReason || '',\n        wake_reason: g_lastFrameWakeReason || '',\n        camera_matrix_changed: cameraMatrixChanged,\n        presenter: presenterStateSnapshot(),\n        camera,\n    };\n    g_prevCameraMatrix = camMatrix ? new Float32Array(camMatrix) : null;\n    return snap;\n}\n\nfunction clickTraceEvents() {\n    if (!controls) {\n        return [];\n    }\n    const hits = [];\n    for (const event of controls.activeEvents ?? []) {\n        if (event === 'L_MOUSE_DOWN'\n            || event === 'L_MOUSE_UP'\n            || event === 'L_MOUSE_DOWN_HOLD'\n            || event === 'R_MOUSE_DOWN'\n            || event === 'R_MOUSE_UP'\n            || event === 'R_MOUSE_DOWN_HOLD'\n            || event === 'DOUBLE_CLICK') {\n            hits.push(event);\n        }\n    }\n    return hits;\n}\n\nfunction describeInteractable(id) {\n    if (!id) {\n        return null;\n    }\n    const node = ui.Interactable._allInteractables?.get?.(id) ?? null;\n    if (!node) {\n        return { id, missing: true };\n    }\n    const explicit = typeof node.recordingIdentity === 'function'\n        ? node.recordingIdentity()\n        : null;\n    let line = Number.isInteger(explicit?.line) ? explicit.line : null;\n    const ancestry = [];\n    const scopes = [];\n    let current = node;\n    for (let depth = 0; current && depth < 12; depth++, current = current.parentNode ?? null) {\n        const candidateLine = Number.isInteger(current.displayLineNumber)\n            ? current.displayLineNumber\n            : (Number.isInteger(current.cellID)\n                ? (current.ownerDocumentView?.recordingLineNumber?.(current.cellID) ?? current.cellID)\n                : (typeof current.recordingLineOnPuffbook === 'function'\n                    ? current.recordingLineOnPuffbook()\n                    : (Number.isInteger(current.testingPuffbookLine)\n                ? current.testingPuffbookLine\n                : (typeof current.getLineOnPuffbook === 'function' ? current.getLineOnPuffbook() : null))));\n        if (line === null && Number.isInteger(candidateLine) && candidateLine >= 0) line = candidateLine;\n        ancestry.push({\n            class_name: current.constructor?.name ?? null,\n            name: current.state?.name ?? null,\n        });\n        if (typeof current.recordingViewState === 'function') {\n            try {\n                const scope = current.recordingViewState();\n                if (scope?.kind && !scopes.some((entry) => entry.kind === scope.kind && entry.line === scope.line)) {\n                    scopes.push(scope);\n                }\n            } catch (error) {\n                scopes.push({ kind: 'capture_error', error: error instanceof Error ? error.message : String(error) });\n            }\n        }\n    }\n    return {\n        id,\n        stable_key: typeof explicit?.stable_key === 'string' ? explicit.stable_key : null,\n        local_line: Number.isInteger(explicit?.local_line) ? explicit.local_line : null,\n        class_name: node.constructor?.name ?? null,\n        name: node.state?.name ?? null,\n        text: node.state?.text ?? null,\n        icon_id: node.state?.iconID ?? null,\n        line,\n        ancestry,\n        scopes,\n        enabled: node.enabled !== false,\n        visible: node.computedVisible !== false,\n        parent: node.parentNode?.constructor?.name ?? null,\n        screen_bounds: recordingNodeScreenBounds(node),\n    };\n}\n\nfunction recordingNodeScreenBounds(node) {\n    if (!node || !g_stage?.projectNodePointToHud || !Number.isFinite(node.width) || !Number.isFinite(node.height)) {\n        return null;\n    }\n    const first = g_stage.projectNodePointToHud(node, [0, 0, 0]);\n    const second = g_stage.projectNodePointToHud(node, [node.width, node.height, 0]);\n    if (!first || !second || [...first.slice(0, 2), ...second.slice(0, 2)].some((value) => !Number.isFinite(value))) {\n        return null;\n    }\n    return {\n        left: Math.min(first[0], second[0]),\n        top: Math.min(first[1], second[1]),\n        width: Math.abs(second[0] - first[0]),\n        height: Math.abs(second[1] - first[1]),\n    };\n}\n\nfunction resolveRecordingTargetPoint(expected, fallbackPoint = null) {\n    if (!expected || typeof expected !== 'object') return null;\n    let match = null;\n    let bestAnonymousScore = Number.POSITIVE_INFINITY;\n    const expectedShape = (expected.ancestry ?? []).map((entry) => entry?.class_name ?? null).join('>');\n    const expectedBounds = expected.screen_bounds;\n    for (const node of ui.Interactable._allInteractables?.values?.() ?? []) {\n        const identity = node?.recordingIdentity?.() ?? null;\n        if (expected.stable_key && identity?.stable_key === expected.stable_key) {\n            match = node;\n            break;\n        }\n        if (expected.stable_key || node?.constructor?.name !== expected.class_name || !expectedBounds) continue;\n        const described = describeInteractable(node.id);\n        if (!described || described.line !== expected.line) continue;\n        const candidateShape = (described.ancestry ?? []).map((entry) => entry?.class_name ?? null).join('>');\n        if (candidateShape !== expectedShape) continue;\n        const bounds = described.screen_bounds;\n        if (!bounds) continue;\n        const score = Math.abs(bounds.left - expectedBounds.left)\n            + Math.abs(bounds.top - expectedBounds.top)\n            + Math.abs(bounds.width - expectedBounds.width)\n            + Math.abs(bounds.height - expectedBounds.height);\n        if (score <= 8 && score < bestAnonymousScore) {\n            bestAnonymousScore = score;\n            match = node;\n        }\n    }\n    if (!match) return null;\n    const currentBounds = recordingNodeScreenBounds(match);\n    if (!currentBounds || currentBounds.width <= 0 || currentBounds.height <= 0) return null;\n    const recordedBounds = expected.screen_bounds;\n    let x = currentBounds.left + currentBounds.width * 0.5;\n    let y = currentBounds.top + currentBounds.height * 0.5;\n    if (recordedBounds && recordedBounds.width > 0 && recordedBounds.height > 0\n        && Number.isFinite(fallbackPoint?.x) && Number.isFinite(fallbackPoint?.y)) {\n        const relativeX = (fallbackPoint.x - recordedBounds.left) / recordedBounds.width;\n        const relativeY = (fallbackPoint.y - recordedBounds.top) / recordedBounds.height;\n        x = currentBounds.left + Math.max(0.05, Math.min(0.95, relativeX)) * currentBounds.width;\n        y = currentBounds.top + Math.max(0.05, Math.min(0.95, relativeY)) * currentBounds.height;\n    } else if (expected.class_name === 'InputCell' && Number.isFinite(fallbackPoint?.x)) {\n        /* Older recordings have no target bounds. Preserve the horizontal\n           caret location and repair only the row displacement. */\n        x = fallbackPoint.x;\n    }\n    return {\n        x,\n        y,\n        target: describeInteractable(match.id),\n    };\n}\n\nfunction recordingSceneRole(scene) {\n    if (scene === g_hudScene) return 'hud';\n    if (scene === g_fullscreenScene) return 'fullscreen';\n    if (scene === g_scene) return 'document';\n    return 'unknown';\n}\n\nfunction sceneForRecordingRole(role) {\n    if (role === 'hud') return g_hudScene;\n    if (role === 'fullscreen') return g_fullscreenScene;\n    if (role === 'document') return g_scene;\n    return null;\n}\n\nfunction recordingPortalViewState(scene = currentFocusScene(), target = null) {\n    const camera = scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    const described = target ?? describeInteractable(scene?.selectedIteractable ?? 0);\n    const scopes = [...(described?.scopes ?? [])];\n    const activeViewport = scene?.activeViewport ?? null;\n    if (typeof activeViewport?.recordingViewState === 'function') {\n        const viewportState = activeViewport.recordingViewState();\n        if (viewportState?.kind && !scopes.some((entry) => entry.kind === viewportState.kind && entry.line === viewportState.line)) {\n            scopes.push(viewportState);\n        }\n    }\n    return {\n        format: 'evil-portal-view-state-v1',\n        version: 1,\n        active_scene: recordingSceneRole(scene),\n        camera: typeof camera?.recordingViewState === 'function' ? camera.recordingViewState() : null,\n        document: g_directory?.recordingViewState?.() ?? null,\n        scopes,\n        frame_stamp: g_frameStamp,\n    };\n}\n\nfunction restorePortalViewState(state) {\n    if (!state || state.version !== 1) throw new Error('Portal replay requires version-1 view state.');\n    for (const scope of state.scopes ?? []) {\n        if (scope?.kind !== 'viewport' || !Number.isInteger(scope.line)) continue;\n        const table = g_directory?.recordingTableView?.(scope.line) ?? null;\n        const viewport = table?.ownPreviewViewport ?? null;\n        if (!viewport?.restoreRecordingViewState) {\n            /* Early recordings could incorrectly attach a collapsed table\n               scope to the document root viewport. A collapsed scope needs\n               no mutation, so it is safe to ignore until the table mounts. */\n            if (scope.expanded === false) continue;\n            throw new Error(`Portal replay cannot find the recorded viewport on line ${scope.line}.`);\n        }\n        viewport.restoreRecordingViewState(scope);\n    }\n    const scene = sceneForRecordingRole(state.active_scene);\n    if (!scene || (state.active_scene !== 'hud' && g_stage?.activeScene !== scene)) {\n        throw new Error(`Portal replay scene mismatch: recorded=${state.active_scene}, active=${recordingSceneRole(g_stage?.activeScene)}.`);\n    }\n    const camera = scene.presentationCamera?.() ?? scene.camera ?? null;\n    if (state.camera) {\n        if (typeof camera?.restoreRecordingViewState !== 'function') {\n            throw new Error(`Portal replay scene '${state.active_scene}' has no restorable camera.`);\n        }\n        camera.restoreRecordingViewState(state.camera);\n    }\n    if (state.document) g_directory?.restoreRecordingViewState?.(state.document);\n    for (const scope of state.scopes ?? []) {\n        if (scope?.kind !== 'table_view' || !Number.isInteger(scope.line)) continue;\n        const table = g_directory?.recordingTableView?.(scope.line) ?? null;\n        if (!table?.restoreRecordingViewState) {\n            throw new Error(`Portal replay cannot find the recorded table view on line ${scope.line}.`);\n        }\n        table.restoreRecordingViewState(scope);\n    }\n    requestMainLoop('recording_restore_view');\n    return recordingPortalViewState(scene, null);\n}\n\nfunction completeRecordingPointerContexts(scene) {\n    if (!g_inputRecorder || g_pendingRecordingPointerContexts.length === 0) return;\n    const pending = g_pendingRecordingPointerContexts.splice(0);\n    const target = describeInteractable(scene?.selectedIteractable ?? 0);\n    const viewState = recordingPortalViewState(scene, target);\n    for (const item of pending) {\n        if (target?.stable_key === 'portal.recording-control') {\n            g_inputRecorder.discard(item.seq);\n            continue;\n        }\n        g_inputRecorder.annotate(item.seq, {\n            pointer_context: {\n                version: 1,\n                captured_frame: g_frameStamp,\n                active_scene: viewState.active_scene,\n                camera: viewState.camera,\n                document: viewState.document,\n                scopes: viewState.scopes,\n                expected_target: target,\n            },\n        });\n    }\n}\n\nfunction waitForPortalReplayFrame() {\n    requestMainLoop('recording_replay_wait');\n    return new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n}\n\nfunction pickCurrentRecordingTarget() {\n    let scene = currentHoverScene();\n    if (g_liveGL && Mouse.inside) {\n        const pick = runDirectPick(g_liveGL, g_frameStamp);\n        scene = pick.scene ?? currentFocusScene();\n        const hoverId = scene?.selectedIteractable ?? 0;\n        ui.Button.setHoveringID(hoverId);\n        ui.GeometryPlot.setHoveringID(hoverId);\n    }\n    return {\n        active_scene: recordingSceneRole(scene),\n        target: describeInteractable(scene?.selectedIteractable ?? 0),\n        blocker: ui.Interactable._allInteractables.get(scene?.selectedIteractable ?? 0)\n            ?.recordingReplayBlocker?.() ?? null,\n    };\n}\n\nfunction installPortalReplayBridge() {\n    if (globalThis.__portalReplayV1) return;\n    Object.defineProperty(globalThis, '__portalReplayV1', {\n        configurable: false,\n        enumerable: false,\n        value: Object.freeze({\n            snapshotViewState: () => recordingPortalViewState(),\n            restoreViewState: async (state) => {\n                const restored = restorePortalViewState(state);\n                await waitForPortalReplayFrame();\n                return restored;\n            },\n            waitForStableFrame: waitForPortalReplayFrame,\n            puffbookReadiness: () => {\n                const document = g_directory?.recordingPuffbookReplayReadiness?.() ?? null;\n                return {\n                    worker_connected: g_puffworkerConnected,\n                    compute_available: g_activePuffbookComputeAvailable,\n                    document,\n                    ready: g_puffworkerConnected === true\n                        && g_activePuffbookComputeAvailable === true\n                        && document?.subscription_open === true\n                        && Number(document?.unsettled ?? 1) === 0\n                        && Number(document?.pending_edits ?? 1) === 0,\n                };\n            },\n            currentPuffbookCheckpoint: () => g_directory?.recordingPuffbookReplayCheckpoint?.() ?? null,\n            currentPuffbookState: async () => await g_directory?.recordingPuffbookState?.() ?? null,\n            /* Replay verification must not depend on a passive hover pick\n               having happened after restoring the camera at the same cursor\n               coordinate. Force the same picker pass used before live input. */\n            pickCurrentTarget: pickCurrentRecordingTarget,\n            resolveTargetPoint: resolveRecordingTargetPoint,\n            pickedTarget: () => {\n                const scene = currentHoverScene();\n                return {\n                    active_scene: recordingSceneRole(scene),\n                    target: describeInteractable(scene?.selectedIteractable ?? 0),\n                    blocker: ui.Interactable._allInteractables.get(scene?.selectedIteractable ?? 0)\n                        ?.recordingReplayBlocker?.() ?? null,\n                };\n            },\n        }),\n    });\n}\n\n/* Surface the current picker result in the F10 HUD so hover/input disagreements can be diagnosed in place. */\nfunction hoverDebugText() {\n    const scene = currentHoverScene();\n    const target = describeInteractable(scene?.selectedIteractable ?? 0);\n    if (!target) {\n        return 'hover: none';\n    }\n    if (target.missing) {\n        return `hover: missing #${target.id}`;\n    }\n    const label = target.name ?? target.text ?? (target.icon_id != null ? `icon ${target.icon_id}` : 'unnamed');\n    return `hover: ${target.class_name} ${JSON.stringify(label)} #${target.id}`;\n}\n\n/* Keep pointer-route logs stable by labelling scenes the same way across pick and dispatch phases. */\nfunction describeScene(scene) {\n    return scene?.activeViewport?.state?.name\n        ?? scene?.rootViewport?.state?.name\n        ?? scene?.root?.state?.name\n        ?? scene?.constructor?.name\n        ?? 'scene';\n}\n\n// https://webglfundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\nfunction onResize(entries) {\n    let sawResize = false;\n    for (const entry of entries) {\n        let width;\n        let height;\n        let method;\n        let dpr = window.devicePixelRatio;\n        if (entry.devicePixelContentBoxSize) {\n            // NOTE: Only this path gives the correct answer\n            // The other 2 paths are an imperfect fallback\n            // for browsers that don't provide anyway to do this\n            width = entry.devicePixelContentBoxSize[0].inlineSize;\n            height = entry.devicePixelContentBoxSize[0].blockSize;\n            dpr = 1; // it's already in width and height\n            method = 4;\n        } else if (entry.contentBoxSize) {\n            if (entry.contentBoxSize[0]) {\n                width = entry.contentBoxSize[0].inlineSize;\n                height = entry.contentBoxSize[0].blockSize;\n                method = 3;\n            } else {\n                // legacy\n                width = entry.contentBoxSize.inlineSize;\n                height = entry.contentBoxSize.blockSize;\n                method = 2;\n            }\n        } else {\n            // legacy\n            width = entry.contentRect.width;\n            height = entry.contentRect.height;\n            method = 1;\n        }\n\n        if (width === undefined || height == undefined) {\n            width = entry.target.clientWidth;\n            height = entry.target.clientHeight;\n            method = 0;\n        }\n\n        const displayWidth = Math.round(width * dpr);\n        const displayHeight = Math.round(height * dpr);\n        g_canvasToDisplaySizeMap.set(entry.target, [displayWidth, displayHeight, method]);\n        sawResize = true;\n    }\n    if (sawResize) {\n        scheduleCanvasResizeApply();\n    }\n}\n\n/* Cancel any older idle wake so only the latest viewport size is applied once drag motion stops. */\nfunction clearScheduledCanvasResizeApply() {\n    if (g_resizeApplyTimeout !== null) {\n        clearTimeout(g_resizeApplyTimeout);\n        g_resizeApplyTimeout = null;\n    }\n}\n\n/* Let the browser scale the current bitmap during drag, then wake one frame after a full idle grace period. */\nfunction scheduleCanvasResizeApply() {\n    g_resizeApplyDeadlineMS = performance.now() + CANVAS_RESIZE_IDLE_APPLY_DELAY_MS;\n    clearScheduledCanvasResizeApply();\n    g_resizeApplyTimeout = setTimeout(() => {\n        g_resizeApplyTimeout = null;\n        requestMainLoop('canvas_resize_idle');\n    }, CANVAS_RESIZE_IDLE_APPLY_DELAY_MS);\n}\n\n/* Keep startup eager, but otherwise hold WebGL resize/reprojection until the idle deadline expires. */\nfunction shouldDeferCanvasResize(canvas, displayWidth, displayHeight) {\n    if (!canvas) {\n        return false;\n    }\n    if (canvas.width === 0 || canvas.height === 0) {\n        return false;\n    }\n    if (canvas.width === displayWidth && canvas.height === displayHeight) {\n        return false;\n    }\n    return performance.now() < g_resizeApplyDeadlineMS;\n}\n\nfunction readCanvasDisplaySize(canvas) {\n    const rect = canvas.getBoundingClientRect();\n    const cssWidth = Math.max(1, Math.round(canvas.clientWidth || rect.width || 1));\n    const cssHeight = Math.max(1, Math.round(canvas.clientHeight || rect.height || 1));\n    const dpr = window.devicePixelRatio || 1;\n    return {\n        displayWidth: Math.max(1, Math.round(cssWidth * dpr)),\n        displayHeight: Math.max(1, Math.round(cssHeight * dpr)),\n        viewportWidth: cssWidth,\n        viewportHeight: cssHeight,\n    };\n}\n\nfunction seedCanvasDisplaySize(canvas) {\n    const dims = readCanvasDisplaySize(canvas);\n    g_canvasToDisplaySizeMap.set(canvas, [dims.displayWidth, dims.displayHeight, -1]);\n    return dims;\n}\n\nfunction applyRenderlessViewport(canvas) {\n    const dims = seedCanvasDisplaySize(canvas);\n    const stage = g_stage;\n    const framebufferChanged = canvas.width !== dims.displayWidth || canvas.height !== dims.displayHeight;\n    const viewportChanged = !!stage && (\n        stage.framebufferDimensions?.width !== dims.displayWidth\n        || stage.framebufferDimensions?.height !== dims.displayHeight\n        || stage.viewportDimensions?.width !== dims.viewportWidth\n        || stage.viewportDimensions?.height !== dims.viewportHeight\n    );\n    if (!framebufferChanged && !viewportChanged) {\n        return dims;\n    }\n    canvas.width = dims.displayWidth;\n    canvas.height = dims.displayHeight;\n    if (stage) {\n        stage.applyRenderlessViewport({\n            framebufferWidth: dims.displayWidth,\n            framebufferHeight: dims.displayHeight,\n            viewportWidth: dims.viewportWidth,\n            viewportHeight: dims.viewportHeight,\n        });\n    }\n    return dims;\n}\n\nfunction installCanvasResizeObserver(canvas) {\n    if (g_resizeObserver) {\n        g_resizeObserver.disconnect();\n        g_resizeObserver = null;\n    }\n    let resizeObserver = new ResizeObserver(onResize);\n    resizeObserver.observe(canvas, { box: 'content-box' });\n    g_resizeObserver = resizeObserver;\n}\n\n\nfunction resizeCanvasToDisplaySize(gl) {\n    let perfToken = null;\n    if (__PORTAL_PERF_BUILD__) {\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('resize_canvas_check');\n    }\n    // Get the size the browser is displaying the canvas in device pixels.\n    const elem = g_canvasToDisplaySizeMap.get(gl.canvas);\n    if (elem === undefined) {\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_check', perfToken);\n        }\n        return;\n    }\n\n    const [displayWidth, displayHeight, method] = elem;\n\n    if (gl.canvas.width !== displayWidth || gl.canvas.height !== displayHeight) {\n        if (shouldDeferCanvasResize(gl.canvas, displayWidth, displayHeight)) {\n            if (__PORTAL_PERF_BUILD__) {\n                globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_check', perfToken);\n            }\n            return false;\n        }\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_check', perfToken);\n            globalThis.__eviluiPerformanceTracker?.incrementCounter('resize_canvas_apply_count');\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('resize_canvas_apply');\n        }\n        clearScheduledCanvasResizeApply();\n        g_resizeApplyDeadlineMS = -Infinity;\n        gl.canvas.width = displayWidth;\n        gl.canvas.height = displayHeight;\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_apply', perfToken);\n        }\n\n        if (!g_stage) {\n            return true;\n        }\n        if (__PORTAL_PERF_BUILD__) {\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('resize_canvas_framebuffer_resized');\n        }\n        g_stage.framebufferResized(gl);\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_framebuffer_resized', perfToken);\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('resize_canvas_viewport_resized');\n        }\n        g_stage.viewportResized(gl);\n        syncRootViewportBounds();\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_viewport_resized', perfToken);\n        }\n        return true;\n    }\n\n    if (__PORTAL_PERF_BUILD__) {\n        globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas_check', perfToken);\n    }\n    return false;\n}\n\nfunction syncRootViewportBounds() {\n    const dims = g_stage?.viewportDimensions;\n    if (!dims) {\n        return;\n    }\n    for (const viewport of [g_rootViewport, g_fullscreenRootViewport, g_hudRootViewport]) {\n        viewport?.setViewportBounds(dims.width, dims.height);\n    }\n}\n\n/* Drop cached fullscreen-scene globals once Stage recycles that scene so later fullscreen entry rebuilds a fresh shell. */\nfunction clearFullscreenSceneRefs() {\n    g_fullscreenScene = null;\n    g_fullscreenRootViewport = null;\n}\n\n/* Create one fullscreen scene shell lazily so heavy scene-scoped payloads exist only while fullscreen is in active or cached use. */\nfunction ensureFullscreenScene() {\n    if (g_fullscreenScene?.stage === g_stage) {\n        return g_fullscreenScene;\n    }\n    clearFullscreenSceneRefs();\n    if (!g_stage) {\n        throw new Error('ensureFullscreenScene(): stage is required.');\n    }\n    const scene = new ui.Scene();\n    const rootViewport = new ui.Viewport({\n        actsAsContainer: true,\n        width: 0,\n        height: 0,\n    });\n    scene.root.appendChild(rootViewport);\n    scene.setRootViewport(rootViewport);\n    scene.setActiveViewport(rootViewport);\n    scene.camera = new ui.Camera({});\n    rootViewport.appendChild(scene.camera);\n    g_fullscreenScene = scene;\n    g_fullscreenRootViewport = rootViewport;\n    g_stage.addScene(scene);\n    g_stage.setFullscreenScene(scene);\n    syncRootViewportBounds();\n    return scene;\n}\n\nfunction safeSnapshotRect(canvas) {\n    if (!canvas || typeof canvas.getBoundingClientRect !== 'function') {\n        return null;\n    }\n    try {\n        const rect = canvas.getBoundingClientRect();\n        return {\n            x: rect.x,\n            y: rect.y,\n            width: rect.width,\n            height: rect.height,\n        };\n    } catch (err) {\n        return {\n            error: err instanceof Error ? err.message : String(err),\n        };\n    }\n}\n\nfunction safeSnapshotGLValue(gl, key, vector = false) {\n    if (!gl || typeof gl.getParameter !== 'function') {\n        return null;\n    }\n    try {\n        const value = gl.getParameter(key);\n        if (vector && ArrayBuffer.isView(value)) {\n            return Array.from(value);\n        }\n        return value ?? null;\n    } catch (err) {\n        return {\n            error: err instanceof Error ? err.message : String(err),\n        };\n    }\n}\n\nfunction rawConsoleError(...args) {\n    g_browserDiagnosticRuntime.originalConsoleError?.(...args);\n}\n\nfunction browserDiagnosticSuppressed() {\n    return g_browserDiagnosticRuntime.suppressDepth > 0;\n}\n\nasync function withBrowserDiagnosticSuppressed(fn) {\n    g_browserDiagnosticRuntime.suppressDepth += 1;\n    try {\n        return await fn();\n    } finally {\n        g_browserDiagnosticRuntime.suppressDepth -= 1;\n    }\n}\n\nfunction trimBrowserDiagnosticText(text, limit = 512) {\n    let value = '';\n    try {\n        value = typeof text === 'string' ? text : String(text ?? '');\n    } catch (_err) {\n        value = '[unprintable diagnostic text]';\n    }\n    return value.length > limit ? `${value.slice(0, limit)}\u2026` : value;\n}\n\n/* Serialise a reporter-side error so partial crash bundles can explain what failed during capture. */\nfunction serializeBrowserDiagnosticError(err) {\n    if (err instanceof Error) {\n        return {\n            name: err.name,\n            message: err.message,\n            stack: err.stack || '',\n        };\n    }\n    return {\n        message: String(err),\n    };\n}\n\nfunction serializeBrowserDiagnosticValue(value, seen = new WeakSet(), depth = 0) {\n    if (value === null || value === undefined) {\n        return value ?? null;\n    }\n    if (typeof value === 'string') {\n        return trimBrowserDiagnosticText(value, 4_096);\n    }\n    if (typeof value === 'number' || typeof value === 'boolean') {\n        return value;\n    }\n    if (typeof value === 'bigint') {\n        return value.toString();\n    }\n    if (typeof value === 'symbol') {\n        return String(value);\n    }\n    if (typeof value === 'function') {\n        return `[function ${value.name || 'anonymous'}]`;\n    }\n    if (value instanceof Error) {\n        return {\n            name: value.name,\n            message: value.message,\n            stack: value.stack || '',\n        };\n    }\n    if (ArrayBuffer.isView(value)) {\n        return Array.from(value).slice(0, 64);\n    }\n    if (value instanceof ArrayBuffer) {\n        return `[ArrayBuffer ${value.byteLength} bytes]`;\n    }\n    if (depth >= 3) {\n        return `[${value.constructor?.name ?? 'Object'}]`;\n    }\n    if (Array.isArray(value)) {\n        return value.slice(0, 32).map((item) => serializeBrowserDiagnosticValue(item, seen, depth + 1));\n    }\n    if (typeof value === 'object') {\n        if (seen.has(value)) {\n            return '[Circular]';\n        }\n        seen.add(value);\n        const out = {};\n        for (const [key, item] of Object.entries(value).slice(0, 32)) {\n            try {\n                out[key] = serializeBrowserDiagnosticValue(item, seen, depth + 1);\n            } catch (err) {\n                out[key] = `[unserialisable: ${err instanceof Error ? err.message : String(err)}]`;\n            }\n        }\n        return out;\n    }\n    return trimBrowserDiagnosticText(String(value), 4_096);\n}\n\n/* Collect partial snapshot failures instead of letting one bad field abort the entire crash report. */\nfunction makeBrowserDiagnosticCollector() {\n    const errors = [];\n    return {\n        capture(label, fn, fallback = null) {\n            try {\n                return fn();\n            } catch (err) {\n                errors.push({\n                    label,\n                    ...serializeBrowserDiagnosticError(err),\n                });\n                return fallback;\n            }\n        },\n        finish(bundle) {\n            if (errors.length === 0) {\n                return bundle;\n            }\n            return {\n                ...bundle,\n                diagnostic_errors: errors,\n            };\n        },\n    };\n}\n\nfunction summarizeBrowserDiagnosticValue(value) {\n    if (value instanceof Error) {\n        return `${value.name}: ${value.message}`;\n    }\n    if (typeof value === 'string') {\n        return trimBrowserDiagnosticText(value, 200);\n    }\n    if (value === null || value === undefined) {\n        return String(value);\n    }\n    if (typeof value === 'object') {\n        return trimBrowserDiagnosticText(value.constructor?.name ?? 'Object', 200);\n    }\n    return trimBrowserDiagnosticText(String(value), 200);\n}\n\nfunction topDiagnosticCounterEntries(counts, {\n    include = null,\n    mapKey = null,\n    limit = 5,\n} = {}) {\n    if (!counts || typeof counts !== 'object') {\n        return [];\n    }\n    return Object.entries(counts)\n        .filter(([key, value]) => {\n            if (!value || !Number.isFinite(value.total) || value.total <= 0) {\n                return false;\n            }\n            if (include && !include(key)) {\n                return false;\n            }\n            return true;\n        })\n        .map(([key, value]) => ({\n            key: mapKey ? mapKey(key) : key,\n            count: value.total,\n        }))\n        .sort((a, b) => {\n            if (a.count !== b.count) {\n                return b.count - a.count;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, limit);\n}\n\nfunction summarizeDocumentViewDiagnosticCounters() {\n    const perf = globalThis.__eviluiPerformanceTracker?.snapshot?.() ?? null;\n    const counters = perf?.counters ?? null;\n    if (!counters) {\n        return null;\n    }\n\n    const actionTotals = new Map();\n    for (const [key, value] of Object.entries(counters)) {\n        if (!key.startsWith('documentview_block_') || !Number.isFinite(value?.total) || value.total <= 0) {\n            continue;\n        }\n        const rest = key.slice('documentview_block_'.length);\n        const dot = rest.indexOf('.');\n        const action = dot >= 0 ? rest.slice(0, dot) : rest;\n        actionTotals.set(action, (actionTotals.get(action) ?? 0) + value.total);\n    }\n\n    const blockActionTotals = Array.from(actionTotals.entries())\n        .map(([key, count]) => ({ key, count }))\n        .sort((a, b) => {\n            if (a.count !== b.count) {\n                return b.count - a.count;\n            }\n            return a.key.localeCompare(b.key);\n        })\n        .slice(0, 8);\n\n    return {\n        sample_window_ms: perf.sample_window_ms ?? null,\n        frame_count: perf.frame_count ?? null,\n        block_action_totals: blockActionTotals,\n        block_counters_top: topDiagnosticCounterEntries(counters, {\n            include: (key) => key.startsWith('documentview_block_') && !key.includes('_transition.'),\n            mapKey: (key) => key.slice('documentview_block_'.length),\n            limit: 8,\n        }),\n        block_transition_top: topDiagnosticCounterEntries(counters, {\n            include: (key) => key.startsWith('documentview_block_') && key.includes('_transition.'),\n            mapKey: (key) => key.slice('documentview_block_'.length),\n            limit: 6,\n        }),\n        node_attach_top: topDiagnosticCounterEntries(counters, {\n            include: (key) => key.startsWith('node_attach.'),\n            mapKey: (key) => key.slice('node_attach.'.length),\n            limit: 6,\n        }),\n        node_detach_top: topDiagnosticCounterEntries(counters, {\n            include: (key) => key.startsWith('node_detach.'),\n            mapKey: (key) => key.slice('node_detach.'.length),\n            limit: 6,\n        }),\n    };\n}\n\nfunction summarizeConsoleErrorArgs(args) {\n    if (!Array.isArray(args) || args.length === 0) {\n        return 'console.error called with no arguments.';\n    }\n    return trimBrowserDiagnosticText(args.map((arg) => summarizeBrowserDiagnosticValue(arg)).join(' | '), 300);\n}\n\nfunction browserDiagnosticDedupeKey(kind, text) {\n    return `${kind}:${trimBrowserDiagnosticText(text, 300)}`;\n}\n\nfunction shouldSendBrowserDiagnostic(key, minIntervalMS = BROWSER_DIAGNOSTIC_DEDUPE_WINDOW_MS) {\n    const now = Date.now();\n    const last = g_browserDiagnosticRuntime.recentByKey.get(key) ?? 0;\n    if (now - last < minIntervalMS) {\n        return false;\n    }\n    g_browserDiagnosticRuntime.recentByKey.set(key, now);\n    for (const [recentKey, atMS] of g_browserDiagnosticRuntime.recentByKey) {\n        if (now - atMS > Math.max(minIntervalMS, BROWSER_CRASH_REPORT_MIN_INTERVAL_MS)) {\n            g_browserDiagnosticRuntime.recentByKey.delete(recentKey);\n        }\n    }\n    return true;\n}\n\n/* Build the shared browser diagnostics block defensively so rare crash reports survive partial snapshot failures. */\nfunction snapshotSharedBrowserDiagnosticBundle(api) {\n    const collector = makeBrowserDiagnosticCollector();\n    const nav = globalThis.navigator ?? {};\n    const screenRef = globalThis.screen ?? {};\n    const uaData = nav.userAgentData ?? null;\n    const perfMem = collector.capture('performance.memory', () => globalThis.performance?.memory ?? null, null);\n    const apiState = collector.capture('api.state', () => (typeof api?.state === 'function' ? api.state() : null), null);\n    const loggerState = callGlobalTestingHook('testingTableChunkAllocLoggerState');\n    const chunkProbeLine = Number.isInteger(loggerState?.line) ? loggerState.line : 3;\n    return collector.finish({\n        observed_at_ms: Date.now(),\n        page: {\n            href: globalThis.location?.href ?? '',\n            visibility_state: globalThis.document?.visibilityState ?? '',\n            device_pixel_ratio: globalThis.devicePixelRatio ?? null,\n        },\n        navigator: {\n            user_agent: nav.userAgent ?? '',\n            platform: nav.userAgentData?.platform ?? nav.platform ?? '',\n            vendor: nav.vendor ?? '',\n            language: nav.language ?? '',\n            languages: Array.isArray(nav.languages) ? nav.languages.slice(0, BROWSER_DIAGNOSTIC_LANGUAGE_LIMIT) : [],\n            user_agent_data: uaData ? {\n                brands: Array.isArray(uaData.brands)\n                    ? uaData.brands.map((entry) => ({\n                        brand: entry?.brand ?? '',\n                        version: entry?.version ?? '',\n                    }))\n                    : [],\n                mobile: uaData.mobile ?? null,\n                platform: uaData.platform ?? '',\n            } : null,\n            hardware_concurrency: nav.hardwareConcurrency ?? null,\n            device_memory_gb: nav.deviceMemory ?? null,\n            max_touch_points: nav.maxTouchPoints ?? null,\n            on_line: nav.onLine ?? null,\n        },\n        screen: {\n            width: screenRef.width ?? null,\n            height: screenRef.height ?? null,\n        },\n        canvas: {\n            id: g_canvas?.id ?? '',\n            width: g_canvas?.width ?? null,\n            height: g_canvas?.height ?? null,\n            client_width: g_canvas?.clientWidth ?? null,\n            client_height: g_canvas?.clientHeight ?? null,\n            css_rect: safeSnapshotRect(g_canvas),\n        },\n        portal: {\n            username: g_username,\n            testing_render_mode: g_testingRenderMode,\n            frame_stamp: g_frameStamp,\n            last_frame_at_ms: g_lastTime,\n            last_raf_request_at_ms: g_lastRafRequestAt,\n        },\n        api: apiState ? {\n            connection: apiState.connection,\n            auth: apiState.auth,\n            last_error_kind: apiState.lastError?.kind ?? null,\n            last_error_message: apiState.lastError?.message ?? null,\n        } : null,\n        websocket_debug: collector.capture('websocket_debug', () => testingPortalWSDebugState(), null),\n        performance_memory: perfMem ? {\n            js_heap_size_limit: perfMem.jsHeapSizeLimit ?? null,\n            total_js_heap_size: perfMem.totalJSHeapSize ?? null,\n            used_js_heap_size: perfMem.usedJSHeapSize ?? null,\n        } : null,\n        scene_summary: collector.capture('scene_summary', () => buildPerfStructureSummary(), null),\n        documentview_summary: collector.capture('documentview_summary', () => summarizeDocumentViewDiagnosticCounters(), null),\n        tableview_chunk_alloc_bundle: collector.capture(\n            'tableview_chunk_alloc_bundle',\n            () => callGlobalTestingHook('testingTableChunkAllocationForLine', chunkProbeLine),\n            null,\n        ),\n        tableview_ptrless_memory: collector.capture(\n            'tableview_ptrless_memory',\n            () => callGlobalTestingHook('testingTablePtrlessMemoryForLine', chunkProbeLine),\n            null,\n        ),\n        ptrless_live_memory: collector.capture(\n            'ptrless_live_memory',\n            () => callGlobalTestingHook('testingPtrlessLiveMemorySummary'),\n            null,\n        ),\n        evilfont_live_groups: collector.capture(\n            'evilfont_live_groups',\n            () => callGlobalTestingHook('testingEvilfontLiveTextGroupSummary'),\n            null,\n        ),\n        tableview_chunk_lifecycle: collector.capture(\n            'tableview_chunk_lifecycle',\n            () => callGlobalTestingHook('testingTableviewChunkLifecycleSummary'),\n            null,\n        ),\n        document_retained: collector.capture(\n            'document_retained',\n            () => callGlobalTestingHook('testingDocumentRetentionSummary'),\n            null,\n        ),\n        puffbook_retained: collector.capture(\n            'puffbook_retained',\n            () => callGlobalTestingHook('testingPuffbookRetentionSummary'),\n            null,\n        ),\n    });\n}\n\nfunction enqueueBrowserDiagnosticReport(report) {\n    g_browserDiagnosticRuntime.queue.push(report);\n    if (g_browserDiagnosticRuntime.queue.length > BROWSER_DIAGNOSTIC_QUEUE_LIMIT) {\n        g_browserDiagnosticRuntime.queue.splice(0, g_browserDiagnosticRuntime.queue.length - BROWSER_DIAGNOSTIC_QUEUE_LIMIT);\n    }\n    g_browserDiagnosticRuntime.recentReports.push({\n        report_type: report?.report_type ?? '',\n        summary: report?.summary ?? '',\n        page_url: report?.page_url ?? '',\n        report_json: report?.report_json ?? null,\n    });\n    if (g_browserDiagnosticRuntime.recentReports.length > TESTING_BROWSER_DIAGNOSTIC_REPORT_LIMIT) {\n        g_browserDiagnosticRuntime.recentReports.splice(\n            0,\n            g_browserDiagnosticRuntime.recentReports.length - TESTING_BROWSER_DIAGNOSTIC_REPORT_LIMIT,\n        );\n    }\n}\n\n/* Expose one compact browser-diagnostic snapshot so e2e can surface the actual frontend exception. */\nexport function testingBrowserDiagnosticState() {\n    return {\n        queued: g_browserDiagnosticRuntime.queue.map((report) => ({\n            report_type: report?.report_type ?? '',\n            summary: report?.summary ?? '',\n            page_url: report?.page_url ?? '',\n        })),\n        recent: g_browserDiagnosticRuntime.recentReports.map((report) => ({\n            report_type: report?.report_type ?? '',\n            summary: report?.summary ?? '',\n            page_url: report?.page_url ?? '',\n            report_json: report?.report_json ?? null,\n        })),\n    };\n}\n\n/* Expose one stable text summary of recent browser diagnostics so e2e can surface the last frontend exception cheaply. */\nexport function testingBrowserDiagnosticSummaryText() {\n    const parts = [];\n    for (const report of g_browserDiagnosticRuntime.recentReports) {\n        const kind = report?.report_type ?? '';\n        const summary = report?.summary ?? '';\n        parts.push(`${kind}: ${summary}`.trim());\n    }\n    for (const report of g_browserDiagnosticRuntime.queue) {\n        const kind = report?.report_type ?? '';\n        const summary = report?.summary ?? '';\n        parts.push(`queued ${kind}: ${summary}`.trim());\n    }\n    return parts.length === 0 ? '<none>' : parts.join('\\n');\n}\n\ntry {\n    globalThis.__portalTestingBrowserDiagnosticState = testingBrowserDiagnosticState;\n    globalThis.__portalTestingBrowserDiagnosticSummaryText = testingBrowserDiagnosticSummaryText;\n} catch (_err) {\n    // Ignore if globalThis is not writable (very old browsers).\n}\n\n/* Read one browser-global testing hook defensively so crash reporting can reuse periodic leak probes without importing them directly. */\nfunction callGlobalTestingHook(name, ...args) {\n    const fn = globalThis?.[name];\n    if (typeof fn !== 'function') {\n        return null;\n    }\n    return fn(...args);\n}\n\nasync function flushBrowserDiagnosticReports() {\n    if (g_browserDiagnosticRuntime.flushPromise) {\n        return await g_browserDiagnosticRuntime.flushPromise;\n    }\n    g_browserDiagnosticRuntime.flushPromise = (async () => {\n        while (g_browserDiagnosticRuntime.queue.length > 0) {\n            const api = g_browserDiagnosticRuntime.api;\n            if (!api) {\n                return;\n            }\n            const state = typeof api.state === 'function' ? api.state() : null;\n            if (!state || state.connection !== 'ready' || state.auth === 'reauth_required') {\n                return;\n            }\n            const report = g_browserDiagnosticRuntime.queue[0];\n            try {\n                await withBrowserDiagnosticSuppressed(async () => {\n                    await api.wsBrowserCrashReport(report);\n                });\n                g_browserDiagnosticRuntime.queue.shift();\n            } catch (err) {\n                const live = typeof api.state === 'function' ? api.state() : null;\n                if (isBackendUnavailableError(err) || live?.connection !== 'ready') {\n                    return;\n                }\n                rawConsoleError('Could not send browser diagnostic report.', err);\n                return;\n            }\n        }\n    })();\n    try {\n        await g_browserDiagnosticRuntime.flushPromise;\n    } finally {\n        g_browserDiagnosticRuntime.flushPromise = null;\n    }\n}\n\nfunction bindBrowserDiagnosticAPI(api) {\n    g_browserDiagnosticRuntime.ownOffApiState?.();\n    g_browserDiagnosticRuntime.ownOffApiState = null;\n    g_browserDiagnosticRuntime.api = api;\n    if (api && typeof api.onStateChange === 'function') {\n        g_browserDiagnosticRuntime.ownOffApiState = api.onStateChange((next, prev) => {\n            if (next.connection === 'ready' && prev?.connection !== 'ready') {\n                void flushBrowserDiagnosticReports();\n            }\n        });\n    }\n    void flushBrowserDiagnosticReports();\n}\n\n/* Keep expected backend-down startup failures out of crash-report paths and console-error recursion. */\nfunction shouldSuppressBrowserDiagnostic(value, api = g_browserDiagnosticRuntime.api) {\n    if (isBackendUnavailableError(value)) {\n        return true;\n    }\n    const detail = value instanceof Error\n        ? value.message\n        : Array.isArray(value)\n            ? value.map((part) => part instanceof Error ? part.message : String(part ?? '')).join(' ')\n            : String(value ?? '');\n    if (detail.includes('WebSocket connection failed.')) {\n        const state = typeof api?.state === 'function' ? api.state() : null;\n        if (!state || state.connection !== 'ready') {\n            return true;\n        }\n    }\n    return false;\n}\n\n/* Queue a browser diagnostic report without letting capture failures recursively break the reporter path. */\nfunction sendBrowserDiagnosticReport({ reportType, summary, reportJSON, dedupeKey, minIntervalMS }) {\n    try {\n        const api = g_browserDiagnosticRuntime.api;\n        const shared = snapshotSharedBrowserDiagnosticBundle(api);\n        const safeReportJSON = reportJSON && typeof reportJSON === 'object'\n            ? reportJSON\n            : { value: serializeBrowserDiagnosticValue(reportJSON) };\n        const report = {\n            report_type: reportType,\n            summary: trimBrowserDiagnosticText(summary, 300),\n            page_url: shared.page?.href ?? '',\n            user_agent: shared.navigator?.user_agent ?? '',\n            report_json: {\n                ...shared,\n                ...safeReportJSON,\n            },\n        };\n        if (!shouldSendBrowserDiagnostic(dedupeKey || browserDiagnosticDedupeKey(reportType, report.summary), minIntervalMS)) {\n            return false;\n        }\n        enqueueBrowserDiagnosticReport(report);\n        void flushBrowserDiagnosticReports();\n        return true;\n    } catch (err) {\n        rawConsoleError('Could not queue browser diagnostic report.', err);\n        return false;\n    }\n}\n\nfunction installGlobalBrowserDiagnosticReporters() {\n    if (g_browserDiagnosticRuntime.installed) {\n        return;\n    }\n    g_browserDiagnosticRuntime.installed = true;\n\n    window.addEventListener('error', (event) => {\n        if (browserDiagnosticSuppressed()) {\n            return;\n        }\n        const err = event?.error ?? null;\n        if (shouldSuppressBrowserDiagnostic(err)) {\n            return;\n        }\n        const source = event?.filename || '';\n        const loc = source ? `${source}:${event?.lineno ?? 0}:${event?.colno ?? 0}` : '';\n        const summary = err?.message\n            ? `Unhandled JS error: ${err.message}`\n            : event?.message\n                ? `Unhandled JS error: ${event.message}`\n                : 'Unhandled JS error.';\n        sendBrowserDiagnosticReport({\n            reportType: 'js_error',\n            summary,\n            dedupeKey: browserDiagnosticDedupeKey('js_error', `${summary}|${loc}`),\n            reportJSON: {\n                event: {\n                    type: event?.type ?? 'error',\n                    message: event?.message ?? '',\n                    filename: source,\n                    lineno: event?.lineno ?? null,\n                    colno: event?.colno ?? null,\n                },\n                error: serializeBrowserDiagnosticValue(err),\n            },\n        });\n    });\n\n    window.addEventListener('unhandledrejection', (event) => {\n        if (browserDiagnosticSuppressed()) {\n            return;\n        }\n        const reason = event?.reason;\n        if (shouldSuppressBrowserDiagnostic(reason)) {\n            return;\n        }\n        const summary = `Unhandled promise rejection: ${summarizeBrowserDiagnosticValue(reason)}`;\n        sendBrowserDiagnosticReport({\n            reportType: 'js_unhandledrejection',\n            summary,\n            dedupeKey: browserDiagnosticDedupeKey('js_unhandledrejection', summary),\n            reportJSON: {\n                event: {\n                    type: event?.type ?? 'unhandledrejection',\n                },\n                reason: serializeBrowserDiagnosticValue(reason),\n            },\n        });\n    });\n\n    if (typeof globalThis.console?.error === 'function') {\n        const origConsoleError = g_browserDiagnosticRuntime.originalConsoleError;\n        globalThis.console.error = (...args) => {\n            origConsoleError?.(...args);\n            if (browserDiagnosticSuppressed()) {\n                return;\n            }\n            if (shouldSuppressBrowserDiagnostic(args)) {\n                return;\n            }\n            const summary = `console.error: ${summarizeConsoleErrorArgs(args)}`;\n            sendBrowserDiagnosticReport({\n                reportType: 'console_error',\n                summary,\n                dedupeKey: browserDiagnosticDedupeKey('console_error', summary),\n                reportJSON: {\n                    console: {\n                        level: 'error',\n                        args: serializeBrowserDiagnosticValue(args),\n                    },\n                },\n            });\n        };\n    }\n}\n\nfunction snapshotWebGLDiagnostics(gl) {\n    if (!gl) {\n        return null;\n    }\n    const collector = makeBrowserDiagnosticCollector();\n    return collector.finish({\n        context_attributes: (() => {\n            try {\n                return gl.getContextAttributes?.() ?? null;\n            } catch (_err) {\n                return null;\n            }\n        })(),\n        version: safeSnapshotGLValue(gl, gl.VERSION),\n        shading_language_version: safeSnapshotGLValue(gl, gl.SHADING_LANGUAGE_VERSION),\n        vendor: safeSnapshotGLValue(gl, gl.VENDOR),\n        renderer: safeSnapshotGLValue(gl, gl.RENDERER),\n        max_texture_size: safeSnapshotGLValue(gl, gl.MAX_TEXTURE_SIZE),\n        max_renderbuffer_size: safeSnapshotGLValue(gl, gl.MAX_RENDERBUFFER_SIZE),\n        max_viewport_dims: safeSnapshotGLValue(gl, gl.MAX_VIEWPORT_DIMS, true),\n        max_vertex_attribs: safeSnapshotGLValue(gl, gl.MAX_VERTEX_ATTRIBS),\n        max_texture_image_units: safeSnapshotGLValue(gl, gl.MAX_TEXTURE_IMAGE_UNITS),\n        aliased_line_width_range: safeSnapshotGLValue(gl, gl.ALIASED_LINE_WIDTH_RANGE, true),\n        aliased_point_size_range: safeSnapshotGLValue(gl, gl.ALIASED_POINT_SIZE_RANGE, true),\n    });\n}\n\n/* Convert one absolute wall-clock timestamp into a report-friendly relative age. */\nfunction ageFromNowMS(atMS, nowMS = Date.now()) {\n    if (!Number.isFinite(atMS) || atMS <= 0) {\n        return null;\n    }\n    return Math.max(0, nowMS - atMS);\n}\n\n/* Build the WebGL loss bundle defensively so one failed summary becomes a field error, not a lost report. */\nfunction snapshotBrowserCrashReportBundle(api, canvas, state, ev, opts = {}) {\n    const collector = makeBrowserDiagnosticCollector();\n    const nowMS = Date.now();\n    const preTeardownShared = opts.preTeardownShared && typeof opts.preTeardownShared === 'object'\n        ? opts.preTeardownShared\n        : collector.capture('shared_bundle', () => snapshotSharedBrowserDiagnosticBundle(api), {});\n    return collector.finish({\n        ...preTeardownShared,\n        event: {\n            type: ev?.type ?? 'webglcontextlost',\n            status_message: ev?.statusMessage ?? '',\n            default_prevented: !!ev?.defaultPrevented,\n        },\n        canvas: {\n            id: canvas?.id ?? '',\n            width: canvas?.width ?? null,\n            height: canvas?.height ?? null,\n            client_width: canvas?.clientWidth ?? null,\n            client_height: canvas?.clientHeight ?? null,\n            css_rect: safeSnapshotRect(canvas),\n        },\n        context: {\n            id: state.contextId,\n            created_age_ms: ageFromNowMS(state.contextCreatedAtMS, nowMS),\n            report_count: state.reportCount,\n            last_report_age_ms: ageFromNowMS(state.lastReportAtMS, nowMS),\n        },\n        webgl: collector.capture(\n            'webgl_snapshot',\n            () => state.webgl ?? snapshotWebGLDiagnostics(canvas?.getContext?.('webgl2', WEBGL2_CONTEXT_ATTRIBUTES) ?? null),\n            null,\n        ),\n        gpu_heartbeat_trend: collector.capture('gpu_heartbeat_trend', () => gpuDiagHeartbeatTrendSummary(), null),\n        gpu_context_summary: collector.capture(\n            'gpu_context_summary',\n            () => gpuDiagContextLossSummary(state?.contextCreatedAtMS ?? null, state?.reportCount ?? 0),\n            null,\n        ),\n        gpu_diagnostics: collector.capture('gpu_diagnostics', () => gpuDiagCompactSnapshot(), null),\n        post_teardown_shared_bundle: opts.postTeardownShared ?? null,\n    });\n}\n\nfunction installBrowserCrashReporter(api, canvas, gl, onContextChange = null) {\n    if (!canvas) {\n        return;\n    }\n    const state = canvas.__browserCrashReportState ?? {\n        installed: false,\n        reportCount: 0,\n        lastReportAtMS: 0,\n        contextId: 0,\n        contextCreatedAtMS: 0,\n        webgl: null,\n    };\n    state.contextId = g_browserCrashReportState.nextContextId++;\n    state.contextCreatedAtMS = Date.now();\n    state.webgl = snapshotWebGLDiagnostics(gl);\n    gpuDiagInstallGlResourceTracker(gl, state.contextId);\n    gpuDiagNoteContext('acquired', {\n        context_id: state.contextId,\n        canvas_id: canvas.id || '',\n    });\n    canvas.__browserCrashReportState = state;\n    if (state.installed) {\n        return;\n    }\n    state.installed = true;\n\n    // A lost-context report is most useful when it survives partial failures in\n    // surrounding teardown and snapshot code.\n    canvas.addEventListener('webglcontextlost', (ev) => {\n        try {\n            ev?.preventDefault?.();\n            const now = Date.now();\n            const preTeardownShared = snapshotSharedBrowserDiagnosticBundle(api);\n            let postTeardownShared = null;\n            if (typeof onContextChange === 'function') {\n                try {\n                    onContextChange(null);\n                } catch (err) {\n                    rawConsoleError('WebGL context-loss callback failed.', err);\n                }\n            }\n            if (g_stage?.gl) {\n                try {\n                    g_stage.releaseContext(g_stage.gl);\n                } catch (err) {\n                    rawConsoleError('Scene context release during WebGL loss failed.', err);\n                }\n            }\n            postTeardownShared = snapshotSharedBrowserDiagnosticBundle(api);\n            if (now - (state?.lastReportAtMS ?? 0) < BROWSER_CRASH_REPORT_MIN_INTERVAL_MS) {\n                console.warn('Suppressing duplicate WebGL crash report burst.', {\n                    canvas_id: canvas?.id || '',\n                    context_id: state?.contextId ?? null,\n                    elapsed_ms: now - (state?.lastReportAtMS ?? 0),\n                });\n                return;\n            }\n            state.reportCount += 1;\n            state.lastReportAtMS = now;\n            gpuDiagNoteContext('lost', {\n                context_id: state.contextId,\n                canvas_id: canvas?.id || '',\n                status_message: ev?.statusMessage ?? '',\n                default_prevented: !!ev?.defaultPrevented,\n            });\n            const report = snapshotBrowserCrashReportBundle(api, canvas, state, ev, {\n                preTeardownShared,\n                postTeardownShared,\n            });\n            console.warn('WebGL context lost.', report);\n            sendBrowserDiagnosticReport({\n                reportType: 'webgl_context_loss',\n                summary: 'WebGL context lost while rendering portal content.',\n                dedupeKey: browserDiagnosticDedupeKey('webgl_context_loss', `context:${state.contextId}`),\n                minIntervalMS: BROWSER_CRASH_REPORT_MIN_INTERVAL_MS,\n                reportJSON: report,\n            });\n        } catch (err) {\n            rawConsoleError('WebGL context-loss reporter failed.', err);\n            sendBrowserDiagnosticReport({\n                reportType: 'webgl_context_loss_reporter_error',\n                summary: 'WebGL context-loss reporter failed while capturing diagnostics.',\n                dedupeKey: browserDiagnosticDedupeKey('webgl_context_loss_reporter_error', `context:${state?.contextId ?? 'unknown'}`),\n                minIntervalMS: BROWSER_CRASH_REPORT_MIN_INTERVAL_MS,\n                reportJSON: {\n                    event: {\n                        type: ev?.type ?? 'webglcontextlost',\n                        status_message: ev?.statusMessage ?? '',\n                    },\n                    context: {\n                        id: state?.contextId ?? null,\n                        created_at_ms: state?.contextCreatedAtMS ?? null,\n                        report_count: state?.reportCount ?? null,\n                    },\n                    reporter_error: serializeBrowserDiagnosticError(err),\n                },\n            });\n        }\n    });\n\n    canvas.addEventListener('webglcontextrestored', () => {\n        try {\n            const nextGL = canvas?.getContext?.('webgl2', WEBGL2_CONTEXT_ATTRIBUTES) ?? null;\n            if (!nextGL) {\n                console.error('WebGL2 context restoration failed for #back canvas.');\n                return;\n            }\n            nextGL.viewport(0, 0, canvas?.width ?? 0, canvas?.height ?? 0);\n            if (g_stage) {\n                g_stage.acquireContext(nextGL);\n            }\n            if (typeof onContextChange === 'function') {\n                onContextChange(nextGL);\n            }\n            requestMainLoop('webgl_context_restored');\n            state.contextId = g_browserCrashReportState.nextContextId++;\n            state.contextCreatedAtMS = Date.now();\n            state.webgl = snapshotWebGLDiagnostics(nextGL);\n            gpuDiagInstallGlResourceTracker(nextGL, state.contextId);\n            gpuDiagNoteContext('restored', {\n                context_id: state.contextId,\n                canvas_id: canvas?.id || '',\n            });\n            console.warn('WebGL context restored.', {\n                context_id: state.contextId,\n                canvas_id: canvas?.id || '',\n            });\n        } catch (err) {\n            rawConsoleError('WebGL context-restore reporter failed.', err);\n            sendBrowserDiagnosticReport({\n                reportType: 'webgl_context_restore_reporter_error',\n                summary: 'WebGL context-restore reporter failed while capturing diagnostics.',\n                dedupeKey: browserDiagnosticDedupeKey('webgl_context_restore_reporter_error', `context:${state?.contextId ?? 'unknown'}`),\n                minIntervalMS: BROWSER_CRASH_REPORT_MIN_INTERVAL_MS,\n                reportJSON: {\n                    context: {\n                        id: state?.contextId ?? null,\n                        created_at_ms: state?.contextCreatedAtMS ?? null,\n                    },\n                    reporter_error: serializeBrowserDiagnosticError(err),\n                },\n            });\n        }\n    });\n}\n\nasync function acquireContext(api, onContextChange = null) {\n    let canvas = document.getElementById('back');\n    installCanvasResizeObserver(canvas);\n    if (testingRenderDisabled()) {\n        applyRenderlessViewport(canvas);\n        return null;\n    }\n    let gl = canvas.getContext('webgl2', WEBGL2_CONTEXT_ATTRIBUTES);\n    if (gl == null) {\n        throw new Error('WebGL2 context acquisition failed for #back canvas.');\n    }\n    gpuDiagInstallGlResourceTracker(gl);\n\n    // This is just a starting point, will be quickly overridden by resizeObserver.\n    gl.viewport(0, 0, canvas.width, canvas.height);\n    ui.warmIconAtlas(gl);\n\n    if (g_stage) {\n        g_stage.acquireContext(gl);\n    }\n    installBrowserCrashReporter(api, canvas, gl, onContextChange);\n\n    return gl;\n}\n\n// async function createPuffbookScene(api) {\n\n//     let scene = new ui.Scene();\n//     let firacode = await evilfont.createMSDFFont(scene, 'FiraCode-Regular');\n\n//     scene.camera = new ui.Camera({});\n//     scene.root.appendChild(scene.camera);\n\n//     controls = new Controls();\n\n//     const pathRef = {\n//         lake: 'primary',\n//         path: 'Untitled.puffbook',\n//         branch: 'main',\n//     };\n\n//     let doc = await createPuffbook(api, pathRef);\n//     g_puffbookScreen = new PuffbookScreen({ doc: doc, font: firacode });\n//     scene.root.appendChild(g_puffbookScreen);\n//     g_puffbookScreen.teleportCamera(scene.camera);\n\n//      let directory = new Directory({\n//         api:api,\n//         font: firacode,\n//         fontSize: 18\n//     })\n//     scene.root.appendChild(directory)\n\n//     return scene;\n// }\n\n// async function createTableScene(api) {\n\n\n//     let scene = new ui.Scene();\n\n//     let googleSansRegular = await evilfont.createMSDFFont(scene, 'GoogleSans-Regular');\n//     let googleSansSemiBold = await evilfont.createMSDFFont(scene, 'GoogleSans-SemiBold');\n\n//     controls = new Controls();\n\n//     scene.camera = new ui.Camera({});\n//     scene.root.appendChild(scene.camera);\n\n\n//     const topLeftAnchor = [-screen.width * 0.5, -screen.height * 0.5, 0];\n//     //const topLeftAnchor = [0, 0, 0];\n\n//     tempTable = new ui.TableView({\n//         font: googleSansRegular,\n//         headerFont: googleSansSemiBold,\n//         x: topLeftAnchor[0],\n//         y: topLeftAnchor[1],\n//         z: topLeftAnchor[2],\n//         camera: scene.camera,\n//         api: api\n//     });\n\n\n//     await scene.root.appendChild(tempTable);\n\n//     return scene;\n// }\n\nfunction drawScene(gl) {\n    if (!gl) {\n        return;\n    }\n\n    if (g_stage) {\n        g_stage.draw(gl);\n    }\n}\n\nfunction browserOwnsInput(canvas, event) {\n    const target = event?.target;\n    if (target && target !== canvas && target !== document.body && target !== document.documentElement) {\n        return true;\n    }\n\n    const sel = window.getSelection?.();\n    if (sel && !sel.isCollapsed) {\n        return true;\n    }\n\n    const el = document.activeElement;\n    if (!el || el === document.body || el === canvas) {\n        return false;\n    }\n\n    return el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName);\n}\n\nfunction recordingLocation() {\n    const url = new URL(window.location.href);\n    for (const key of Array.from(url.searchParams.keys())) {\n        if (/(?:code|token|state|session|secret)/i.test(key)) {\n            url.searchParams.set(key, '[redacted]');\n        }\n    }\n    return {\n        url: url.href,\n        route: `${url.pathname}${url.search}`,\n    };\n}\n\nfunction recordingMetadata(canvas) {\n    const location = recordingLocation();\n    return {\n        app_version: APP_VERSION,\n        debug_build_version: PORTAL_DEBUG_BUILD_VERSION,\n        username: g_username,\n        url: location.url,\n        route: location.route,\n        viewport: {\n            width: window.innerWidth,\n            height: window.innerHeight,\n            device_pixel_ratio: window.devicePixelRatio,\n        },\n        canvas: {\n            width: canvas?.width ?? null,\n            height: canvas?.height ?? null,\n            client_width: canvas?.clientWidth ?? null,\n            client_height: canvas?.clientHeight ?? null,\n            css_rect: safeSnapshotRect(canvas),\n        },\n        user_agent: navigator.userAgent,\n    };\n}\n\nfunction setRecordingControlState(text, { disabled = false, state = 'idle', toastText = null } = {}) {\n    g_directory?.setRecordingControlState?.(text, { disabled, state, toastText });\n}\n\nfunction syncRecordingControlAvailability() {\n    if (g_activeRecording || g_recordingPreparing || g_recordingSaving\n        || g_recordingRecovering || g_failedRecordingSave) return;\n    if (!g_username) {\n        setRecordingControlState('Sign in to record', { disabled: true });\n        return;\n    }\n    setRecordingControlState('Start recording');\n}\n\nfunction requestRecordingFrame(kind, startedAtMs) {\n    return new Promise((resolve, reject) => {\n        const request = {\n            kind,\n            startedAtMs,\n            resolve: (capture) => {\n                window.clearTimeout(request.timeout);\n                resolve(capture);\n            },\n            reject: (error) => {\n                window.clearTimeout(request.timeout);\n                reject(error);\n            },\n            timeout: null,\n        };\n        request.timeout = window.setTimeout(() => {\n            const index = g_pendingRecordingFrameCaptures.indexOf(request);\n            if (index >= 0) g_pendingRecordingFrameCaptures.splice(index, 1);\n            reject(new Error(`Portal recording ${kind} frame did not render within 10 seconds.`));\n        }, 10_000);\n        g_pendingRecordingFrameCaptures.push(request);\n        requestMainLoop(`recording_${kind}_frame`);\n    });\n}\n\nfunction serviceRecordingFrameCaptures() {\n    if (g_pendingRecordingFrameCaptures.length === 0) return;\n    const requests = g_pendingRecordingFrameCaptures.splice(0);\n    const capturedAtMs = performance.now();\n    const capturedAtUtc = new Date().toISOString();\n    for (const request of requests) {\n        captureRecordingCanvas(g_canvas, { capturedAtMs, capturedAtUtc })\n            .then((capture) => request.resolve({\n                ...capture,\n                kind: request.kind,\n                t_ms: Math.max(0, capture.captured_at_ms - request.startedAtMs),\n            }))\n            .catch(request.reject);\n    }\n}\n\nfunction queueRecordingChunk(active) {\n    const capturedAtMs = performance.now();\n    const actions = active.inputRecorder\n        .snapshot(active.metadata, capturedAtMs, { originAtMs: active.startedAtMs })\n        .events\n        .filter((event) => event.seq > active.lastChunkActionSeq);\n    const consoleEntries = g_consoleRecorder\n        .snapshot(capturedAtMs)\n        .entries\n        .filter((entry) => entry.seq > active.lastChunkConsoleSeq);\n    /* Advance durable cursors only after Lake acknowledges the chunk. A later\n       chunk repeats an unacknowledged suffix so a transient failure cannot make\n       an interrupted recording silently lose that interval. */\n    const lastActionSeq = actions.at(-1)?.seq ?? active.lastChunkActionSeq;\n    const lastConsoleSeq = consoleEntries.at(-1)?.seq ?? active.lastChunkConsoleSeq;\n    const chunkNumber = ++active.chunkNumber;\n    const chunk = {\n        format: PORTAL_RECORDING_FORMAT,\n        started_at_utc: active.startedAtUtc,\n        captured_at_utc: new Date().toISOString(),\n        captured_t_ms: Math.max(0, capturedAtMs - active.startedAtMs),\n        actions,\n        console: consoleEntries,\n        last_action_seq: lastActionSeq,\n        last_console_seq: lastConsoleSeq,\n    };\n    active.chunkChain = active.chunkChain.then(async () => {\n        const allocation = await active.allocation;\n        if (!allocation.recording) return;\n        await g_recordingStore.writeChunk(allocation.recording, chunkNumber, chunk);\n        active.lastChunkActionSeq = Math.max(active.lastChunkActionSeq, lastActionSeq);\n        active.lastChunkConsoleSeq = Math.max(active.lastChunkConsoleSeq, lastConsoleSeq);\n        try {\n            await persistActiveRecordingRecovery(active, capturedAtMs);\n        } catch (error) {\n            console.error('Could not checkpoint recording recovery state.', error);\n        }\n    }).catch((error) => {\n        active.chunkErrors.push(error instanceof Error ? error.message : String(error));\n    });\n}\n\nfunction recordingEpochKey(state) {\n    const ref = state?.file_ref;\n    return ref\n        ? `${ref.lake}\\u0000${ref.branch}\\u0000${ref.path}`\n            + `\\u0000${state.recording_instance_id ?? 'legacy'}\\u0000${state.subscription_generation ?? 0}`\n        : null;\n}\n\nfunction recordingEpoch(active, { cause, state, viewState, actionSeq, capturedAtMs }) {\n    return {\n        epoch_id: `epoch-${String(active.nextEpochNumber++).padStart(4, '0')}`,\n        cause,\n        action_seq: actionSeq,\n        t_ms: Math.max(0, capturedAtMs - active.startedAtMs),\n        file_ref: state.file_ref,\n        subscription_generation: state.subscription_generation ?? 0,\n        recording_instance_id: state.recording_instance_id ?? null,\n        source_version: state.source_version,\n        state,\n        view_state: viewState,\n    };\n}\n\n/* Start the state request immediately at the mount boundary; serialise only\n   publication so a later document cannot overtake an earlier epoch. */\nfunction captureActiveRecordingEpoch({ cause, doc }) {\n    const active = g_activeRecording;\n    if (!active || active.stopping || !doc) return;\n    const readiness = doc.recordingReplayReadiness?.() ?? null;\n    const key = recordingEpochKey(readiness);\n    if (!key || active.epochKeys.has(key)) return;\n    active.epochKeys.add(key);\n    const capturedAtMs = performance.now();\n    const actionSeq = active.inputRecorder.nextSequence();\n    let viewState = null;\n    try {\n        viewState = recordingPortalViewState();\n    } catch (error) {\n        active.chunkErrors.push(`document epoch view capture failed: ${error instanceof Error ? error.message : String(error)}`);\n    }\n    const statePromise = doc.recordingFullStateSnapshot({ freezeAtCall: true });\n    active.chunkChain = active.chunkChain.then(async () => {\n        const state = await statePromise;\n        active.session.epochs.push(recordingEpoch(active, {\n            cause,\n            state,\n            viewState,\n            actionSeq,\n            capturedAtMs,\n        }));\n        const allocation = await active.allocation;\n        if (allocation.recording) {\n            await g_recordingStore.writeRecordingSession(allocation.recording, active.session);\n        }\n    }).catch(async (error) => {\n        const message = error instanceof Error ? error.message : String(error);\n        active.chunkErrors.push(`document epoch capture failed: ${message}`);\n        active.session.errors.push({\n            action_seq: actionSeq,\n            cause,\n            file_ref: readiness.file_ref,\n            subscription_generation: readiness.subscription_generation,\n            message,\n        });\n        const allocation = await active.allocation;\n        if (allocation.recording) {\n            await g_recordingStore.writeRecordingSession(allocation.recording, active.session);\n        }\n    });\n    active.epochChain = active.chunkChain;\n}\n\nasync function startRecording(canvas) {\n    if (g_activeRecording || g_recordingPreparing || !g_username || !g_api) return;\n    g_recordingPreparing = true;\n    setRecordingControlState('Preparing recording\u2026', { disabled: true, state: 'saving' });\n    const preparingRoute = location.route;\n    let puffbookState = null;\n    try {\n        puffbookState = await (g_directory?.recordingPuffbookState?.() ?? null);\n    } catch (error) {\n        g_recordingPreparing = false;\n        console.error('Could not capture a complete Puffbook recording state.', error);\n        setRecordingControlState('Start failed \u2014 retry', {\n            state: 'failed',\n            toastText: 'Recording Interrupted',\n        });\n        return;\n    }\n    if (location.route !== preparingRoute) {\n        g_recordingPreparing = false;\n        console.error('Could not start recording because the route changed while its state was being prepared.');\n        setRecordingControlState('Start failed \u2014 retry', {\n            state: 'failed',\n            toastText: 'Recording Interrupted',\n        });\n        return;\n    }\n    const startedAtMs = performance.now();\n    const startedAtUtc = new Date().toISOString();\n    g_recordingStore ??= new PortalRecordingLakeStore(g_api);\n    g_inputRecorder = new PortalInputRecorder({ durationMs: PORTAL_RECORDING_MAX_DURATION_MS * 2 });\n    g_pendingRecordingPointerContexts.length = 0;\n    g_consoleRecorder.start(startedAtMs);\n    const puffbookStateError = null;\n    let viewState = null;\n    let viewStateError = null;\n    try {\n        viewState = recordingPortalViewState();\n    } catch (error) {\n        viewStateError = error instanceof Error ? error.message : String(error);\n    }\n    const session = {\n        format: PORTAL_RECORDING_SESSION_FORMAT,\n        epochs: [],\n        errors: [],\n    };\n    const active = {\n        username: g_username,\n        startedAtMs,\n        startedAtUtc,\n        metadata: recordingMetadata(canvas),\n        inputRecorder: g_inputRecorder,\n        puffbookState,\n        puffbookStateError,\n        viewState,\n        viewStateError,\n        session,\n        epochKeys: new Set(),\n        nextEpochNumber: 1,\n        epochChain: Promise.resolve(),\n        allocation: g_recordingStore.openRecording(g_username)\n            .then((recording) => ({ recording, error: null }))\n            .catch((error) => ({ recording: null, error })),\n        startScreenshot: requestRecordingFrame('start', startedAtMs)\n            .then((screenshot) => ({ screenshot, error: null }))\n            .catch((error) => ({ screenshot: null, error })),\n        timeout: null,\n        chunkTimer: null,\n        chunkNumber: 0,\n        lastChunkActionSeq: 0,\n        lastChunkConsoleSeq: 0,\n        chunkErrors: [],\n        chunkChain: Promise.resolve(),\n        stopping: false,\n    };\n    if (puffbookState) {\n        active.epochKeys.add(recordingEpochKey(puffbookState));\n        session.epochs.push(recordingEpoch(active, {\n            cause: 'recording_start',\n            state: puffbookState,\n            viewState,\n            actionSeq: 1,\n            capturedAtMs: startedAtMs,\n        }));\n    }\n    active.chunkChain = Promise.all([active.allocation, active.startScreenshot])\n        .then(async ([allocation, startCapture]) => {\n            if (!allocation.recording) return;\n            try {\n                await persistActiveRecordingRecovery(active, startedAtMs);\n            } catch (error) {\n                console.error('Could not initialise recording recovery state.', error);\n            }\n            await g_recordingStore.initialiseReplayState(allocation.recording, {\n                puffbookState: active.puffbookState,\n                viewState: active.viewState,\n                session: active.session,\n                startScreenshot: startCapture.screenshot,\n                startedAtUtc: active.startedAtUtc,\n                metadata: active.metadata,\n            });\n        })\n        .catch((error) => {\n            active.chunkErrors.push(error instanceof Error ? error.message : String(error));\n        });\n    active.chunkTimer = window.setInterval(() => {\n        if (!active.stopping) queueRecordingChunk(active);\n    }, PORTAL_RECORDING_CHUNK_INTERVAL_MS);\n    active.timeout = window.setTimeout(() => {\n        void stopRecording(canvas, 'timeout');\n    }, PORTAL_RECORDING_MAX_DURATION_MS);\n    g_activeRecording = active;\n    g_recordingPreparing = false;\n    setRecordingControlState('Save recording', {\n        state: 'recording',\n        toastText: 'Recording Started',\n    });\n    void active.allocation.then(({ error }) => {\n        if (!error || g_activeRecording !== active || active.stopping) return;\n        console.error('Could not create the Portal recording directory.', error);\n        window.clearTimeout(active.timeout);\n        window.clearInterval(active.chunkTimer);\n        g_activeRecording = null;\n        g_inputRecorder = null;\n        g_pendingRecordingPointerContexts.length = 0;\n        g_consoleRecorder.cancel();\n        setRecordingControlState('Start failed \u2014 retry', {\n            state: 'failed',\n            toastText: 'Recording Interrupted',\n        });\n    });\n}\n\nfunction screenshotManifest(screenshot) {\n    if (!screenshot) return null;\n    const { blob: _blob, captured_at_ms: _capturedAtMs, ...metadata } = screenshot;\n    return metadata;\n}\n\nfunction buildRecordingReport(active, {\n    endedAtMs,\n    endedAtUtc,\n    reason,\n    inputs,\n    consoleRecording,\n    startCapture,\n    endCapture = { screenshot: null, error: null },\n    completionStatus = 'complete',\n}) {\n    const durationMs = Math.max(0, endedAtMs - active.startedAtMs);\n    return {\n        manifest: {\n            format: PORTAL_RECORDING_FORMAT,\n            status: 'finalizing',\n            completion_status: completionStatus,\n            username: active.username,\n            starting_url: active.metadata.url,\n            starting_route: active.metadata.route,\n            app_version: active.metadata.app_version,\n            debug_build_version: active.metadata.debug_build_version,\n            viewport: active.metadata.viewport,\n            canvas: active.metadata.canvas,\n            user_agent: active.metadata.user_agent,\n            started_at_utc: active.startedAtUtc,\n            ended_at_utc: endedAtUtc,\n            duration_ms: durationMs,\n            maximum_duration_ms: PORTAL_RECORDING_MAX_DURATION_MS,\n            stop_reason: reason,\n            input_count: inputs.events.length,\n            pointer_context_count: inputs.events.filter((event) => event.pointer_context?.version === 1).length,\n            console_count: consoleRecording.entries.length,\n            truncated: {\n                inputs: inputs.truncated,\n                console: consoleRecording.truncated,\n            },\n            screenshots: {\n                start: screenshotManifest(startCapture.screenshot),\n                end: screenshotManifest(endCapture.screenshot),\n            },\n            capture_errors: [startCapture.error, endCapture.error]\n                .filter(Boolean)\n                .map((error) => error instanceof Error ? error.message : String(error)),\n            chunk_count: active.chunkNumber,\n            chunk_errors: active.chunkErrors,\n            puffbook_state: active.puffbookState ? {\n                present: true,\n                full_body: active.puffbookState.body_window?.full === true,\n                pending_edit_count: active.puffbookState.pending_ops?.length ?? 0,\n                file_ref: active.puffbookState.file_ref,\n            } : {\n                present: false,\n                error: active.puffbookStateError,\n            },\n            view_state: active.viewState ? {\n                present: true,\n                version: active.viewState.version,\n            } : {\n                present: false,\n                error: active.viewStateError,\n            },\n            features: {\n                view_state: active.viewState ? 1 : 0,\n                pointer_target_verification: active.viewState ? 1 : 0,\n                document_epochs: 2,\n            },\n            document_epoch_count: active.session.epochs.length,\n        },\n        actions: {\n            format: PORTAL_RECORDING_FORMAT,\n            started_at_utc: active.startedAtUtc,\n            duration_ms: durationMs,\n            events: inputs.events,\n        },\n        console: {\n            format: PORTAL_RECORDING_FORMAT,\n            started_at_utc: active.startedAtUtc,\n            duration_ms: durationMs,\n            entries: consoleRecording.entries,\n        },\n        puffbookState: active.puffbookState,\n        viewState: active.viewState,\n        session: active.session,\n        startScreenshot: startCapture.screenshot,\n        endScreenshot: endCapture.screenshot,\n    };\n}\n\nfunction recordingRecoveryEntry(recording, report, phase) {\n    return {\n        id: recording.path,\n        owner_token: g_recordingOwnerToken,\n        username: report.manifest.username,\n        phase,\n        recording,\n        report,\n        updated_at_utc: new Date().toISOString(),\n    };\n}\n\nasync function persistActiveRecordingRecovery(active, capturedAtMs = performance.now()) {\n    const [allocation, startCapture] = await Promise.all([active.allocation, active.startScreenshot]);\n    if (!allocation.recording) return;\n    const inputs = active.inputRecorder.snapshot(active.metadata, capturedAtMs, { originAtMs: active.startedAtMs });\n    const consoleRecording = g_consoleRecorder.snapshot(capturedAtMs);\n    const report = buildRecordingReport(active, {\n        endedAtMs: capturedAtMs,\n        endedAtUtc: new Date().toISOString(),\n        reason: 'page_reload',\n        inputs,\n        consoleRecording,\n        startCapture,\n        completionStatus: 'interrupted',\n    });\n    await g_recordingRecoveryStore.put(recordingRecoveryEntry(allocation.recording, report, 'recording'));\n}\n\nasync function stopRecording(canvas, reason) {\n    const active = g_activeRecording;\n    if (!active || active.stopping) return;\n    active.stopping = true;\n    window.clearTimeout(active.timeout);\n    window.clearInterval(active.chunkTimer);\n    const endedAtMs = performance.now();\n    const endedAtUtc = new Date().toISOString();\n    queueRecordingChunk(active);\n    const inputs = active.inputRecorder.snapshot(active.metadata, endedAtMs, { originAtMs: active.startedAtMs });\n    g_inputRecorder = null;\n    g_pendingRecordingPointerContexts.length = 0;\n    const consoleRecording = g_consoleRecorder.stop(endedAtMs);\n    const endScreenshotPromise = requestRecordingFrame('end', active.startedAtMs)\n        .then((screenshot) => ({ screenshot, error: null }))\n        .catch((error) => ({ screenshot: null, error }));\n    g_activeRecording = null;\n    g_recordingSaving = true;\n    setRecordingControlState('Saving recording\u2026', {\n        disabled: true,\n        state: 'saving',\n        toastText: 'Saving Recording...',\n    });\n\n    const [allocation, startCapture, endCapture] = await Promise.all([\n        active.allocation,\n        active.startScreenshot,\n        endScreenshotPromise,\n        active.chunkChain,\n        active.epochChain,\n    ]);\n    if (!allocation.recording) {\n        console.error('Portal recording could not be saved because its Lake directory was not created.', allocation.error);\n        g_recordingSaving = false;\n        setRecordingControlState('Start recording', {\n            state: 'failed',\n            toastText: 'Recording Failed to Save',\n        });\n        return;\n    }\n    const report = buildRecordingReport(active, {\n        endedAtMs,\n        endedAtUtc,\n        reason,\n        inputs,\n        consoleRecording,\n        startCapture,\n        endCapture,\n    });\n    try {\n        await g_recordingRecoveryStore.put(recordingRecoveryEntry(allocation.recording, report, 'saving'));\n    } catch (error) {\n        console.error('Could not persist the recording save recovery payload.', error);\n    }\n    try {\n        await g_recordingStore.finalise(allocation.recording, report);\n        try {\n            await g_recordingRecoveryStore.delete(allocation.recording.path);\n        } catch (error) {\n            console.warn('Could not clear the completed recording recovery payload.', error);\n        }\n        g_recordingSaving = false;\n        setRecordingControlState('Start recording', { toastText: 'Recording Saved' });\n    } catch (error) {\n        g_recordingSaving = false;\n        g_failedRecordingSave = { recording: allocation.recording, report, recoveryId: allocation.recording.path };\n        console.error(`Could not save Portal recording to ${allocation.recording.path}.`, error);\n        setRecordingControlState('Retry save', {\n            state: 'failed',\n            toastText: 'Recording Failed to Save',\n        });\n    }\n}\n\nasync function retryFailedRecordingSave() {\n    const failed = g_failedRecordingSave;\n    if (!failed) return;\n    g_recordingSaving = true;\n    setRecordingControlState('Retrying save\u2026', {\n        disabled: true,\n        state: 'saving',\n        toastText: 'Saving Recording...',\n    });\n    try {\n        await g_recordingStore.finalise(failed.recording, failed.report);\n        try {\n            await g_recordingRecoveryStore.delete(failed.recoveryId ?? failed.recording.path);\n        } catch (error) {\n            console.warn('Could not clear the completed recording recovery payload.', error);\n        }\n        g_recordingSaving = false;\n        g_failedRecordingSave = null;\n        setRecordingControlState('Start recording', { toastText: 'Recording Saved' });\n    } catch (error) {\n        g_recordingSaving = false;\n        console.error(`Could not save Portal recording to ${failed.recording.path}.`, error);\n        setRecordingControlState('Retry save', {\n            state: 'failed',\n            toastText: 'Recording Failed to Save',\n        });\n    }\n}\n\nasync function recoverPendingRecordings() {\n    if (!g_username || g_recordingRecovering || g_recordingRecoveryUsername === g_username) return;\n    g_recordingRecovering = true;\n    let records = [];\n    try {\n        records = await g_recordingRecoveryStore.owned(g_recordingOwnerToken, g_username);\n        g_recordingRecoveryUsername = g_username;\n        records.sort((left, right) => String(left.updated_at_utc).localeCompare(String(right.updated_at_utc)));\n        if (records.length === 0) return;\n        g_recordingStore ??= new PortalRecordingLakeStore(g_api);\n        for (const record of records) {\n            setRecordingControlState('Recovering recording\u2026', { disabled: true, state: 'saving' });\n            try {\n                await g_recordingStore.finalise(record.recording, record.report);\n                try {\n                    await g_recordingRecoveryStore.delete(record.id);\n                } catch (error) {\n                    console.warn('Could not clear the recovered recording payload.', error);\n                }\n                const interrupted = record.phase === 'recording'\n                    || record.report?.manifest?.completion_status === 'interrupted';\n                setRecordingControlState('Start recording', {\n                    toastText: interrupted ? 'Recording Interrupted' : 'Recording Saved',\n                });\n            } catch (error) {\n                console.error(`Could not recover Portal recording ${record.recording?.path ?? record.id}.`, error);\n                g_failedRecordingSave = {\n                    recording: record.recording,\n                    report: record.report,\n                    recoveryId: record.id,\n                };\n                setRecordingControlState('Retry save', {\n                    state: 'failed',\n                    toastText: 'Recording Failed to Save',\n                });\n                break;\n            }\n        }\n    } catch (error) {\n        console.error('Could not inspect pending Portal recording recovery state.', error);\n    } finally {\n        g_recordingRecovering = false;\n        if (records.length === 0) syncRecordingControlAvailability();\n    }\n}\n\nfunction handleRecordingControlInput() {\n    if (!g_canvas || g_recordingPreparing || g_recordingSaving || g_recordingRecovering) return;\n    if (g_failedRecordingSave) {\n        void retryFailedRecordingSave();\n    } else if (g_activeRecording) {\n        void stopRecording(g_canvas, 'manual');\n    } else {\n        void startRecording(g_canvas);\n    }\n}\n\nasync function handlePuffworkerRestartInput() {\n    const directory = g_directory;\n    const button = directory?.visualTesterButton ?? null;\n    if (!button || !g_api || directory.puffworkerRestartPending) return;\n    const showToast = (text) => {\n        button.toastText = text;\n        try {\n            button.displayToast();\n        } catch (toastError) {\n            console.warn('Could not display puffworker restart toast.', toastError);\n        }\n    };\n    directory.puffworkerRestartPending = true;\n    try {\n        await g_api.puffworkerRestart();\n        showToast('Puffworker Restarted');\n    } catch (error) {\n        console.error('Could not restart puffworker.', error);\n        showToast('Puffworker Restart Failed');\n    } finally {\n        directory.puffworkerRestartPending = false;\n        directory.ctxMenu?.getButton('Restart Puffworker')?.setEnabled(true);\n    }\n}\n\nasync function handleTranquilityRestartInput() {\n    const directory = g_directory;\n    const button = directory?.visualTesterButton ?? null;\n    if (!button || !g_api || directory.tranquilityRestartPending) return;\n    const showToast = (text) => {\n        button.toastText = text;\n        try {\n            button.displayToast();\n        } catch (toastError) {\n            console.warn('Could not display Tranquility restart toast.', toastError);\n        }\n    };\n    directory.tranquilityRestartPending = true;\n    try {\n        await g_api.tranquilityRestart();\n        showToast('Tranquility Restarting');\n    } catch (error) {\n        console.error('Could not restart Tranquility.', error);\n        showToast('Tranquility Restart Failed');\n    } finally {\n        directory.tranquilityRestartPending = false;\n        directory.ctxMenu?.getButton('Restart Tranquility')?.setEnabled(true);\n    }\n}\n\nfunction toggleRecordingFromShortcut() {\n    const button = g_directory?.recordingButton ?? null;\n    if (!g_canvas || !button || button.enabled === false\n        || g_recordingPreparing || g_recordingSaving || g_recordingRecovering\n        || g_failedRecordingSave || !g_username || !g_api) {\n        return false;\n    }\n    if (g_activeRecording?.stopping) {\n        return false;\n    }\n    if (g_activeRecording) {\n        void stopRecording(g_canvas, 'shortcut');\n    } else {\n        void startRecording(g_canvas);\n    }\n    return true;\n}\n\nfunction createTableviewLiveProbe() {\n    const state = {\n        label: 'startup',\n        startAtMs: performance.now(),\n        entries: [],\n        textDirtyEntries: [],\n    };\n\n    function reset(label = 'manual') {\n        state.label = label;\n        state.startAtMs = performance.now();\n        state.entries = [];\n        state.textDirtyEntries = [];\n        return summary();\n    }\n\n    function note(entry) {\n        state.entries.push({\n            at_ms: performance.now(),\n            ...entry,\n        });\n        if (state.entries.length > 4096) {\n            state.entries.splice(0, state.entries.length - 4096);\n        }\n    }\n\n    /* Keep TableView-scoped text dirty samples separate so motion counts stay comparable across runs. */\n    function noteTextDirty(entry) {\n        state.textDirtyEntries.push({\n            at_ms: performance.now(),\n            ...entry,\n        });\n        if (state.textDirtyEntries.length > 4096) {\n            state.textDirtyEntries.splice(0, state.textDirtyEntries.length - 4096);\n        }\n    }\n\n    function max(vals) {\n        return vals.length > 0 ? Math.max(...vals) : 0;\n    }\n\n    function avg(vals) {\n        return vals.length > 0 ? vals.reduce((a, b) => a + b, 0) / vals.length : 0;\n    }\n\n    /* Filter retained live-probe entries to one optional trailing window without copying more than needed. */\n    function entriesSince(sinceAtMs = null) {\n        if (!Number.isFinite(sinceAtMs)) {\n            return state.entries;\n        }\n        return state.entries.filter((entry) => (entry.at_ms ?? 0) >= sinceAtMs);\n    }\n\n    /* Filter retained text-dirty samples to the same optional trailing window used by motion entries. */\n    function textDirtyEntriesSince(sinceAtMs = null) {\n        if (!Number.isFinite(sinceAtMs)) {\n            return state.textDirtyEntries;\n        }\n        return state.textDirtyEntries.filter((entry) => (entry.at_ms ?? 0) >= sinceAtMs);\n    }\n\n    /* Roll one TableView live-probe window into momentum and chunk-maintenance stats. */\n    function summary(sinceAtMs = null) {\n        const entries = entriesSince(sinceAtMs);\n        const textDirtyEntries = textDirtyEntriesSince(sinceAtMs);\n        const stageMs = entries.map((e) => e.stage_ms).filter(Number.isFinite);\n        const updateChunkMs = entries.map((e) => e.update_chunk_ms).filter(Number.isFinite);\n        const reconcileMs = entries.map((e) => e.reconcile_ms).filter(Number.isFinite);\n        const renderWindowMs = entries.map((e) => e.render_window_ms).filter(Number.isFinite);\n        const buildCounts = entries.map((e) => e.reconcile_built).filter(Number.isFinite);\n        const churnMs = entries.map((e) => e.duration_ms).filter(Number.isFinite);\n        const velocity = entries.map((e) => Math.hypot(e.throw_vx ?? 0, e.throw_vy ?? 0)).filter(Number.isFinite);\n        const lines = new Set(entries.map((e) => e.line).filter(Number.isFinite));\n        const tables = new Set(entries.map((e) => e.table_name).filter((name) => typeof name === 'string' && name !== ''));\n        const kindCounts = {};\n        let momentumEntryCount = 0;\n        let columnWindowChangeCount = 0;\n        let rowBandLoadCount = 0;\n        let chunkBuildCount = 0;\n        let chunkEvictCount = 0;\n        let rowBandEvictCount = 0;\n        let reconcileBuiltTotal = 0;\n        let maxLoadedRowBands = 0;\n        let maxLoadedChunks = 0;\n        const frameStats = new Map();\n        for (const entry of entries) {\n            const kind = entry.kind || 'unspecified';\n            kindCounts[kind] = (kindCounts[kind] ?? 0) + 1;\n            if (kind === 'physics_throw') {\n                momentumEntryCount += 1;\n            }\n            if (entry.column_window_changed) {\n                columnWindowChangeCount += 1;\n            }\n            if (kind === 'row_band_load') {\n                rowBandLoadCount += 1;\n            }\n            if (kind === 'chunk_build') {\n                chunkBuildCount += 1;\n            }\n            if (kind === 'cache_evict') {\n                chunkEvictCount += Math.max(0, entry.evicted_chunks ?? 0);\n                rowBandEvictCount += Math.max(0, entry.evicted_row_bands ?? 0);\n            }\n            if (Number.isFinite(entry.reconcile_built)) {\n                reconcileBuiltTotal += entry.reconcile_built;\n            }\n            if (Number.isFinite(entry.loaded_row_bands)) {\n                maxLoadedRowBands = Math.max(maxLoadedRowBands, entry.loaded_row_bands);\n            }\n            if (Number.isFinite(entry.loaded_chunks)) {\n                maxLoadedChunks = Math.max(maxLoadedChunks, entry.loaded_chunks);\n            }\n            if (Number.isFinite(entry.frame_index)) {\n                let stat = frameStats.get(entry.frame_index);\n                if (!stat) {\n                    stat = {\n                        chunk_build_count: 0,\n                        chunk_evict_count: 0,\n                        chunk_text_dirty_count: 0,\n                        scopes: new Set(),\n                        tables: new Set(),\n                        source_counts: new Map(),\n                    };\n                    frameStats.set(entry.frame_index, stat);\n                }\n                if (kind === 'chunk_build') {\n                    stat.chunk_build_count += 1;\n                } else if (kind === 'cache_evict') {\n                    stat.chunk_evict_count += Math.max(0, entry.evicted_chunks ?? 0);\n                }\n                if (typeof entry.table_name === 'string' && entry.table_name !== '') {\n                    stat.tables.add(entry.table_name);\n                }\n            }\n        }\n        let chunkTextDirtyCount = 0;\n        let chunkTextDirtyFrames = 0;\n        let headerTextDirtyCount = 0;\n        let headerTextDirtyFrames = 0;\n        let textDirtyMissingFrameIndexCount = 0;\n        const chunkTextDirtyFrameSet = new Set();\n        const headerTextDirtyFrameSet = new Set();\n        for (const entry of textDirtyEntries) {\n            if (!Number.isFinite(entry.frame_index)) {\n                textDirtyMissingFrameIndexCount += 1;\n                continue;\n            }\n            if (entry.scope_kind === 'chunk') {\n                chunkTextDirtyCount += 1;\n                chunkTextDirtyFrameSet.add(entry.frame_index);\n                let stat = frameStats.get(entry.frame_index);\n                if (!stat) {\n                    stat = {\n                        chunk_build_count: 0,\n                        chunk_evict_count: 0,\n                        chunk_text_dirty_count: 0,\n                        scopes: new Set(),\n                        tables: new Set(),\n                        source_counts: new Map(),\n                    };\n                    frameStats.set(entry.frame_index, stat);\n                }\n                stat.chunk_text_dirty_count += 1;\n                if (typeof entry.scope_key === 'string' && entry.scope_key !== '') {\n                    stat.scopes.add(entry.scope_key);\n                }\n                if (typeof entry.table_name === 'string' && entry.table_name !== '') {\n                    stat.tables.add(entry.table_name);\n                }\n                if (typeof entry.source_label === 'string' && entry.source_label !== '') {\n                    stat.source_counts.set(entry.source_label, (stat.source_counts.get(entry.source_label) ?? 0) + 1);\n                }\n            } else if (entry.scope_kind === 'header') {\n                headerTextDirtyCount += 1;\n                headerTextDirtyFrameSet.add(entry.frame_index);\n            }\n        }\n        chunkTextDirtyFrames = chunkTextDirtyFrameSet.size;\n        headerTextDirtyFrames = headerTextDirtyFrameSet.size;\n        const chunkChurnFrames = [];\n        const suspiciousFrames = [];\n        let suspiciousChunkTextDirtyTotal = 0;\n        for (const [frameIndex, stat] of frameStats.entries()) {\n            const expectedBudget = stat.chunk_build_count > 0 || stat.chunk_evict_count > 0 ? 1 : 0;\n            if (expectedBudget > 0) {\n                chunkChurnFrames.push(frameIndex);\n            }\n            if (stat.chunk_text_dirty_count > expectedBudget) {\n                suspiciousChunkTextDirtyTotal += stat.chunk_text_dirty_count - expectedBudget;\n                suspiciousFrames.push({\n                    frame_index: frameIndex,\n                    expected_chunk_text_dirty_budget: expectedBudget,\n                    chunk_text_dirty_count: stat.chunk_text_dirty_count,\n                    chunk_build_count: stat.chunk_build_count,\n                    chunk_evict_count: stat.chunk_evict_count,\n                    tables: Array.from(stat.tables).sort(),\n                    scopes: Array.from(stat.scopes).sort(),\n                    source_counts: Object.fromEntries([...stat.source_counts.entries()].sort(([a], [b]) => a.localeCompare(b))),\n                });\n            }\n        }\n        suspiciousFrames.sort((a, b) => a.frame_index - b.frame_index);\n        return {\n            label: state.label,\n            run_ms: Math.max(0, performance.now() - (Number.isFinite(sinceAtMs) ? sinceAtMs : state.startAtMs)),\n            entry_count: entries.length,\n            line_count: lines.size,\n            table_count: tables.size,\n            kind_counts: Object.fromEntries(Object.entries(kindCounts).sort(([a], [b]) => a.localeCompare(b))),\n            momentum_entry_count: momentumEntryCount,\n            column_window_change_count: columnWindowChangeCount,\n            stage_ms: { avg: avg(stageMs), max: max(stageMs) },\n            update_chunk_ms: { avg: avg(updateChunkMs), max: max(updateChunkMs) },\n            reconcile_ms: { avg: avg(reconcileMs), max: max(reconcileMs) },\n            render_window_ms: { avg: avg(renderWindowMs), max: max(renderWindowMs) },\n            churn_ms: { avg: avg(churnMs), max: max(churnMs) },\n            reconcile_built: { avg: avg(buildCounts), max: max(buildCounts) },\n            reconcile_built_total: reconcileBuiltTotal,\n            throw_speed: { avg: avg(velocity), max: max(velocity) },\n            row_band_load_count: rowBandLoadCount,\n            chunk_build_count: chunkBuildCount,\n            chunk_evict_count: chunkEvictCount,\n            row_band_evict_count: rowBandEvictCount,\n            max_loaded_row_bands: maxLoadedRowBands,\n            max_loaded_chunks: maxLoadedChunks,\n            text_dirty: {\n                chunk_count: chunkTextDirtyCount,\n                chunk_frames: chunkTextDirtyFrames,\n                chunk_churn_frames: chunkChurnFrames.length,\n                header_count: headerTextDirtyCount,\n                header_frames: headerTextDirtyFrames,\n                missing_frame_index_count: textDirtyMissingFrameIndexCount,\n                suspicious_chunk_total: suspiciousChunkTextDirtyTotal,\n                suspicious_chunk_frames: suspiciousFrames.length,\n                recent_suspicious_frames: suspiciousFrames.slice(-12),\n            },\n            last_entry: entries.length > 0 ? { ...entries[entries.length - 1] } : null,\n        };\n    }\n\n    /* Expose one optional trailing-window slice so other probes can correlate motion with upload windows. */\n    function report(opts = {}) {\n        const sinceAtMs = opts?.sinceAtMs ?? null;\n        const entries = entriesSince(sinceAtMs);\n        return {\n            summary: summary(sinceAtMs),\n            recent_entries: entries.slice(-40),\n        };\n    }\n\n    return {\n        reset,\n        note,\n        noteTextDirty,\n        summary,\n        report,\n    };\n}\n\nglobalThis.__tableviewLiveProbe = createTableviewLiveProbe();\n\nfunction createSceneTraversalProbe() {\n    const state = {\n        label: 'startup',\n        startAtMs: performance.now(),\n        entries: [],\n        worstEntries: [],\n    };\n\n    function reset(label = 'manual') {\n        state.label = label;\n        state.startAtMs = performance.now();\n        state.entries = [];\n        state.worstEntries = [];\n        return summary();\n    }\n\n    function severity(entry) {\n        return Math.max(entry.transforms_ms ?? 0, entry.scene_update_ms ?? 0);\n    }\n\n    function note(entry) {\n        const full = {\n            at_ms: performance.now(),\n            ...entry,\n        };\n        state.entries.push(full);\n        if (state.entries.length > 2048) {\n            state.entries.splice(0, state.entries.length - 2048);\n        }\n        state.worstEntries.push(full);\n        state.worstEntries.sort((a, b) => severity(b) - severity(a));\n        if (state.worstEntries.length > 64) {\n            state.worstEntries.splice(64);\n        }\n    }\n\n    function summary() {\n        const entries = state.entries;\n        const sceneUpdate = entries.map((e) => e.scene_update_ms).filter(Number.isFinite);\n        const transforms = entries.map((e) => e.transforms_ms).filter(Number.isFinite);\n        const max = (vals) => vals.length > 0 ? Math.max(...vals) : 0;\n        const avg = (vals) => vals.length > 0 ? vals.reduce((a, b) => a + b, 0) / vals.length : 0;\n        return {\n            label: state.label,\n            run_ms: Math.max(0, performance.now() - state.startAtMs),\n            entry_count: entries.length,\n            scene_update_ms: { avg: avg(sceneUpdate), max: max(sceneUpdate) },\n            transforms_ms: { avg: avg(transforms), max: max(transforms) },\n        };\n    }\n\n    function report() {\n        return {\n            summary: summary(),\n            recent_entries: state.entries.slice(-40),\n            worst_entries: state.worstEntries.slice(0, 20),\n        };\n    }\n\n    return {\n        reset,\n        note,\n        summary,\n        report,\n    };\n}\n\nglobalThis.__sceneTraversalProbe = createSceneTraversalProbe();\n\nfunction mainLoop(timestamp) {\n    const wakeRequestedAtEntry = g_frameWakeRequested;\n    g_frameQueued = false;\n    g_frameRunning = true;\n    g_frameWakeRequested = false;\n    if (!presenterVisibilityAllowsFrames()) {\n        suspendPresenter('document_hidden', performance.now());\n        g_frameRunning = false;\n        return;\n    }\n    if (Number.isFinite(g_nextPresentFrameAtMS) && timestamp < g_nextPresentFrameAtMS) {\n        const demandHot = frameDemandSnapshot().hot;\n        if (presenterShouldContinue({\n            demandHot,\n            wakeRequested: wakeRequestedAtEntry,\n            nowMS: performance.now(),\n        })) {\n            scheduleMainLoop(g_testingFrameIntervalMS);\n        }\n        g_frameRunning = false;\n        return;\n    }\n    if (!Number.isFinite(g_nextPresentFrameAtMS)) {\n        g_nextPresentFrameAtMS = timestamp + MIN_PRESENT_FRAME_INTERVAL_MS;\n    } else {\n        const steps = Math.max(1, Math.floor((timestamp - g_nextPresentFrameAtMS) / MIN_PRESENT_FRAME_INTERVAL_MS) + 1);\n        g_nextPresentFrameAtMS += steps * MIN_PRESENT_FRAME_INTERVAL_MS;\n    }\n    g_stage?.setColdScheduledThinkWakesEnabled(false);\n    const gl = g_liveGL;\n    const callbackStartAt = performance.now();\n    const phaseDurations = {};\n    if (__PORTAL_PERF_BUILD__) {\n        assignScenePerfLabels(g_stage);\n        globalThis.__eviluiPerformanceTracker?.beginFrame(callbackStartAt);\n        globalThis.__eviluiPerformanceTracker?.recordDuration('raf_timestamp_lag', callbackStartAt - timestamp);\n        if (g_lastRafRequestAt !== null) {\n            globalThis.__eviluiPerformanceTracker?.recordDuration('raf_request_to_callback', callbackStartAt - g_lastRafRequestAt);\n        }\n        g_gpuDrawTimer?.poll(globalThis.__eviluiPerformanceTracker);\n    }\n    let lastPhaseEndName = 'frame_begin';\n    let lastPhaseEndAt = callbackStartAt;\n    function beginPhase(name, at = performance.now()) {\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.recordDuration(`phase_gap.${lastPhaseEndName}->${name}`, at - lastPhaseEndAt);\n        }\n        return at;\n    }\n    function endPhase(name, at = performance.now()) {\n        lastPhaseEndName = name;\n        lastPhaseEndAt = at;\n    }\n\n    g_frameStamp += 1;\n    gpuDiagNoteFramePhase('frame_begin', {\n        frame_stamp: g_frameStamp,\n    });\n    /*\n        Process delta time\n    */\n    const now = timestamp * 0.001;\n    const deltatime = Math.min(now - g_lastTime, 0.1);\n    g_lastTime = now;\n    g_stage?.beginFrameTime(Date.now());\n\n    /*\n        User input update\n    */\n    let perfToken = null;\n    let phaseStartAt = beginPhase('resize_canvas', performance.now());\n    let phaseAt = phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('resize_canvas', phaseAt);\n    }\n    if (gl) {\n        resizeCanvasToDisplaySize(gl);\n    } else if (g_canvas) {\n        applyRenderlessViewport(g_canvas);\n    }\n    phaseAt = performance.now();\n    phaseDurations.resize_canvas = phaseAt - phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        globalThis.__eviluiPerformanceTracker?.endTimer('resize_canvas', perfToken, phaseAt);\n    }\n    endPhase('resize_canvas', phaseAt);\n    gpuDiagNoteFramePhase('resize_canvas', {\n        frame_stamp: g_frameStamp,\n    });\n\n\n    perfToken = null;\n    phaseStartAt = beginPhase('update_controls', performance.now());\n    phaseAt = phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('update_controls', phaseAt);\n    }\n    updateControls()\n    if (g_agentChat?.parentNode) g_agentChat.layout(agentChatBounds());\n    phaseAt = performance.now();\n    phaseDurations.update_controls = phaseAt - phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        globalThis.__eviluiPerformanceTracker?.endTimer('update_controls', perfToken, phaseAt);\n    }\n    endPhase('update_controls', phaseAt);\n    gpuDiagNoteFramePhase('update_controls', {\n        frame_stamp: g_frameStamp,\n    });\n    let directPickReason = '';\n    let passivePickReason = '';\n    let didDirectPick = false;\n    let didPassivePick = false;\n    let frameScene = currentFocusScene();\n    //for now we'll just propagate the whole set each frame\n    //later we can call this on event\n    if (currentFocusScene()) {\n        if (controls && controls.activeEvents) {\n            controls.frameDeltaTime = deltatime;\n            for (const scene of interactiveScenes()) {\n                if (!scene) {\n                    continue;\n                }\n                scene.inputPickedInteractable = 0;\n            }\n            const directPickWanted = interactiveSceneOrder().some((scene) => sceneWantsDirectPick(scene));\n            if (gl && directPickWanted) {\n                directPickReason = 'forced_input_pick';\n                perfToken = null;\n                phaseStartAt = beginPhase('direct_pick', performance.now());\n                phaseAt = phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('direct_pick', phaseAt);\n                }\n                const pick = runDirectPick(gl, g_frameStamp);\n                didDirectPick = pick.didPick;\n                directPickReason = pick.reason;\n                frameScene = pick.scene ?? frameScene;\n                const hoverScene = currentHoverScene();\n                const hoverId = gl && !g_disablePickingForExperiment && Mouse.inside\n                    ? hoverScene?.selectedIteractable ?? 0\n                    : 0;\n                ui.Button.setHoveringID(hoverId);\n                ui.GeometryPlot.setHoveringID(hoverId);\n                completeRecordingPointerContexts(pick.scene ?? frameScene);\n                phaseAt = performance.now();\n                phaseDurations.direct_pick = phaseAt - phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    globalThis.__eviluiPerformanceTracker?.endTimer('direct_pick', perfToken, phaseAt);\n                }\n                endPhase('direct_pick', phaseAt);\n            }\n            // Not updating contros in sub scenes for now\n            // for(const cs of g_scene.childScenes.values()){\n            //     cs.root._propagateInputEvent(controls.activeEvents);\n            // }\n            if (controls.activeEvents.size != 0) {\n                perfToken = null;\n                phaseStartAt = beginPhase('propagate_input', performance.now());\n                phaseAt = phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('propagate_input', phaseAt);\n                }\n                const pointerRouteTrace = shouldLogPointerRoute(controls) ? {\n                    event: summarizePointerEvents(controls),\n                    scene_routes: [],\n                    handled_scene: null,\n                } : null;\n                if (controls.activeEvents.has('L_MOUSE_DOWN')) {\n                    const picked = frameScene?.pickedInteractable?.() ?? null;\n                    g_stage?.prepareDialogPointerInput(controls.activeEvents, picked);\n                    const pointerTarget = frameScene?.stage?.windowManager?.pointerTarget?.(frameScene, picked)\n                        ?? { target: picked };\n                    g_directory?.clearDirectorySelectionOutside(pointerTarget.target);\n                    if (!(pointerTarget.target instanceof ui.InputCell)\n                        && !g_stage?.activeDialog?.ownsNode(pointerTarget.target)) ui.clearInputFocus();\n                }\n                let consumedScene = null;\n                for (const scene of interactiveSceneOrder()) {\n                    if (propagateSceneInput(scene, controls, pointerRouteTrace)) {\n                        consumedScene = scene;\n                        break;\n                    }\n                }\n                if (pointerRouteTrace) {\n                    pointerRouteTrace.handled_scene = consumedScene ? describeScene(consumedScene) : null;\n                    logPointerRoute(pointerRouteTrace);\n                }\n                if (consumedScene) {\n                    frameScene = consumedScene;\n                }\n                noteRetainedClickFocus(controls.activeEvents);\n                phaseAt = performance.now();\n                phaseDurations.propagate_input = phaseAt - phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    globalThis.__eviluiPerformanceTracker?.endTimer('propagate_input', perfToken, phaseAt);\n                }\n                endPhase('propagate_input', phaseAt);\n            }\n\n        }\n    }\n    /*\n        Physics update\n    */\n    //Todo: need to add per tick functionality, but is a bit too early for that\n    syncChromePresentationViewport();\n    if (g_stage) {\n        perfToken = null;\n        phaseStartAt = beginPhase('physics_update', performance.now());\n        phaseAt = phaseStartAt;\n        if (__PORTAL_PERF_BUILD__) {\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('physics_update', phaseAt);\n        }\n        phaseAt = performance.now();\n        phaseDurations.physics_update = phaseAt - phaseStartAt;\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('physics_update', perfToken, phaseAt);\n        }\n        endPhase('physics_update', phaseAt);\n        gpuDiagNoteFramePhase('physics_update', {\n            frame_stamp: g_frameStamp,\n        });\n    }\n    /*\n        Scene nodes update\n    */\n\n    if (g_stage) {\n        perfToken = null;\n        phaseStartAt = beginPhase('update_scene', performance.now());\n        phaseAt = phaseStartAt;\n        if (__PORTAL_PERF_BUILD__) {\n            perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('update_scene', phaseAt);\n        }\n        g_stage.update(gl, deltatime);\n        syncChromePresentation();\n        phaseAt = performance.now();\n        phaseDurations.update_scene = phaseAt - phaseStartAt;\n        if (__PORTAL_PERF_BUILD__) {\n            globalThis.__eviluiPerformanceTracker?.endTimer('update_scene', perfToken, phaseAt);\n        }\n        endPhase('update_scene', phaseAt);\n        gpuDiagNoteFramePhase('update_scene', {\n            frame_stamp: g_frameStamp,\n        });\n\n        if (!g_disablePickingForExperiment) {\n            perfToken = null;\n            const passivePickNeeded = interactiveSceneOrder().some((scene) => wantsPassivePick({\n                gl,\n                sceneFullyRendered: scene.sceneFullyRendered,\n                needsPassiveHoverPick: scene.needsPassiveHoverPick(),\n                fullscreenViewportActive: scene === g_fullscreenScene,\n                pickReason: scene.getPickReason() ?? '',\n            }));\n            if (passivePickNeeded) {\n                phaseStartAt = beginPhase('passive_hover_pick', performance.now());\n                phaseAt = phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('passive_hover_pick', phaseAt);\n                }\n                const pick = runPassivePick(gl, g_frameStamp);\n                didPassivePick = pick.didPick;\n                passivePickReason = pick.reason;\n                frameScene = pick.scene ?? frameScene;\n                phaseAt = performance.now();\n                phaseDurations.passive_hover_pick = phaseAt - phaseStartAt;\n                if (__PORTAL_PERF_BUILD__) {\n                    globalThis.__eviluiPerformanceTracker?.endTimer('passive_hover_pick', perfToken, phaseAt);\n                }\n                endPhase('passive_hover_pick', phaseAt);\n            }\n        }\n        const hoverScene = currentHoverScene();\n        if (gl && !g_disablePickingForExperiment && hoverScene?.sceneFullyRendered && Mouse.inside) {\n            ui.Button.setHoveringID(hoverScene.selectedIteractable);\n            ui.GeometryPlot.setHoveringID(hoverScene.selectedIteractable);\n        } else {\n            ui.Button.setHoveringID(0);\n            ui.GeometryPlot.setHoveringID(0);\n        }\n    }\n    if (g_devHudEnabled) {\n        g_fpsIndicator?.noteFrame(timestamp);\n    }\n    /*\n       Drawing stage\n    */\n\n    perfToken = null;\n    phaseStartAt = beginPhase('draw_scene', performance.now());\n    phaseAt = phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('draw_scene', phaseAt);\n    }\n    drawScene(gl);\n    phaseAt = performance.now();\n    phaseDurations.draw_scene = phaseAt - phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        globalThis.__eviluiPerformanceTracker?.endTimer('draw_scene', perfToken, phaseAt);\n    }\n    endPhase('draw_scene', phaseAt);\n    gpuDiagNoteFramePhase('draw_scene', {\n        frame_stamp: g_frameStamp,\n    });\n    gpuDiagNoteFrameActivity(buildFrameActivitySnapshot(frameScene ?? currentFocusScene(), {\n        gl,\n        directPickReason,\n        passivePickReason,\n        didDirectPick,\n        didPassivePick,\n    }));\n    gpuDiagNoteDraw({\n        frame_stamp: g_frameStamp,\n    });\n    gpuDiagMaybeHeartbeat({\n        frame_stamp: g_frameStamp,\n    });\n    serviceRecordingFrameCaptures();\n\n    Mouse.commitFrame();\n    perfToken = null;\n    phaseStartAt = beginPhase('cleanup_controls', performance.now());\n    phaseAt = phaseStartAt;\n    if (__PORTAL_PERF_BUILD__) {\n        perfToken = globalThis.__eviluiPerformanceTracker?.beginTimer('cleanup_controls', phaseAt);\n    }\n    cleanupControls()\n    phaseAt = performance.now();\n    phaseDurations.cleanup_controls = phaseAt - phaseStartAt;\n    const frameEndAt = performance.now();\n    const demand = frameDemandSnapshot();\n    g_portalJitterProbe?.noteFrame?.({\n        frameStamp: g_frameStamp,\n        callbackStartAt,\n        frameEndAt,\n        rafTimestamp: timestamp,\n        rafRequestAt: g_lastRafRequestAt,\n        wakeReason: g_lastFrameWakeReason || '',\n        phaseDurations,\n        frameDemand: demand,\n    });\n    if (__PORTAL_PERF_BUILD__) {\n        globalThis.__eviluiPerformanceTracker?.endTimer('cleanup_controls', perfToken, phaseAt);\n        endPhase('cleanup_controls', phaseAt);\n        globalThis.__eviluiPerformanceTracker?.recordDuration('phase_gap.cleanup_controls->frame_end', frameEndAt - lastPhaseEndAt);\n        const rafRequestAt = performance.now();\n        globalThis.__eviluiPerformanceTracker?.recordDuration('frame_end_to_raf_request', rafRequestAt - frameEndAt);\n        globalThis.__eviluiPerformanceTracker?.endFrame(rafRequestAt);\n        g_lastRafRequestAt = rafRequestAt;\n    }\n    if (!__PORTAL_PERF_BUILD__) {\n        g_lastRafRequestAt = performance.now();\n    }\n    if (presenterShouldContinue({\n        demandHot: demand.hot,\n        wakeRequested: g_frameWakeRequested,\n        nowMS: frameEndAt,\n    })) {\n        scheduleMainLoop(g_testingFrameIntervalMS);\n    }\n    g_frameRunning = false;\n}\n\nfunction scheduleMainLoop(delayMS = 0) {\n    if (g_frameQueued) {\n        return;\n    }\n    g_frameQueued = true;\n    const queue = () => {\n        g_lastRafRequestAt = performance.now();\n        requestAnimationFrame((t) => {\n            try {\n                mainLoop(t);\n            } finally {\n                if (!g_frameRunning) {\n                    return;\n                }\n                const wakeRequested = g_frameWakeRequested;\n                let demandHot = false;\n                try {\n                    demandHot = frameDemandSnapshot().hot;\n                } catch (_err) {\n                }\n                g_frameRunning = false;\n                if (presenterShouldContinue({\n                    demandHot,\n                    wakeRequested,\n                    nowMS: performance.now(),\n                })) {\n                    scheduleMainLoop(g_testingFrameIntervalMS);\n                }\n            }\n        });\n    };\n    if (delayMS > 0) {\n        window.setTimeout(queue, delayMS);\n        return;\n    }\n    queue();\n}\n\nasync function setup(api) {\n    g_api = api;\n    let onPuffworkerReconnect = null;\n    api.onPuffworkerStateChange((connected) => {\n        const reconnected = connected === true && g_puffworkerConnected === false;\n        syncPuffworkerState(connected);\n        if (reconnected) {\n            onPuffworkerReconnect?.();\n        }\n    });\n    beginNoComputeStartupGrace();\n    // const scriptUrl = new URL(import.meta.url);\n    // const mode = scriptUrl.searchParams.get(\"mode\");\n\n    initEvilEpoch(Date.now());\n\n    if (!testingRenderDisabled()) {\n        await ewu.preloadPortalShaders();\n    }\n\n    g_stage = new ui.Stage();\n    g_scene = new ui.Scene();\n    g_hudScene = new ui.Scene(undefined, { cameraPolicy: 'scene' });\n    g_stage.addScene(g_scene);\n    g_stage.addScene(g_hudScene);\n    g_stage.setActiveScene(g_scene);\n    g_stage.setHudScene(g_hudScene);\n    g_stage.setFullscreenSceneFactory(() => ensureFullscreenScene());\n    g_stage.setFullscreenSceneRecycleDelay(FULLSCREEN_SCENE_CACHE_MS);\n    const [docFiraCode, docNotoSansMono, docNotoSansMath, docGoogleSansRegular, docGoogleSansSemiBold] =\n        await Promise.all([...FONT_FALLBACK_NAMES, 'GoogleSans-Regular', 'GoogleSans-SemiBold']\n            .map(name => evilfont.createMSDFFont(g_scene, name)));\n    configureFontFallbacks([docGoogleSansRegular, docGoogleSansSemiBold],\n        [docFiraCode, docNotoSansMono, docNotoSansMath]);\n\n    new Director(g_scene);\n    g_rootViewport = new ui.Viewport({\n        actsAsContainer: true,\n        width: 0,\n        height: 0,\n    });\n    g_scene.root.appendChild(g_rootViewport);\n    g_scene.setRootViewport(g_rootViewport);\n    g_scene.setActiveViewport(g_rootViewport);\n    g_scene.camera = new ui.Camera({});\n    g_stage.setActiveCamera(g_scene.camera);\n    g_rootViewport.appendChild(g_scene.camera);\n    g_hudRootViewport = new ui.Viewport({\n        actsAsContainer: true,\n        width: 0,\n        height: 0,\n    });\n    g_hudScene.root.appendChild(g_hudRootViewport);\n    g_hudScene.setRootViewport(g_hudRootViewport);\n    g_hudScene.setActiveViewport(g_hudRootViewport);\n    g_hudScene.camera = new ui.ScreenCamera({ name: 'hudScreenCamera' });\n    g_hudRootViewport.appendChild(g_hudScene.camera);\n    g_hudChromeRoot = new ui.Placeholder({ name: 'hudContentRoot', z: 0 });\n    g_hudWindowRoot = new ui.Placeholder({ name: 'hudWindowRoot', z: -1000 });\n    g_hudContextMenuRoot = new ui.Placeholder({ name: 'hudContextMenuRoot', z: -3000 });\n    g_hudInfoBarRoot = new ui.Placeholder({ name: 'hudSystemRoot', z: -4000 });\n    g_hudDialogRoot = new ui.Placeholder({ name: 'hudDialogRoot', z: -4500 });\n    g_hudTooltipRoot = new ui.Placeholder({ name: 'hudTooltipRoot', z: -5000 });\n    g_hudToastRoot = new ui.Placeholder({ name: 'hudToastRoot', z: -6000 });\n    g_hudRootViewport.appendChild(g_hudChromeRoot);\n    g_hudRootViewport.appendChild(g_hudWindowRoot);\n    g_hudRootViewport.appendChild(g_hudContextMenuRoot);\n    g_hudRootViewport.appendChild(g_hudDialogRoot);\n    g_hudRootViewport.appendChild(g_hudTooltipRoot);\n    g_hudRootViewport.appendChild(g_hudToastRoot);\n    g_hudRootViewport.appendChild(g_hudInfoBarRoot);\n    g_stage.setHudMountRoot('content', g_hudChromeRoot);\n    g_stage.setHudMountRoot('window', g_hudWindowRoot);\n    g_stage.setHudMountRoot('contextMenu', g_hudContextMenuRoot);\n    g_stage.setHudMountRoot('dialog', g_hudDialogRoot);\n    g_stage.setHudMountRoot('tooltip', g_hudTooltipRoot);\n    g_stage.setHudMountRoot('toast', g_hudToastRoot);\n    g_stage.setHudMountRoot('system', g_hudInfoBarRoot);\n    if (!PORTAL_MIN_BUILD) {\n        globalThis.testingInstallFontSamples({ mountRoot: g_hudWindowRoot,\n            fonts: [docFiraCode, docGoogleSansRegular, docGoogleSansSemiBold] });\n    }\n    g_hudScene.windowMountRoot = () => g_hudWindowRoot;\n    g_hudScene.contextMenuMountRoot = () => g_hudContextMenuRoot;\n    g_hudScene.tooltipMountRoot = () => g_hudTooltipRoot;\n    g_hudScene.toastMountRoot = () => g_hudToastRoot;\n    g_hudScene.resolveToastPlacement = (spec) => resolveHudToastPlacement(spec);\n    g_stage.resolveToastPlacement = (spec) => resolveHudToastPlacement(spec);\n    g_fpsIndicatorFont = docFiraCode;\n    g_connectionInfoBar = new ui.InfoBar({\n        anchor: 'top_right',\n    });\n    g_disconnectBadge = makeDisconnectBadge(docGoogleSansRegular);\n    g_noComputeBadge = makeNoComputeBadge(docGoogleSansRegular);\n    g_connectionInfoBar.appendChild(g_disconnectBadge);\n    g_connectionInfoBar.appendChild(g_noComputeBadge);\n    g_hudInfoBarRoot.appendChild(g_connectionInfoBar);\n    /* Apply any worker-health state received before setup constructed the HUD. */\n    syncNoComputeBadge(g_noComputeBadgeDesiredVisible);\n    syncChromePresentation();\n    setDevHudEnabled(false);\n    controls = new Controls();\n\n    const startupParams = new URLSearchParams(window.location.search);\n    const fileActivityIndicator = new FileActivityIndicator({ font: docGoogleSansRegular });\n    g_hudRootViewport.appendChild(fileActivityIndicator);\n    const fileDropOverlay = new FileDropOverlay({ font: docGoogleSansRegular });\n    g_hudRootViewport.appendChild(fileDropOverlay);\n    let filesHovering = false;\n    let hoverFileCount = null;\n    let lastFileDropKey = null;\n    const syncFileDropOverlay = (allowed) => {\n        if (!filesHovering) return;\n        const path = g_directory.params.path;\n        const key = JSON.stringify([allowed, hoverFileCount, path]);\n        if (lastFileDropKey === key) return;\n        lastFileDropKey = key;\n        fileDropOverlay.show(allowed, {\n            fileCount: hoverFileCount,\n            directoryName: routeArtifactLabel(path),\n        });\n        requestMainLoop('file_drop_overlay');\n    };\n    g_directory = new Directory({\n        api:api,\n        font: docGoogleSansRegular,\n        puffbookFont: docFiraCode,\n        tableviewFont: docGoogleSansRegular,\n        tableviewHeaderFont: docGoogleSansSemiBold,\n        fontSize: 15,\n        lake: startupParams.get('lake') || 'primary',\n        branch: startupParams.get('branch') || 'main',\n        username: g_username,\n        documentScene: g_scene,\n        windowMountRoot: g_hudWindowRoot,\n        onRequestSignin: () => {\n            void beginSigninRedirect({ reason: 'auth/manual', manual: true });\n        },\n        onRequestSignout: async () => {\n            const userManager = await getUserManager();\n            await userManager.signoutRedirect();\n        },\n        onUploadAccessChange: syncFileDropOverlay,\n        onFileActivityChange: activity => {\n            fileActivityIndicator.setActivity(activity);\n            requestMainLoop('file_activity');\n        },\n        onRecordingControlInput: handleRecordingControlInput,\n        onPuffworkerRestartInput: handlePuffworkerRestartInput,\n        onTranquilityRestartInput: handleTranquilityRestartInput,\n        onPuffbookComputeAvailabilityChange: (available) => {\n            syncActivePuffbookComputeAvailability(available);\n        },\n        onRecordingPuffbookEpoch: captureActiveRecordingEpoch,\n    })\n    const directory = g_directory;\n    g_agentChat = new AgentChat({\n        font: docFiraCode,\n        onToggle: toggleAgentChat,\n        api,\n        enabled: () => g_agentChatEnabled,\n        snapshot: () => {\n            const screen = g_directory.curPuffbook;\n            return screen ? screen.assistantDocumentSnapshot() : {};\n        },\n    });\n    // Damon stays mounted; server status controls whether agent requests are available.\n    g_hudChromeRoot.appendChild(directory);\n    g_agentChat.mount(g_hudChromeRoot, agentChatBounds());\n    g_hudScene.resolveToastPlacement = (spec) => resolveHudToastPlacement(spec);\n    /* Let no-pick wheel frames land on the directory before falling through to the world camera. */\n    g_hudRootViewport.onPointerInput = (events) => directory.onPointerInput(events) === true;\n    syncConnectionInfoBar(api.state());\n    globalThis.__sceneTraversalProbe?.reset?.('post_setup');\n\n    const syncPortalStatus = async ({ refreshDirectory = true } = {}) => {\n        try {\n            const st = await api.status();\n            let username = st.data?.authentication?.username;\n            if (isLocalPortal() && username?.startsWith('user-')) {\n                username = username.substring(5);\n            }\n            g_username = username || null;\n            const groups = Array.isArray(st.data?.authentication?.groups)\n                ? st.data.authentication.groups\n                : [];\n            g_agentChatEnabled = st.data?.features?.puff_assistant === true;\n            directory.setCurrentUsername(g_username, { refresh: refreshDirectory, groups });\n            await recoverPendingRecordings();\n            syncRecordingControlAvailability();\n        } catch (err) {\n            console.warn('Could not refresh portal status metadata.', err);\n        }\n    };\n\n\n    g_liveGL = await acquireContext(api, nextGL => {\n        g_liveGL = nextGL;\n        g_gpuDrawTimer = g_liveGL ? new GpuDrawTimer(g_liveGL) : null;\n        globalThis.__eviluiGpuDrawTimer = g_gpuDrawTimer;\n    });\n    const gl = g_liveGL;\n    syncRootViewportBounds();\n    g_gpuDrawTimer = gl ? new GpuDrawTimer(gl) : null;\n    globalThis.__eviluiGpuDrawTimer = g_gpuDrawTimer;\n\n    /* prototype */\n    let routeLoadVersion = 0;\n    const classifyPath = async (path) => {\n        if (path === '') {\n            return { type: 'directory' };\n        }\n        const stat = await api.statPath({\n            lake: directory.params.lake,\n            branch: directory.params.branch,\n            path,\n        });\n        return stat?.data ?? null;\n    };\n\n    const routeTargetDiffersFromDisplayed = (cleanPath) => {\n        const normalizedTarget = cleanPath ? `/${cleanPath}` : '';\n        if (isDocumentArtifactPath(cleanPath)) {\n            return !directory.matchesCurrentOrPendingFileRef({\n                lake: directory.params.lake,\n                branch: directory.params.branch,\n                path: normalizedTarget,\n            });\n        }\n        if (directory.curPuffbook) {\n            return true;\n        }\n        return normalizedTarget !== (directory.params.path ?? null);\n    };\n\n    const routeDisconnectError = () => new Error(api.state()?.lastError?.message || 'WebSocket connection failed.');\n    \n    const loadPuffbookFromRoute = async () => {\n        const myVersion = ++routeLoadVersion;\n        const route = resolvePortalRouteTarget(getLakePathFromUrl(), g_username || directory.currentUsername);\n        const cleanPath = route.cleanPath;\n        const directDirectoryRoute = route.isDirectory;\n        const normalizedTarget = route.normalizedTarget;\n\n        if (!apiCanServeRoutes(api.state())) {\n            directory.hideRouteLoading();\n            if (!routeTargetDiffersFromDisplayed(cleanPath)) {\n                return;\n            }\n            if (!directDirectoryRoute) {\n                directory.loadUnreadableRouteArtifact(`/${cleanPath}`, routeDisconnectError());\n                return;\n            }\n            directory.loadConnectionIssue(routeDisconnectError());\n            return;\n        }\n\n        if (directDirectoryRoute) {\n            directory.hideRouteLoading();\n            directory.changeCurPath(normalizedTarget, { clearBannerOnSuccess: false });\n            directory.loadReadme();\n            directory.updateBrowserPath(normalizedTarget, { directory: true });\n            return;\n        }\n\n        // Split the path to separate the parent directory and the final segment\n        const endOfPath = route.parentPath.replace(/^\\/+/, '');\n        directory.showRouteLoading(cleanPath);\n\n        try {\n            const matchedObject = await classifyPath(cleanPath);\n            if (myVersion !== routeLoadVersion) {\n                return;\n            }\n\n            // Check if the matched object is a directory. \n            const isDirectory = matchedObject && matchedObject.type === 'directory';\n            if (isDirectory) {\n                // It's definitely a directory  \n                directory.hideRouteLoading();\n                directory.changeCurPath(`/${cleanPath}`, { clearBannerOnSuccess: false });\n                directory.loadReadme();\n                directory.updateBrowserPath(`/${cleanPath}`, { directory: true });\n            } else if (matchedObject) {\n                directory.hideRouteLoading();\n                directory.openArtifact(matchedObject, `/${cleanPath}`, { fromRoute: true });\n            } else {\n                directory.hideRouteLoading();\n                directory.loadMissingRouteArtifact(`/${cleanPath}`);\n            }\n\n        } catch (error) {\n            if (myVersion !== routeLoadVersion) {\n                return;\n            }\n            directory.hideRouteLoading();\n            console.error(\"Failed to classify route path:\", error);\n            if (error?.status === 403) {\n                directory.changeCurPath(`/${endOfPath}`, { clearBannerOnSuccess: false });\n                directory.loadForbidden(cleanPath);\n            } else if (error?.status === 404) {\n                directory.loadMissingRouteArtifact(`/${cleanPath}`);\n            } else if (isBackendUnavailableError(error)) {\n                directory.changeCurPath(`/${endOfPath}`, { clearBannerOnSuccess: false });\n                directory.loadConnectionIssue(error);\n            } else {\n                directory.changeCurPath(`/${endOfPath}`, { clearBannerOnSuccess: false });\n                directory.loadPuffbookError(routeArtifactLabel(cleanPath), error);\n            }\n        }\n    };\n\n    const syncPortalRouteBootstrap = async () => {\n        await syncPortalStatus({ refreshDirectory: false });\n        await loadPuffbookFromRoute();\n    };\n    onPuffworkerReconnect = () => void syncPortalRouteBootstrap();\n\n    const ownOffApiState = api.onStateChange((next, prev) => {\n        if (next.connection !== prev?.connection || next.auth !== prev?.auth) {\n            syncConnectionInfoBar(next);\n        }\n        const routeCapableBecameTrue = shouldBootstrapRouteAfterAPIStateChange(next, prev);\n        if (routeCapableBecameTrue) {\n            const route = resolvePortalRouteTarget(getLakePathFromUrl(), g_username || directory.currentUsername);\n            if (prev.auth !== 'renewing' || routeTargetDiffersFromDisplayed(route.cleanPath)) {\n                void syncPortalRouteBootstrap();\n            }\n        }\n    });\n    if (apiCanServeRoutes(api.state())) {\n        void syncPortalRouteBootstrap();\n    } else {\n        void loadPuffbookFromRoute();\n    }\n\n\n    /* Input stuff */\n    let canvas = document.getElementById('back');\n    g_canvas = canvas;\n    installFileDrop({\n        target: window,\n        canUpload: () => directory.canUploadFiles,\n        onHover: (hovering, fileCount = null) => {\n            const wasHovering = filesHovering;\n            filesHovering = hovering;\n            hoverFileCount = fileCount;\n            if (hovering) {\n                syncFileDropOverlay(directory.canUploadFiles);\n                if (!wasHovering && !directory.canUploadFiles) void directory.refreshUploadAccess();\n            } else if (wasHovering) {\n                lastFileDropKey = null;\n                fileDropOverlay.setVisibility(false);\n                requestMainLoop('file_drop_clear');\n            }\n        },\n        onDrop: (files) => {\n            const [, height] = g_hudScene.camera.getViewportSize();\n            g_hudToastRoot.appendChild(new ui.Toast({\n                text: 'Starting Upload', wrapText: false,\n                font: docGoogleSansRegular, fontSize: 18,\n                x: 16, y: Math.max(16, height - 144), z: -4,\n                color: [0.92, 0.92, 0.88, 0.98],\n                fontColor: [0.16, 0.16, 0.16, 1],\n            }));\n            requestMainLoop('upload_start_toast');\n            return directory.uploadFiles(files);\n        },\n        onError: (err) => directory.showUploadError(err),\n    });\n    installFocusAccessibility(canvas);\n    installFrameRequester(requestMainLoop);\n    Mouse.bindCanvas(canvas);\n    installPortalReplayBridge();\n    \n    canvas.addEventListener('mousedown', function (e) {\n        const seq = g_inputRecorder?.noteMouseDown(e, canvas);\n        if (Number.isInteger(seq)) g_pendingRecordingPointerContexts.push({ seq, kind: 'mouse_down' });\n        onMouseDown(canvas, e);\n    });\n    window.addEventListener('mouseup', function (e) {\n        const seq = g_inputRecorder?.noteMouseUp(e, canvas, { returnSequence: true });\n        if (Number.isInteger(seq)) g_pendingRecordingPointerContexts.push({ seq, kind: 'mouse_up' });\n        onMouseUp(canvas, e);\n    });\n    document.addEventListener('mouseleave',  function (e) {\n        g_inputRecorder?.record('document_mouse_leave', snapshotMouseEvent(e, canvas), { role: 'boundary' });\n        Mouse.leave();\n        onMouseUp(canvas, {button: -1})\n        requestMainLoop('mouse_leave');\n    });\n    canvas.addEventListener('dblclick', function (e) {\n        const seq = g_inputRecorder?.record('double_click', snapshotMouseEvent(e, canvas), { role: 'derived_intent' });\n        if (Number.isInteger(seq)) g_pendingRecordingPointerContexts.push({ seq, kind: 'double_click' });\n        onMouseDBLclick(e)\n    });\n    // Added to block browser defaults on right click.\n    window.addEventListener('contextmenu', (e) => {\n        if (browserOwnsInput(g_canvas, e)) {\n            return;\n        }\n        e.preventDefault();\n    });\n    canvas.addEventListener('mousemove', function (e) {\n        g_inputRecorder?.noteMouseMove(e, canvas);\n        onMouseMove(canvas, e);\n        e.preventDefault();\n        e.stopPropagation();\n    });\n    canvas.addEventListener('wheel', function (e) {\n        g_inputRecorder?.flushMouseMove();\n        g_inputRecorder?.record('wheel', snapshotWheelEvent(e, canvas));\n        e.preventDefault();\n        onMouseScroll(e);\n    }, { passive: false });\n    \n    canvas.addEventListener('pointerdown', (event) => {\n        if (event.pointerType === 'pen') {\n            g_inputRecorder?.record('pen_down', snapshotMouseEvent(event, canvas));\n            controls.activeEvents.add('L_MOUSE_DOWN');\n        }\n    });\n    window.addEventListener('pointerup', (event) => {\n        if (event.pointerType === 'pen') {\n            g_inputRecorder?.record('pen_up', snapshotMouseEvent(event, canvas));\n            Mouse.setButtonDown(0, false);\n            controls.activeEvents.add('L_MOUSE_UP');\n            requestMainLoop('pen_up');\n        }\n    });\n    window.addEventListener('pointercancel', (event) => {\n        if (event.pointerType === 'pen') {\n            g_inputRecorder?.record('pen_cancel', snapshotMouseEvent(event, canvas), { role: 'boundary' });\n            releaseAllMouseButtons();\n            requestMainLoop('pen_cancel');\n        }\n    });\n    window.addEventListener('blur', () => {\n        ui.cancelFocusedActivation();\n        g_inputRecorder?.noteInputReset('window_blur');\n        g_stage?.activeDialog?.dismiss('focus_lost');\n        releaseAllMouseButtons();\n        requestMainLoop('window_blur');\n    });\n    let lastDocumentVisibilityState = document.visibilityState;\n    document.addEventListener('visibilitychange', () => {\n        const visibilityState = document.visibilityState;\n        if (visibilityState === lastDocumentVisibilityState) {\n            return;\n        }\n        lastDocumentVisibilityState = visibilityState;\n        if (visibilityState === 'hidden') {\n            g_inputRecorder?.noteInputReset('visibility_hidden');\n            g_stage?.activeDialog?.dismiss('focus_lost');\n            syncConnectionInfoBar(api.state());\n            releaseAllMouseButtons();\n            suspendPresenter('document_hidden');\n            return;\n        }\n        g_inputRecorder?.record('visibility_visible', {}, { role: 'boundary' });\n        syncConnectionInfoBar(api.state());\n        requestMainLoop('document_visible');\n    });\n    canvas.addEventListener('pointermove', (event) => {\n        if (event.pointerType === 'pen') {\n            g_inputRecorder?.record('pen_move', snapshotMouseEvent(event, canvas));\n            onMouseMove(canvas, event);\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    });\n    window.addEventListener('resize', () => {\n        g_inputRecorder?.record('window_resize', {\n            width: window.innerWidth,\n            height: window.innerHeight,\n            device_pixel_ratio: window.devicePixelRatio,\n            canvas_rect: safeSnapshotRect(canvas),\n        }, { role: 'boundary' });\n        requestMainLoop('window_resize');\n    });\n    document.addEventListener('pointerlockchange', () => {\n        g_inputRecorder?.record('pointer_lock_change', {\n            locked_to_canvas: document.pointerLockElement === canvas,\n        }, { role: 'boundary' });\n    });\n\n    document.addEventListener('paste', (event) => {\n        const data = event.clipboardData.getData('text');\n        if (!browserOwnsInput(canvas, event)) {\n            g_inputRecorder?.record('paste', { clipboard_text: data }, { role: 'derived_intent' });\n        }\n        currentFocusScene()?.sendKeyDown({key : \"paste\", clipboardData:data });\n        event.preventDefault(); \n        requestMainLoop('paste');\n    });\n\n    document.addEventListener('copy', (event) => {\n        if (!browserOwnsInput(canvas, event)) {\n            g_inputRecorder?.record('copy', {}, { role: 'derived_intent' });\n        }\n        currentFocusScene()?.sendKeyDown({key : \"copy\", writeClipboard: text => event.clipboardData.setData(\"text/plain\", text)});\n        event.preventDefault(); \n        requestMainLoop('copy');\n    });\n\n    document.addEventListener('cut', (event) => {\n        if (!browserOwnsInput(canvas, event)) {\n            g_inputRecorder?.record('cut', {}, { role: 'derived_intent' });\n        }\n        currentFocusScene()?.sendKeyDown({key : \"cut\", writeClipboard: text => event.clipboardData.setData(\"text/plain\", text)});\n        event.preventDefault(); \n        requestMainLoop('cut');\n    });\n\n    // Keep Damon available from F1 regardless of which input currently has focus.\n    window.addEventListener('keydown', event => {\n        if (event.key !== 'F1') return;\n        g_inputRecorder?.noteKeyDown(event);\n        if (!event.repeat) toggleAgentChat();\n        event.stopPropagation();\n        event.preventDefault();\n    }, { capture: true });\n\n    window.addEventListener('keydown', function (event) {\n        return withPortalTimingScope('portal.window_keydown', {\n            key: event?.key ?? null,\n            ctrl_key: event?.ctrlKey === true,\n            meta_key: event?.metaKey === true,\n            shift_key: event?.shiftKey === true,\n            alt_key: event?.altKey === true,\n            repeat: event?.repeat === true,\n        }, () => {\n            // Find targets the open Puffbook, independently of the focus stack.\n            if ((event.ctrlKey || event.metaKey) && !event.altKey && !event.shiftKey\n                && event.key?.toLowerCase() === 'f') {\n                event.stopPropagation();\n                event.preventDefault();\n                g_inputRecorder?.noteKeyDown(event);\n                if (!event.isComposing) {\n                    g_directory?.curPuffbook?.getDocumentView().openFindDialog({ repeat: event.repeat });\n                }\n                requestMainLoop('find_shortcut');\n                return;\n            }\n\n            if (browserOwnsInput(g_canvas, event)) {\n                return;\n            }\n            if (event.isComposing) return;\n\n            if (event.key === 'F5') {\n                return;\n            }\n\n            if (handlePortalShortcut(event, {\n                recording_toggle: toggleRecordingFromShortcut,\n            })) {\n                event.stopPropagation();\n                event.preventDefault();\n                return;\n            }\n\n            g_inputRecorder?.noteKeyDown(event);\n\n            if (event.key === 'F10') {\n                if (!event.repeat) {\n                    toggleDevHud();\n                }\n                event.stopPropagation();\n                event.preventDefault();\n                return;\n            }\n\n            if (!currentFocusScene()) {\n                return;\n            }\n\n            if (!event.altKey) {\n                if (event.shiftKey && !event.ctrlKey) {\n                    if (event.key === 'Insert') {\n                        // Shift-Ins: Alternative \"paste\" instruction\n                        event.preventDefault();\n                        document.execCommand('paste');\n                        return;\n                    } else if (event.key === 'Delete') {\n                        // Shift-Del: Alternative \"cut\" instruction\n                        event.preventDefault();\n                        document.execCommand('cut');\n                        return;\n                    }\n                } else if (!event.shiftKey && event.ctrlKey) {\n                    if (event.key === 'Insert') {\n                        // Ctrl-Ins: Alternative \"copy\" instruction\n                        event.preventDefault();\n                        document.execCommand('copy');\n                        return;\n                    }\n                }\n            }\n\n            // Pass the key input. Shortcut events are consumed only when the\n            // focused scene actually handles them, so native browser undo does\n            // not race the document's predicted-state history.\n            controls.activeEvents.add(event.key?.toString().toLowerCase());\n            const handled = currentFocusScene().sendKeyDown(event); //deprecate this\n\n            if (handled || (!event.ctrlKey && !event.metaKey)) {\n                event.stopPropagation();\n                event.preventDefault();\n            }\n            requestMainLoop('key_down');\n        });\n    });\n    window.addEventListener('keyup', function (event) {\n        g_inputRecorder?.noteKeyUp(event);\n        if (!browserOwnsInput(g_canvas, event) && ui.dispatchFocusedKeyUp(event)) {\n            event.preventDefault();\n            event.stopPropagation();\n            requestMainLoop('control_key_up');\n        }\n    });\n    window.addEventListener('beforeinput', function (event) {\n        const recordInput = !browserOwnsInput(canvas, event);\n        const atMs = recordInput ? performance.now() : null;\n        const input = recordInput ? snapshotBeforeInputEvent(event) : null;\n        const scene = currentFocusScene();\n        const handled = scene?.sendBeforeInput?.(event) === true;\n        if (recordInput && handled) {\n            g_inputRecorder?.record('before_input', { ...input, handled: true }, {\n                role: 'derived_intent',\n                atMs,\n            });\n        }\n        if (handled) {\n            event.preventDefault();\n        }\n    });\n    for (const eventName of ['compositionstart', 'compositionupdate', 'compositionend']) {\n        window.addEventListener(eventName, function (event) {\n            ui.currentFocusContainer()?.onCompositionEvent?.(event);\n            if (!browserOwnsInput(canvas, event)) {\n                g_inputRecorder?.record(eventName, snapshotCompositionEvent(event), { role: 'derived_intent' });\n            }\n        });\n    }\n\n    requestMainLoop('setup');\n}\n\nfunction updateControls() {\n    if (controls) {\n        if (controls.activeEvents.has('L_MOUSE_DOWN')) {\n            Mouse.setButtonDown(0, true);\n        } else if (Mouse.leftDown) {\n            controls.activeEvents.add('L_MOUSE_DOWN_HOLD')\n        }\n        if (controls.activeEvents.has('R_MOUSE_DOWN')) {\n            Mouse.setButtonDown(2, true);\n        } else if (Mouse.rightDown) {\n            controls.activeEvents.add('R_MOUSE_DOWN_HOLD')\n        }\n    }\n}\n\n \nfunction cleanupControls() {\n    controls.clearFrame()\n}\n\nfunction onMouseDown(canvas, event) {\n    if (event.ctrlKey || event.metaKey) controls.activeEvents.add('CTRL_KEY');\n    if (event.altKey) controls.activeEvents.add('ALT_KEY');\n    if (event.shiftKey) controls.activeEvents.add('SHIFT_KEY');\n    if (Number.isFinite(event?.clientX) && Number.isFinite(event?.clientY)) {\n        Mouse.handleMouseMove(canvas, event);\n    }\n    if (event.button === 0 && !Mouse.leftDown) {\n        controls.activeEvents.add('L_MOUSE_DOWN');\n    } else if (event.button === 2 && !Mouse.rightDown) {\n        controls.activeEvents.add('R_MOUSE_DOWN');\n    }\n    if (event?.detail === 3 && event.button === 0) {\n        // Browsers report the third press through MouseEvent.detail but do not\n        // provide a native triple-click event.\n        controls.activeEvents.add('TRIPLE_CLICK');\n    }\n    requestMainLoop('mouse_down');\n}\n\nfunction onMouseUp(canvas, event) {\n    if (Number.isFinite(event?.clientX) && Number.isFinite(event?.clientY)) {\n        Mouse.handleMouseMove(canvas, event);\n    }\n    if (event.button === 0) {\n        Mouse.setButtonDown(0, false);\n        controls.activeEvents.add('L_MOUSE_UP');\n    }\n    if (event.button === 2) {\n        Mouse.setButtonDown(2, false);\n        controls.activeEvents.add('R_MOUSE_UP');\n    }\n    if(event.button === -1){\n        if(Mouse.leftDown){\n            Mouse.setButtonDown(0, false);\n            controls.activeEvents.add('L_MOUSE_UP');\n        }\n        if(Mouse.rightDown){\n            Mouse.setButtonDown(2, false);\n            controls.activeEvents.add('R_MOUSE_UP');\n        }\n        ui.currentFocusContainer()?.noteRetainedPointerActivity?.();\n    }\n    requestMainLoop('mouse_up');\n}\n\n/* Force-release any retained mouse buttons when the browser drops the pointer outside canvas ownership. */\nfunction releaseAllMouseButtons() {\n    onMouseUp(g_canvas, { button: -1 });\n}\n\nfunction onMouseDBLclick(event){\n    if (event.altKey) controls.activeEvents.add('ALT_KEY');\n    if (event.shiftKey) controls.activeEvents.add('SHIFT_KEY');\n    if (Number.isFinite(event?.clientX) && Number.isFinite(event?.clientY)) {\n        Mouse.handleMouseMove(g_canvas, event);\n    }\n    controls.activeEvents.add('DOUBLE_CLICK');\n    requestMainLoop('double_click');\n}\n\nfunction onMouseMove(canvas, event) {\n    Mouse.handleMouseMove(canvas, event);\n    requestMainLoop('mouse_move');\n}\n\nfunction onMouseScroll(event) {\n    const scrollX = event.deltaX;\n    const scrollY = event.deltaY;\n    const zoomKey = event.ctrlKey || event.metaKey\n    const shiftKey = event.shiftKey\n    const pixelWheel = event.deltaMode === WheelEvent.DOM_DELTA_PIXEL;\n    if (controls) {\n        if (zoomKey) {\n            controls.activeEvents.add('CTRL_KEY');\n        }\n        if (shiftKey) {\n            controls.activeEvents.add('SHIFT_KEY');\n        }\n        if (event.altKey) {\n            controls.activeEvents.add('ALT_KEY');\n        }\n        controls.noteWheel(event.deltaX, event.deltaY, event.deltaMode);\n        if (scrollY > 0) {\n            controls.activeEvents.add(pixelWheel ? 'SCROLL_DOWN_PIXEL' : 'SCROLL_DOWN');\n        } else if (scrollY < 0) {\n            controls.activeEvents.add(pixelWheel ? 'SCROLL_UP_PIXEL' : 'SCROLL_UP');\n        }\n        if (scrollX > 0) {\n            controls.activeEvents.add(pixelWheel ? 'SCROLL_RIGHT_PIXEL' : 'SCROLL_RIGHT');\n        } else if (scrollX < 0) {\n            controls.activeEvents.add(pixelWheel ? 'SCROLL_LEFT_PIXEL' : 'SCROLL_LEFT');\n        }\n    }\n    requestMainLoop('mouse_scroll');\n}\n\n// Redirect before auth/API startup so root mounts land on the same route\n// shape as user-driven directory navigation.\nfunction redirectPortalRoute() {\n    const url = new URL(window.location.href);\n    const currentPath = `${url.pathname}${url.search}${url.hash}`;\n    const path = portalReturnPath(url);\n    if (path === currentPath) {\n        return false;\n    }\n    window.location.replace(new URL(path, window.location.origin).href);\n    return true;\n}\n\n/* Extract one lake-local route path from the current browser location. */\nfunction getLakePathFromUrl() {\n    const lakeRoute = splitPortalLakeRoute(window.location.pathname);\n    // Keep route canonicalisation percent-encoded, but decode spaces before\n    // using the path in backend artifact lookups.\n    return lakeRoute ? lakeRoute.lakePath.replace(/%20/gi, ' ') || null : null;\n}\n\n/* Kick off interactive sign-in with optional caller-owned state/query overlays. */\nfunction buildSigninRedirectRequest({\n    reason = null,\n    returnTo = null,\n    statePatch = null,\n    extraQueryParams = null,\n} = {}) {\n    // OIDC stores an absolute URL, so rewrite bare root before handoff.\n    const returnURL = returnTo ? new URL(returnTo, window.location.origin) : new URL(window.location.href);\n    if (returnURL.pathname === '/' && !returnURL.search && !returnURL.hash) {\n        returnURL.pathname = DEFAULT_PORTAL_RETURN_PATH;\n    }\n    const request = {\n        state: {\n            return_to: returnURL.href,\n            reason,\n        },\n    };\n    if (statePatch !== null) {\n        if (typeof statePatch !== 'object' || Array.isArray(statePatch)) {\n            throw new Error('signin redirect statePatch must be a plain object when provided.');\n        }\n        request.state = {\n            ...request.state,\n            ...statePatch,\n        };\n    }\n    if (extraQueryParams !== null) {\n        if (typeof extraQueryParams !== 'object' || Array.isArray(extraQueryParams)) {\n            throw new Error('signin redirect extraQueryParams must be a plain object when provided.');\n        }\n        if (Object.keys(extraQueryParams).length > 0) {\n            request.extraQueryParams = extraQueryParams;\n        }\n    }\n    return request;\n}\n\n/* Build one interactive sign-in URL without navigating, while preserving callback state payload. */\nasync function buildSigninRedirectURL(opts = {}) {\n    const userManager = await getUserManager();\n    const request = buildSigninRedirectRequest(opts);\n    let signin = null;\n    if (typeof userManager?.createSigninRequest === 'function') {\n        signin = await userManager.createSigninRequest(request);\n    } else if (typeof userManager?._client?.createSigninRequest === 'function') {\n        // oidc-client-ts v3 keeps request creation on the internal client object.\n        signin = await userManager._client.createSigninRequest(request);\n    } else {\n        throw new Error('Could not build sign-in redirect URL: unsupported OIDC client version.');\n    }\n    const href = typeof signin?.url === 'string' ? signin.url.trim() : '';\n    if (href === '') {\n        throw new Error('Could not build sign-in redirect URL.');\n    }\n    return href;\n}\n\n/* Kick off interactive sign-in with optional caller-owned state/query overlays. */\nasync function beginSigninRedirect({\n    reason = null,\n    manual = false,\n    returnTo = null,\n    statePatch = null,\n    extraQueryParams = null,\n} = {}) {\n    if (g_authRedirectInFlight) {\n        return false;\n    }\n    const backoffMs = authRedirectBackoffRemainingMs(window.sessionStorage, Date.now());\n    if (!manual && backoffMs > 0) {\n        console.warn(`Suppressing automatic sign-in redirect for ${backoffMs}ms due to auth backoff.`);\n        return false;\n    }\n    g_authRedirectInFlight = true;\n\n    try {\n        noteAuthRedirectAttempt(window.sessionStorage, Date.now());\n        const userManager = await getUserManager();\n        const request = buildSigninRedirectRequest({\n            reason,\n            returnTo,\n            statePatch,\n            extraQueryParams,\n        });\n        await userManager.signinRedirect(request);\n        return true;\n    } catch (err) {\n        g_authRedirectInFlight = false;\n        console.error(\"Could not start interactive sign-in redirect.\", err);\n        return false;\n    }\n}\n\n/* Render one fail-fast startup overlay so pre-UI boot failures do not degrade to a blank screen. */\nfunction showStartupErrorOverlay(err) {\n    if (typeof document === 'undefined' || !document.body) {\n        return;\n    }\n    const detail = `${err?.detail || err?.message || err || ''}`.trim();\n    document.body.innerHTML = '';\n    const root = document.createElement('div');\n    root.style.position = 'fixed';\n    root.style.inset = '0';\n    root.style.display = 'flex';\n    root.style.flexDirection = 'column';\n    root.style.justifyContent = 'center';\n    root.style.alignItems = 'center';\n    root.style.padding = '32px';\n    root.style.background = '#0f1824';\n    root.style.color = '#ffffff';\n    root.style.fontFamily = 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n    root.style.textAlign = 'center';\n    root.style.overflow = 'auto';\n\n    const card = document.createElement('div');\n    card.style.width = 'min(920px, 100%)';\n    card.style.padding = '20px 24px';\n    card.style.borderRadius = '10px';\n    card.style.border = '1px solid rgba(255, 255, 255, 0.24)';\n    card.style.background = 'rgba(0, 0, 0, 0.42)';\n    card.style.boxShadow = '0 10px 30px rgba(0, 0, 0, 0.36)';\n\n    const title = document.createElement('div');\n    title.textContent = 'Portal startup failed';\n    title.style.fontSize = '24px';\n    title.style.fontWeight = '600';\n    title.style.color = '#ffffff';\n    title.style.background = 'transparent';\n    title.style.display = 'block';\n    card.appendChild(title);\n\n    if (detail) {\n        const subtitle = document.createElement('div');\n        subtitle.textContent = detail;\n        subtitle.style.marginTop = '14px';\n        subtitle.style.maxWidth = '860px';\n        subtitle.style.fontSize = '20px';\n        subtitle.style.fontWeight = '400';\n        subtitle.style.lineHeight = '1.5';\n        subtitle.style.color = '#f3f7ff';\n        subtitle.style.background = 'transparent';\n        subtitle.style.display = 'block';\n        subtitle.style.wordBreak = 'break-word';\n        card.appendChild(subtitle);\n    }\n\n    root.appendChild(card);\n    document.body.appendChild(root);\n}\n\n/* Reload this tab when another portal tab requests forced invite re-authentication. */\nfunction installForcedInviteReauthListener(win = globalThis.window) {\n    if (!win || typeof win.addEventListener !== 'function') {\n        return;\n    }\n    win.addEventListener('storage', (event) => {\n        if (event.storageArea !== win.localStorage) {\n            return;\n        }\n        if (event.key !== INVITE_FORCE_REAUTH_BROADCAST_KEY) {\n            return;\n        }\n        if (typeof event.newValue !== 'string' || event.newValue.trim() === '') {\n            return;\n        }\n        win.sessionStorage?.setItem(INVITE_FORCE_LOGIN_ONCE_KEY, '1');\n        clearAuthRedirectBackoff(win.sessionStorage);\n        clearCallbackRetryUsed(win.sessionStorage);\n        win.location.reload();\n    });\n}\n\n/* Consume one one-shot force-login marker set by invite mismatch reauth broadcasts. */\nfunction consumeInviteForceLoginOnce(storage = globalThis.window?.sessionStorage) {\n    if (!storage) {\n        return false;\n    }\n    const marked = storage.getItem(INVITE_FORCE_LOGIN_ONCE_KEY) === '1';\n    if (marked) {\n        storage.removeItem(INVITE_FORCE_LOGIN_ONCE_KEY);\n    }\n    return marked;\n}\n\n/* Bootstrap auth/callback/invite routing first, then connect the steady-state API session. */\nasync function main() {\n    if (redirectPortalRoute()) {\n        return;\n    }\n    await installPerformanceTracker();\n\n    let isLocal = isLocalPortal();\n\n    let user = null;\n    if (!isLocal) {\n        //Handle OIDC callback FIRST\n        if (window.location.pathname === \"/authcallback\") {\n            try {\n                const userManager = await getUserManager();\n                const callback = await userManager.signinRedirectCallback();\n                await maybeConsumeCallbackInvite(callback);\n                clearAuthRedirectBackoff(window.sessionStorage);\n                clearCallbackRetryUsed(window.sessionStorage);\n                window.location.replace(callbackReturnPath(callback?.state, window.location.origin));\n                return;\n            } catch (err) {\n                console.error(\"OIDC callback failed\", err);\n                if (isMissingOidcStateError(err) && !callbackRetryAlreadyUsed(window.sessionStorage)) {\n                    try {\n                        markCallbackRetryUsed(window.sessionStorage);\n                        const userManager = await getUserManager();\n                        const returnURL = new URL(DEFAULT_PORTAL_RETURN_PATH, window.location.origin);\n                        await userManager.signinRedirect({\n                            state: {\n                                return_to: returnURL.href,\n                                reason: 'auth/callback_missing_state',\n                            },\n                        });\n                        return;\n                    } catch (retryErr) {\n                        console.error('Could not restart sign-in after missing callback state.', retryErr);\n                    }\n                }\n                if (isMissingOidcStateError(err)) {\n                    document.body.innerHTML = '<p>Please open the <a href=\"/\">portal home page</a> in this same browser window and sign in again.</p>';\n                } else {\n                    const detail = err?.message || String(err);\n                    document.body.innerText = `Authentication failed. ${detail}`;\n                }\n                return;\n            }\n        }\n\n        try {\n            user = await getCurrentUser();\n            if (user && !user.expired) {\n                logWhoami(user, 'startup');\n            }\n        } catch (err) {\n            console.warn('Could not read current OIDC user during portal startup.', err);\n        }\n        if (await maybeHandleInviteRoute({\n            pathname: window.location.pathname,\n            origin: window.location.origin,\n            user,\n            defaultReturnPath: DEFAULT_PORTAL_RETURN_PATH,\n            beginSigninRedirect,\n            buildSigninRedirectURL,\n            replaceLocation: (href) => window.location.replace(href),\n        })) {\n            return;\n        }\n        if (user && !user.expired) {\n            try {\n                await maybeConsumePendingInvite(user.access_token || '');\n            } catch (err) {\n                console.warn('Could not consume pending invite token during startup.', err);\n            }\n            clearAuthRedirectBackoff(window.sessionStorage);\n        } else {\n            const forceLoginOnce = consumeInviteForceLoginOnce(window.sessionStorage);\n            if (!user || forceLoginOnce) {\n                const redirected = await beginSigninRedirect({\n                    reason: forceLoginOnce ? 'invite/wrong_principal' : 'auth/initial',\n                    manual: forceLoginOnce,\n                    extraQueryParams: forceLoginOnce ? { prompt: 'login' } : null,\n                });\n                if (redirected) {\n                    return;\n                }\n            }\n        }\n    }\n\n    const api = await connectTranquility(user);\n    bindBrowserDiagnosticAPI(api);\n    await setup(api);\n}\n\ninstallGlobalBrowserDiagnosticReporters();\ninstallForcedInviteReauthListener();\n\nmain().catch((err) => {\n    console.error('Portal startup failed.', err);\n    showStartupErrorOverlay(err);\n});\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { currentFocusTarget, onFocusStackChange } from './focus-manager.mjs';\n\n/* A DOM projection of the current canvas control, never a second focus owner.\n * InputCell and native form semantics remain on their existing routes. */\nexport function installFocusAccessibility(canvas) {\n    const doc = canvas.ownerDocument;\n    const proxy = doc.createElement('span');\n    proxy.id = `${canvas.id}-focused-control`;\n    canvas.appendChild(proxy);\n    canvas.tabIndex = 0;\n    const previousRole = canvas.getAttribute('role');\n    const sync = () => {\n        const target = currentFocusTarget();\n        for (const name of ['role', 'aria-label', 'aria-checked', 'aria-current', 'aria-disabled', 'aria-description']) {\n            proxy.removeAttribute(name);\n        }\n        if (target?.focusTargetKind !== 'control') {\n            canvas.removeAttribute('aria-activedescendant');\n            if (previousRole === null) canvas.removeAttribute('role');\n            else canvas.setAttribute('role', previousRole);\n            proxy.hidden = true;\n            return;\n        }\n        const semantics = target.focusSemantics();\n        proxy.hidden = false;\n        proxy.setAttribute('role', semantics.role);\n        proxy.setAttribute('aria-label', semantics.name);\n        proxy.setAttribute('aria-disabled', String(semantics.disabled));\n        if (semantics.checked !== undefined) proxy.setAttribute('aria-checked', String(semantics.checked));\n        if (semantics.selected) proxy.setAttribute('aria-current', 'true');\n        if (semantics.description) proxy.setAttribute('aria-description', semantics.description);\n        canvas.setAttribute('role', 'application');\n        canvas.setAttribute('aria-activedescendant', proxy.id);\n        if (!doc.activeElement || doc.activeElement === doc.body || doc.activeElement === canvas) {\n            canvas.focus({ preventScroll: true });\n        }\n    };\n    const unsubscribe = onFocusStackChange(sync);\n    sync();\n    return () => {\n        unsubscribe();\n        proxy.remove();\n        canvas.removeAttribute('aria-activedescendant');\n        if (previousRole === null) canvas.removeAttribute('role');\n        else canvas.setAttribute('role', previousRole);\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/*\n * Portal shortcut glossary\n * ------------------------\n * Keep application-wide shortcuts in this table so future additions have one\n * reviewable home. Feature modules remain responsible for deciding whether an\n * action is currently allowed; a matching chord is consumed only when its\n * handler returns true.\n *\n * Use KeyboardEvent.code for letter shortcuts. This keeps the physical chord\n * stable across keyboard layouts and avoids depending on a shifted key value.\n * Exact modifier checks are intentional: adding Shift or Meta must not trigger\n * a nearby command accidentally.\n */\nexport const SHORTCUT_GLOSSARY = Object.freeze([\n    Object.freeze({\n        id: 'recording_toggle',\n        chord: 'Ctrl+Alt+S',\n        description: 'Start a Portal recording, or end and save the active recording.',\n        code: 'KeyS',\n        ctrl: true,\n        alt: true,\n        shift: false,\n        meta: false,\n    }),\n]);\n\nexport function shortcutChord(id) {\n    return SHORTCUT_GLOSSARY.find((shortcut) => shortcut.id === id)?.chord ?? null;\n}\n\nfunction matchesShortcut(event, shortcut) {\n    return event?.code === shortcut.code\n        && event.ctrlKey === shortcut.ctrl\n        && event.altKey === shortcut.alt\n        && event.shiftKey === shortcut.shift\n        && event.metaKey === shortcut.meta;\n}\n\n/*\n * Return true only when a shortcut both matches and executes. Repeats,\n * composition events, already-consumed events, and unavailable actions pass\n * through untouched so text input and browser behavior remain authoritative.\n */\nexport function handlePortalShortcut(event, handlers = {}) {\n    if (!event || event.defaultPrevented || event.repeat || event.isComposing) {\n        return false;\n    }\n    for (const shortcut of SHORTCUT_GLOSSARY) {\n        if (!matchesShortcut(event, shortcut)) continue;\n        const handler = handlers[shortcut.id];\n        return typeof handler === 'function' && handler() === true;\n    }\n    return false;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst VERSION_STORAGE_KEY = 'portal.appVersion';\nconst HARD_RELOAD_STORAGE_KEY = 'portal.pendingHardReload';\n\nfunction safeStorage(kind) {\n    if (typeof window === 'undefined') {\n        return null;\n    }\n    try {\n        return window[kind] ?? null;\n    } catch (_err) {\n        return null;\n    }\n}\n\nasync function clearAllCaches() {\n    if (typeof window === 'undefined' || !('caches' in window)) {\n        return;\n    }\n    try {\n        const keys = await window.caches.keys();\n        await Promise.all(keys.map((key) => window.caches.delete(key).catch(() => false)));\n    } catch (err) {\n        console.warn('portal: failed clearing CacheStorage', err);\n    }\n}\n\nasync function unregisterServiceWorkers() {\n    if (typeof navigator === 'undefined' || !navigator.serviceWorker?.getRegistrations) {\n        return;\n    }\n    try {\n        const registrations = await navigator.serviceWorker.getRegistrations();\n        await Promise.all(registrations.map((registration) => registration.unregister().catch(() => false)));\n    } catch (err) {\n        console.warn('portal: failed unregistering service workers', err);\n    }\n}\n\nfunction rememberVersion(value) {\n    const storage = safeStorage('localStorage');\n    if (!storage) {\n        return false;\n    }\n    try {\n        storage.setItem(VERSION_STORAGE_KEY, value);\n        return true;\n    } catch (err) {\n        console.warn('portal: unable to persist app version', err);\n        return false;\n    }\n}\n\nfunction storedVersion() {\n    const storage = safeStorage('localStorage');\n    if (!storage) {\n        return null;\n    }\n    try {\n        return storage.getItem(VERSION_STORAGE_KEY);\n    } catch (_err) {\n        return null;\n    }\n}\n\nasync function purgeForNewVersion() {\n    await Promise.all([\n        clearAllCaches(),\n        unregisterServiceWorkers(),\n    ]);\n    const session = safeStorage('sessionStorage');\n    try {\n        session?.clear?.();\n    } catch (err) {\n        console.warn('portal: failed clearing sessionStorage', err);\n    }\n}\n\nfunction pendingHardReloadVersion() {\n    const storage = safeStorage('sessionStorage');\n    if (!storage) {\n        return null;\n    }\n    try {\n        return storage.getItem(HARD_RELOAD_STORAGE_KEY);\n    } catch (err) {\n        console.warn('portal: unable to read hard reload marker', err);\n        return null;\n    }\n}\n\nfunction clearPendingHardReload() {\n    const storage = safeStorage('sessionStorage');\n    if (!storage) {\n        return;\n    }\n    try {\n        storage.removeItem(HARD_RELOAD_STORAGE_KEY);\n    } catch (err) {\n        console.warn('portal: unable to clear hard reload marker', err);\n    }\n}\n\nfunction requestHardReload(version, storage = safeStorage('sessionStorage')) {\n    if (typeof window === 'undefined') {\n        return false;\n    }\n    let markerSet = false;\n    if (!storage) {\n        console.warn('portal: sessionStorage unavailable, proceeding with hard reload without marker');\n    } else {\n        try {\n            storage.setItem(HARD_RELOAD_STORAGE_KEY, version);\n            markerSet = true;\n        } catch (err) {\n            console.warn('portal: unable to persist hard reload marker', err);\n        }\n    }\n    console.info('portal: requesting hard reload for new version', { version, markerSet });\n    window.location.reload();\n    return true;\n}\n\nexport async function ensurePortalVersion(appVersion) {\n    if (typeof window === 'undefined') {\n        return true;\n    }\n    if (appVersion === null || appVersion === undefined || appVersion === '') {\n        throw new Error('portal: app version missing from bootstrap metadata.');\n    }\n\n    const pendingReload = pendingHardReloadVersion();\n    if (pendingReload !== null) {\n        clearPendingHardReload();\n        if (pendingReload === appVersion) {\n            console.info('portal: completed hard reload for version', appVersion);\n        } else {\n            console.info('portal: cleared stale hard reload marker', { pending: pendingReload, current: appVersion });\n        }\n    }\n\n    const navigationEntry = (() => {\n        const navEntries = performance?.getEntriesByType?.('navigation');\n        if (navEntries && navEntries.length > 0) {\n            return navEntries[0];\n        }\n        const legacyNav = performance?.navigation;\n        if (legacyNav && legacyNav.type === performance.navigation.TYPE_RELOAD) {\n            return legacyNav;\n        }\n        return null;\n    })();\n    if (navigationEntry && (navigationEntry.type === 'reload' || navigationEntry.type === performance?.navigation?.TYPE_RELOAD)) {\n        console.info('portal: detected reload navigation', navigationEntry.toJSON?.() ?? navigationEntry);\n    }\n\n    const previous = storedVersion();\n    const reloadStorage = safeStorage('sessionStorage');\n    if (previous !== appVersion) {\n        console.info('portal: detected version change', { previous, next: appVersion });\n        await purgeForNewVersion();\n        const versionPersisted = rememberVersion(appVersion);\n        if ((versionPersisted || reloadStorage) && requestHardReload(appVersion, reloadStorage)) {\n            return false;\n        }\n    }\n\n    try {\n        globalThis.__PORTAL_APP_VERSION__ = appVersion;\n    } catch (_err) {\n        // Ignore if globalThis is not writable (very old browsers).\n    }\n    return true;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { AgentInput, AGENT_LEFT_GAP } from './agent-input.mjs';\nimport { AgentConversation } from './agent-conversation.mjs';\nimport { Button, ClickArea } from './button.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { Tile } from './tile.mjs';\nimport { roundedTileShape } from './tile-shape.mjs';\nimport { MSDFText, getTextAdvanceMetrics } from '../evilfont/evilfont.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport * as twgl from 'twgl';\nimport { createGLBModel, MeshInstance } from './mesh-instance.mjs';\n\nconst CONVERSATION_MAX_HEIGHT = 300;\nconst SEND_BUTTON_SIZE = 36;\nconst SEND_BUTTON_GAP = 15;\nconst HEADER_HEIGHT = 20;\nconst HEADER_FONT_SIZE = 12;\nconst HEADER_BUTTON_INSET = 8;\nconst HEADER_BUTTON_ICON_SIZE = 14;\nconst HEADER_BUTTON_TEXT_X = 26;\nconst DAMON_PADDING = 10;\nconst DAMON_SIZE = AGENT_LEFT_GAP - DAMON_PADDING * 2;\nconst DAMON_BOB_AMPLITUDE = 5;\nconst DAMON_BOB_HALF_PERIOD_S = 1.5;\nconst DAMON_ORIENTATION = twgl.m4.rotationY(Math.PI / 2);\nconst TRANSITION_DURATION_S = 0.45;\nconst DAMON_FLIGHT_SPINS = 6;\nconst DAMON_DOCK_OFFSET_Y = 100;\nconst DAMON_HOVER_RISE = 30;\nconst DAMON_DOCK_HIT_EXTENSION = 40;\n\n/* Match MeshInstance's shader-space scale and fixed loading-screen orientation,\n * then fit the actual vertices rather than assuming the asset is centred. */\nfunction fittedDamonMatrix(mesh) {\n    const min = [Infinity, Infinity];\n    const max = [-Infinity, -Infinity];\n    for (const part of mesh.glbModel) {\n        for (let i = 0; i < part.positions.length; i += 3) {\n            const point = twgl.m4.transformPoint(DAMON_ORIENTATION,\n                [part.positions[i] * 30, -part.positions[i + 1] * 30, part.positions[i + 2] * 30]);\n            for (let axis = 0; axis < 2; axis++) {\n                min[axis] = Math.min(min[axis], point[axis]);\n                max[axis] = Math.max(max[axis], point[axis]);\n            }\n        }\n    }\n    const extent = Math.max(max[0] - min[0], max[1] - min[1]);\n    if (!Number.isFinite(extent) || extent <= 0) throw new Error('Agent Damon has no finite drawable bounds.');\n    const scale = DAMON_SIZE / extent;\n    return twgl.m4.scale(twgl.m4.translation([\n        DAMON_SIZE / 2 - (min[0] + max[0]) * scale / 2,\n        DAMON_SIZE / 2 - (min[1] + max[1]) * scale / 2, 0,\n    ]), [scale, scale, scale]);\n}\n\n/* Damon has a page-local transcript and draft. Transport, context, confirmation\n * and usage reuse the existing assistant API. */\nexport class AgentChat extends Placeholder {\n    #api;\n    #enabled;\n    #snapshot;\n    #bounds = null;\n    #pending = false;\n    #pendingDeleteMessage = null;\n    #usage = '';\n    #usageStarted = false;\n    #notice = '';\n    #damonGeneration = 0;\n    #damonLoading = false;\n    #open = false;\n    #damonTravelling = false;\n    #presentationInitialised = false;\n    #hudParent = null;\n    #conversationExpanded = false;\n    #conversationToggleWidth;\n    ownDamon = null;\n\n    constructor({ font, api, enabled, snapshot, onToggle }) {\n        super({ name: 'agentChat', width: 0, height: 0 });\n        this.#api = api;\n        this.#enabled = enabled;\n        this.#snapshot = snapshot;\n        this.conversation = new AgentConversation({ font });\n        this.ownConversationHeader = new Tile({ name: 'agentConversationHeader',\n            width: 0, height: HEADER_HEIGHT, z: -500, color: Palette.grey, clipChildren: true,\n            shape: roundedTileShape({ cornerRadius: 10, roundTopLeft: true, roundTopRight: true,\n                roundBottomLeft: false, roundBottomRight: false }),\n            outlineEnabled: true, outlineWidth: 1, outlineColor: Palette.silver, outlineAlignment: 'inner' });\n        this.ownUsageText = new MSDFText({ name: 'agentRemainingTokens', font, fontSize: HEADER_FONT_SIZE,\n            text: '', fontColor: Palette.silver, textBatching: 'volatile_local', x: 26,\n            y: (HEADER_HEIGHT - font.fontData.lineHeight * HEADER_FONT_SIZE) / 2, z: -0.1 });\n        this.ownUsageClip = new Placeholder({ name: 'agentUsageClip',\n            width: 0, height: HEADER_HEIGHT, clipChildren: true });\n        this.ownUsageClip.appendChild(this.ownUsageText);\n        this.ownConversationHeader.appendChild(this.ownUsageClip);\n        this.#conversationToggleWidth = HEADER_BUTTON_TEXT_X + HEADER_BUTTON_INSET + Math.ceil(Math.max(\n            ...['Expand conversation', 'Collapse conversation'].map(text =>\n                getTextAdvanceMetrics(font, HEADER_FONT_SIZE, text).widths.at(-1))));\n        this.ownConversationToggle = new Button({ name: 'agentConversationToggle', font,\n            fontSize: HEADER_FONT_SIZE, width: this.#conversationToggleWidth, height: HEADER_HEIGHT - 2,\n            y: 1, z: -0.2, color: Palette.grey, onHoverColor: Palette.darkgrey,\n            defaultTextColor: Palette.silver, iconColor: Palette.silver, onHoverIconColor: Palette.silver,\n            text: 'Expand conversation', accessibleName: 'Expand conversation',\n            iconID: 10, iconSize: [HEADER_BUTTON_ICON_SIZE, HEADER_BUTTON_ICON_SIZE],\n            iconExpand: false, textExpand: false, clipChildren: true,\n            onActivate: () => {\n                this.#conversationExpanded = !this.#conversationExpanded;\n                const text = this.#conversationExpanded ? 'Collapse conversation' : 'Expand conversation';\n                this.ownConversationToggle.mutate({ text, accessibleName: text,\n                    iconID: this.#conversationExpanded ? 11 : 10 });\n                this.#layoutConversation();\n                requestFrame('agent_conversation_toggle');\n            } });\n        this.ownConversationToggle.onIconCreated = () => this.#layoutConversationToggle();\n        this.ownConversationHeader.appendChild(this.ownConversationToggle);\n        this.input = new AgentInput({ font, onSubmit: () => this.submit(),\n            onLayout: () => this.#layoutConversation() });\n        this.ownSendButton = new Button({ name: 'agentSendButton',\n            width: SEND_BUTTON_SIZE, height: SEND_BUTTON_SIZE, z: -500,\n            iconID: 14, color: Palette.orange, onHoverColor: Palette.grey,\n            accessibleName: 'Send request', tooltipText: 'Send request (Ctrl+Enter)', tooltipEnabled: true,\n            onActivate: () => { void this.submit(); } });\n        this.ownSendButton.onIconCreated = (_icon, pivot) => pivot.setLocalRotationZ(Math.PI / 2);\n        this.ownDamonMount = new Placeholder({ name: 'agentDamonMount',\n            width: DAMON_SIZE, height: DAMON_SIZE, z: -500 });\n        this.ownDamonBob = new Placeholder({ name: 'agentDamonBob',\n            width: DAMON_SIZE, height: DAMON_SIZE });\n        this.ownDamonMount.appendChild(this.ownDamonBob);\n        this.ownDamonClickArea = new ClickArea({ name: 'agentDamonClickArea',\n            width: DAMON_SIZE, height: DAMON_SIZE, z: -1 });\n        this.ownDamonClickArea.onHoverEnter = () => this.#syncPresentation();\n        this.ownDamonClickArea.onHoverExit = () => this.#syncPresentation();\n        this.ownDamonClickArea.onInput = event => {\n            if (event === 'L_MOUSE_UP') {\n                onToggle();\n                return true;\n            }\n            return event === 'L_MOUSE_DOWN' || event === 'L_MOUSE_DOWN_HOLD';\n        };\n        this.ownDamonBob.appendChild(this.ownDamonClickArea);\n        this.ownPanels = new Placeholder({ name: 'agentChatPanels' });\n        this.ownPanels.appendChild(this.conversation);\n        this.ownPanels.appendChild(this.ownConversationHeader);\n        this.ownPanels.appendChild(this.ownSendButton);\n        this.appendChild(this.ownPanels);\n        this.appendChild(this.ownDamonMount);\n    }\n\n    get pending() { return this.#pending; }\n    get isOpen() { return this.#open; }\n\n    mount(parent, bounds) {\n        if (this.parentNode) throw new Error('AgentChat.mount(): view is already mounted.');\n        this.#hudParent = parent;\n        this.#bounds = bounds;\n        this.#open = false;\n        this.ownPanels.setVisibility(false);\n        parent.appendChild(this);\n        this.layout(bounds);\n        this.#presentationInitialised = true;\n        void this.#ensureDamon();\n        requestFrame('agent_chat_mount');\n    }\n\n    show(parent, bounds) {\n        if (!this.parentNode) this.mount(parent, bounds);\n        if (this.#hudParent !== parent) throw new Error('AgentChat.show(): parent does not match its HUD mount.');\n        if (this.#open) return;\n        this.#open = true;\n        this.#damonTravelling = true;\n        this.ownPanels.setVisibility(true);\n        if (this.input.parentNode) this.input.focusSelection();\n        else this.input.show(this.ownPanels, bounds);\n        this.layout(bounds);\n        this.#syncDamonSpin(true);\n        this.ownSendButton.setEnabled(!this.#pending);\n        if (!this.#usageStarted && this.#enabled()) {\n            this.#usageStarted = true;\n            void this.#refreshUsage();\n        }\n        requestFrame('agent_chat_show');\n    }\n\n    hide() {\n        if (!this.parentNode || !this.#open) return;\n        this.#open = false;\n        this.#damonTravelling = true;\n        this.input.releaseFocus();\n        this.ownSendButton.setEnabled(false);\n        this.#syncPresentation();\n        requestFrame('agent_chat_hide');\n    }\n\n    unmount() {\n        if (!this.parentNode) return;\n        this.#open = false;\n        this.#damonTravelling = false;\n        this.#presentationInitialised = false;\n        this.#damonGeneration++;\n        this.#damonLoading = false;\n        this.ownDamonBob.stopAnimation('y');\n        this.ownDamonMount.stopAnimation(['x', 'y']);\n        this.ownPanels.stopAnimation('y');\n        if (this.ownDamon) {\n            this.ownDamon.stopAnimation(['post_view_rotation_y', 'rim_light_strength']);\n            this.ownDamonBob.removeChild(this.ownDamon);\n            this.ownDamon = null;\n        }\n        this.input.hide();\n        this.parentNode.removeChild(this);\n        requestFrame('agent_chat_unmount');\n    }\n\n    _onDetachNode(shared) {\n        this.#damonTravelling = false;\n        this.#damonGeneration++;\n        this.#damonLoading = false;\n        this.ownDamonBob.stopAnimation('y');\n        this.ownDamonMount.stopAnimation(['x', 'y']);\n        this.ownPanels.stopAnimation('y');\n        this.ownDamon?.stopAnimation(['post_view_rotation_y', 'rim_light_strength']);\n        super._onDetachNode(shared);\n    }\n\n    #syncDamonSpin(start = false) {\n        const mesh = this.ownDamon;\n        if (!mesh) return;\n        const spin = mesh.animationState('post_view_rotation_y');\n        if (!start && !spin) return;\n        const flights = [this.ownDamonMount.animationState('x'), this.ownDamonMount.animationState('y')]\n            .filter(Boolean);\n        const stopS = Math.max(this.sceneNowS(), ...flights.map(flight => flight.stop_s));\n        if (stopS <= this.sceneNowS()) {\n            mesh.stopAnimation('post_view_rotation_y');\n            mesh.mutate({ post_view_rotation_y: 0 });\n            return;\n        }\n        const angle = mesh.state.post_view_rotation_y;\n        const turn = Math.PI * 2;\n        // Preserve a partial turn when retargeting. Every landing has an exact\n        // front-facing endpoint, normalised to zero to avoid accumulated drift.\n        const target = this.#open\n            ? (spin?.to > angle ? spin.to : (Math.ceil(angle / turn) + DAMON_FLIGHT_SPINS) * turn)\n            : 0;\n        mesh.animateTo({ post_view_rotation_y: target, stop_s: stopS, ease: 'easeInOutSine',\n            onFinish: () => mesh.mutate({ post_view_rotation_y: 0 }) });\n    }\n\n    #syncDamonBob() {\n        if (!this.ownDamon || !this.ownDamonMount.visible) {\n            this.ownDamonBob.stopAnimation('y');\n            return;\n        }\n        if (this.ownDamonBob.animationState('y')) return;\n        this.ownDamonBob.setLocalPosition([0, -DAMON_BOB_AMPLITUDE, 0]);\n        this.ownDamonBob.animateTo({ y: DAMON_BOB_AMPLITUDE,\n            duration_s: DAMON_BOB_HALF_PERIOD_S, ease: 'easeInOutSine',\n            loop: 'ping_pong', iterations: null });\n    }\n\n    #syncDamonRim() {\n        const mesh = this.ownDamon;\n        if (!mesh) return;\n        const strength = this.ownDamonClickArea._mouseIsHovering && this.ownDamonMount.visible ? 12 : 0;\n        if ((mesh.animationState('rim_light_strength')?.to ?? mesh.state.rim_light_strength) === strength) return;\n        mesh.animateTo({ rim_light_strength: strength, duration_s: strength ? 0.15 : 0.2,\n            ease: 'easeInOutSine' });\n    }\n\n    #syncPresentation() {\n        if (!this.#bounds) return;\n        const hitExtension = this.#open ? 0 : DAMON_DOCK_HIT_EXTENSION;\n        const clickArea = this.ownDamonClickArea;\n        if (clickArea.state.height !== DAMON_SIZE + hitExtension) {\n            clickArea.mutate({ height: DAMON_SIZE + hitExtension });\n        }\n        if (clickArea.localPosition()[1] !== -hitExtension) {\n            clickArea.setLocalPosition([0, -hitExtension, clickArea.localPosition()[2]]);\n        }\n        const top = Math.min(this.ownConversationHeader.localPosition()[1],\n            this.input.localPosition()[1], this.ownSendButton.localPosition()[1]);\n        const panelY = this.#open ? 0 : Math.max(0, this.#bounds.height - top + 1);\n        const panel = this.ownPanels;\n        const finishHide = () => {\n            if (this.#open) return;\n            panel.setVisibility(false);\n            this.input.hide();\n        };\n        if (!this.#presentationInitialised || !panel.visible) {\n            panel.stopAnimation('y');\n            panel.setLocalPosition([0, panelY, 0]);\n        } else if ((panel.animationState('y')?.to ?? panel.localPosition()[1]) !== panelY) {\n            panel.animateTo({ y: panelY, duration_s: TRANSITION_DURATION_S, ease: 'easeInOutSine',\n                onFinish: this.#open ? null : finishHide });\n        } else if (!this.#open && !panel.animationState('y')) finishHide();\n\n        const verticalPadding = DAMON_PADDING + DAMON_BOB_AMPLITUDE;\n        const openX = this.#bounds.directoryRight + DAMON_PADDING;\n        const bottomY = Math.max(verticalPadding, this.#bounds.height - 18 - DAMON_SIZE);\n        // Centre on the send-button area, constrained to the screen padding.\n        const dockX = Math.max(DAMON_PADDING, Math.min(\n            this.ownSendButton.localPosition()[0] + SEND_BUTTON_SIZE / 2 - DAMON_SIZE / 2,\n            this.#bounds.width - DAMON_PADDING - DAMON_SIZE));\n        const dockOffsetY = DAMON_DOCK_OFFSET_Y\n            - (!this.#damonTravelling && clickArea._mouseIsHovering ? DAMON_HOVER_RISE : 0);\n        const target = this.#open ? [openX, bottomY] : [dockX, bottomY + dockOffsetY];\n        const mount = this.ownDamonMount;\n        const current = mount.localPosition();\n        if (!this.#presentationInitialised) {\n            mount.setLocalPosition([target[0], target[1], current[2]]);\n        } else if (['x', 'y'].some((prop, axis) =>\n            (mount.animationState(prop)?.to ?? current[axis]) !== target[axis])) {\n            mount.animateTo({ x: target[0], y: target[1],\n                duration_s: TRANSITION_DURATION_S, ease: 'easeInOutSine',\n                onFinish: ({ prop }) => {\n                    if (prop !== 'y' || !this.#damonTravelling) return;\n                    this.#damonTravelling = false;\n                    this.#syncDamonSpin();\n                    // Apply any dock hover lift only after the flight has landed.\n                    this.#syncPresentation();\n                } });\n            if (this.#damonTravelling) this.#syncDamonSpin();\n        }\n        mount.setVisibility((!this.#open || this.input.state.width > 0)\n            && this.#bounds.width >= DAMON_SIZE + DAMON_PADDING * 2\n            && this.#bounds.height >= DAMON_SIZE + verticalPadding * 2);\n        this.#syncDamonBob();\n        this.#syncDamonRim();\n    }\n\n    async #ensureDamon() {\n        if (this.ownDamon || this.#damonLoading || !this.scene) return;\n        const generation = ++this.#damonGeneration;\n        const scene = this.scene;\n        this.#damonLoading = true;\n        try {\n            const mesh = await createGLBModel(scene, 'damon');\n            // Loading only acquires CPU data. Stale loads never attach a node or\n            // allocate GL resources; the scene tree owns all live mesh resources.\n            if (generation !== this.#damonGeneration || this.scene !== scene) return;\n            this.ownDamon = new MeshInstance({ name: 'agentDamon', mesh,\n                localToParent: fittedDamonMatrix(mesh), postViewMatrix: DAMON_ORIENTATION,\n                post_view_rotation_y: 0, rimLight: { color: Palette.orange, power: 4 }, rim_light_strength: 0 });\n            this.ownDamonBob.appendChild(this.ownDamon);\n            this.#syncDamonBob();\n            this.#syncDamonRim();\n            if (this.#open) this.#syncDamonSpin(true);\n            requestFrame('agent_damon_loaded');\n        } catch (error) {\n            if (generation === this.#damonGeneration) console.warn('Failed to load agent Damon model.', error);\n        } finally {\n            if (generation === this.#damonGeneration) this.#damonLoading = false;\n        }\n    }\n\n    layout(bounds = this.#bounds) {\n        if (!bounds) return;\n        this.#bounds = bounds;\n        if (this.state.width !== bounds.width || this.state.height !== bounds.height) {\n            this.mutate({ width: bounds.width, height: bounds.height });\n        }\n        this.input.layout(bounds);\n    }\n\n    #layoutConversation() {\n        if (!this.#bounds) return;\n        const [x, inputY] = this.input.localPosition();\n        const buttonX = x + this.input.state.width + SEND_BUTTON_GAP;\n        const buttonY = inputY + this.input.state.height - SEND_BUTTON_SIZE;\n        const buttonPosition = this.ownSendButton.localPosition();\n        if (buttonPosition[0] !== buttonX || buttonPosition[1] !== buttonY) {\n            this.ownSendButton.setLocalPosition([buttonX, buttonY, buttonPosition[2]]);\n        }\n        this.ownSendButton.setVisibility(this.input.state.width > 0);\n        const requestedHeight = this.#conversationExpanded ? this.#bounds.height / 2 : CONVERSATION_MAX_HEIGHT;\n        const maxHeight = Math.min(requestedHeight, Math.max(0, inputY - HEADER_HEIGHT));\n        this.conversation.layout(this.input.state.width, maxHeight);\n        const y = Math.max(0, inputY - this.conversation.state.height);\n        const current = this.conversation.localPosition();\n        if (current[0] !== x || current[1] !== y) this.conversation.setLocalPosition([x, y, current[2]]);\n        const header = this.ownConversationHeader;\n        const headerY = Math.max(0, y - HEADER_HEIGHT);\n        if (header.state.width !== this.input.state.width) header.mutate({ width: this.input.state.width });\n        const headerPosition = header.localPosition();\n        if (headerPosition[0] !== x || headerPosition[1] !== headerY) {\n            header.setLocalPosition([x, headerY, headerPosition[2]]);\n        }\n        header.setVisibility(this.input.state.width > 0 && inputY >= HEADER_HEIGHT);\n        this.#layoutConversationToggle();\n        this.#syncPresentation();\n    }\n\n    #layoutConversationToggle() {\n        const button = this.ownConversationToggle;\n        const width = Math.min(this.#conversationToggleWidth,\n            Math.max(0, this.ownConversationHeader.state.width - HEADER_BUTTON_INSET * 2));\n        if (button.state.width !== width) button.mutate({ width });\n        const x = Math.max(0, this.ownConversationHeader.state.width - HEADER_BUTTON_INSET - width);\n        button.setLocalPosition([x, 1, button.localPosition()[2]]);\n        if (this.ownUsageClip.state.width !== Math.max(0, x - HEADER_BUTTON_INSET)) {\n            this.ownUsageClip.mutate({ width: Math.max(0, x - HEADER_BUTTON_INSET) });\n        }\n        if (button.iconPivot) button.iconPivot.setLocalPosition([\n            6 + HEADER_BUTTON_ICON_SIZE / 2, button.state.height / 2, button.iconPivot.localPosition()[2]]);\n        if (button.textLabel) button.textLabel.setLocalPosition([HEADER_BUTTON_TEXT_X,\n            (button.state.height - button.state.font.fontData.lineHeight * HEADER_FONT_SIZE) / 2,\n            button.textLabel.localPosition()[2]]);\n    }\n\n    #syncStatus() {\n        this.ownSendButton.setEnabled(this.#open && !this.#pending);\n        this.conversation.setStatus(this.#pending ? 'Working...' : this.#notice);\n        if (this.ownUsageText.state.text !== this.#usage) this.ownUsageText.setText(this.#usage);\n        this.#layoutConversation();\n        requestFrame('agent_chat_status');\n    }\n\n    async #refreshUsage() {\n        try {\n            const usage = await this.#api.puffAssistantUsage();\n            const remaining = Number(usage.remaining);\n            if (!Number.isFinite(remaining) || remaining < 0) throw new Error('invalid remaining token count');\n            this.#usage = `Tokens remaining today: ${remaining.toLocaleString()}`;\n        } catch {\n            this.#usage = 'Tokens remaining today: unavailable';\n        }\n        this.#syncStatus();\n    }\n\n    async submit() {\n        if (!this.#open) return false;\n        if (this.#pending) return false;\n        if (!this.#enabled()) {\n            this.#notice = 'Assistant is unavailable.';\n            this.#syncStatus();\n            return false;\n        }\n        const message = this.input.value;\n        if (!message.trim()) {\n            this.#notice = 'Enter a request.';\n            this.#syncStatus();\n            return false;\n        }\n        let context;\n        try {\n            context = this.#snapshot();\n        } catch (error) {\n            this.#notice = `${error?.message || error}`;\n            this.#syncStatus();\n            return false;\n        }\n        this.#pending = true;\n        this.#notice = '';\n        this.conversation.appendMessage('user', message);\n        this.input.clear();\n        this.#syncStatus();\n        try {\n            const response = await this.#api.wsPuffAssistantChat({ ...context, message,\n                confirm_delete: this.#pendingDeleteMessage === message });\n            this.#pendingDeleteMessage = response.confirmation_required ? message : null;\n            this.conversation.appendMessage('assistant', response.confirmation_required\n                ? `${response.text} Send again to confirm deletion.` : response.text);\n        } catch (error) {\n            const detail = String(error?.message || error || 'Unable to send request');\n            this.conversation.appendMessage('error',\n                `Request failed: ${detail}${/[.!?]$/.test(detail) ? '' : '.'} Please try again.`);\n            this.input.restoreDraftIfEmpty(message);\n        } finally {\n            this.#pending = false;\n            this.#syncStatus();\n            void this.#refreshUsage();\n        }\n        return true;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { Tile } from './tile.mjs';\nimport { InputCell } from './input-cell.mjs';\nimport { ScrollBox } from './scroll-box.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { normalizePasteText } from './clipboard-text.mjs';\nimport { currentFocusedInputCell, focusContentInputCell, removeFocusEntry } from './focus-manager.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\nimport { Mouse } from '../../controls.mjs';\nimport {\n    selectionAt, primaryFocus, cloneSelection, normaliseSelection, selectionWithCaret, orderedRange,\n    rowSelection, selectedSource, selectionCommand,\n} from '../../puffbook-selection.mjs';\nimport { applyReplaceSpan } from '../../puffbook-replacespan.mjs';\n\nconst ROW_HEIGHT = 32;\nconst MAX_VISIBLE_ROWS = 3;\nconst INPUT_PLACEHOLDER = 'Ask Damon for assistance.';\nexport const AGENT_INPUT_MAX_HEIGHT = ROW_HEIGHT * MAX_VISIBLE_ROWS;\nexport const AGENT_LEFT_GAP = 140;\n\n/* Page-local text and selection, projected into actual WebGL InputCells.\n * Pure selection commands are shared with the document editor; this owner never\n * touches a Puffbook, backend or browser storage.\n */\nexport class AgentInput extends Placeholder {\n    focusContainerKind = 'AgentInput';\n    blocksKeyPropagation = true;\n    #font;\n    #activeCell;\n    #body = '';\n    #selection = selectionAt({ line: 0, col: 0 });\n    #bounds = null;\n    #layoutBody = null;\n    #layoutWidth = null;\n    #composition = null;\n    #preferredX = null;\n    #drag = false;\n    #ownDragThink = null;\n    #onSubmit;\n    #onLayout;\n\n    constructor({ font, onSubmit = null, onLayout = null }) {\n        super({ name: 'agentInput', width: 0, height: ROW_HEIGHT, z: -500 });\n        this.#font = font;\n        this.#onSubmit = onSubmit;\n        this.#onLayout = onLayout;\n        this.cells = [];\n        this.backing = new Tile({\n            name: 'agentInputBacking', width: 0, height: ROW_HEIGHT,\n            color: Palette.charcoal,\n        });\n        this.scroll = new ScrollBox({\n            name: 'agentInputScroll', width: 0, height: ROW_HEIGHT,\n            axes: 'vertical', layout: 'vertical', z: -0.1,\n        });\n        this.ownOutline = new Tile({ name: 'agentInputOutline', width: 0, height: ROW_HEIGHT,\n            color: Palette.clear, outlineEnabled: true, outlineWidth: 1,\n            outlineColor: Palette.silver, outlineAlignment: 'inner', z: -1 });\n        this.appendChild(this.backing);\n        this.appendChild(this.scroll);\n        this.appendChild(this.ownOutline);\n        this.#activeCell = this.#appendCell('');\n    }\n\n    get value() { return this.#body; }\n\n    restoreDraftIfEmpty(text) {\n        if (this.#body.length !== 0) return false;\n        this.#endDrag();\n        this.#composition = null;\n        this.#preferredX = null;\n        this.#body = text;\n        this.#selection = selectionAt({ line: 0, col: 0 });\n        this.#activeCell = this.cells[0];\n        this.#activeCell.wrappedCaretAffinity = 'forward';\n        this.#projectText();\n        this.scroll.scrollTo(0, 0);\n        this.#renderSelection();\n        requestFrame('agent_input_restore');\n        return true;\n    }\n\n    clear() {\n        this.#endDrag();\n        this.#composition = null;\n        this.#preferredX = null;\n        this.#body = '';\n        this.#selection = selectionAt({ line: 0, col: 0 });\n        this.cells[0].wrappedCaretAffinity = 'forward';\n        this.#projectText();\n        this.scroll.scrollTo(0, 0);\n        this.#syncSelection();\n    }\n\n    show(parent, bounds) {\n        if (this.parentNode) throw new Error('AgentInput.show(): editor is already mounted.');\n        this.layout(bounds);\n        parent.appendChild(this);\n        this.#syncSelection();\n        requestFrame('agent_input_show');\n    }\n\n    hide() {\n        if (!this.parentNode) return;\n        this.releaseFocus();\n        this.parentNode.removeChild(this);\n        requestFrame('agent_input_hide');\n    }\n\n    releaseFocus() {\n        this.#endDrag();\n        this.#composition = null;\n        removeFocusEntry(this);\n    }\n\n    focusSelection() { return this.#syncSelection(); }\n\n    layout(bounds = this.#bounds) {\n        if (!bounds) return;\n        this.#bounds = bounds;\n        const { directoryRight, width: screenWidth, height: screenHeight } = bounds;\n        const x = directoryRight + AGENT_LEFT_GAP;\n        const width = Math.max(0, screenWidth - x - 100);\n        const reflow = this.#layoutBody !== this.#body || this.#layoutWidth !== width;\n        if (reflow) {\n            // Measure at full width first; reserve the scrollbar only if needed.\n            // Starting from full width also removes the bar after shrinking.\n            for (const cell of this.cells) if (cell.state.width !== width) cell.mutate({ width });\n            if (this.#visualRows() > MAX_VISIBLE_ROWS) {\n                const cellWidth = Math.max(0, width - this.scroll.thumbWidth);\n                for (const cell of this.cells) if (cell.state.width !== cellWidth) cell.mutate({ width: cellWidth });\n            }\n            this.#layoutBody = this.#body;\n            this.#layoutWidth = width;\n        }\n        const height = Math.min(this.#visualRows(), MAX_VISIBLE_ROWS) * ROW_HEIGHT;\n        const y = Math.max(0, screenHeight - height - 18);\n        const sizeChanged = this.state.width !== width || this.state.height !== height;\n        const position = this.localPosition();\n        if (position[0] !== x || position[1] !== y) this.setLocalPosition([x, y, position[2]]);\n        if (sizeChanged) {\n            this.mutate({ width, height });\n            this.backing.mutate({ width, height });\n            this.scroll.mutate({ width, height });\n            this.ownOutline.mutate({ width, height });\n        }\n        this.setVisibility(width > 0);\n        if (reflow || sizeChanged) {\n            this.scroll.syncContentLayout();\n            this.#renderSelection();\n            this.#revealCaret();\n        }\n        this.#onLayout?.();\n    }\n\n    #visualRows() {\n        return this.cells.reduce((count, cell) => count + cell.wrappedLayout.rows.length, 0);\n    }\n\n    restoreFocusState(cell) {\n        if (!this.cells.includes(cell)) throw new Error('AgentInput.restoreFocusState(): cell is not owned by this editor.');\n        this.#activeCell = cell;\n        cell.syncFocusVisual(true, 'agent_input_restore');\n        if (!this.#drag) this.#revealCaret();\n    }\n\n    activateInputCell(cell, column = cell.cursorIndex) {\n        if (!this.cells.includes(cell)) throw new Error('AgentInput.activateInputCell(): cell is not owned by this editor.');\n        this.#selection = selectionAt({ line: cell.cellID, col: column });\n        this.#preferredX = null;\n        return this.#syncSelection();\n    }\n\n    #appendCell(text) {\n        const cell = new InputCell({\n            name: 'agentInputCell', font: this.#font, fontSize: 14,\n            width: this.state.width, height: ROW_HEIGHT, paddingX: 8,\n            textInput: text, cursorIndex: 0, focusContainerOwner: this,\n            infoLabel: this.cells.length === 0, infoLabelWhenFocused: true,\n            infoLabelText: INPUT_PLACEHOLDER,\n            wrapText: true, wrapLineHeight: ROW_HEIGHT, selectionOwner: this,\n            keyDelegate: event => this.onKeyDownCapture(event),\n            color: Palette.charcoal,\n        });\n        cell.cellID = this.cells.length;\n        this.cells.push(cell);\n        this.scroll.appendChild(cell);\n        return cell;\n    }\n\n    #projectText() {\n        const lines = this.#body.split('\\n');\n        this.cells[0].setInfoLabelText(this.#body.length === 0 ? INPUT_PLACEHOLDER : '');\n        while (this.cells.length > lines.length) this.scroll.removeChild(this.cells.pop());\n        lines.forEach((line, i) => {\n            const cell = this.cells[i] ?? this.#appendCell(line);\n            if (cell.textInput !== line) cell.syncFromDocument(line, Math.min(cell.cursorIndex, line.length));\n        });\n        this.layout();\n        this.scroll.syncContentLayout();\n    }\n\n    #syncSelection(reveal = true) {\n        const point = primaryFocus(this.#selection);\n        const cell = this.cells[point.line];\n        cell.updateCaret(point.col);\n        this.#activeCell = cell;\n        const focused = focusContentInputCell(this, cell);\n        this.#renderSelection();\n        if (reveal) this.#revealCaret();\n        requestFrame('agent_input_selection');\n        return focused;\n    }\n\n    #renderSelection() {\n        const point = primaryFocus(this.#selection);\n        for (const cell of this.cells) {\n            cell.syncDocumentSelection(rowSelection(this.#selection, cell.cellID, cell.textInput.length),\n                cell.cellID === point.line ? point.col : null, true);\n        }\n    }\n\n    #revealCaret() {\n        const cell = this.#activeCell;\n        if (!cell || !this.cells.includes(cell)) return;\n        const y = cell.localPosition()[1] + cell.wrappedLayout.point(cell.cursorIndex, cell.wrappedCaretAffinity).y;\n        const delta = y < 0 ? y : Math.max(0, y + ROW_HEIGHT - this.scroll.viewportHeight);\n        if (delta) this.scroll.scrollTo(0, this.scroll.contentPosition + delta);\n    }\n\n    // InputCell's existing owner-selection interface, also used by DocumentView.\n    usesDocumentSelection(cell) { return this.cells.includes(cell); }\n    sourceCellHasSelection(cell) {\n        return rowSelection(this.#selection, cell.cellID, cell.textInput.length).segments.length > 0;\n    }\n    selectSourceCellRange(cell, start, end) {\n        this.#endDrag();\n        this.#selection = { ranges: [{ anchor: { line: cell.cellID, col: start },\n            focus: { line: cell.cellID, col: end } }], primaryIndex: 0, verticalColumn: null };\n        this.#preferredX = null;\n        return this.#syncSelection();\n    }\n    beginSourceSelection(cell, col, shift = false) {\n        const point = { line: cell.cellID, col };\n        const anchor = shift ? this.#selection.ranges[this.#selection.primaryIndex].anchor : point;\n        this.#selection = { ranges: [{ anchor: { ...anchor }, focus: point }], primaryIndex: 0, verticalColumn: null };\n        this.#preferredX = null;\n        this.#syncSelection();\n        this.#startDrag();\n        return true;\n    }\n    addSourceCaret(cell, col) {\n        this.#selection = selectionWithCaret(this.#selection, { line: cell.cellID, col });\n        this.#syncSelection();\n        return true;\n    }\n    beginAddSourceSelection(cell, col) {\n        this.addSourceCaret(cell, col);\n        this.#startDrag();\n        return true;\n    }\n\n    #startDrag() {\n        this.#endDrag();\n        this.#drag = true;\n        this.scene.pointerCaptureOwner = this;\n        this.scene.dragCapture = 'agent_input_selection';\n        this.#scheduleDrag();\n    }\n\n    #scheduleDrag() {\n        this.#ownDragThink = this.thinkAt(this.sceneNowS() + this.sceneFrameStepS(), () => {\n            this.#ownDragThink = null;\n            if (!Mouse.leftDown || currentFocusedInputCell()?.focusContainerOwner !== this) {\n                this.#endDrag();\n                return;\n            }\n            this.#extendDrag(true);\n            this.#scheduleDrag();\n        });\n    }\n\n    #endDrag() {\n        this.#drag = false;\n        if (this.#ownDragThink !== null) {\n            this.cancelThinkAt(this.#ownDragThink);\n            this.#ownDragThink = null;\n        }\n        if (this.scene?.pointerCaptureOwner === this) {\n            this.scene.pointerCaptureOwner = null;\n            this.scene.dragCapture = null;\n        }\n    }\n\n    #extendDrag(autoScroll = false) {\n        const pointer = this.scroll.getLocalMousePosition();\n        if (!pointer) return;\n        const [x, y] = pointer;\n        if (autoScroll) {\n            const distance = y < 0 ? y : Math.max(0, y - this.scroll.viewportHeight);\n            const speed = Math.max(-700, Math.min(700, distance * 12));\n            if (speed) this.scroll.scrollTo(0, this.scroll.contentPosition + speed * this.sceneFrameStepS());\n        }\n        const cell = this.cells.find(cell => y < cell.localPosition()[1] + cell.state.height) ?? this.cells.at(-1);\n        const pick = cell.wrappedLayout.pick(x, y - cell.localPosition()[1]);\n        const col = pick.index;\n        cell.wrappedCaretAffinity = pick.affinity;\n        this.#selection.ranges[this.#selection.primaryIndex].focus = { line: cell.cellID, col };\n        this.#renderSelection();\n        const focus = primaryFocus(this.#selection);\n        this.cells[focus.line].updateCaret(focus.col);\n        this.#activeCell = this.cells[focus.line];\n        // Autoscroll follows the pointer at a bounded speed.\n        focusContentInputCell(this, this.#activeCell);\n        requestFrame('agent_input_drag');\n    }\n\n    onPointerInput(events) {\n        if (!this.#drag) return false;\n        const cancelled = ['L_MOUSE_CANCEL', 'POINTER_CANCEL', 'WINDOW_BLUR'].some(event => events.has(event));\n        if (!cancelled && (events.has('L_MOUSE_DOWN_HOLD') || events.has('L_MOUSE_UP'))) this.#extendDrag();\n        if (cancelled || events.has('L_MOUSE_UP')) {\n            this.#selection = normaliseSelection(this.#selection);\n            this.#endDrag();\n            this.#renderSelection();\n        }\n        return true;\n    }\n\n    #moveVisual(event) {\n        const vertical = event.key === 'ArrowUp' || event.key === 'ArrowDown';\n        const point = primaryFocus(this.#selection);\n        const cell = this.cells[point.line];\n        const layout = cell.wrappedLayout;\n        const cursor = layout.point(point.col, cell.wrappedCaretAffinity);\n        let line = point.line;\n        let row = cursor.row;\n        let col;\n        if (vertical) {\n            this.#preferredX ??= cursor.x;\n            row += event.key === 'ArrowUp' ? -1 : 1;\n            if (row < 0 && line > 0) row = this.cells[--line].wrappedLayout.rows.length - 1;\n            else if (row >= layout.rows.length && line + 1 < this.cells.length) { line++; row = 0; }\n            const target = this.cells[line].wrappedLayout;\n            row = Math.max(0, Math.min(target.rows.length - 1, row));\n            col = target.indexAt(this.#preferredX, row);\n            this.cells[line].wrappedCaretAffinity = col === target.rows[row].end ? 'backward' : 'forward';\n        } else {\n            this.#preferredX = null;\n            const target = layout.rows[row];\n            col = event.key === 'Home' ? target.start : target.end;\n            cell.wrappedCaretAffinity = event.key === 'Home' ? 'forward' : 'backward';\n        }\n        const focus = { line, col };\n        const anchor = event.shiftKey ? this.#selection.ranges[this.#selection.primaryIndex].anchor : focus;\n        this.#selection = { ranges: [{ anchor: { ...anchor }, focus }], primaryIndex: 0, verticalColumn: null };\n        this.#syncSelection();\n        return true;\n    }\n\n    #command(event) {\n        const result = selectionCommand(this.#body, this.#selection, event);\n        if (!result.handled) return false;\n        for (const span of result.spans) this.#body = applyReplaceSpan(this.#body, span);\n        this.#selection = result.selection;\n        const target = this.cells[primaryFocus(this.#selection).line];\n        if (target) target.wrappedCaretAffinity = 'forward';\n        if (result.spans.length) this.#projectText();\n        this.#syncSelection();\n        return true;\n    }\n\n    onKeyDownCapture(event) {\n        if (!this.cells.includes(currentFocusedInputCell())) return false;\n        if (event.isComposing) return true;\n        if (event.key === 'Enter' && event.ctrlKey && !event.altKey && this.#onSubmit) {\n            if (!event.repeat) void this.#onSubmit();\n            return true;\n        }\n        this.#composition = null;\n        if (event.key === 'copy' || event.key === 'cut') {\n            const text = selectedSource(this.#body, this.#selection);\n            if (text) {\n                if (event.writeClipboard) event.writeClipboard(text);\n                else void this.#activeCell.copyToClipboard(text);\n            }\n            if (event.key === 'copy') return true;\n        }\n        if (!event.ctrlKey && !event.metaKey && !event.altKey\n            && ['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return this.#moveVisual(event);\n        this.#preferredX = null;\n        return this.#command(event);\n    }\n\n    onBeforeInput(event) {\n        if (!this.cells.includes(currentFocusedInputCell())) return false;\n        if (['insertCompositionText', 'insertFromComposition'].includes(event.inputType)) {\n            this.#composition ??= cloneSelection(this.#selection);\n            const anchor = orderedRange(this.#composition.ranges[this.#composition.primaryIndex])[0];\n            this.#selection = cloneSelection(this.#composition);\n            this.#command({ key: 'paste', clipboardData: normalizePasteText(event.data ?? '') });\n            this.#composition = { ranges: [{ anchor: { ...anchor }, focus: { ...primaryFocus(this.#selection) } }],\n                primaryIndex: 0, verticalColumn: null };\n            return true;\n        }\n        this.#composition = null;\n        if (['insertLineBreak', 'insertParagraph'].includes(event.inputType)) return this.#command({ key: 'Enter' });\n        if (['insertText', 'insertFromPaste', 'insertReplacementText'].includes(event.inputType)) {\n            return this.#command({ key: 'paste', clipboardData: normalizePasteText(event.data ?? '') });\n        }\n        if (event.inputType === 'deleteContentBackward') return this.#command({ key: 'Backspace' });\n        if (event.inputType === 'deleteContentForward') return this.#command({ key: 'Delete' });\n        return false;\n    }\n\n    onCompositionEvent(event) {\n        if (event.type === 'compositionstart' || event.type === 'compositionend') this.#composition = null;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { Tile } from './tile.mjs';\nimport { roundedTileShape } from './tile-shape.mjs';\nimport { ScrollBox } from './scroll-box.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { MSDFText, getTextAdvanceMetrics } from '../evilfont/evilfont.mjs';\nimport { WrappedInputLayout } from './wrapped-input-layout.mjs';\nimport { requestFrame } from '../frame-wakeup.mjs';\n\nconst FONT_SIZE = 14;\nconst LINE_HEIGHT = 24;\nconst MESSAGE_GAP = 8;\nconst PADDING_X = 8;\nconst PADDING_Y = 4;\nconst EMPTY_HEIGHT = 32;\nconst CONTENT_LEFT_PADDING = 18;\n\n/* Read-only message geometry; actual MSDFText nodes own their GPU lifecycle\n * through the scene tree. No editable cells or DOM inputs are involved. */\nclass ConversationText extends Placeholder {\n    #font;\n    #text;\n    #layoutText = null;\n    #layoutWidth = null;\n    #measuredLines = new Map();\n    #ownBackground = null;\n    #ownBadge = null;\n    #badgeWidth = 0;\n    #badgeHeight = 0;\n    ownLines = [];\n\n    constructor(font, text, role = null) {\n        super({ name: 'agentConversationText', width: 0, height: 0 });\n        this.#font = font;\n        this.#text = text;\n        if (role === 'user') {\n            this.#ownBackground = new Tile({ name: 'agentUserMessageBackground',\n                x: CONTENT_LEFT_PADDING, width: 0, height: 0, color: Palette.grey });\n            this.appendChild(this.#ownBackground);\n            this.#ownBadge = new MSDFText({ name: 'agentUserBadge', font, fontSize: FONT_SIZE,\n                text: '>', fontColor: Palette.orange, textBatching: 'volatile_local', z: -0.3 });\n            this.#badgeWidth = getTextAdvanceMetrics(font, FONT_SIZE, '>').widths[1];\n            this.#badgeHeight = font.fontData.lineHeight * FONT_SIZE;\n        } else if (role === 'assistant' || role === 'error') {\n            this.#badgeWidth = this.#badgeHeight = 10;\n            this.#ownBadge = new Tile({ name: role === 'error' ? 'agentErrorBadge' : 'agentResponseBadge',\n                width: 10, height: 10, color: role === 'error' ? Palette.red : Palette.neonblue,\n                shape: roundedTileShape({ cornerRadius: 5 }), z: -0.3 });\n        }\n        if (this.#ownBadge) this.appendChild(this.#ownBadge);\n    }\n\n    setText(text) {\n        if (text === this.#text) return;\n        this.#text = text;\n        this.#measuredLines.clear();\n    }\n\n    #linesAtWidth(width) {\n        if (this.#measuredLines.has(width)) return this.#measuredLines.get(width);\n        const lines = [];\n        if (width > 0) {\n            // Keep message text intact; normalise line endings and expand tabs\n            // only for display, without applying the clipboard's byte limit.\n            for (const line of this.#text.replace(/\\r\\n?/g, '\\n').replace(/\\t/g, '    ').split('\\n')) {\n                const layout = new WrappedInputLayout(this.#font, FONT_SIZE, line, width, PADDING_X, LINE_HEIGHT);\n                for (const row of layout.rows) lines.push(line.slice(row.start, row.end));\n            }\n        }\n        // Retain the full-width and scrollbar-width measurements, without\n        // retaining every historical viewport size or changing rendered nodes.\n        if (this.#measuredLines.size === 2) this.#measuredLines.delete(this.#measuredLines.keys().next().value);\n        this.#measuredLines.set(width, lines);\n        return lines;\n    }\n\n    measureHeight(width) {\n        const count = this.#linesAtWidth(width).length;\n        return count ? count * LINE_HEIGHT + PADDING_Y * 2 : 0;\n    }\n\n    layout(width) {\n        if (this.#layoutText === this.#text && this.#layoutWidth === width) return;\n        const lines = this.#linesAtWidth(width);\n        while (this.ownLines.length > lines.length) this.removeChild(this.ownLines.pop());\n        lines.forEach((text, i) => {\n            const style = { x: CONTENT_LEFT_PADDING + Math.min(PADDING_X, width / 2), y: PADDING_Y + i * LINE_HEIGHT };\n            const line = this.ownLines[i];\n            if (line) {\n                if (line.state.text !== text) line.setText(text);\n                line.mutate(style);\n            } else {\n                const node = new MSDFText({ ...style, font: this.#font, fontSize: FONT_SIZE,\n                    text, textBatching: 'volatile_local', z: -0.3, fontColor: [1, 1, 1, 1] });\n                this.ownLines.push(node);\n                this.appendChild(node);\n            }\n        });\n        // Include the gutter in each scrolling row so its badge stays inside\n        // the ScrollBox's clip, alongside the inset message background/text.\n        this.mutate({ width: width + CONTENT_LEFT_PADDING,\n            height: lines.length ? lines.length * LINE_HEIGHT + PADDING_Y * 2 : 0 });\n        this.#ownBackground?.mutate({ width, height: this.state.height });\n        if (this.#ownBadge) {\n            this.#ownBadge.setLocalPosition([(CONTENT_LEFT_PADDING - this.#badgeWidth) / 2,\n                (this.state.height - this.#badgeHeight) / 2, this.#ownBadge.localPosition()[2]]);\n        }\n        this.#layoutWidth = width;\n        this.#layoutText = this.#text;\n    }\n}\n\nexport class AgentConversation extends Placeholder {\n    #font;\n    #messages = [];\n    #status;\n    #statusText = '';\n    #dirty = true;\n    #followBottom = true;\n    #maxHeight = null;\n\n    constructor({ font }) {\n        super({ name: 'agentConversation', width: 0, height: EMPTY_HEIGHT, z: -500 });\n        this.#font = font;\n        this.backing = new Tile({ width: 0, height: EMPTY_HEIGHT, color: Palette.charcoal });\n        this.scroll = new ScrollBox({ name: 'agentConversationScroll', width: 0, height: EMPTY_HEIGHT,\n            axes: 'vertical', layout: 'vertical', spacing: MESSAGE_GAP, z: -0.1 });\n        this.ownOutline = new Tile({ name: 'agentConversationOutline', width: 0, height: EMPTY_HEIGHT,\n            color: Palette.clear, outlineEnabled: true, outlineWidth: 1,\n            outlineColor: Palette.silver, outlineAlignment: 'inner', z: -1 });\n        this.#status = new ConversationText(font, '');\n        this.appendChild(this.backing);\n        this.appendChild(this.scroll);\n        this.appendChild(this.ownOutline);\n    }\n\n    get messages() { return this.#messages.map(({ role, text }) => ({ role, text })); }\n    get status() { return this.#statusText; }\n\n    #atBottom() {\n        return this.scroll.contentPosition >= this.scroll.contentHeight - this.scroll.viewportHeight - 1;\n    }\n\n    #markDirty() {\n        if (!this.#dirty) this.#followBottom = this.#atBottom();\n        this.#dirty = true;\n    }\n\n    appendMessage(role, text) {\n        this.#markDirty();\n        const node = new ConversationText(this.#font, text, role);\n        this.#messages.push({ role, text });\n        if (this.#status.parentNode) this.scroll.contentHost.insertChildBefore(node, this.#status);\n        else this.scroll.appendChild(node);\n    }\n\n    setStatus(text) {\n        if (text === this.#statusText) return;\n        this.#markDirty();\n        this.#statusText = text;\n        this.#status.setText(text);\n        if (text && !this.#status.parentNode) this.scroll.appendChild(this.#status);\n        else if (!text && this.#status.parentNode) this.scroll.removeChild(this.#status);\n    }\n\n    layout(width, maxHeight) {\n        if (!this.#dirty && this.state.width === width && this.#maxHeight === maxHeight) return;\n        const follow = this.#dirty ? this.#followBottom : this.#atBottom();\n        const nodes = this.scroll.contentHost.children;\n        const measure = cellWidth => nodes.reduce((total, node) => total + node.measureHeight(cellWidth), 0)\n            + Math.max(0, nodes.length - 1) * MESSAGE_GAP;\n        const contentWidth = Math.max(0, width - CONTENT_LEFT_PADDING);\n        let effectiveWidth = contentWidth;\n        let contentHeight = measure(contentWidth);\n        if (contentHeight > maxHeight) {\n            effectiveWidth = Math.max(0, contentWidth - this.scroll.thumbWidth);\n            contentHeight = measure(effectiveWidth);\n        }\n        // Only project the settled width. Measuring scrollbar need must not\n        // rebuild every message's MSDF lines at both candidate widths.\n        for (const node of nodes) node.layout(effectiveWidth);\n        const height = Math.min(maxHeight, Math.max(EMPTY_HEIGHT, contentHeight));\n        this.mutate({ width, height });\n        this.backing.mutate({ width, height });\n        this.ownOutline.mutate({ width, height });\n        this.scroll.mutate({ width, height });\n        this.scroll.syncContentLayout();\n        if (follow) this.scroll.scrollTo(0, this.scroll.contentHeight - this.scroll.viewportHeight);\n        this.setVisibility(width > 0 && height > 0);\n        this.#dirty = false;\n        this.#maxHeight = maxHeight;\n        requestFrame('agent_conversation_layout');\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as evilfont from './lib/evilfont/evilfont.mjs';\nimport * as ui from './lib/evilui/evilui.mjs';\nimport { gpuDiagCompactSnapshot } from './lib/evilui/browser-gpu-diagnostics.mjs';\nimport {\n    formatHudBytes,\n    formatHudPingParts,\n    formatHudScalar,\n    getHudPingColor,\n} from './fps-hud-format.mjs';\nimport { formatFpsText } from './fps-format.mjs';\nimport { PingSampler } from './ping-sampler.mjs';\n\nconst FPS_SAMPLE_WINDOW_MS = 3000;\nconst FPS_SAMPLE_INTERVAL_MS = 250;\nconst FPS_CHROME_INSET = 8;\nconst FPS_HUD_WIDTH = 760;\nconst FPS_HUD_PAD_X = 6;\nconst FPS_HUD_PAD_Y = 4;\nconst FPS_HUD_BACKDROP_Y = 2;\nconst PING_PERIOD_MS = 1000;\nconst HUD_FIELD_GAP_PX = 18;\nconst HUD_SECTION_GAP_PX = 24;\n\n/* Reuse the existing rolling perf tracker for coarse phase timings instead of adding another timer stream. */\nfunction readTrackerMetric(name) {\n    const tracker = globalThis.__eviluiPerformanceTracker;\n    if (typeof tracker?.timerAverage === 'function') {\n        return tracker.timerAverage(name);\n    }\n    const report = tracker?.snapshot?.() ?? null;\n    return report?.timers?.[name]?.avg_ms ?? null;\n}\n\n/* Read the cumulative GPU diagnostics totals so the HUD can derive short-window per-frame pressure. */\nfunction readGpuCounters() {\n    const snap = gpuDiagCompactSnapshot();\n    return {\n        bufferUploadBytes: snap?.resources?.bytes?.uploaded?.buffer ?? 0,\n        bufferUploadEvents: snap?.resources?.bytes?.upload_events?.buffer ?? 0,\n        readbackCount: snap?.resources?.readbacks?.count ?? 0,\n    };\n}\n\n/* Measure one representative HUD string so the strip can reserve stable field widths up front. */\nfunction measureHudText(font, fontSize, text) {\n    return evilfont.MSDFText.measureFromState({ font, fontSize, text }).width;\n}\n\n/* Describe one fixed-width HUD field in terms of a label, a right-aligned value box, and an optional suffix. */\nfunction makeHudField(font, fontSize, left, { label = '', sampleValue = '', suffix = '', gapAfter = HUD_FIELD_GAP_PX }) {\n    const labelWidth = measureHudText(font, fontSize, label);\n    const valueWidth = measureHudText(font, fontSize, sampleValue);\n    const suffixWidth = measureHudText(font, fontSize, suffix);\n    const totalWidth = labelWidth + valueWidth + suffixWidth;\n    return {\n        left,\n        label,\n        suffix,\n        labelWidth,\n        valueWidth,\n        suffixWidth,\n        totalWidth,\n        nextLeft: left + totalWidth + gapAfter,\n    };\n}\n\n/* Freeze the strip geometry from representative samples so later value churn repaints fields without moving neighbours. */\nfunction buildHudLayout(font, fontSize) {\n    let left = 0;\n    const fps = makeHudField(font, fontSize, left, {\n        sampleValue: '000.0 FPS',\n        gapAfter: HUD_SECTION_GAP_PX,\n    });\n    left = fps.nextLeft;\n    const buf = makeHudField(font, fontSize, left, {\n        label: 'buf ',\n        sampleValue: '00.0',\n        suffix: '/f',\n    });\n    left = buf.nextLeft;\n    const bytes = makeHudField(font, fontSize, left, {\n        sampleValue: '999MB',\n        suffix: '/f',\n    });\n    left = bytes.nextLeft;\n    const rb = makeHudField(font, fontSize, left, {\n        label: 'rb ',\n        sampleValue: '00.0',\n        suffix: '/f',\n    });\n    left = rb.nextLeft;\n    const upd = makeHudField(font, fontSize, left, {\n        label: 'upd ',\n        sampleValue: '00.0',\n        suffix: 'ms',\n    });\n    left = upd.nextLeft;\n    const dr = makeHudField(font, fontSize, left, {\n        label: 'dr ',\n        sampleValue: '00.0',\n        suffix: 'ms',\n    });\n    left = dr.nextLeft;\n    const trq = makeHudField(font, fontSize, left, {\n        label: 'trq ',\n        sampleValue: '9999',\n        suffix: 'ms',\n    });\n    left = trq.nextLeft;\n    const pw = makeHudField(font, fontSize, left, {\n        label: 'pw ',\n        sampleValue: '9999',\n        suffix: 'ms',\n        gapAfter: 0,\n    });\n    return {\n        fps,\n        buf,\n        bytes,\n        rb,\n        upd,\n        dr,\n        trq,\n        pw,\n        totalWidth: pw.left + pw.totalWidth,\n    };\n}\n\n/* Compare small RGBA tuples exactly so the HUD can skip redundant colour updates. */\nfunction sameColor(a, b) {\n    if (a === b) {\n        return true;\n    }\n    if (a == null || b == null || a.length !== b.length) {\n        return false;\n    }\n    for (let i = 0; i < a.length; i += 1) {\n        if (a[i] !== b[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Keep HUD text-node creation uniform so all field segments share the same font contract. */\nfunction makeHudNode(font, fontSize, fontColor, text = '') {\n    return new evilfont.MSDFText({\n        font,\n        fontSize,\n        text,\n        fontColor,\n    });\n}\n\n/* Keep the FPS strip as ordinary scene text so it behaves like chrome rather than an out-of-band DOM overlay. */\nexport class FpsIndicator extends ui.Node {\n    #frameTimes = [];\n    #frameCount = 0;\n    #lastSampleAt = -Infinity;\n    #lastGpuCounters = null;\n    #lastTrqColor = null;\n    #lastPwColor = null;\n    #tranquilityPing = null;\n    #puffworkerPing = null;\n    #getHoverText = null;\n    #fontColor = [1, 1, 1, 0.92];\n    #layout = null;\n\n    constructor({ api = null, font, fontSize = 14, fontColor = [1, 1, 1, 0.92], getHoverText = null }) {\n        super({});\n        this.#fontColor = fontColor;\n        this.#getHoverText = getHoverText;\n        this.#layout = buildHudLayout(font, fontSize);\n        if (api) {\n            this.#tranquilityPing = new PingSampler({\n                ping: ({ signal }) => api.ping({ signal }),\n                periodMS: PING_PERIOD_MS,\n            });\n            this.#puffworkerPing = new PingSampler({\n                ping: ({ signal }) => api.puffworkerPing({ signal }),\n                periodMS: PING_PERIOD_MS,\n            });\n        }\n        this.backing = new ui.Tile({\n            x: -FPS_HUD_PAD_X,\n            y: -FPS_HUD_PAD_Y + FPS_HUD_BACKDROP_Y,\n            z: 0,\n            width: Math.max(FPS_HUD_WIDTH, this.#layout.totalWidth) + FPS_HUD_PAD_X * 2,\n            height: fontSize * 2 + FPS_HUD_PAD_Y * 2,\n            color: [0, 0, 0, 0.5],\n        });\n        this.fpsLabel = makeHudNode(font, fontSize, fontColor, '0.0 FPS');\n        this.bufLabel = makeHudNode(font, fontSize, fontColor, this.#layout.buf.label);\n        this.bufValue = makeHudNode(font, fontSize, fontColor, '0.0');\n        this.bufUnit = makeHudNode(font, fontSize, fontColor, this.#layout.buf.suffix);\n        this.bytesValue = makeHudNode(font, fontSize, fontColor, '0kB');\n        this.bytesUnit = makeHudNode(font, fontSize, fontColor, this.#layout.bytes.suffix);\n        this.rbLabel = makeHudNode(font, fontSize, fontColor, this.#layout.rb.label);\n        this.rbValue = makeHudNode(font, fontSize, fontColor, '0.0');\n        this.rbUnit = makeHudNode(font, fontSize, fontColor, this.#layout.rb.suffix);\n        this.updLabel = makeHudNode(font, fontSize, fontColor, this.#layout.upd.label);\n        this.updValue = makeHudNode(font, fontSize, fontColor, '--');\n        this.updUnit = makeHudNode(font, fontSize, fontColor, '');\n        this.drLabel = makeHudNode(font, fontSize, fontColor, this.#layout.dr.label);\n        this.drValue = makeHudNode(font, fontSize, fontColor, '--');\n        this.drUnit = makeHudNode(font, fontSize, fontColor, '');\n        this.trqLabel = makeHudNode(font, fontSize, fontColor, this.#layout.trq.label);\n        this.trqValue = makeHudNode(font, fontSize, fontColor, '--');\n        this.trqUnit = makeHudNode(font, fontSize, fontColor, '');\n        this.pwLabel = makeHudNode(font, fontSize, fontColor, this.#layout.pw.label);\n        this.pwValue = makeHudNode(font, fontSize, fontColor, '--');\n        this.pwUnit = makeHudNode(font, fontSize, fontColor, '');\n        this.hoverValue = makeHudNode(font, fontSize, fontColor, 'hover: none');\n        this.appendChild(this.backing);\n        for (const node of [\n            this.fpsLabel,\n            this.bufLabel,\n            this.bufValue,\n            this.bufUnit,\n            this.bytesValue,\n            this.bytesUnit,\n            this.rbLabel,\n            this.rbValue,\n            this.rbUnit,\n            this.updLabel,\n            this.updValue,\n            this.updUnit,\n            this.drLabel,\n            this.drValue,\n            this.drUnit,\n            this.trqLabel,\n            this.trqValue,\n            this.trqUnit,\n            this.pwLabel,\n            this.pwValue,\n            this.pwUnit,\n            this.hoverValue,\n        ]) {\n            this.appendChild(node);\n        }\n        this.#layoutStaticFields();\n        this.#syncHud({\n            fpsText: '0.0 FPS',\n            bufferUploadsPerFrame: 0,\n            bufferUploadBytesPerFrame: 0,\n            readbacksPerFrame: 0,\n            updateSceneMS: null,\n            drawSceneMS: null,\n            tranquilityPing: null,\n            puffworkerPing: null,\n            hoverText: 'hover: none',\n        });\n        this.setLocalPosition([FPS_CHROME_INSET, FPS_CHROME_INSET, 0]);\n    }\n\n    /* Stop background ping work when the HUD is hidden so the default-off path returns fully to zero extra browser activity. */\n    dispose() {\n        this.#tranquilityPing?.dispose();\n        this.#puffworkerPing?.dispose();\n    }\n\n    /* Pin the fixed labels once so live values can start immediately after them while each field keeps its spare width at the tail. */\n    #layoutStaticFields() {\n        this.bufLabel.setLocalPosition([this.#layout.buf.left, 0, 0]);\n        this.rbLabel.setLocalPosition([this.#layout.rb.left, 0, 0]);\n        this.updLabel.setLocalPosition([this.#layout.upd.left, 0, 0]);\n        this.drLabel.setLocalPosition([this.#layout.dr.left, 0, 0]);\n        this.trqLabel.setLocalPosition([this.#layout.trq.left, 0, 0]);\n        this.pwLabel.setLocalPosition([this.#layout.pw.left, 0, 0]);\n        this.hoverValue.setLocalPosition([0, this.fpsLabel.height() + 2, 0]);\n    }\n\n    /* Left-anchor one mutable value immediately after its label so the reserved slack stays at the end of the field. */\n    #placeValue(node, field) {\n        node.setLocalPosition([field.left + field.labelWidth, 0, 0]);\n    }\n\n    /* Keep one live suffix immediately after its current value while the field's fixed spare width remains on the far right. */\n    #placeUnit(unitNode, valueNode, field) {\n        unitNode.setLocalPosition([field.left + field.labelWidth + valueNode.width(), 0, 0]);\n    }\n\n    /* Format one optional millisecond metric into the shared value/unit split used by the fixed-width HUD fields. */\n    #metricParts(value) {\n        if (!Number.isFinite(value)) {\n            return {\n                valueText: '--',\n                unitText: '',\n            };\n        }\n        return {\n            valueText: formatHudScalar(value),\n            unitText: 'ms',\n        };\n    }\n\n    /* Project one settled HUD sample into the fixed field set so only the active value cells repaint and latency digits can be tinted alone. */\n    #syncHud({\n        fpsText,\n        bufferUploadsPerFrame,\n        bufferUploadBytesPerFrame,\n        readbacksPerFrame,\n        updateSceneMS,\n        drawSceneMS,\n        tranquilityPing,\n        puffworkerPing,\n        hoverText,\n    }) {\n        const upd = this.#metricParts(updateSceneMS);\n        const dr = this.#metricParts(drawSceneMS);\n        const trq = formatHudPingParts(tranquilityPing);\n        const pw = formatHudPingParts(puffworkerPing);\n        const trqColor = getHudPingColor(tranquilityPing, this.#fontColor[3] ?? 1) ?? this.#fontColor;\n        const pwColor = getHudPingColor(puffworkerPing, this.#fontColor[3] ?? 1) ?? this.#fontColor;\n\n        this.fpsLabel.setText(fpsText);\n        this.fpsLabel.setLocalPosition([this.#layout.fps.left, 0, 0]);\n\n        this.bufValue.setText(formatHudScalar(bufferUploadsPerFrame));\n        this.#placeValue(this.bufValue, this.#layout.buf);\n        this.#placeUnit(this.bufUnit, this.bufValue, this.#layout.buf);\n\n        this.bytesValue.setText(formatHudBytes(bufferUploadBytesPerFrame));\n        this.#placeValue(this.bytesValue, this.#layout.bytes);\n        this.#placeUnit(this.bytesUnit, this.bytesValue, this.#layout.bytes);\n\n        this.rbValue.setText(formatHudScalar(readbacksPerFrame));\n        this.#placeValue(this.rbValue, this.#layout.rb);\n        this.#placeUnit(this.rbUnit, this.rbValue, this.#layout.rb);\n\n        this.updValue.setText(upd.valueText);\n        this.updUnit.setText(upd.unitText);\n        this.#placeValue(this.updValue, this.#layout.upd);\n        this.#placeUnit(this.updUnit, this.updValue, this.#layout.upd);\n\n        this.drValue.setText(dr.valueText);\n        this.drUnit.setText(dr.unitText);\n        this.#placeValue(this.drValue, this.#layout.dr);\n        this.#placeUnit(this.drUnit, this.drValue, this.#layout.dr);\n\n        this.trqValue.setText(trq.valueText);\n        this.trqUnit.setText(trq.unitText);\n        this.#placeValue(this.trqValue, this.#layout.trq);\n        this.#placeUnit(this.trqUnit, this.trqValue, this.#layout.trq);\n        if (!sameColor(trqColor, this.#lastTrqColor)) {\n            this.#lastTrqColor = trqColor;\n            this.trqValue.mutate({ fontColor: trqColor });\n        }\n\n        this.pwValue.setText(pw.valueText);\n        this.pwUnit.setText(pw.unitText);\n        this.#placeValue(this.pwValue, this.#layout.pw);\n        this.#placeUnit(this.pwUnit, this.pwValue, this.#layout.pw);\n        if (!sameColor(pwColor, this.#lastPwColor)) {\n            this.#lastPwColor = pwColor;\n            this.pwValue.mutate({ fontColor: pwColor });\n        }\n        this.hoverValue.setText(hoverText);\n    }\n\n    /* Update the displayed FPS at a lower cadence so the chrome only churns when the rounded display value changes. */\n    noteFrame(timestamp) {\n        this.#frameCount += 1;\n        this.#frameTimes.push(timestamp);\n        this.#tranquilityPing?.tick(timestamp);\n        this.#puffworkerPing?.tick(timestamp);\n        const minTime = timestamp - FPS_SAMPLE_WINDOW_MS;\n        while (this.#frameTimes.length > 0 && this.#frameTimes[0] < minTime) {\n            this.#frameTimes.shift();\n        }\n        if ((timestamp - this.#lastSampleAt) < FPS_SAMPLE_INTERVAL_MS) {\n            return;\n        }\n        this.#lastSampleAt = timestamp;\n        if (this.#frameTimes.length < 2) {\n            return;\n        }\n        const spanMs = this.#frameTimes[this.#frameTimes.length - 1] - this.#frameTimes[0];\n        if (spanMs <= 0) {\n            return;\n        }\n        const fps = ((this.#frameTimes.length - 1) * 1000) / spanMs;\n        const fpsText = formatFpsText(fps);\n        const gpuCounters = readGpuCounters();\n        const lastGpu = this.#lastGpuCounters;\n        const frameDelta = lastGpu ? Math.max(1, this.#frameCount - lastGpu.frameCount) : 0;\n        const hud = {\n            fpsText,\n            bufferUploadsPerFrame: frameDelta > 0\n                ? (gpuCounters.bufferUploadEvents - lastGpu.bufferUploadEvents) / frameDelta\n                : 0,\n            bufferUploadBytesPerFrame: frameDelta > 0\n                ? (gpuCounters.bufferUploadBytes - lastGpu.bufferUploadBytes) / frameDelta\n                : 0,\n            readbacksPerFrame: frameDelta > 0\n                ? (gpuCounters.readbackCount - lastGpu.readbackCount) / frameDelta\n                : 0,\n            updateSceneMS: readTrackerMetric('update_scene'),\n            drawSceneMS: readTrackerMetric('draw_scene'),\n            tranquilityPing: this.#tranquilityPing?.snapshot(timestamp) ?? null,\n            puffworkerPing: this.#puffworkerPing?.snapshot(timestamp) ?? null,\n            hoverText: this.#getHoverText?.() ?? 'hover: none',\n        };\n        this.#lastGpuCounters = {\n            frameCount: this.#frameCount,\n            bufferUploadBytes: gpuCounters.bufferUploadBytes,\n            bufferUploadEvents: gpuCounters.bufferUploadEvents,\n            readbackCount: gpuCounters.readbackCount,\n        };\n        this.#syncHud(hud);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nfunction clampNonNegative(value) {\n    if (!Number.isFinite(value)) {\n        return 0;\n    }\n    return Math.max(0, value);\n}\n\nexport const HUD_FIELD_GAP = '  ';\nconst HUD_PING_COLOR_STOPS = [\n    { ms: 50, color: [0.18, 0.96, 0.34] },\n    { ms: 100, color: [0.55, 0.92, 0.20] },\n    { ms: 500, color: [0.98, 0.86, 0.12] },\n    { ms: 1000, color: [1.0, 0.18, 0.14] },\n];\n\n/* Keep interpolation bounded so the latency ramp stays monotonic between the named thresholds. */\nfunction clamp01(value) {\n    if (!Number.isFinite(value)) {\n        return 0;\n    }\n    return Math.min(1, Math.max(0, value));\n}\n\n/* Interpolate one RGB stop pair so latency colour changes stay visually smooth across the coarse thresholds. */\nfunction mixColor(a, b, t) {\n    const k = clamp01(t);\n    return [\n        a[0] + ((b[0] - a[0]) * k),\n        a[1] + ((b[1] - a[1]) * k),\n        a[2] + ((b[2] - a[2]) * k),\n    ];\n}\n\n/* Pull the latency ramp toward neutral luminance so the HUD reads as advisory colour rather than alarm chrome. */\nfunction desaturateColor(color, amount = 0.65) {\n    const k = clamp01(amount);\n    const grey = (color[0] + color[1] + color[2]) / 3;\n    return [\n        color[0] + ((grey - color[0]) * k),\n        color[1] + ((grey - color[1]) * k),\n        color[2] + ((grey - color[2]) * k),\n    ];\n}\n\n/* Resolve one compact latency colour from the user-facing thresholds rather than from arbitrary continuous maths. */\nfunction pingRgbForLatencyMS(latencyMS) {\n    const ms = clampNonNegative(latencyMS);\n    if (ms <= HUD_PING_COLOR_STOPS[0].ms) {\n        return desaturateColor(HUD_PING_COLOR_STOPS[0].color);\n    }\n    for (let i = 1; i < HUD_PING_COLOR_STOPS.length; i += 1) {\n        const prev = HUD_PING_COLOR_STOPS[i - 1];\n        const next = HUD_PING_COLOR_STOPS[i];\n        if (ms <= next.ms) {\n            return desaturateColor(mixColor(prev.color, next.color, (ms - prev.ms) / (next.ms - prev.ms)));\n        }\n    }\n    return desaturateColor(HUD_PING_COLOR_STOPS[HUD_PING_COLOR_STOPS.length - 1].color);\n}\n\n\n/* Keep small developer metrics stable and compact rather than showing visually noisy precision. */\nexport function formatHudScalar(value) {\n    const n = clampNonNegative(value);\n    if (n < 0.05) {\n        return '0.0';\n    }\n    if (n < 9.95) {\n        return (Math.round(n * 10) / 10).toFixed(1);\n    }\n    return `${Math.round(n)}`;\n}\n\n/* Keep bandwidth units stable so the HUD width does not twitch when upload pressure drops near zero. */\nexport function formatHudBytes(value) {\n    const n = clampNonNegative(value);\n    if (n < (1024 * 1024)) {\n        const kb = n / 1024;\n        return `${Math.round(kb)}kB`;\n    }\n    const mb = n / (1024 * 1024);\n    if (mb < 9.95) {\n        return `${(Math.round(mb * 10) / 10).toFixed(1)}MB`;\n    }\n    return `${Math.round(mb)}MB`;\n}\n\n/* Keep ping labels compact but explicit so stalls and backend errors remain\n   visible in the single-line HUD. */\nexport function formatHudPing(snapshot) {\n    switch (snapshot?.state) {\n    case 'ok':\n        return `${formatHudScalar(snapshot.latencyMS)}ms`;\n    case 'pending':\n        return '...';\n    case 'error':\n        return 'err';\n    default:\n        return '--';\n    }\n}\n\n/* Split ping text into value and unit so the HUD can colour only the numeric latency without tinting labels or suffixes. */\nexport function formatHudPingParts(snapshot) {\n    switch (snapshot?.state) {\n    case 'ok':\n        return {\n            valueText: formatHudScalar(snapshot.latencyMS),\n            unitText: 'ms',\n        };\n    case 'pending':\n        return {\n            valueText: '...',\n            unitText: '',\n        };\n    case 'error':\n        return {\n            valueText: 'err',\n            unitText: '',\n        };\n    default:\n        return {\n            valueText: '--',\n            unitText: '',\n        };\n    }\n}\n\n/* Build one authoritative HUD field list so text layout and ping colouring share the same segmentation. */\nexport function buildHudParts({\n    fpsText,\n    bufferUploadsPerFrame = 0,\n    bufferUploadBytesPerFrame = 0,\n    readbacksPerFrame = 0,\n    updateSceneMS = null,\n    drawSceneMS = null,\n    tranquilityPing = null,\n    puffworkerPing = null,\n}) {\n    const parts = [\n        { text: fpsText },\n        { text: `buf ${formatHudScalar(bufferUploadsPerFrame)}/f` },\n        { text: `${formatHudBytes(bufferUploadBytesPerFrame)}/f` },\n        { text: `rb ${formatHudScalar(readbacksPerFrame)}/f` },\n    ];\n    if (Number.isFinite(updateSceneMS)) {\n        parts.push({ text: `upd ${formatHudScalar(updateSceneMS)}ms` });\n    }\n    if (Number.isFinite(drawSceneMS)) {\n        parts.push({ text: `dr ${formatHudScalar(drawSceneMS)}ms` });\n    }\n    if (tranquilityPing || puffworkerPing) {\n        parts.push({\n            text: `trq ${formatHudPing(tranquilityPing)}`,\n            highlightPrefix: 'trq ',\n            snapshot: tranquilityPing,\n        });\n        parts.push({\n            text: `pw ${formatHudPing(puffworkerPing)}`,\n            highlightPrefix: 'pw ',\n            snapshot: puffworkerPing,\n        });\n    }\n    return parts;\n}\n\n/* Project one RGBA latency colour for the compact HUD while leaving startup and idle placeholders unaccented. */\nexport function getHudPingColor(snapshot, alpha = 1) {\n    return snapshot?.state === 'ok'\n        ? [...pingRgbForLatencyMS(snapshot.latencyMS), alpha]\n        : null;\n}\n\n/* Build one compact diagnostic line so developers can correlate visible artefacts with upload and phase pressure. */\nexport function formatHudText({\n    fpsText,\n    bufferUploadsPerFrame = 0,\n    bufferUploadBytesPerFrame = 0,\n    readbacksPerFrame = 0,\n    updateSceneMS = null,\n    drawSceneMS = null,\n    tranquilityPing = null,\n    puffworkerPing = null,\n}) {\n    return buildHudParts({\n        fpsText,\n        bufferUploadsPerFrame,\n        bufferUploadBytesPerFrame,\n        readbacksPerFrame,\n        updateSceneMS,\n        drawSceneMS,\n        tranquilityPing,\n        puffworkerPing,\n    }).map((part) => part.text).join(HUD_FIELD_GAP);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Match the low-churn display contract: integer at 10+, one decimal below, floor tiny values to zero. */\nexport function formatFpsText(fps) {\n    if (!Number.isFinite(fps) || fps < 0.05) {\n        return '0.0 FPS';\n    }\n    if (fps < 9.95) {\n        return `${(Math.round(fps * 10) / 10).toFixed(1)} FPS`;\n    }\n    return `${Math.round(fps)} FPS`;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nfunction isAbortError(err) {\n    return err?.name === 'AbortError';\n}\n\n/* Keep HUD ping probes single-flight so the display reports the latest settled\n   latency per one-second window without stacking stale requests behind stalls. */\nexport class PingSampler {\n    #ping;\n    #periodMS;\n    #now;\n    #nextLaunchAt = 0;\n    #inFlightSince = null;\n    #latencyMS = null;\n    #hasError = false;\n    #token = 0;\n    #controller = null;\n    #disposed = false;\n\n    constructor({ ping, periodMS = 1000, now = () => performance.now() }) {\n        if (typeof ping !== 'function') {\n            throw new Error('PingSampler requires a ping({ signal }) function.');\n        }\n        this.#ping = ping;\n        this.#periodMS = periodMS;\n        this.#now = now;\n    }\n\n    /* Launch the next probe once its integration window opens and no earlier\n       probe is still outstanding. */\n    tick(timestamp) {\n        if (this.#disposed || this.#inFlightSince !== null || timestamp < this.#nextLaunchAt) {\n            return;\n        }\n\n        const startedAt = timestamp;\n        const token = ++this.#token;\n        const controller = new AbortController();\n        this.#controller = controller;\n        this.#inFlightSince = startedAt;\n        do {\n            this.#nextLaunchAt += this.#periodMS;\n        } while (this.#nextLaunchAt <= startedAt);\n        Promise.resolve().then(() => this.#ping({ signal: controller.signal })).then(\n            () => this.#settle(token, startedAt, null),\n            (err) => this.#settle(token, startedAt, err),\n        );\n    }\n\n    /* Project the current display state so the HUD can distinguish settled,\n       pending, and failed windows compactly. */\n    snapshot() {\n        if (this.#latencyMS !== null) {\n            return { state: 'ok', latencyMS: this.#latencyMS };\n        }\n        if (this.#inFlightSince !== null) {\n            return { state: 'pending', latencyMS: null };\n        }\n        if (this.#hasError) {\n            return { state: 'error', latencyMS: null };\n        }\n        return { state: 'idle', latencyMS: null };\n    }\n\n    /* Abort any in-flight probe when the owning HUD instance is torn down. */\n    dispose() {\n        this.#disposed = true;\n        this.#controller?.abort();\n        this.#controller = null;\n        this.#inFlightSince = null;\n    }\n\n    #settle(token, startedAt, err) {\n        if (this.#disposed || token !== this.#token) {\n            return;\n        }\n        this.#controller = null;\n        this.#inFlightSince = null;\n        if (isAbortError(err)) {\n            return;\n        }\n\n        if (err) {\n            this.#hasError = true;\n            return;\n        }\n\n        this.#latencyMS = Math.max(0, this.#now() - startedAt);\n        this.#hasError = false;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Desktop files arrive through native events even when the UI is rendered in WebGL. */\nexport function installFileDrop({ target, canUpload, onHover, onDrop, onError }) {\n    let depth = 0;\n    const hasFiles = (event) => Array.from(event.dataTransfer?.types ?? []).includes('Files');\n    // Item kinds are readable during hover even though file names and bodies are protected.\n    const fileCount = (event) => Array.from(event.dataTransfer.items ?? [])\n        .filter((item) => item.kind === 'file').length || event.dataTransfer.files?.length || null;\n    const clear = () => {\n        depth = 0;\n        onHover(false);\n    };\n    const listeners = {\n        dragenter(event) {\n            if (!hasFiles(event)) return;\n            event.preventDefault();\n            depth += 1;\n            onHover(true, fileCount(event));\n        },\n        dragover(event) {\n            if (!hasFiles(event)) return;\n            event.preventDefault();\n            event.dataTransfer.dropEffect = canUpload() ? 'copy' : 'none';\n            onHover(true, fileCount(event));\n        },\n        dragleave(event) {\n            if (depth === 0) return;\n            depth = Math.max(0, depth - 1);\n            if (depth === 0) clear();\n        },\n        drop(event) {\n            if (!hasFiles(event)) return;\n            event.preventDefault();\n            const allowed = canUpload();\n            // Copy the files before the browser closes the drag data store.\n            const items = Array.from(event.dataTransfer.items ?? []);\n            const hasDirectory = items.some((item) => item.webkitGetAsEntry?.()?.isDirectory);\n            const files = Array.from(event.dataTransfer.files);\n            clear();\n            if (!allowed) return;\n            if (hasDirectory) {\n                onError(new Error('Folder uploads are not supported. Drop individual files.'));\n                return;\n            }\n            if (files.length > 0) {\n                Promise.resolve(onDrop(files)).catch(onError);\n            }\n        },\n        blur: clear,\n        pagehide: clear,\n    };\n    for (const [type, handler] of Object.entries(listeners)) target.addEventListener(type, handler);\n    return () => {\n        for (const [type, handler] of Object.entries(listeners)) target.removeEventListener(type, handler);\n        clear();\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Anchor } from './base.mjs';\nimport { OverlayTile, OverlayText } from './overlay.mjs';\nimport { roundedTileShape } from './tile-shape.mjs';\nimport { MSDFText } from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nconst VALID_UPLOAD_COLOR = [...Palette.darkteal.slice(0, 3), 0.75];\nconst INVALID_UPLOAD_COLOR = [...Palette.darkburgundy.slice(0, 3), 0.4];\n\nexport class FileDropOverlay extends Anchor {\n    constructor({ font }) {\n        super({ name: 'fileDropOverlay', z: -7000, textBatchScopeKey: 'file_drop_overlay.text' });\n        this.font = font;\n        this.backing = new OverlayTile({\n            width: 1, height: 1, color: VALID_UPLOAD_COLOR,\n        });\n        this.frame = new OverlayTile({\n            width: 1, height: 1, z: -0.5,\n            color: Palette.clear,\n            shape: roundedTileShape({ cornerRadius: 24 }),\n            outlineEnabled: true,\n            outlineWidth: 5,\n            outlineAlignment: 'inner',\n            outlineColor: Palette.white,\n        });\n        this.label = new OverlayText({ font, fontSize: 32, text: '', fontColor: Palette.white, z: -1 });\n        this.subtitle = new OverlayText({\n            font, fontSize: 18,\n            text: 'Drag and drop files into this window to upload them to the current directory',\n            fontColor: Palette.white, z: -1,\n        });\n        // Register the backing before the scoped transparent text batch so the message stays untinted.\n        this.appendChild(this.backing);\n        this.appendChild(this.frame);\n        this.appendChild(this.label);\n        this.appendChild(this.subtitle);\n        this.setVisibility(false);\n    }\n\n    show(allowed, { fileCount = null, directoryName = '/' } = {}) {\n        this.backing.mutate({ color: allowed ? VALID_UPLOAD_COLOR : INVALID_UPLOAD_COLOR });\n        const files = fileCount === null ? 'files' : `${fileCount} ${fileCount === 1 ? 'file' : 'files'}`;\n        this.label.setText(allowed\n            ? `Upload ${files} to ${directoryName}`\n            : 'You dont have permission to upload files here');\n        this.subtitle.setVisibility(allowed);\n        this.setVisibility(true);\n        this.syncLayout();\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.syncLayout();\n    }\n\n    onViewportResized() {\n        this.syncLayout();\n    }\n\n    syncLayout() {\n        const camera = this.scene?.presentationCamera?.() ?? this.scene?.camera;\n        if (!camera?.vpBounds) return;\n        const [width, height] = camera.getViewportSize();\n        this.backing.mutate({ x: 0, y: 0, width, height });\n        this.frame.mutate({\n            x: width * 0.025, y: height * 0.025,\n            width: width * 0.95, height: height * 0.95,\n        });\n        // Keep the full permission message visible on narrow browser windows too.\n        const style = { font: this.font, fontSize: 32, text: this.label.state.text };\n        const natural = MSDFText.measureFromState(style);\n        const fontSize = 32 * Math.min(1, Math.max(1, width - 32) / Math.max(1, natural.width));\n        this.label.mutate({ fontSize });\n        const text = MSDFText.measureFromState({ ...style, fontSize });\n        this.label.setLocalPosition([(width - text.width) / 2, (height - text.height) / 2, -1]);\n        const subtitleStyle = { font: this.font, fontSize: 18, text: this.subtitle.state.text };\n        const naturalSubtitle = MSDFText.measureFromState(subtitleStyle);\n        const subtitleFontSize = 18 * Math.min(1, Math.max(1, width - 32) / Math.max(1, naturalSubtitle.width));\n        this.subtitle.mutate({ fontSize: subtitleFontSize });\n        const subtitle = MSDFText.measureFromState({ ...subtitleStyle, fontSize: subtitleFontSize });\n        this.subtitle.setLocalPosition([(width - subtitle.width) / 2, (height + text.height) / 2 + 16, -1]);\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Anchor } from './base.mjs';\nimport { Icon } from './icon.mjs';\nimport { Tile } from './tile.mjs';\nimport { roundedTileShape } from './tile-shape.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { MSDFText } from '../evilfont/evilfont.mjs';\n\n/* Match the table view's stale spinner inside a noninteractive status pill. */\nexport class FileActivityIndicator extends Anchor {\n    constructor({ font }) {\n        super({ name: 'fileActivityIndicator', z: -6500 });\n        this.font = font;\n        this.ownBacking = null;\n        this.ownSpinner = null;\n        this.ownLabel = null;\n        this.statusText = '';\n    }\n\n    setActivity(activity) {\n        if (activity === null) {\n            this.#clearSpinner();\n            return;\n        }\n        this.#setStatusText(activity);\n        if (this.ownSpinner) {\n            this.onViewportResized();\n            return;\n        }\n        this.ownBacking = new Tile({\n            name: 'fileActivityBacking', width: 80, height: 80, z: 1,\n            color: Palette.darkgrey,\n            shape: roundedTileShape({ cornerRadius: 40 }),\n        });\n        this.appendChild(this.ownBacking);\n        this.ownSpinner = new Icon({\n            name: 'fileActivitySpinner', width: 64, height: 64,\n            iconID: 24, color: Palette.white,\n        });\n        this.appendChild(this.ownSpinner);\n        this.ownLabel = new MSDFText({\n            name: 'fileActivityStatus', font: this.font, fontSize: 18,\n            text: this.statusText, fontColor: Palette.white, z: -1,\n        });\n        this.appendChild(this.ownLabel);\n        this.ownSpinner.setGpuSpin(1.6);\n        // GPU rotation still needs frames while the network request is pending.\n        this.ownSpinner.animateTo({\n            clock_s: 1, duration_s: 1.6, ease: 'linear',\n            loop: 'repeat', accumulate: true,\n        });\n        this.onViewportResized();\n    }\n\n    #setStatusText(progress) {\n        switch (progress.stage) {\n        case 'deleting':\n            this.statusText = progress.total > 1\n                ? `Deleting ${progress.index} of ${progress.total}: ${progress.filename}`\n                : `Deleting: ${progress.filename}`;\n            break;\n        case 'uploading': this.statusText = `Uploading: ${progress.filename}`; break;\n        case 'awaiting_selection': this.statusText = 'Waiting for replacement selection\u2026'; break;\n        case 'refreshing': this.statusText = 'Refreshing directory\u2026'; break;\n        case 'preparing': this.statusText = progress.operation === 'delete' ? 'Preparing deletion\u2026' : 'Preparing upload\u2026'; break;\n        default: throw new Error(`Unknown file activity stage: ${progress.stage}`);\n        }\n    }\n\n    onViewportResized() {\n        if (!this.ownSpinner) return;\n        const camera = this.scene?.presentationCamera?.() ?? this.scene?.camera;\n        if (!camera?.vpBounds) return;\n        const [width, height] = camera.getViewportSize();\n        this.ownSpinner.setLocalPosition([16, height - 80, 0]);\n        const maxWidth = Math.max(0, width - 112);\n        const measure = text => MSDFText.measureFromState({ font: this.font, fontSize: 18, text });\n        let text = this.statusText.replace(/[\\r\\n\\t]/g, ' ');\n        if (measure(text).width > maxWidth) {\n            const chars = Array.from(text);\n            let lo = 0, hi = chars.length;\n            while (lo < hi) {\n                const mid = Math.ceil((lo + hi) / 2);\n                if (measure(chars.slice(0, mid).join('') + '...').width <= maxWidth) lo = mid;\n                else hi = mid - 1;\n            }\n            text = measure('...').width <= maxWidth ? chars.slice(0, lo).join('') + '...' : '';\n        }\n        const textSize = measure(text);\n        this.ownBacking.mutate({\n            x: 8, y: height - 88, width: Math.max(80, textSize.width + 96), height: 80,\n        });\n        this.ownLabel.setText(text);\n        this.ownLabel.setLocalPosition([88, height - 48 - textSize.height / 2, -1]);\n    }\n\n    #clearSpinner() {\n        if (!this.ownSpinner) return;\n        this.ownSpinner.stopAnimation('clock_s');\n        this.ownSpinner.setGpuSpin(null);\n        this.removeChild(this.ownSpinner);\n        this.ownSpinner = null;\n        this.removeChild(this.ownLabel);\n        this.ownLabel = null;\n        this.removeChild(this.ownBacking);\n        this.ownBacking = null;\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.#clearSpinner();\n        super._onBeforeDetachNode(shared);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as ui from '../evilui/evilui.mjs';\nimport { VisualTesterPanel } from './visual-tester-panel.mjs';\nimport { RenamePanel } from './rename-panel.mjs';\nimport { PermissionPanel } from './permission-panel.mjs';\nimport { NewPuffbookPanel } from './new-file-panel.mjs';\nimport { NewDirPanel } from './new-dir-panel.mjs';\nimport { ConfirmationPanel } from './confirmation-panel.mjs';\nimport { FileActivityQueue } from './file-activity-queue.mjs';\nimport { UploadConflictsPanel } from './upload-conflicts-panel.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { CommanderBus } from '../commander.mjs';\nimport * as twgl from 'twgl';\nimport { createPuffbook, PuffbookScreen } from '../../puffbook.mjs';\nimport { createConvo, createDefaultConvo, serializeConvo } from '../../convo.mjs';\nimport { isBackendUnavailableError, parseDirectoryDeltaPayload } from '../../api.mjs';\nimport { castPtrlessNamed } from '../puffrpc/puffrpc.ptrless.mjs';\nimport { getPortalEnvironment, isDevelopmentPortal } from '../../env.mjs';\nimport * as textutils from './text-utils.mjs';\nimport { Palette } from './evil_palette.mjs'\nimport {\n    setTestingCurrentDocument,\n    setTestingCurrentScreen,\n    setTestingPuffbookError,\n} from '../testing-bridge.mjs';\nimport {\n    childPath,\n    describeArtifactReadErrorBanner,\n    formatDirectoryItemTooltip,\n    isDocumentArtifactPath,\n    normPath,\n    permissionGrantPaths,\n    routeArtifactLabel,\n} from './directory-utils.mjs';\nimport { portalLakePathFromFilePath } from '../../portal-routes.mjs';\nimport { apiCanServeRoutes } from '../../portal-policy.mjs';\nimport { downloadFileBuffer } from '../evil-works-utils.mjs';\nimport {\n    BANNER_CONTENT_SCALE,\n    BANNER_SUBTITLE_FONT_SIZE,\n    BANNER_TITLE_FONT_SIZE,\n    bannerSubtitleY,\n    bannerTextX,\n    bannerTitleY,\n} from './banner-layout.mjs';\nimport { shortcutChord } from '../shortcut-glossary.mjs';\n\n\nconst BUTTON_HEIGHT = 40\nconst DIRECTORY_MIN_WIDTH = 216\nlet WIDTH = DIRECTORY_MIN_WIDTH\nlet HEIGHT = 1080\nlet FRAME_THICKNESS = 8\nconst DIRECTORY_ROW_HOVER_COLOR = [0.2, 0.3, 0.3, 1.0];\nconst ROUTE_LOADING_DAMON_SCALE = 1.18;\nconst ROUTE_LOADING_DAMON_CENTER_Y_OFFSET = -90;\nconst ROUTE_LOADING_DAMON_Z = -100.0;\nconst ROUTE_LOADING_DAMON_POST_VIEW_ROTATION_Y = 0.5 * Math.PI;\nconst ROUTE_LOADING_DAMON_SPIN_DURATION_S = 0.8;\nconst DIRECTORY_RETRACTION_DURATION_S = 0.3;\nconst DIRECTORY_CORNER_ICON_GAP_PX = 8;\nconst RECORDING_SAVING_SPIN_PERIOD_S = 1.2;\nconst RECORDING_SHORTCUT_CHORD = shortcutChord('recording_toggle');\n\nfunction recordingTooltip(label) {\n    return RECORDING_SHORTCUT_CHORD ? `${label} (${RECORDING_SHORTCUT_CHORD})` : label;\n}\nconst DIRECTORY_RETRACTION_EASE = 'easeInOutSine';\nconst DIRECTORY_BANNER_FADE_DURATION_S = 0.3;\nconst DIRECTORY_BANNER_BACKING_Z = 0.0;\nconst DIRECTORY_BANNER_FOREGROUND_Z = -0.1;\nconst DIRECTORY_CLIPPED_TAIL_PENULT_ALPHA = 0.72;\nconst DIRECTORY_CLIPPED_TAIL_LAST_ALPHA = 0.42;\nconst DIRECTORY_DELTA_FADE_DURATION_S = 0.16;\nconst DIRECTORY_DELTA_FADE_EASE = 'easeInOutSine';\nconst DIRECTORY_DELTA_MOVE_DURATION_S = 0.16;\nconst DIRECTORY_DELTA_MOVE_EASE = 'easeInOutSine';\nconst DIRECTORY_ROW_PITCH = 29;\nconst DIRECTORY_SYMBOL_ICON_TINT = [0.40, 0.58, 0.78, 1.0];\nconst PATH_BREADCRUMB_SPACING = 2;\n\nfunction directoryFrameColor() {\n    switch (getPortalEnvironment()) {\n        case 'prod':\n            return Palette.orange;\n        case 'dev':\n            return Palette.dryteal;\n        case 'staging':\n            return Palette.purple;\n        default:\n            return Palette.olivegreen;\n    }\n}\n\nconst PUBLIC_PRINCIPAL = 'anyone';\nconst ROOT_PRINCIPAL = 'root';\nconst UNRESOLVED_PATH = null;\nconst GRANT_DENIED_FEEDBACK = 'You cannot grant permissions to this file.';\n\n/* Mirrors the backend's named-principal and ACL-group matching for frontend\n * permission fallbacks when a response has no explicit can_read/can_write flag. */\nfunction principalMatchesUsername(principal, username, effectiveGroups) {\n    if (!principal || !username) {\n        return false;\n    }\n    if (principal === username) {\n        return true;\n    }\n    return effectiveGroups?.has?.(principal) ?? false;\n}\n\nclass DirectoryBannerOverlay extends ui.Anchor {\n    constructor({ font, onRequestSignin = null }) {\n        super({\n            name: ui.uniqueName('directory_banner_overlay'),\n            textBatchScopeKey: 'directory_banner_overlay.text',\n        });\n        this.font = font;\n        this.onRequestSignin = onRequestSignin;\n        this.titleText = '';\n        this.subtitleText = '';\n        this.sidebarWidth = 0;\n        this.blocksInput = false;\n        this.showDamon = false;\n        this.wantsSignin = false;\n        this.damon = null;\n        this.damonMount = null;\n        this.label = new evilfont.MSDFText({\n            font,\n            fontSize: BANNER_TITLE_FONT_SIZE * BANNER_CONTENT_SCALE,\n            text: '',\n            z: DIRECTORY_BANNER_FOREGROUND_Z,\n            fontColor: Palette.white,\n        });\n        this.subtitleLabel = new evilfont.MSDFText({\n            font,\n            fontSize: BANNER_SUBTITLE_FONT_SIZE * BANNER_CONTENT_SCALE,\n            text: '',\n            z: DIRECTORY_BANNER_FOREGROUND_Z,\n            fontColor: Palette.white,\n        });\n        this.signInButton = null;\n        this.damonLoading = false;\n        this.damonToken = 0;\n        this.fadeToken = 0;\n        this.fadingOut = false;\n        this.backing = new ui.Tile({\n            x: 0,\n            y: 0,\n            z: DIRECTORY_BANNER_BACKING_Z,\n            width: 1,\n            height: 1,\n            color: [0.05, 0.06, 0.08, 0.82],\n        });\n        this.appendChild(this.backing);\n        this.appendChild(this.label);\n        this.appendChild(this.subtitleLabel);\n    }\n\n    setBanner({ title = '', subtitle = '', sidebarWidth = 0, blocksInput = false, wantsSignin = false, showDamon = false }) {\n        this.fadeToken += 1;\n        this.fadingOut = false;\n        this.titleText = `${title ?? ''}`.trim();\n        this.subtitleText = `${subtitle ?? ''}`.trim();\n        this.sidebarWidth = sidebarWidth;\n        this.blocksInput = blocksInput;\n        this.wantsSignin = wantsSignin;\n        this.showDamon = showDamon;\n        this.setVisibility(true);\n        this.backing.setVisibility(true);\n        this.backing.opacity = 1.0;\n        this.label.setText(this.titleText);\n        this.subtitleLabel.setText(this.subtitleText);\n        this.subtitleLabel.setVisibility(this.subtitleText.length > 0);\n        this.#syncSigninButton();\n        this.#resetForegroundOpacity();\n        if (!this.showDamon && this.damonMount && this.children.includes(this.damonMount)) {\n            this.removeChild(this.damonMount);\n            this.damonMount = null;\n            this.damon = null;\n        }\n        this.syncToChromeSpace();\n        void this.ensureDamon();\n    }\n\n    /* Fade the visible foreground out over the Puffbook, then detach the overlay once alpha reaches zero. */\n    fadeOutAndDetach() {\n        if (!this.parentNode) {\n            return;\n        }\n        const fadeToken = ++this.fadeToken;\n        this.fadingOut = true;\n        this.blocksInput = false;\n        this.showDamon = false;\n        this.backing.setVisibility(false);\n        const nodes = this.#foregroundNodes();\n        if (nodes.length === 0) {\n            this.parentNode.removeChild(this);\n            return;\n        }\n        const anchor = nodes[0];\n        for (const node of nodes) {\n            node.stopAnimation('opacity');\n            node.animateTo({\n                opacity: 0.0,\n                duration_s: DIRECTORY_BANNER_FADE_DURATION_S,\n                ease: DIRECTORY_RETRACTION_EASE,\n                onFinish: node === anchor ? () => {\n                    if (fadeToken !== this.fadeToken || !this.parentNode) {\n                        return;\n                    }\n                    this.parentNode.removeChild(this);\n                } : null,\n            });\n        }\n    }\n\n    /* Place Damon in HUD space with enough foreground depth for the rotating mesh to stay ahead of the banner backing. */\n    #damonBaseMatrix(x, y, z, scale) {\n        let out = twgl.m4.translation([x, y, z]);\n        out = twgl.m4.scale(out, [scale, scale, scale]);\n        return out;\n    }\n\n    /* Build the Damon banner mesh in the same HUD scene as its loading overlay. */\n    async ensureDamon() {\n        if (!this.showDamon || this.fadingOut || this.damon || this.damonLoading || !this.scene) {\n            return;\n        }\n        this.damonLoading = true;\n        const damonToken = ++this.damonToken;\n        let damonModel = null;\n        try {\n            damonModel = await ui.createGLBModel(this.scene, 'damon');\n        } catch (err) {\n            console.warn('Failed to create Damon banner model; rendering text-only overlay.', err);\n        }\n        this.damonLoading = false;\n        if (damonToken !== this.damonToken || !this.scene || !damonModel || !this.showDamon) {\n            return;\n        }\n        this.damonMount = new ui.Placeholder({\n            name: ui.uniqueName(`${this.state.name}.damon_mount`),\n        });\n        this.damon = new ui.MeshInstance({\n            mesh: damonModel,\n            z: 0.0,\n            postViewMatrix: twgl.m4.rotationY(ROUTE_LOADING_DAMON_POST_VIEW_ROTATION_Y),\n            post_view_rotation_y: 0.0,\n        });\n        this.damonMount.appendChild(this.damon);\n        this.appendChild(this.damonMount);\n        this.syncToChromeSpace();\n        this.#ensureDamonSpin();\n    }\n\n    onPointerInput(_event) {\n        return this.blocksInput;\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        void this.ensureDamon();\n        this.syncToChromeSpace();\n        this.#ensureDamonSpin();\n    }\n\n    onViewportResized(_gl) {\n        this.syncToChromeSpace();\n    }\n\n    /* Resize the banner overlay against the chrome presentation plane while keeping the sidebar visually in front. */\n    syncToChromeSpace() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam?.vpBounds) {\n            return;\n        }\n        const [w, h] = cam.getViewportSize();\n        const left = Math.max(0, this.sidebarWidth);\n        const docWidth = Math.max(1, w - left);\n        const centreX = left + docWidth * 0.5;\n        this.setLocalPosition([0, 0, this.localPosition()[2]]);\n        this.backing.mutate({ x: left, y: 0, width: docWidth, height: h });\n        if (this.damonMount) {\n            this.damonMount.setLocalToParent(this.#damonBaseMatrix(\n                centreX,\n                Math.max(160, h * 0.5 + ROUTE_LOADING_DAMON_CENTER_Y_OFFSET),\n                ROUTE_LOADING_DAMON_Z,\n                ROUTE_LOADING_DAMON_SCALE,\n            ));\n        }\n        const titleLayout = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.label.state.fontSize,\n            text: this.label.state.text,\n        });\n        const subtitleLayout = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.subtitleLabel.state.fontSize,\n            text: this.subtitleLabel.state.text,\n        });\n        const titleY = bannerTitleY(h);\n        const subtitleY = bannerSubtitleY(h);\n        this.label.setLocalPosition([\n            bannerTextX(left, centreX, titleLayout.width, 1.0),\n            titleY,\n            this.label.localPosition()[2],\n        ]);\n        this.subtitleLabel.setLocalPosition([\n            bannerTextX(left, centreX, subtitleLayout.width, 1.0),\n            subtitleY,\n            this.subtitleLabel.localPosition()[2],\n        ]);\n        if (this.signInButton && this.children.includes(this.signInButton)) {\n            this.signInButton.setLocalPosition([\n                centreX - this.signInButton.state.width * 0.5,\n                Math.max(0, subtitleY + 96),\n                this.signInButton.localPosition()[2],\n            ]);\n        }\n    }\n\n    /* Keep the optional sign-in affordance owned by the shared banner overlay rather than by Directory. */\n    #syncSigninButton() {\n        if (!this.wantsSignin || !this.onRequestSignin) {\n            if (this.signInButton && this.children.includes(this.signInButton)) {\n                this.removeChild(this.signInButton);\n            }\n            this.signInButton = null;\n            return;\n        }\n        if (this.signInButton && this.children.includes(this.signInButton)) {\n            return;\n        }\n        this.signInButton = new ui.Button({\n            font: this.font,\n            fontSize: 20,\n            text: 'Sign in',\n            width: 160,\n            height: 48,\n            textHAlignment: 'CENTER',\n            textVAlignment: 'MIDDLE',\n            z: DIRECTORY_BANNER_FOREGROUND_Z,\n            color: Palette.orange,\n            onHoverColor: Palette.teal,\n        });\n        this.signInButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            this.onRequestSignin();\n            return true;\n        };\n        this.appendChild(this.signInButton);\n    }\n\n    /* Enumerate the currently mounted foreground nodes that should visually fade while the scrim disappears immediately. */\n    #foregroundNodes() {\n        return [this.label, this.subtitleLabel, this.damon, this.signInButton].filter((node) => node && node.parentNode === this);\n    }\n\n    /* Restore any reused foreground nodes to full opacity before presenting a fresh banner state. */\n    #resetForegroundOpacity() {\n        for (const node of this.#foregroundNodes()) {\n            node.stopAnimation('opacity');\n            node.setVisibility(true);\n            node.opacity = 1.0;\n        }\n    }\n\n    /* Drive Damon banner motion through the shared node animation registry rather than a manual frame think loop. */\n    #ensureDamonSpin() {\n        if (!this.scene || !this.showDamon || this.fadingOut || !this.damon) {\n            return;\n        }\n        if (this.damon.animationState('post_view_rotation_y')) {\n            return;\n        }\n        this.damon.state.post_view_rotation_y = 0.0;\n        this.damon.animateTo({\n            post_view_rotation_y: Math.PI * 2.0,\n            duration_s: ROUTE_LOADING_DAMON_SPIN_DURATION_S,\n            ease: 'linear',\n            loop: 'repeat',\n            iterations: null,\n            accumulate: true,\n        });\n    }\n\n    _onDetachNode(shared) {\n        this.damonToken += 1;\n        this.fadeToken += 1;\n        this.fadingOut = false;\n        this.damonLoading = false;\n        super._onDetachNode(shared);\n    }\n}\n\n/* Fade the trailing two rendered glyphs for one clipped directory row so overlong names taper out cleanly. */\nfunction applyDirectoryClippedTail(textLabel, clipped, baseColor = [1, 1, 1, 1]) {\n    if (!textLabel || typeof textLabel.setGlyphColors !== 'function' || typeof textLabel.glyphCount !== 'function') {\n        return;\n    }\n    const glyphCount = textLabel.glyphCount();\n    if (!clipped || !Number.isInteger(glyphCount) || glyphCount <= 0) {\n        textLabel.setGlyphColors(null);\n        return;\n    }\n    const glyphColors = new Float32Array(glyphCount * 4);\n    for (let i = 0; i < glyphCount; i += 1) {\n        const off = i * 4;\n        glyphColors[off] = baseColor[0] ?? 1;\n        glyphColors[off + 1] = baseColor[1] ?? 1;\n        glyphColors[off + 2] = baseColor[2] ?? 1;\n        glyphColors[off + 3] = baseColor[3] ?? 1;\n    }\n    glyphColors[glyphColors.length - 1] = (baseColor[3] ?? 1) * DIRECTORY_CLIPPED_TAIL_LAST_ALPHA;\n    if (glyphCount > 1) {\n        glyphColors[glyphColors.length - 5] = (baseColor[3] ?? 1) * DIRECTORY_CLIPPED_TAIL_PENULT_ALPHA;\n    }\n    textLabel.setGlyphColors(glyphColors);\n}\n\n/* Keep one row-label fade spec on the button so attach and relayout can reapply it after the text node exists. */\nfunction setDirectoryRowFade(button, clipped, baseColor = [1, 1, 1, 1]) {\n    if (!button) {\n        return;\n    }\n    button.ownDirectoryFade = {\n        clipped: clipped === true,\n        baseColor,\n    };\n    applyDirectoryClippedTail(button.textLabel, clipped, baseColor);\n}\n\n/* Reapply one retained row fade after button attach creates the real text label node. */\nfunction syncDirectoryRowFade(button) {\n    const spec = button?.ownDirectoryFade ?? null;\n    if (!spec) {\n        return;\n    }\n    applyDirectoryClippedTail(button.textLabel, spec.clipped, spec.baseColor);\n}\n\n/* Format one directory row against the real text renderer and treat any truncation or width overrun as clipped. */\nfunction layoutDirectoryRowLabel(name, width, style) {\n    const layout = textutils.formatCellValueLayout(name, width, style);\n    const fullText = String(name ?? '').replace(/\\r\\n/g, '\\n').split('\\n')[0] ?? '';\n    const fullLayout = evilfont.MSDFText.measureFromState({\n        font: style.font,\n        fontSize: style.fontSize,\n        text: fullText,\n    });\n    return {\n        text: layout.text,\n        clipped: layout.clipped === true || layout.text !== fullText || fullLayout.width > width,\n    };\n}\n\n/* Decode one UTF-8 artifact payload exactly once so directory-side manifest reads stay text-based and simple. */\nfunction decodeDirectoryArtifactText(buffer) {\n    return new TextDecoder().decode(buffer);\n}\n\n/* Validate one optional line-focus target at the external open boundary. */\nfunction normalizePuffbookFocus(focus) {\n    if (!focus) {\n        return null;\n    }\n    if (!Number.isInteger(focus.lineNum) || focus.lineNum < 0) {\n        throw new Error(`Puffbook focus line must be a non-negative integer (got ${JSON.stringify(focus.lineNum)}).`);\n    }\n    const col = focus.col ?? 0;\n    if (!Number.isInteger(col) || col < 0) {\n        throw new Error(`Puffbook focus column must be a non-negative integer (got ${JSON.stringify(col)}).`);\n    }\n    return {\n        lineNum: focus.lineNum,\n        col,\n    };\n}\n\n/* Escape one export name for regex use so source-line lookup stays strict about the backend-provided symbol spelling. */\nfunction escapeRegExp(text) {\n    return `${text ?? ''}`.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/* Find the top-level `export` line for one export name, falling back to line zero when the source no longer matches the stub. */\nfunction findPublishedExportLine(body, exportName) {\n    const name = `${exportName ?? ''}`.trim();\n    if (!name) {\n        return 0;\n    }\n    const lines = String(body ?? '').split(/\\r?\\n/);\n    const rx = new RegExp(`^\\\\s*export\\\\s+${escapeRegExp(name)}(?:\\\\b|\\\\s*=|\\\\s|$)`);\n    for (let i = 0; i < lines.length; i += 1) {\n        if (rx.test(lines[i])) {\n            return i;\n        }\n    }\n    return 0;\n}\n\n/* Map one authoritative alphabetical directory node into the sidebar row shape consumed by the existing chrome. */\nfunction directoryItemFromSnapshotNode(dirPath, node) {\n    const itemPath = childPath(dirPath, node?.name ?? '');\n    if (node?.kind === 'child') {\n        return {\n            name: node?.name ?? '',\n            path: itemPath,\n            type: node?.artifact?.type ?? 'directory',\n            owner: node?.artifact?.owner ?? '',\n            read_groups: Array.isArray(node?.artifact?.read_groups) ? [...node.artifact.read_groups] : [],\n            write_groups: Array.isArray(node?.artifact?.write_groups) ? [...node.artifact.write_groups] : [],\n            can_read: node?.artifact?.can_read,\n            can_write: node?.artifact?.can_write,\n        };\n    }\n    if (node?.kind === 'symbol') {\n        return {\n            name: node?.name ?? '',\n            path: itemPath,\n            type: 'symbol',\n            owner_path: node?.owner_path ?? '',\n            conflicts: [],\n        };\n    }\n    if (node?.kind === 'conflict') {\n        return {\n            name: node?.name ?? '',\n            path: itemPath,\n            type: 'conflict',\n            owner_path: '',\n            conflicts: Array.isArray(node?.conflicts) ? [...node.conflicts] : [],\n        };\n    }\n    throw new Error(`Unsupported directory node kind ${JSON.stringify(node?.kind)}.`);\n}\n\n/* Map one authoritative by-source group into the same row shape used by the retained sidebar renderer. */\nfunction directoryItemFromBySourceGroup(group) {\n    const sourcePath = normPath(group?.source_path ?? '');\n    const names = Array.isArray(group?.names) ? group.names.map((item) => `${item?.name ?? ''}`.trim()).filter(Boolean) : [];\n    const sourceName = `${group?.source_name ?? ''}`.trim();\n    const namesText = names.join(', ');\n    return {\n        name: sourceName,\n        display_name: namesText ? `${sourceName}: ${namesText}` : sourceName,\n        path: sourcePath,\n        type: group?.source_artifact?.type ?? 'directory',\n        owner: group?.source_artifact?.owner ?? '',\n        read_groups: Array.isArray(group?.source_artifact?.read_groups) ? [...group.source_artifact.read_groups] : [],\n        write_groups: Array.isArray(group?.source_artifact?.write_groups) ? [...group.source_artifact.write_groups] : [],\n        can_read: group?.source_artifact?.can_read,\n        can_write: group?.source_artifact?.can_write,\n        group_key: `${group?.key ?? sourcePath}`,\n        published_names: names,\n    };\n}\n\n/* Project one snapshot payload into the generic ordered row list for the selected directory projection. */\nfunction directoryProjectionRows(snapshot) {\n    const projection = `${snapshot?.projection ?? ''}`;\n    const dirPath = normPath(snapshot?.key?.path ?? '');\n    switch (projection) {\n    case 'alphabetical':\n        return Array.isArray(snapshot?.alphabetical)\n            ? snapshot.alphabetical.map((node) => directoryItemFromSnapshotNode(dirPath, node))\n            : [];\n    case 'by_source':\n        return Array.isArray(snapshot?.by_source)\n            ? snapshot.by_source.map((group) => directoryItemFromBySourceGroup(group))\n            : [];\n    default:\n        throw new Error(`Unsupported directory projection ${JSON.stringify(snapshot?.projection)}.`);\n    }\n}\n\n/* Project one delta edit payload into generic retained rows for the selected directory projection. */\nfunction directoryProjectionEditRows(projection, dirPath, rows) {\n    switch (`${projection ?? ''}`) {\n    case 'alphabetical':\n        return Array.isArray(rows) ? rows.map((node) => directoryItemFromSnapshotNode(dirPath, node)) : [];\n    case 'by_source':\n        return Array.isArray(rows) ? rows.map((group) => directoryItemFromBySourceGroup(group)) : [];\n    default:\n        throw new Error(`Unsupported directory projection ${JSON.stringify(projection)}.`);\n    }\n}\n\n/* Convert one websocket/open baseline payload into the retained sidebar list state. */\nfunction directoryStateFromSnapshot(snapshot) {\n    if (!snapshot || typeof snapshot !== 'object') {\n        throw new Error('Directory snapshot must be an object.');\n    }\n    return {\n        key: snapshot.key ?? null,\n        seq: snapshot.seq ?? 0,\n        projection: snapshot.projection,\n        counts: snapshot.counts ?? null,\n        data: directoryProjectionRows(snapshot),\n    };\n}\n\n/* Apply one ordered insert/remove delta batch onto the retained sidebar list state without refetching. */\nfunction applyDirectoryStateDelta(state, delta) {\n    if (!state || typeof state !== 'object') {\n        throw new Error('Directory delta requires existing state.');\n    }\n    if (!delta || typeof delta !== 'object') {\n        throw new Error('Directory delta must be an object.');\n    }\n    if (state.projection !== delta.projection) {\n        throw new Error(`Directory projection changed from ${JSON.stringify(state.projection)} to ${JSON.stringify(delta.projection)}.`);\n    }\n    if (delta.seq !== state.seq + 1) {\n        throw new Error(`Directory seq gap: next=${delta.seq} current=${state.seq}.`);\n    }\n    const rows = state.data.slice();\n    const dirPath = normPath(delta?.key?.path ?? state?.key?.path ?? '');\n    let edits = null;\n    switch (state.projection) {\n    case 'alphabetical': {\n        edits = Array.isArray(delta.alphabetical) ? delta.alphabetical : [];\n        break;\n    }\n    case 'by_source':\n        edits = Array.isArray(delta.by_source) ? delta.by_source : [];\n        break;\n    default:\n        throw new Error(`Unsupported directory projection ${JSON.stringify(state.projection)}.`);\n    }\n    for (const edit of edits) {\n        if (edit?.kind === 'remove') {\n            rows.splice(edit.index, edit.count ?? 0);\n            continue;\n        }\n        if (edit?.kind === 'insert') {\n            const inserted = directoryProjectionEditRows(state.projection, dirPath, edit.rows);\n            rows.splice(edit.index, 0, ...inserted);\n            continue;\n        }\n        throw new Error(`Unsupported directory edit kind ${JSON.stringify(edit?.kind)}.`);\n    }\n    return {\n        key: delta.key ?? state.key,\n        seq: delta.seq,\n        projection: delta.projection,\n        counts: delta.counts ?? state.counts,\n        data: rows,\n    };\n}\n\nclass DirectorySearchCell extends ui.InputCell {\n    onKeyDown(event) {\n        const previous = this.textInput;\n        const handled = super.onKeyDown(event);\n        if (this.textInput !== previous) this.focusContainerOwner.setDirectorySearch(this.textInput);\n        return handled;\n    }\n    onBeforeInput(event) {\n        const previous = this.textInput;\n        const handled = super.onBeforeInput(event);\n        if (this.textInput !== previous) this.focusContainerOwner.setDirectorySearch(this.textInput);\n        return handled;\n    }\n}\n\nexport class Directory extends ui.Node {\n    ownOffApiState = null;\n    ownViewportResizeThink = null;\n    hasViewportSizedLayout = false;\n    pendingViewportWidth = null;\n    pendingViewportHeight = null;\n    backgroundTile = null;\n    leftFrameTile = null;\n    rightFrameTile = null;\n    topFrameTile = null;\n    bottomFrameTile = null;\n    edgeHandlePolygon = null;\n    readOnlyIconMount = null;\n    bugReportButton = null;\n    recordingButton = null;\n    puffworkerRestartPending = false;\n    tranquilityRestartPending = false;\n    recordingControlState = { text: 'Start recording', disabled: false, state: 'idle' };\n    userButton = null;\n    visualTesterButton = null;\n    visualTesterWindow = null;\n    homeButton = null;\n    quickActionsContainer = null;\n    quickActionsRowsContainer = null;\n    quickActionsScrollBox = null;\n    directoryHeaderScrollBox = null;\n    directoryControlsRow = null;\n    newDirButton = null;\n    versionDisplayNode = null;\n    versionDisplayHeight = 0;\n    versionDisplayRequestToken = 0;\n    uploadFileButton = null;\n    directoryCreationAccess = null;\n    directoryCreationAccessEpoch = 0;\n    newPuffbookButton = null;\n    pathContainer = null;\n    listBackTile = null;\n    scrollRowHost = null;\n    scrollFxHost = null;\n    emptyDirLabel = null;\n    reconnectTitleLabel = null;\n    reconnectSubtitleLabel = null;\n    rowEntries = [];\n    selectedItemPaths = new Set();\n    selectionAnchorPath = null;\n    focusContainerKind = 'DirectorySearch';\n    searchPattern = '';\n    searchRegex = null;\n    searchError = '';\n    ownPendingPuffbookFocus = null;\n    ownPuffbookSession = null;\n    ownPuffbookRename = null;\n    nextPuffbookSessionToken = 0;\n    ownDirectoryOwner = null;\n    nextDirectoryOwnerToken = 0;\n    ownDirectoryProjection = 'alphabetical';\n\n    /* Preserve the historic `curPuffbook` property as a derived view of the authoritative session owner. */\n    get curPuffbook() {\n        return this.ownPuffbookSession?.screen ?? null;\n    }\n\n    set curPuffbook(screen) {\n        if (!screen) {\n            this.ownPuffbookSession = null;\n            this.#syncPuffbookIndicator();\n            return;\n        }\n        const doc = screen?.state?.doc ?? null;\n        const owner = this.ownPuffbookSession ?? {\n            token: ++this.nextPuffbookSessionToken,\n            target: null,\n            doc: null,\n            screen: null,\n            state: 'mounted',\n        };\n        owner.target = {\n            lake: doc?.fileRef?.lake ?? this.params.lake,\n            branch: doc?.fileRef?.branch ?? this.params.branch,\n            path: doc?.fileRef?.path ?? '',\n        };\n        owner.doc = doc;\n        owner.screen = screen;\n        owner.state = 'mounted';\n        this.ownPuffbookSession = owner;\n        this.#syncPuffbookIndicator();\n    }\n\n    async recordingPuffbookState() {\n        const doc = this.ownPuffbookSession?.doc ?? null;\n        return typeof doc?.recordingFullStateSnapshot === 'function'\n            ? await doc.recordingFullStateSnapshot()\n            : null;\n    }\n\n    recordingPuffbookReplayReadiness() {\n        const doc = this.ownPuffbookSession?.doc ?? null;\n        return typeof doc?.recordingReplayReadiness === 'function'\n            ? doc.recordingReplayReadiness()\n            : null;\n    }\n\n    recordingPuffbookReplayCheckpoint() {\n        const doc = this.ownPuffbookSession?.doc ?? null;\n        return typeof doc?.recordingReplayCheckpoint === 'function'\n            ? doc.recordingReplayCheckpoint()\n            : null;\n    }\n\n    recordingViewState() {\n        const screen = this.#activePuffbookScreen();\n        const documentView = screen?.getDocumentView?.() ?? null;\n        return typeof documentView?.recordingViewState === 'function'\n            ? documentView.recordingViewState()\n            : null;\n    }\n\n    restoreRecordingViewState(state) {\n        const screen = this.#activePuffbookScreen();\n        const documentView = screen?.getDocumentView?.() ?? null;\n        if (typeof documentView?.restoreRecordingViewState !== 'function') {\n            if (state === null || state === undefined) return null;\n            throw new Error('Portal replay cannot restore a document view before it is mounted.');\n        }\n        return documentView.restoreRecordingViewState(state);\n    }\n\n    recordingTableView(line) {\n        if (!Number.isInteger(line) || line < 0) return null;\n        const doc = this.ownPuffbookSession?.doc ?? null;\n        const localLine = doc?.windowLineForDisplayLine?.(line) ?? line;\n        return this.#activePuffbookScreen()?.testingTableViewForLine?.(localLine) ?? null;\n    }\n\n    /* Keep Directory text scoped to the sidebar root so chrome-anchor motion does not stale world-space glyph spans. */\n    _textBatchScopeForDescendants(scene) {\n        if (!scene || this.scene !== scene) {\n            return null;\n        }\n        return {\n            key: `${this.state.name}.text`,\n            root: this,\n        };\n    }\n\n    /* Capture the latest viewport-driven sidebar target size without immediately relaying it into live chrome layout. */\n    #capturePendingViewportSize() {\n        const cam = this.#presentationCamera();\n        if (!cam) {\n            return false;\n        }\n        const [vpWidth, vpHeight] = cam.getViewportSize();\n        this.pendingViewportHeight = vpHeight;\n        this.pendingViewportWidth = Math.max(DIRECTORY_MIN_WIDTH, vpWidth * 0.25);\n        return true;\n    }\n\n    /* Publish the last captured viewport target into the sidebar layout globals only when a relayout is authorised. */\n    #applyPendingViewportSize() {\n        if (!Number.isFinite(this.pendingViewportWidth) || !Number.isFinite(this.pendingViewportHeight)) {\n            return;\n        }\n        WIDTH = this.pendingViewportWidth;\n        HEIGHT = this.pendingViewportHeight;\n    }\n\n    /* Coalesce rapid viewport-resize churn so width-driven text relayout waits until resizing has stopped. */\n    onViewportResized(gl) {\n        this.#capturePendingViewportSize();\n        if (this.ownViewportResizeThink !== null) {\n            this.cancelThinkAt(this.ownViewportResizeThink);\n            this.ownViewportResizeThink = null;\n        }\n        this.hasViewportSizedLayout = true;\n        this.#runViewportResizeBuild();\n    }\n\n    /* Apply one resize relayout for the latest viewport dimensions once the stage has authorised the viewport change. */\n    #runViewportResizeBuild(_nowS = null) {\n        this.#applyPendingViewportSize();\n        this.#reflowViewportLayout()\n    }\n\n    /* Reflow directory chrome and rerender the current body without recreating the whole sidebar resource tree. */\n    #reflowViewportLayout() {\n        if (!this.background || !this.chromeMount || !this._ephemeral) {\n            this.#build();\n            return;\n        }\n        this.destroyCTXMenu();\n        this.#layoutBackground();\n        this.#layoutStaticElements();\n        this.#layoutDirectoryBody();\n        if (this.bannerTitle) {\n            this.#presentBannerOverlay();\n        }\n        this.#syncRetractionPose();\n    }\n\n    /* Split the current path into breadcrumb entries while retaining literal slash separators. */\n    #pathEntries() {\n        let path = this.params.path ? `${this.params.path}` : '/';\n        if (this.currentUsername && path === '/~') {\n            path = `/home/${this.currentUsername}`;\n        } else if (this.currentUsername && path.startsWith('/~/')) {\n            path = `/home/${this.currentUsername}/${path.substring(3)}`;\n        }\n        const entries = [{ type: 'separator', text: '/' }];\n        let entryPath = '';\n        for (const segment of path.split('/').filter(Boolean)) {\n            entryPath = childPath(entryPath, segment);\n            entries.push({ type: 'entry', text: segment, path: entryPath });\n            entries.push({ type: 'separator', text: '/' });\n        }\n        if (entries.length > 1) {\n            entries.pop();\n        }\n        return entries;\n    }\n\n    #pathEntryWidth(entry) {\n        const textMetrics = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: entry.text,\n        });\n        return textMetrics.width;\n    }\n\n    /* Cap one path caption without hiding that button's directory target. */\n    #truncatePathEntryText(text, maxWidth) {\n        const label = String(text ?? '');\n        const width = Math.max(0, maxWidth);\n        const measure = (value) => evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: value,\n        }).width;\n        if (measure(label) <= width) {\n            return label;\n        }\n        const ellipsis = '...';\n        if (measure(ellipsis) > width) {\n            return '';\n        }\n        let clipped = '';\n        for (const char of label) {\n            if (measure(`${clipped}${char}${ellipsis}`) > width) {\n                break;\n            }\n            clipped += char;\n        }\n        return `${clipped}${ellipsis}`;\n    }\n\n    /* Keep the newest path segments visible when the breadcrumb row is too narrow. */\n    #visiblePathEntries(entries, maxWidth) {\n        const availableWidth = Math.max(0, maxWidth);\n        const maxEntryTextWidth = availableWidth / 3;\n        const boundedEntries = entries.map((entry) => entry.type === 'entry'\n            ? { ...entry, text: this.#truncatePathEntryText(entry.text, maxEntryTextWidth) }\n            : entry);\n        const totalWidth = boundedEntries.reduce((total, entry) => total + this.#pathEntryWidth(entry), 0)\n            + Math.max(0, boundedEntries.length - 1) * PATH_BREADCRUMB_SPACING;\n        if (totalWidth <= availableWidth) {\n            return boundedEntries;\n        }\n\n        const segments = boundedEntries.filter((entry) => entry.type === 'entry');\n        const separator = { type: 'separator', text: '/' };\n        const visible = [];\n        let usedWidth = 0;\n        for (let index = segments.length - 1; index >= 0; index -= 1) {\n            const segment = segments[index];\n            const addedWidth = this.#pathEntryWidth(segment)\n                + (visible.length > 0\n                    ? this.#pathEntryWidth(separator) + PATH_BREADCRUMB_SPACING * 2\n                    : 0);\n            if (usedWidth + addedWidth > availableWidth && visible.length > 0) {\n                break;\n            }\n            if (usedWidth + addedWidth > availableWidth) {\n                const textWidth = availableWidth;\n                const text = this.#truncatePathEntryText(segment.text, textWidth);\n                visible.unshift({ ...segment, text });\n                usedWidth = this.#pathEntryWidth(visible[0]);\n                break;\n            }\n            if (visible.length > 0) {\n                visible.unshift(separator);\n            }\n            visible.unshift(segment);\n            usedWidth += addedWidth;\n        }\n\n        if (visible.length < boundedEntries.length) {\n            const omission = { type: 'omission', text: '\u2026/' };\n            if (usedWidth + this.#pathEntryWidth(omission) + PATH_BREADCRUMB_SPACING <= availableWidth) {\n                visible.unshift(omission);\n            }\n        }\n        return visible;\n    }\n\n    #appendPathEntries(container, spec) {\n        for (const entry of spec.pathEntries) {\n            const textMetrics = evilfont.MSDFText.measureFromState({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: entry.text,\n            });\n            if (entry.type !== 'entry') {\n                const separator = new ui.Placeholder({\n                    width: textMetrics.width,\n                    height: spec.pathHeight,\n                });\n                separator.appendChild(new evilfont.MSDFText({\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    text: entry.text,\n                    y: 4,\n                    z: -0.1,\n                    fontColor: Palette.white,\n                }));\n                container.appendChild(separator);\n                continue;\n            }\n            const button = new ui.Button({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: entry.text,\n                width: textMetrics.width,\n                height: spec.pathHeight,\n                z: -0.1,\n                hideTile: true,\n                textExpand: false,\n                onHovertextColor: Palette.teal,\n                textHAlignment: 'CENTER',\n                textVAlignment: 'MIDDLE',\n                textPadding: 0,\n            });\n            button.pathEntry = entry.text;\n            button.path = entry.path;\n            button.onInput = (event) => {\n                if (!isActivationEvent(event)) {\n                    return false;\n                }\n                void this.ensureDirectorySubscription({\n                    ...this.params,\n                    path: entry.path,\n                }, {\n                    clearBannerOnSuccess: true,\n                    forceRetry: true,\n                });\n                return true;\n            };\n            container.appendChild(button);\n        }\n    }\n\n    /* Calculate the retained directory body geometry from the current sidebar dimensions. */\n    #directoryBodyLayout() {\n        const inset = FRAME_THICKNESS + 10;\n        const sectionGap = 8;\n        const x = 0;\n        const padding = 12;\n        const pathWidth = WIDTH - inset * 2;\n        const pathEntries = this.#visiblePathEntries(this.#pathEntries(), pathWidth);\n        const pathHeight = Math.max(24, evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: '/',\n        }).height);\n        const dockTop = HEIGHT - BUTTON_HEIGHT * 2.0 - FRAME_THICKNESS * 3.0;\n        const environmentHeight = this.versionDisplayNode ? this.versionDisplayHeight + 6 : 0;\n        const actionsY = inset + environmentHeight;\n        const actionsContentHeight = this.quickActionsRowsContainer?.height ?? 0;\n        const navigationHeight = BUTTON_HEIGHT + 6 + pathHeight;\n        const minimumListHeight = 32;\n        const availableAboveDock = Math.max(0, dockTop - sectionGap - actionsY);\n        const fullLayoutHeight = actionsContentHeight + navigationHeight\n            + minimumListHeight + sectionGap * 2;\n        const compactContentHeight = Math.max(0, availableAboveDock - sectionGap * 2);\n        const compact = availableAboveDock < fullLayoutHeight;\n        const actionsHeight = compact\n            ? Math.min(actionsContentHeight, compactContentHeight * 0.4)\n            : actionsContentHeight;\n        const directoryTop = actionsY + actionsHeight + (actionsHeight > 0 ? sectionGap : 0);\n        const availableDirectoryHeight = Math.max(0, dockTop - sectionGap - directoryTop);\n        const headerHeight = compact\n            ? Math.min(navigationHeight, compactContentHeight * 0.35)\n            : navigationHeight;\n        const y = BUTTON_HEIGHT + 6;\n        const innerShadowStart = directoryTop + headerHeight + (headerHeight > 0 ? sectionGap : 0);\n        const listBottom = Math.max(innerShadowStart, dockTop - sectionGap);\n        const listHeight = Math.max(0, listBottom - innerShadowStart);\n        const boxWidth = WIDTH - FRAME_THICKNESS * 2.0;\n        const searchHeight = Math.min(listHeight, 36 + (this.searchError ? 24 : 0));\n        const itemListHeight = listHeight - searchHeight;\n        return {\n            x,\n            y,\n            inset,\n            sectionGap,\n            dockTop,\n            actionsY,\n            actionsHeight,\n            directoryTop,\n            navigationHeight,\n            headerHeight,\n            padding,\n            pathWidth,\n            pathEntries,\n            pathHeight,\n            innerShadowStart,\n            listBottom,\n            searchHeight,\n            listHeight: itemListHeight,\n            dimensions: {\n                width: WIDTH - FRAME_THICKNESS * 2.0,\n                height: itemListHeight,\n                x: FRAME_THICKNESS,\n                y: innerShadowStart + searchHeight,\n            },\n            boxWidth,\n        };\n    }\n\n    /* Reflow the retained directory body in place so settled resizes do not recreate the sidebar subtree. */\n    #layoutDirectoryBody() {\n        if (!this.pathContainer || !this.listBackTile || !this.scrollBox || !this.scrollRowHost || !this.scrollFxHost) {\n            this._itemsRenderKey = null;\n            this.#renderDirectoryBody();\n            return;\n        }\n        const spec = this.#directoryBodyLayout();\n        this.pathContainer.removeAllChildren();\n        this.#appendPathEntries(this.pathContainer, spec);\n        this.pathContainer.mutate({\n            width: spec.pathWidth,\n            height: spec.pathHeight,\n        });\n        this.pathContainer.setLocalPosition([\n            spec.x,\n            spec.y,\n            this.pathContainer.localPosition()[2],\n        ]);\n        this.#layoutDirectoryHeader(spec);\n        this.listBackTile.mutate(spec.dimensions);\n        this.#layoutDirectorySearch(spec);\n        this.scrollBox.mutate({\n            width: spec.boxWidth,\n            height: spec.listHeight,\n        });\n        this.scrollBox.setLocalPosition([\n            FRAME_THICKNESS,\n            spec.innerShadowStart + spec.searchHeight,\n            this.scrollBox.localPosition()[2],\n        ]);\n        // Both live rows and fixed effects are owned by ScrollBox's padded viewport.\n        if (this.reconnectTitleLabel && this.reconnectSubtitleLabel) {\n            const gap = 1;\n            const titleLayout = evilfont.MSDFText.measureFromState(this.reconnectTitleLabel.state);\n            const subtitleLayout = evilfont.MSDFText.measureFromState(this.reconnectSubtitleLabel.state);\n            const overlayWidth = Math.max(titleLayout.width, subtitleLayout.width);\n            const overlayHeight = titleLayout.height + subtitleLayout.height + gap;\n            const bodyWidth = this.scrollBox.requestedContentWidth - this.scrollBox.thumbWidth;\n            const overlayX = Math.max(0, (bodyWidth - overlayWidth) * 0.5);\n            const overlayY = Math.max(\n                0,\n                (this.scrollBox.requestedContentRect.height - overlayHeight) * 0.5,\n            );\n            this.reconnectTitleLabel.setLocalPosition([\n                overlayX + (overlayWidth - titleLayout.width) * 0.5,\n                overlayY,\n                this.reconnectTitleLabel.localPosition()[2],\n            ]);\n            this.reconnectSubtitleLabel.setLocalPosition([\n                overlayX + (overlayWidth - subtitleLayout.width) * 0.5,\n                overlayY + titleLayout.height + gap,\n                this.reconnectSubtitleLabel.localPosition()[2],\n            ]);\n        }\n        if (this.emptyDirLabel) {\n            this.#syncEmptyDirectoryLabel(spec);\n        }\n        let itemY = 0;\n        for (const row of this.rowEntries) {\n            this.#layoutDirectoryRowEntry(row, spec, itemY);\n            itemY += 29;\n        }\n        this.scrollBox.syncContentLayout();\n    }\n\n    /* Own a primary gesture that begins on bare sidebar background so it cannot fall through to the document camera. */\n    onPointerInput(events) {\n        const scene = this.scene ?? null;\n        const captureKey = 'directory';\n        const hasPrimaryMouseInput = events?.has?.('L_MOUSE_DOWN')\n            || events?.has?.('L_MOUSE_DOWN_HOLD')\n            || events?.has?.('L_MOUSE_UP');\n        if (!scene || !hasPrimaryMouseInput) {\n            return false;\n        }\n        if (scene.dragCapture === captureKey) {\n            if (events.has('L_MOUSE_UP')) {\n                scene.dragCapture = null;\n            }\n            return true;\n        }\n        if (scene.dragCapture !== null || this.computedVisible === false || this.isRetracted || !events.has('L_MOUSE_DOWN')) {\n            return false;\n        }\n        const pointer = this.getLocalMousePosition?.();\n        const x = Number(pointer?.[0]);\n        const y = Number(pointer?.[1]);\n        if (!Number.isFinite(x) || !Number.isFinite(y) || x < 0 || x > WIDTH || y < 0 || y > HEIGHT) {\n            return false;\n        }\n        scene.dragCapture = captureKey;\n        return true;\n    }\n\n    constructor(state) {\n        super(state)\n        this.font = state.font\n        this.fontSize = state.fontSize\n        this.puffbookFont = state.puffbookFont\n        this.tableviewFont = state.tableviewFont\n        this.tableviewHeaderFont = state.tableviewHeaderFont\n        this.documentScene = state.documentScene ?? null\n        this.windowMountRoot = state.windowMountRoot ?? null\n        this.api = state.api ?? null\n        this.onRequestSignin = state.onRequestSignin ?? null\n        this.onRequestSignout = state.onRequestSignout ?? null\n        this.onUploadAccessChange = state.onUploadAccessChange ?? null\n        this.onFileActivityChange = state.onFileActivityChange ?? null;\n        // Deletion temporarily owns the indicator; the latest upload activity resumes afterwards.\n        const publishActivity = () => this.onFileActivityChange?.(this.deleteQueue.activity ?? this.uploadQueue.activity);\n        this.uploadQueue = new FileActivityQueue('upload', publishActivity);\n        this.deleteQueue = new FileActivityQueue('delete', publishActivity);\n        this.onRecordingControlInput = state.onRecordingControlInput ?? null\n        this.onPuffworkerRestartInput = state.onPuffworkerRestartInput ?? null\n        this.onTranquilityRestartInput = state.onTranquilityRestartInput ?? null\n        this.onPuffbookIndicatorChange = state.onPuffbookIndicatorChange ?? null\n        this.onPuffbookComputeAvailabilityChange = state.onPuffbookComputeAvailabilityChange ?? null\n        this.onRecordingPuffbookEpoch = state.onRecordingPuffbookEpoch ?? null\n        this.currentUsername = state.username ?? null\n        this.recordingControlState = {\n            text: this.currentUsername ? 'Start recording' : 'Sign in to record',\n            disabled: !this.currentUsername,\n            state: 'idle',\n        }\n        this.currentGroups = new Set(Array.isArray(state.groups) ? state.groups : [])\n        this.appEnvironment = 'local'\n        if (!this.api) {\n            throw error(\"Directory's refrence to the API is invalid or null!\");\n        }\n        if (!this.font) {\n            throw error(\"Directory needs a valid font.\")\n        }\n        if (!this.fontSize) {\n            throw error(\"Directory needs a valid fontSize.\")\n        }\n\n        this.params = {\n            lake: state.lake ?? 'primary',\n            branch: state.branch ?? 'main',\n            path: state.path ?? UNRESOLVED_PATH,\n        }\n\n        this.baseUrl = this.api.getBaseUrl() //temp load of base url\n        this.portalBasePath = this.#computePortalBasePath();\n        this._ephemeral = null\n        this._itemsRenderKey = null\n        this.ctxMenu = null\n        this.backDirButton = null\n        this.expandDirButton = null\n        this.expandDirButtonMount = null\n        this.itemsInPath = null\n        this.background = null\n        this.contentMount = null\n        this.scrollBox = null\n        this.isRetracted = false\n        this.ownPuffbookSession = null;\n        this.nextPuffbookSessionToken = 0;\n        this.bannerTitle = '';\n        this.bannerSubtitle = '';\n        this.bannerKind = null;\n        this.bannerWantsSignin = false;\n        this.bannerOverlay = null;\n        this.refreshEpoch = 0;\n        this.buildEpoch = 0;\n        this.ownDirectoryOwner = null;\n        this.nextDirectoryOwnerToken = 0;\n        this.ownDirectoryProjection = state.projection ?? 'alphabetical';\n        this.lastPuffbookIndicatorState = 'none';\n        this.directoryCreationAccess = null;\n        this.directoryCreationAccessEpoch = 0;\n\n        this.#setupSignals()\n        this.ownOffApiState = this.api.onStateChange((next, prev) => {\n            if (next.connection === prev?.connection && next.auth === prev?.auth) {\n                return;\n            }\n            if (apiCanServeRoutes(next) && !this.ownDirectoryOwner && this.params.path !== UNRESOLVED_PATH) {\n                void this.ensureDirectorySubscription(this.params, { forceRetry: true });\n            }\n            this.#syncVersionDisplay();\n            this.#applyApiState(next);\n        });\n        this.#build()\n    }\n\n    /* Grant read access through the path when the user owns the selected artifact. */\n    async permissionGrantPathsForCurrentUser(path) {\n        let paths;\n        try {\n            paths = permissionGrantPaths(path);\n        } catch (_error) {\n            throw new Error(GRANT_DENIED_FEEDBACK);\n        }\n\n        if (!this.currentUsername) {\n            throw new Error(GRANT_DENIED_FEEDBACK);\n        }\n\n        let payload;\n        try {\n            payload = await this.api.statPath({\n                lake: this.params.lake,\n                branch: this.params.branch,\n                path: paths.at(-1),\n            });\n        } catch (_error) {\n            console.log(_error)\n            throw new Error(GRANT_DENIED_FEEDBACK);\n        }\n        const artifact = payload?.data ?? payload;\n        if (!artifact || !principalMatchesUsername(artifact.owner, this.currentUsername, this.currentGroups)) {\n            throw new Error(GRANT_DENIED_FEEDBACK);\n        }\n\n        return paths;\n    }\n\n    async canManagePermissionsAlongPath(path) {\n        try {\n            await this.permissionGrantPathsForCurrentUser(path);\n            return true;\n        } catch (_error) {\n            return false;\n        }\n    }\n\n    async grantArtifactAccessAlongPath({ path, principal, privilege = 'read', includeFiles = false }) {\n        const paths = await this.permissionGrantPathsForCurrentUser(path);\n        let result = null;\n        for (const candidatePath of paths) {\n            result = await this.api.grantArtifactAccess({\n                lake: this.params.lake,\n                branch: this.params.branch,\n                path: candidatePath,\n                principal,\n                privilege: 'read',\n                includeFiles: includeFiles && candidatePath === paths.at(-1),\n            });\n        }\n        if (privilege === 'write') {\n            result = await this.api.grantArtifactAccess({\n                lake: this.params.lake,\n                branch: this.params.branch,\n                path: paths.at(-1),\n                principal,\n                privilege: 'write',\n            });\n        }\n        return result;\n    }\n\n    /* Resolve the camera that drives chrome placement and chrome-local interaction for this directory instance. */\n    #presentationCamera() {\n        return this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n    }\n\n    /* Resolve the document scene where puffbook screens live even when the directory itself is mounted in chrome. */\n    #documentPresentationScene() {\n        return this.documentScene ?? this.scene ?? null;\n    }\n\n    /* Resolve the document presentation camera for puffbook screen mounting and teleporting. */\n    #documentCamera() {\n        const scene = this.#documentPresentationScene();\n        return scene?.presentationCamera?.() ?? scene?.camera ?? null;\n    }\n\n    /* Route shared directory dialogs through the explicit overlay mount and centre them in that mount's local space. */\n    #mountWindow(state) {\n        const cam = this.#presentationCamera();\n        const mountParent = this.windowMountRoot ?? this.parentNode ?? this;\n        if (!cam?.vpBounds || !mountParent) {\n            return null;\n        }\n        const centreWorld = cam.getWorldCameraCenter();\n        const centreScene = this.scene?.worldToPresentationPoint\n            ? this.scene.worldToPresentationPoint([centreWorld[0], centreWorld[1], 0])\n            : [centreWorld[0], centreWorld[1], 0];\n        const centreLocal = twgl.m4.transformPoint(\n            twgl.m4.inverse(mountParent.localToWorld()),\n            centreScene,\n        );\n        return ui.UIWindow.mount(this, {\n            ...state,\n            mountParent,\n            anchor: 'center',\n            x: centreLocal[0],\n            y: centreLocal[1],\n        });\n    }\n\n    /* Apply the directory's own open/retracted pose inside chrome space, animating only for direct user toggles. */\n    #syncRetractionPose({ animate = false } = {}) {\n        this.#syncBodyVisibility();\n        const x = this.isRetracted ? -(WIDTH - FRAME_THICKNESS) : 0;\n        const angle = this.isRetracted ? Math.PI : 0.0;\n        const pos = this.localPosition();\n        if (!animate) {\n            this.stopAnimation('x');\n            this.setLocalPosition([x, 0, pos[2]]);\n            this.expandDirButtonMount?.stopAnimation('rotation_z');\n            this.expandDirButtonMount?.setLocalRotationZ(angle);\n            return;\n        }\n        this.animateTo({\n            x,\n            duration_s: DIRECTORY_RETRACTION_DURATION_S,\n            ease: DIRECTORY_RETRACTION_EASE,\n        });\n        this.expandDirButtonMount?.animateTo({\n            rotation_z: angle,\n            duration_s: DIRECTORY_RETRACTION_DURATION_S,\n            ease: DIRECTORY_RETRACTION_EASE,\n        });\n    }\n\n    /* Keep the retained directory body fully hidden while the sidebar is retracted so resize/focus churn cannot leak stale list content into document space. */\n    #syncBodyVisibility() {\n        this.contentMount?.setVisibility(!this.isRetracted);\n    }\n\n    /* Expose the current sidebar rect in presentation space so shared chrome such as toasts can avoid obscuring it. */\n    sidebarRect() {\n        const [x = 0, y = 0] = this.localPosition();\n        return [x, y, x + WIDTH, y + HEIGHT];\n    }\n\n    /* Present the current banner state through the shared overlay path used by transient route loading. */\n    #presentBannerOverlay() {\n        if (!this.bannerTitle) {\n            return;\n        }\n        const parent = this.parentNode ?? this.scene?.presentedRoot?.();\n        if (!parent) {\n            return;\n        }\n        if (!this.bannerOverlay) {\n            this.bannerOverlay = new DirectoryBannerOverlay({\n                font: this.font,\n                onRequestSignin: () => {\n                    this.onRequestSignin?.();\n                },\n            });\n        }\n        if (this.bannerOverlay.parentNode !== parent) {\n            if (this.bannerOverlay.parentNode) {\n                this.bannerOverlay.parentNode.removeChild(this.bannerOverlay);\n            }\n            if (this.parentNode === parent) {\n                parent.insertChildBefore(this.bannerOverlay, this);\n            } else {\n                parent.appendChild(this.bannerOverlay);\n            }\n        }\n        this.bannerOverlay.setBanner({\n            title: this.bannerTitle,\n            subtitle: this.bannerSubtitle,\n            sidebarWidth: 0,\n            blocksInput: this.bannerKind === 'loading',\n            wantsSignin: this.bannerWantsSignin,\n            showDamon: !this.curPuffbook,\n        });\n    }\n\n    /* Clear the shared banner overlay mount when no banner state should remain visible. */\n    #hideBannerOverlay() {\n        const overlay = this.bannerOverlay;\n        if (overlay?.parentNode) {\n            overlay.fadeOutAndDetach();\n        }\n        this.bannerOverlay = null;\n    }\n\n    /* Treat a just-opened pending puffbook as current for route/bootstrap dedupe so first websocket READY does not reopen it. */\n    matchesCurrentOrPendingFileRef(ref) {\n        const cur = this.#activePuffbookDoc();\n        if (cur?.matchesFileRef?.(ref)) {\n            return true;\n        }\n        if (this.#pendingPuffbookRefMatches(ref)) {\n            return true;\n        }\n        return false;\n    }\n\n    /* Keep directory-side source jumps stable while a puffbook is still opening by preferring the pending target path. */\n    #activeOrPendingPuffbookPath() {\n        return normPath(this.ownPuffbookSession?.target?.path ?? this.#activePuffbookDoc()?.fileRef?.path ?? '');\n    }\n\n    /* Keep an in-flight rename from turning the old source path's expected teardown into a route-load banner. */\n    #isPuffbookRenameInFlight(owner) {\n        return this.ownPuffbookRename?.owner === owner;\n    }\n\n    /* Compare one route target against the pending puffbook target before a document instance exists. */\n    #pendingPuffbookRefMatches(ref) {\n        const pending = this.ownPuffbookSession;\n        if (!pending || !ref) {\n            return false;\n        }\n        if (pending.state !== 'opening') {\n            return false;\n        }\n        return pending.lake === ref.lake\n            && pending.branch === ref.branch\n            && pending.path === ref.path;\n    }\n\n    /* Publish one pending puffbook target immediately so async route re-entry cannot spawn a duplicate open. */\n    #beginPendingPuffbookOpen(ref, focusSpec) {\n        this.ownPendingPuffbookFocus = focusSpec;\n        const owner = {\n            token: ++this.nextPuffbookSessionToken,\n            lake: ref.lake,\n            branch: ref.branch,\n            path: ref.path,\n            target: {\n                lake: ref.lake,\n                branch: ref.branch,\n                path: ref.path,\n            },\n            doc: null,\n            screen: null,\n            state: 'opening',\n        };\n        this.ownPuffbookSession = owner;\n        return owner;\n    }\n\n    /* Clear any still-opening puffbook target so later async completions cannot reassert it. */\n    #clearPendingPuffbookOpen(owner = this.ownPuffbookSession) {\n        this.ownPendingPuffbookFocus = null;\n        if (!owner || owner.state !== 'opening') {\n            return;\n        }\n        this.#retirePuffbookSession(owner);\n    }\n\n    /* Resolve the active puffbook document, whether or not it is already mounted on-screen. */\n    #activePuffbookDoc() {\n        return this.ownPuffbookSession?.doc ?? this.ownPuffbookSession?.screen?.state?.doc ?? null;\n    }\n\n    /* Resolve the mounted puffbook screen if the current session has reached one live screen state. */\n    #activePuffbookScreen() {\n        return this.ownPuffbookSession?.screen ?? null;\n    }\n\n    /* Report whether one retained puffbook session still owns this Directory instance. */\n    #isCurrentPuffbookSession(owner) {\n        return !!owner && this.ownPuffbookSession === owner && owner.state !== 'retired';\n    }\n\n    /* Derive the current mounted puffbook transport banner state from the authoritative document lifecycle. */\n    puffbookTransportIndicatorState() {\n        const state = this.#activePuffbookDoc()?.lifecycleState?.() ?? null;\n        if (state === 'live_lapsed_reconnecting') {\n            return 'reconnecting';\n        }\n        if (state === 'live_lapsed_idle') {\n            return 'disconnected';\n        }\n        return 'none';\n    }\n\n    /* Project access from the mounted document, using the same permission result that gates editing. */\n    #syncReadOnlyIcon() {\n        this.readOnlyIconMount?.setVisibility(this.#activePuffbookScreen()?.state?.doc?.read_only === true);\n    }\n\n    /* Publish one deduplicated transport-indicator update so portal chrome follows the current puffbook lifecycle only. */\n    #syncPuffbookIndicator() {\n        this.#syncReadOnlyIcon();\n        const next = this.puffbookTransportIndicatorState();\n        if (next === this.lastPuffbookIndicatorState) {\n            return;\n        }\n        this.lastPuffbookIndicatorState = next;\n        this.onPuffbookIndicatorChange?.(next);\n    }\n\n    /* Interlock mounted-screen visibility with lifecycle and then project the same lifecycle into shared chrome. */\n    #handlePuffbookLifecycleChange(owner, lifecycle, doc) {\n        if (!this.#isCurrentPuffbookSession(owner) || owner.doc !== doc) {\n            return;\n        }\n        if (!lifecycle?.can_mount_screen && owner.screen) {\n            const screen = owner.screen;\n            owner.state = lifecycle.state ?? 'closed';\n            try {\n                /*\n                    Keep the session authoritative until its screen is off-scene.\n                    A failed lifecycle teardown must not leave a mounted screen\n                    untracked, because a later document open would then stack a\n                    new screen over it.\n                */\n                this.#detachPuffbookScreen(screen);\n            } finally {\n                owner.screen = null;\n                if (this.ownPuffbookSession === owner) {\n                    this.ownPuffbookSession = null;\n                }\n                setTestingCurrentDocument(null);\n                setTestingCurrentScreen(null);\n            }\n            this.#syncCurrentDirectoryRows();\n        }\n        this.#syncPuffbookIndicator();\n    }\n\n    /* Retire one superseded puffbook session so stale async completions cannot mutate the current document. */\n    #retirePuffbookSession(owner) {\n        if (!owner || owner.state === 'retired') {\n            return;\n        }\n        if (this.ownPuffbookSession === owner) {\n            this.ownPuffbookSession = null;\n        }\n        owner.state = 'retired';\n        owner.screen = null;\n        this.#syncPuffbookIndicator();\n    }\n\n    /* Derive one canonical path for a rendered row so list-order conflict cycling can reason about source files directly. */\n    #directoryItemPath(item) {\n        return normPath(item?.path) || childPath(this.params.path, item?.name ?? '');\n    }\n\n    clearDirectorySelection() {\n        this.selectedItemPaths.clear();\n        this.selectionAnchorPath = null;\n        this.#syncDirectorySelection();\n    }\n\n    clearDirectorySelectionOutside(target) {\n        if (this.selectedItemPaths.size > 0 && !this.rowEntries.some(row => row.button === target)) {\n            this.clearDirectorySelection();\n        }\n    }\n\n    selectDirectoryItem(item, { toggle = false, range = false } = {}) {\n        const path = this.#directoryItemPath(item);\n        const paths = this.rowEntries.map(row => this.#directoryItemPath(row.item));\n        const anchor = paths.indexOf(this.selectionAnchorPath);\n        const target = paths.indexOf(path);\n        if (range && anchor >= 0 && target >= 0) {\n            if (!toggle) this.selectedItemPaths.clear();\n            for (const entry of paths.slice(Math.min(anchor, target), Math.max(anchor, target) + 1)) {\n                this.selectedItemPaths.add(entry);\n            }\n        } else {\n            if (toggle) {\n                if (this.selectedItemPaths.has(path)) this.selectedItemPaths.delete(path);\n                else this.selectedItemPaths.add(path);\n            } else {\n                this.selectedItemPaths.clear();\n                this.selectedItemPaths.add(path);\n            }\n            this.selectionAnchorPath = path;\n        }\n        this.#syncDirectorySelection();\n    }\n\n    #syncDirectorySelection({ prune = false } = {}) {\n        if (prune && this.itemsInPath) {\n            const present = new Set(this.itemsInPath.data.map(item => this.#directoryItemPath(item)));\n            for (const path of this.selectedItemPaths) {\n                if (!present.has(path)) this.selectedItemPaths.delete(path);\n            }\n            if (!present.has(this.selectionAnchorPath)) this.selectionAnchorPath = null;\n        }\n        for (const row of this.rowEntries) {\n            row.button.mutate({ selectionHighlighted: this.selectedItemPaths.has(this.#directoryItemPath(row.item)) });\n        }\n    }\n\n    /* Parse one published-artifact stub as strict JSON so frontend navigation follows the backend-authored symbol contract. */\n    #parsePublishedArtifactManifest(buffer, itemPath) {\n        const raw = decodeDirectoryArtifactText(buffer);\n        try {\n            return JSON.parse(raw);\n        } catch (err) {\n            throw new Error(`Published artifact ${itemPath} is not valid JSON: ${err?.message || err}`);\n        }\n    }\n\n    /* Choose one conflicting source path by visible directory order, advancing after the current document and wrapping at the end. */\n    #pickConflictSourcePath(sourcePaths) {\n        const want = new Set((sourcePaths ?? []).map((path) => normPath(path)).filter(Boolean));\n        const ordered = [];\n        for (const row of this.rowEntries) {\n            const path = this.#directoryItemPath(row?.item);\n            if (!want.has(path) || ordered.includes(path)) {\n                continue;\n            }\n            ordered.push(path);\n        }\n        if (ordered.length === 0) {\n            return normPath(sourcePaths?.[0] ?? '');\n        }\n        const cur = this.#activeOrPendingPuffbookPath();\n        const curIndex = ordered.indexOf(cur);\n        if (curIndex < 0) {\n            return ordered[0];\n        }\n        return ordered[(curIndex + 1) % ordered.length];\n    }\n\n    /* Resolve one export target line from the stored source file body so symbol jumps land on the defining `export` statement. */\n    async #findPublishedSourceLine(path, exportName) {\n        const source = decodeDirectoryArtifactText(await this.api.fileAsBuffer({\n            lake: this.params.lake,\n            branch: this.params.branch,\n            path,\n        }));\n        return findPublishedExportLine(source, exportName);\n    }\n\n    /* Jump from one namespace stub row to the owning source puffbook and place the caret at the defining export line. */\n    async openPublishedArtifact(item) {\n        const itemPath = this.#directoryItemPath(item);\n        try {\n            let sourcePath = '';\n            if (item?.type === 'symbol') {\n                sourcePath = `${item?.owner_path ?? ''}`.trim();\n                if (!sourcePath) {\n                    throw new Error(`Published symbol ${itemPath} missing owner_path.`);\n                }\n            } else if (item?.type === 'conflict') {\n                if (!Array.isArray(item?.conflicts) || item.conflicts.length < 1) {\n                    throw new Error(`Published symbol conflict ${itemPath} missing conflicts.`);\n                }\n                sourcePath = this.#pickConflictSourcePath(item.conflicts);\n            } else {\n                if (this.shouldShowUnsupportedArtifactBanner()) {\n                    this.loadUnsupportedItem(itemPath, item?.type ?? '');\n                }\n                return;\n            }\n            if (!sourcePath) {\n                throw new Error(`Published artifact ${itemPath} could not resolve a source_path.`);\n            }\n            const lineNum = await this.#findPublishedSourceLine(sourcePath, item?.name ?? '');\n            this.loadPuffBook(sourcePath, null, { lineNum, col: 0 });\n        } catch (err) {\n            console.error('Failed to open published artifact.', err);\n            this.loadPuffbookError(item?.name ?? itemPath, err);\n        }\n    }\n\n    /* Open one backend-classified artifact through the same permission and compatibility policy for directory rows and browser routes. */\n    openArtifact(item, itemPath = null, { fromRoute = false } = {}) {\n        const path = normPath(itemPath) || this.#directoryItemPath(item);\n        if (!this.canReadArtifact(item)) {\n            if (fromRoute) {\n                this.changeCurPath(this.#parentDirectoryPath(path), { clearBannerOnSuccess: false });\n            }\n            this.loadForbidden(routeArtifactLabel(path));\n            return 'forbidden';\n        }\n        if (item?.type === 'puffbook') {\n            void this.loadPuffBook(path, item);\n            return 'puffbook';\n        }\n        if (item?.type === 'convo') {\n            void this.loadConvo(path, item);\n            return 'convo';\n        }\n        if (item?.type === 'symbol' || item?.type === 'conflict') {\n            void this.openPublishedArtifact({ ...item, path });\n            return item.type;\n        }\n        if (fromRoute) {\n            this.changeCurPath(this.#parentDirectoryPath(path), { clearBannerOnSuccess: false });\n        }\n        if (this.shouldShowUnsupportedArtifactBanner()) {\n            this.loadUnsupportedItem(routeArtifactLabel(path), item?.type ?? '');\n            return 'unsupported';\n        }\n        void this.loadPuffBook(path, item);\n        return 'puffbook';\n    }\n\n    /* Focus one already-mounted puffbook screen immediately instead of needlessly closing and reopening the same document. */\n    #focusMountedPuffbook(focus) {\n        const spec = normalizePuffbookFocus(focus);\n        this.ownPendingPuffbookFocus = spec;\n        const screen = this.#activePuffbookScreen();\n        if (!spec || !screen) {\n            return;\n        }\n        screen.focusLine(spec.lineNum, spec.col);\n        this.ownPendingPuffbookFocus = null;\n    }\n\n    /* Apply one deferred line focus after an async puffbook open finishes so directory jumps land deterministically. */\n    #applyPendingPuffbookFocus(screen) {\n        const focus = this.ownPendingPuffbookFocus;\n        this.ownPendingPuffbookFocus = null;\n        if (!focus || !screen) {\n            return;\n        }\n        screen.focusLine(focus.lineNum, focus.col);\n    }\n\n    #listRenderKey(items) {\n        const rows = (items?.data ?? []).map((item) => ({\n            path: this.#directoryItemPath(item),\n            name: item.name,\n            display_name: item.display_name ?? item.name,\n            type: item.type,\n            owner: item.owner ?? null,\n            write_groups: Array.isArray(item.write_groups) ? item.write_groups : [],\n            published_names: Array.isArray(item.published_names) ? item.published_names : [],\n        }));\n        return JSON.stringify({\n            path: normPath(this.params.path),\n            user: this.currentUsername ?? null,\n            current_open_path: this.#activePuffbookDoc()?.fileRef?.path ?? null,\n            projection: items?.projection ?? null,\n            rows,\n        });\n    }\n\n    /* Report whether one retained owner record is still the sole current directory-subscription authority. */\n    #isCurrentDirectoryOwner(owner) {\n        return !!owner && this.ownDirectoryOwner === owner && owner.state !== 'retired' && owner.state !== 'closed';\n    }\n\n    /* Report whether the retained directory rows already describe the requested subscription target. */\n    #hasRetainedDirectoryStateFor(target) {\n        const state = this.itemsInPath;\n        if (!state || typeof state !== 'object') {\n            return false;\n        }\n        return `${state?.key?.lake ?? ''}` === `${target?.lake ?? ''}`\n            && `${state?.key?.branch ?? ''}` === `${target?.branch ?? ''}`\n            && normPath(state?.key?.path ?? '') === normPath(target?.path ?? '')\n            && `${state?.projection ?? ''}` === `${target?.projection ?? ''}`;\n    }\n\n    /* Mint one sole authoritative directory-subscription owner record for this Directory instance. */\n    #newDirectoryOwner(target, { clearBannerOnSuccess = false } = {}) {\n        return {\n            token: ++this.nextDirectoryOwnerToken,\n            lake: target.lake,\n            branch: target.branch,\n            path: target.path,\n            projection: target.projection,\n            subscription_uuid: null,\n            state: 'opening',\n            clearBannerOnSuccess,\n        };\n    }\n\n    /* Emit one concise lifecycle trace for the authoritative directory subscription owner. */\n    #logDirectorySubscription(action, owner, extra = {}) {\n        console.info(`Directory subscription ${action}.`, {\n            token: owner?.token ?? null,\n            lake: owner?.lake ?? null,\n            branch: owner?.branch ?? null,\n            path: owner?.path ?? null,\n            projection: owner?.projection ?? null,\n            subscription_uuid: owner?.subscription_uuid ?? null,\n            state: owner?.state ?? null,\n            ...extra,\n        });\n    }\n\n    /* Retire one owner record so late websocket events cannot keep mutating this Directory instance. */\n    #retireDirectoryOwner(owner) {\n        if (!owner || owner.state === 'retired' || owner.state === 'closed') {\n            return;\n        }\n        if (this.ownDirectoryOwner === owner) {\n            this.ownDirectoryOwner = null;\n        }\n        owner.state = 'retired';\n    }\n\n    /* Close one live directory stream before path or lifecycle changes invalidate its baseline. */\n    async #closeDirectorySubscription(owner = this.ownDirectoryOwner) {\n        if (!owner) {\n            return;\n        }\n        this.#logDirectorySubscription('closing', owner);\n        this.#retireDirectoryOwner(owner);\n        if (!owner.subscription_uuid || owner.state === 'closed') {\n            owner.state = 'closed';\n            this.#logDirectorySubscription('closed', owner, {\n                reason: 'no_live_subscription',\n            });\n            return;\n        }\n        owner.state = 'closing';\n        try {\n            await this.api.wsCloseDirectory(owner.subscription_uuid);\n        } catch (_err) {\n        } finally {\n            owner.state = 'closed';\n            this.#logDirectorySubscription('closed', owner);\n        }\n    }\n\n    /* Repaint the sidebar from already-retained rows when only local chrome state changed. */\n    #rerenderCurrentItems({ force = false } = {}) {\n        if (!this._ephemeral) {\n            return;\n        }\n        const renderKey = this.#listRenderKey(this.itemsInPath);\n        if (!force && renderKey === this._itemsRenderKey) {\n            return;\n        }\n        this._itemsRenderKey = renderKey;\n        this.#renderDirectoryBody();\n    }\n\n    /* Update only active-document row styling so opening a file preserves the retained list and scroll position. */\n    #syncCurrentDirectoryRows() {\n        const activePath = this.#activePuffbookDoc()?.fileRef?.path ?? null;\n        for (const row of this.rowEntries) {\n            const isCurrentDocument = this.#directoryItemPath(row.item) === activePath;\n            const color = isCurrentDocument ? Palette.teal : [0, 0, 0, 0];\n            const hoverColor = this.canReadArtifact(row.item) && !isCurrentDocument\n                ? DIRECTORY_ROW_HOVER_COLOR\n                : color;\n            row.button.mutate({\n                color,\n                onHoverColor: hoverColor,\n                selected: isCurrentDocument,\n            });\n        }\n        this._itemsRenderKey = this.#listRenderKey(this.itemsInPath);\n    }\n\n    /* Install one fresh subscribed baseline as the sole authoritative sidebar list state. */\n    #installDirectorySnapshot(snapshot, { clearBannerOnSuccess = false } = {}) {\n        this.itemsInPath = directoryStateFromSnapshot(snapshot);\n        this.params = {\n            ...this.params,\n            path: normPath(snapshot?.key?.path ?? ''),\n        };\n        this.#syncDirectorySelection({ prune: true });\n        this.#syncBackButtonState();\n        if (clearBannerOnSuccess && !this.#shouldPreserveReadmeBanner()) {\n            this.#clearBanner();\n        }\n        this.#rerenderCurrentItems({ force: true });\n        void this.#refreshDirectoryWriteAccess();\n    }\n\n    /* Apply one subscribed delta batch directly onto the retained rows and resubscribe on any continuity loss. */\n    #handleDirectoryDelta(subscriptionUUID, delta) {\n        const owner = this.ownDirectoryOwner;\n        if (!this.#isCurrentDirectoryOwner(owner) || owner.subscription_uuid !== subscriptionUUID) {\n            return;\n        }\n        try {\n            const nextState = applyDirectoryStateDelta(this.itemsInPath, delta);\n            this.#applyDirectoryDelta(delta, nextState);\n        } catch (err) {\n            console.warn('Directory delta continuity lost; resubscribing.', err);\n            queueMicrotask(() => {\n                void (async () => {\n                    await this.#closeDirectorySubscription(owner);\n                    await this.ensureDirectorySubscription({\n                        ...this.params,\n                        path: normPath(delta?.key?.path ?? this.params.path),\n                    }, {\n                        forceRetry: true,\n                    });\n                })();\n            });\n        }\n    }\n\n    /* Derive the current per-row geometry inputs from the settled body layout and ScrollBox width. */\n    #directoryRowMetrics(spec = this.#directoryBodyLayout()) {\n        const itemHeight = 25;\n        const itemGap = 4;\n        const itemBadgeWidth = 24;\n        const boxWidth = this.scrollBox?.requestedContentWidth ?? spec.boxWidth;\n        const boxThumbWidth = this.scrollBox?.thumbWidth ?? 0;\n        return {\n            itemHeight,\n            itemGap,\n            itemBadgeWidth,\n            itemRowContentWidth: boxWidth - boxThumbWidth - spec.x,\n            rowWidth: boxWidth - spec.x,\n        };\n    }\n\n    /* Lay out one retained row container and its owned child nodes against the current sidebar width. */\n    #layoutDirectoryRowEntry(row, spec, itemY) {\n        const metrics = this.#directoryRowMetrics(spec);\n        const itemNameStyle = {\n            font: this.font,\n            fontSize: this.fontSize,\n            maxCellHeight: this.fontSize * 1.5,\n        };\n        const badgeWidth = row.badge ? metrics.itemBadgeWidth + metrics.itemGap : 0;\n        const itemNameSpace = Math.max(0, metrics.itemRowContentWidth - metrics.itemHeight - metrics.itemGap - badgeWidth);\n        const textLayout = layoutDirectoryRowLabel(row.item.name, itemNameSpace, itemNameStyle);\n        row.mount.mutate({\n            width: metrics.rowWidth,\n            height: metrics.itemHeight,\n        });\n        row.mount.setLocalPosition([\n            spec.x,\n            itemY,\n            row.mount.localPosition()[2],\n        ]);\n        row.button.mutate({\n            width: itemNameSpace,\n            height: metrics.itemHeight,\n            text: textLayout.text,\n        });\n        setDirectoryRowFade(row.button, textLayout.clipped, row.button.defaultTextColor);\n        row.items.width = metrics.itemRowContentWidth;\n        row.items.height = metrics.itemHeight;\n        row.items.invalidateLayout();\n    }\n\n    /* Reset one retained row's local motion offset so full rebuild paths do not inherit delta animation residue. */\n    #resetDirectoryRowMotion(entry) {\n        if (!entry?.content) {\n            return;\n        }\n        entry.content.stopAnimation('y');\n        entry.content.setLocalPosition([\n            0,\n            0,\n            entry.content.localPosition()[2],\n        ]);\n    }\n\n    /* Animate one retained row's inner content back into its final slot after the authoritative list layout changes. */\n    #animateDirectoryRowMotion(entry, offsetY, { fadeIn = false } = {}) {\n        if (!entry?.content || !entry?.mount) {\n            return;\n        }\n        this.#resetDirectoryRowMotion(entry);\n        if (Number.isFinite(offsetY) && offsetY !== 0) {\n            entry.content.setLocalPosition([\n                0,\n                offsetY,\n                entry.content.localPosition()[2],\n            ]);\n            entry.content.animateTo({\n                y: 0,\n                duration_s: DIRECTORY_DELTA_MOVE_DURATION_S,\n                ease: DIRECTORY_DELTA_MOVE_EASE,\n            });\n        }\n        entry.mount.stopAnimation('opacity');\n        if (fadeIn) {\n            entry.mount.opacity = 0.0;\n            entry.mount.animateTo({\n                opacity: 1,\n                duration_s: DIRECTORY_DELTA_FADE_DURATION_S,\n                ease: DIRECTORY_DELTA_FADE_EASE,\n            });\n            return;\n        }\n        entry.mount.opacity = 1.0;\n    }\n\n    /* Build one retained row container so directory deltas can later mutate row ownership without flattening the scene graph. */\n    #makeDirectoryRowEntry(item) {\n        const metrics = this.#directoryRowMetrics();\n        const isDir = item.type === 'directory';\n        const isConflict = item.type === 'conflict';\n        const canReadItem = this.canReadArtifact(item);\n        const canWriteItem = this.canWriteArtifact(item);\n        const isReadOnlyFile = !isDir && canReadItem && !canWriteItem;\n\n        const rowLabel = item.display_name ?? item.name;\n        const itemPath = this.#directoryItemPath(item);\n        const isCurrentDocument = itemPath === (this.#activePuffbookDoc()?.fileRef?.path ?? null);\n        const currentRowColor = isCurrentDocument\n            ? Palette.teal\n            : [0, 0, 0, 0];\n        const defaultTextColor = canReadItem\n            ? [1.0, 1.0, 1.0, 1.0]\n            : [0.52, 0.52, 0.52, 1.0];\n        const itemIconColor = canReadItem\n            ? [1.0, 1.0, 1.0, 1.0]\n            : [0.42, 0.42, 0.42, 1.0];\n        const itemIconID = isDir ? 13 : isConflict ? 6 : 20;\n        const itemIconTint = isConflict\n            ? [0.992, 0.855, 0.051, 1.0]\n            : item.type === 'symbol'\n                ? DIRECTORY_SYMBOL_ICON_TINT\n            : itemIconColor;\n        const hoverRowColor = canReadItem && !isCurrentDocument\n            ? DIRECTORY_ROW_HOVER_COLOR\n            : currentRowColor;\n\n        const rowMount = new ui.Placeholder({\n            width: metrics.rowWidth,\n            height: metrics.itemHeight,\n            x: 0,\n            y: 0,\n            z: -0.11,\n        });\n        const rowContent = new ui.Placeholder({\n            x: 0,\n            y: 0,\n            z: 0,\n        });\n        const rowItems = new ui.HBoxContainer({\n            width: metrics.itemRowContentWidth,\n            height: metrics.itemHeight,\n            spacing: metrics.itemGap,\n            crossAlign: 'center',\n        });\n        const itemName = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            width: metrics.itemRowContentWidth - metrics.itemHeight - metrics.itemGap,\n            height: metrics.itemHeight,\n            y: 0,\n            z: -0.1,\n            text: rowLabel,\n            filename: item.name,\n            color: currentRowColor,\n            defaultTextColor: defaultTextColor,\n            onHoverColor: hoverRowColor,\n            onHovertextColor: defaultTextColor,\n            selected: isCurrentDocument,\n            selectionHighlighted: this.selectedItemPaths.has(itemPath),\n            tooltipEnabled : true,\n            tooltipText: formatDirectoryItemTooltip(item),\n            toastEnabled: true,\n            toastText: `You do not have read access to ${item.name}.`,\n            toastOffsetX: metrics.itemRowContentWidth + 7,\n            recordingKey: `portal.directory-item:path=${itemPath}`,\n        });\n        setDirectoryRowFade(itemName, false, defaultTextColor);\n\n        itemName.onInput = (event, events = new Set()) => {\n            if (event === 'L_MOUSE_DOWN') {\n                this.selectDirectoryItem(item, { toggle: events.has('CTRL_KEY'), range: events.has('SHIFT_KEY') });\n                // Directory items expose focus on a single click; opening\n                // remains a double-click or keyboard activation action.\n                ui.focusControl(itemName);\n                return true;\n            }\n            if (event === 'R_MOUSE_UP' && !this.selectedItemPaths.has(itemPath)) {\n                this.selectDirectoryItem(item);\n            }\n            if (!canReadItem) {\n                if (isActivationEvent(event) || event === 'DOUBLE_CLICK') {\n                    itemName.displayToast();\n                    return true;\n                }\n                if (event === \"R_MOUSE_UP\") {\n                    void this.#refreshDirectoryWriteAccess().then((writable) => {\n                        if (writable) {\n                            this.buildCTXMenu(item, { structuralOnly: true });\n                        } else {\n                            itemName.displayToast();\n                        }\n                    });\n                    return true;\n                }\n                return false;\n            }\n            if (event === \"DOUBLE_CLICK\" || event === 'ACTIVATE') {\n                if (isDir) {\n                    this.changeCurPath(itemPath);\n                } else {\n                    this.openArtifact(item, itemPath);\n                }\n                return true; \n            }\n            else if (event === \"R_MOUSE_UP\") {\n                if (itemPath === \"/home\") {\n                    return false;\n                }\n                this.buildCTXMenu(item, {\n                    permissionsOnly: itemPath === `/home/${this.currentUsername}`,\n                });\n                return true; \n            }\n        \n            return false\n        };\n\n        const icon = new ui.Icon({\n            width: metrics.itemHeight,\n            height: metrics.itemHeight,\n            x: 0,\n            y: 0,\n            z: -0.12,\n            iconID: itemIconID,\n            color: itemIconTint,\n        });\n        rowItems.appendChild(icon);\n        rowItems.appendChild(itemName);\n\n        let badge = null;\n        if (isReadOnlyFile) {\n            badge = new ui.Icon({\n                width: metrics.itemBadgeWidth,\n                height: metrics.itemHeight,\n                z: -0.2,\n                iconID: 35,\n                color: [0.86, 0.75, 0.38, 1.0],\n            });\n            rowItems.appendChild(badge);\n        }\n        rowContent.appendChild(rowItems);\n        rowMount.appendChild(rowContent);\n        syncDirectoryRowFade(itemName);\n        return { item, mount: rowMount, content: rowContent, items: rowItems, button: itemName, icon, badge };\n    }\n\n    /* Mount one retained row through the ScrollBox host so attach-time text resources settle uniformly for rebuild and delta paths. */\n    #mountDirectoryRowEntry(entry, beforeMount = null) {\n        if (!entry?.mount) {\n            return;\n        }\n        if (beforeMount) {\n            this.scrollRowHost.insertChildBefore(entry.mount, beforeMount);\n        } else {\n            this.scrollBox.appendChild(entry.mount);\n        }\n        syncDirectoryRowFade(entry.button);\n    }\n\n    /* Keep the explicit empty-directory label aligned with the authoritative retained row state. */\n    #syncEmptyDirectoryLabel(spec = this.#directoryBodyLayout()) {\n        const isEmpty = Array.isArray(this.itemsInPath?.data) && this.#visibleDirectoryItems().length < 1;\n        if (!isEmpty) {\n            if (this.emptyDirLabel?.parentNode) {\n                this.emptyDirLabel.parentNode.removeChild(this.emptyDirLabel);\n            }\n            this.emptyDirLabel = null;\n            return;\n        }\n        if (!this.emptyDirLabel) {\n            this.emptyDirLabel = new evilfont.MSDFText({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: \"Empty Directory\",\n                z: -0.1,\n                fontColor: Palette.white,\n            });\n            this.scrollBox.appendOverlayChild(this.emptyDirLabel);\n        }\n        this.emptyDirLabel.setText(this.itemsInPath.data.length ? \"No matching items\" : \"Empty Directory\");\n        const labelLayout = evilfont.MSDFText.measureFromState(this.emptyDirLabel.state);\n        this.emptyDirLabel.setLocalPosition([\n            Math.max(0, (this.scrollBox.requestedContentWidth - labelLayout.width) * 0.5),\n            20,\n            this.emptyDirLabel.localPosition()[2],\n        ]);\n    }\n\n    /* Animate one removed row from the live list into a short-lived fade-out overlay. */\n    #animateRemovedDirectoryRow(entry) {\n        if (!entry?.mount || !this.scrollFxHost) {\n            return;\n        }\n        if (entry.mount.parentNode !== this.scrollFxHost) {\n            entry.mount.remount(this.scrollFxHost);\n        }\n        entry.button?.setEnabled?.(false);\n        entry.content?.stopAnimation('y');\n        entry.mount.stopAnimation('opacity');\n        entry.mount.animateTo({\n            opacity: 0,\n            duration_s: DIRECTORY_DELTA_FADE_DURATION_S,\n            ease: DIRECTORY_DELTA_FADE_EASE,\n            onFinish: () => {\n                if (entry.mount.parentNode) {\n                    entry.mount.parentNode.removeChild(entry.mount);\n                }\n            },\n        });\n    }\n\n    /* Reconcile one projection-specific delta directly against retained row containers. */\n    #applyDirectoryDelta(delta, nextState) {\n        if (!this.scrollBox || !this.scrollRowHost || !this.scrollFxHost) {\n            throw new Error('Directory delta arrived before retained row containers were mounted.');\n        }\n        if (this.searchRegex) {\n            this.itemsInPath = nextState;\n            this.#syncDirectorySelection({ prune: true });\n            this.#rebuildSearchRows();\n            return;\n        }\n        let edits = null;\n        switch (nextState?.projection) {\n        case 'alphabetical':\n            edits = Array.isArray(delta?.alphabetical) ? delta.alphabetical : [];\n            break;\n        case 'by_source':\n            edits = Array.isArray(delta?.by_source) ? delta.by_source : [];\n            break;\n        default:\n            throw new Error(`Unsupported directory projection ${JSON.stringify(nextState?.projection)}.`);\n        }\n        const dirPath = normPath(delta?.key?.path ?? nextState?.key?.path ?? this.params.path);\n        const priorY = new Map(this.rowEntries.map((entry) => [entry, entry.mount.localPosition()[1]]));\n        const rows = this.rowEntries.slice();\n        const inserted = [];\n        const removed = [];\n        for (const edit of edits) {\n            if (edit?.kind === 'remove') {\n                const cut = rows.splice(edit.index, edit.count ?? 0);\n                for (const entry of cut) {\n                    if (entry?.mount?.parentNode === this.scrollRowHost) {\n                        entry.mount.remount(this.scrollFxHost);\n                    }\n                }\n                removed.push(...cut);\n                continue;\n            }\n            if (edit?.kind === 'insert') {\n                const beforeMount = rows[edit.index]?.mount ?? null;\n                const items = directoryProjectionEditRows(nextState.projection, dirPath, edit.rows);\n                const entries = items.map((item) => this.#makeDirectoryRowEntry(item));\n                for (const entry of entries) {\n                    this.#mountDirectoryRowEntry(entry, beforeMount);\n                }\n                rows.splice(edit.index, 0, ...entries);\n                inserted.push(...entries);\n                continue;\n            }\n            throw new Error(`Unsupported directory edit kind ${JSON.stringify(edit?.kind)}.`);\n        }\n        this.itemsInPath = nextState;\n        this.rowEntries = rows;\n        this.#syncDirectorySelection({ prune: true });\n        this._itemsRenderKey = this.#listRenderKey(nextState);\n        this.#syncBackButtonState();\n        const spec = this.#directoryBodyLayout();\n        this.#syncEmptyDirectoryLabel(spec);\n        let itemY = 0;\n        for (const row of rows) {\n            this.#layoutDirectoryRowEntry(row, spec, itemY);\n            itemY += DIRECTORY_ROW_PITCH;\n        }\n        this.scrollBox.syncContentLayout();\n        for (const row of rows) {\n            const prevY = priorY.get(row);\n            if (prevY == null) {\n                this.#animateDirectoryRowMotion(row, 0);\n                continue;\n            }\n            this.#animateDirectoryRowMotion(row, prevY - row.mount.localPosition()[1]);\n        }\n        for (const entry of removed) {\n            this.#animateRemovedDirectoryRow(entry);\n        }\n    }\n\n    activateInputCell(cell) {\n        if (cell !== this.searchInput) return false;\n        return ui.focusContentInputCell(this, cell);\n    }\n\n    setDirectorySearch(pattern) {\n        this.searchPattern = pattern;\n        try {\n            this.searchRegex = pattern ? new RegExp(pattern, 'i') : null;\n            this.searchError = '';\n        } catch (error) {\n            this.searchError = `Invalid regex: ${error.message}`;\n        }\n        if (this.searchInput.textInput !== pattern) this.searchInput.syncFromDocument(pattern, pattern.length);\n        this.#layoutDirectoryBody();\n        this.#rebuildSearchRows({ resetScroll: true });\n    }\n\n    #visibleDirectoryItems() {\n        const items = this.itemsInPath?.data ?? [];\n        return this.searchRegex ? items.filter((item) => this.searchRegex.test(item.name)) : items;\n    }\n\n    #layoutDirectorySearch(spec) {\n        if (!this.searchInput) {\n            this.searchHost = new ui.Anchor({ name: 'directory_search' });\n            this.searchInput = new DirectorySearchCell({\n                name: 'directory_search_input', font: this.font, fontSize: this.fontSize,\n                infoLabel: true, infoLabelText: \"Search Item\",\n                onHoverColor: Palette.teal,\n                textInput: this.searchPattern, width: 100, height: 28, paddingX: 33, displayTextXOffset: 5,\n                focusContainerOwner: this, z: -0.2,\n                shape: ui.shapes.rounded({ cornerRadius: 14 }),\n                material: ui.materials.solid(),\n            });\n            this.searchClearButton = new ui.Button({\n                name: 'directory_search_clear',\n                width: 16, height: 16, z: -0.3, tooltipText: 'Clear regex search',\n                iconID: 3, iconSize: [10, 10], iconExpand: false,\n                iconColor: Palette.darkgrey, onHoverIconColor: Palette.white,\n                color: Palette.lightgrey, onHoverColor: Palette.charcoal,\n                shape: ui.shapes.rounded({ cornerRadius: 8 }),\n                material: ui.materials.solid(),\n            });\n            this.searchClearButton.onInput = ui.Button.onPrimaryRelease(() => {\n                this.setDirectorySearch('');\n                this.searchInput.setFocus();\n            });\n            this.searchErrorLabel = new evilfont.MSDFText({\n                font: this.font, fontSize: 12, text: '', fontColor: Palette.orange, y: 34, z: -0.2,\n            });\n            this.searchHost.appendChild(this.searchInput);\n            this.searchInput.appendChild(this.searchClearButton);\n            this.searchHost.appendChild(this.searchErrorLabel);\n            this.appendChild(this.searchHost);\n        }\n        const width = Math.max(0, spec.boxWidth - 24);\n        this.searchHost.setLocalPosition([FRAME_THICKNESS + 12, spec.innerShadowStart + 2, -0.1]);\n        this.searchHost.setVisibility(spec.searchHeight >= 28);\n        this.searchInput.mutate({ width });\n        this.searchClearButton.setLocalPosition([Math.max(0, width - 22), 6, -0.3]);\n        this.searchClearButton.setVisibility(this.searchInput.textInput.length > 0);\n        this.searchErrorLabel.setText(this.searchError ? 'Invalid regex' : '');\n        this.searchErrorLabel.setVisibility(Boolean(this.searchError));\n        this.searchClearButton.tooltipText = this.searchError || 'Clear regex search';\n    }\n\n    #rebuildSearchRows({ resetScroll = false } = {}) {\n        if (!this.scrollRowHost) return;\n        this.scrollRowHost.removeAllChildren();\n        this.scrollFxHost.removeAllChildren();\n        this.emptyDirLabel = null;\n        this.rowEntries = [];\n        const spec = this.#directoryBodyLayout();\n        for (const item of this.#visibleDirectoryItems()) {\n            const entry = this.#makeDirectoryRowEntry(item);\n            this.#layoutDirectoryRowEntry(entry, spec, this.rowEntries.length * DIRECTORY_ROW_PITCH);\n            this.#mountDirectoryRowEntry(entry);\n            this.rowEntries.push(entry);\n        }\n        this.#syncEmptyDirectoryLabel(spec);\n        if (resetScroll) this.scrollBox.contentPosition = 0;\n        this.scrollBox.syncContentLayout();\n        this._itemsRenderKey = this.#listRenderKey(this.itemsInPath);\n    }\n\n    /* Render the directory path chrome and list body from the current `itemsInPath`, including the disconnected placeholder path. */\n    #renderDirectoryBody() {\n        if (this._ephemeral) this._ephemeral.removeAllChildren()\n        if (this.pathContainer?.parentNode) this.pathContainer.parentNode.removeChild(this.pathContainer)\n        this.pathContainer = null;\n        this.listBackTile = null;\n        this.scrollBox = null;\n        this.scrollRowHost = null;\n        this.scrollFxHost = null;\n        this.emptyDirLabel = null;\n        this.reconnectTitleLabel = null;\n        this.reconnectSubtitleLabel = null;\n        this.rowEntries = [];\n        const spec = this.#directoryBodyLayout();\n        let y = spec.y;\n        let x = spec.x;\n\n        //Update Back directory button\n        if (this.params.path === \"\") {\n            this.disableBackBtn()\n        } else {\n            this.enableBackBtn()\n        }\n        let innerShadowStart = y;\n        const pathContainer = new ui.HBoxContainer({\n            width: spec.pathWidth,\n            height: spec.pathHeight,\n            x,\n            y,\n            z: -0.01,\n            spacing: PATH_BREADCRUMB_SPACING,\n            crossAlign: 'center',\n        });\n        this.#appendPathEntries(pathContainer, spec);\n        this.pathContainer = pathContainer;\n        this.directoryHeaderScrollBox.appendChild(pathContainer);\n        this.#layoutDirectoryHeader(spec);\n\n        y = spec.innerShadowStart;\n        innerShadowStart = y;\n\n        const dimensions = {\n            width: spec.dimensions.width,\n            height: spec.dimensions.height,\n            x: FRAME_THICKNESS,\n            y: spec.dimensions.y\n        }\n        const backTile = new ui.Tile({\n            tileBatch: 'directory.inner',\n            ...dimensions,\n            color: Palette.darkgrey,\n            material: ui.materials.beveled({\n                bevelType: 'inner',\n                bevelMargin: 0,\n                bevelWidth: 12,\n            }),\n            z: -0.01\n        });\n        this.listBackTile = backTile;\n        this._ephemeral.appendChild(backTile)\n        this.#layoutDirectorySearch(spec);\n\n        const box = new ui.ScrollBox({\n            width: spec.boxWidth,\n            height: spec.listHeight,\n            padding: spec.padding,\n            x: FRAME_THICKNESS,\n            z: -0.05,\n            y: y + spec.searchHeight,\n            mouseSpace: 'view',\n        });\n        this.scrollBox = box;\n        this._ephemeral.appendChild(box)\n        this.scrollRowHost = box.contentHost;\n        this.scrollFxHost = box.overlayHost;\n\n        /* Render the reconnect hint through the same ScrollBox content host as ordinary rows. */\n        const addReconnectOverlay = () => {\n            const title = new evilfont.MSDFText({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: 'Refresh',\n                z: -0.1,\n                fontColor: [0.78, 0.78, 0.78, 1.0],\n            });\n            const subtitle = new evilfont.MSDFText({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: 'to reconnect',\n                z: -0.1,\n                fontColor: [0.78, 0.78, 0.78, 1.0],\n            });\n            const titleLayout = evilfont.MSDFText.measureFromState(title.state);\n            const subtitleLayout = evilfont.MSDFText.measureFromState(subtitle.state);\n            const gap = 1;\n            const overlayWidth = Math.max(titleLayout.width, subtitleLayout.width);\n            const overlayHeight = titleLayout.height + subtitleLayout.height + gap;\n            const bodyWidth = box.requestedContentWidth - box.thumbWidth;\n            const overlayX = Math.max(0, (bodyWidth - overlayWidth) * 0.5);\n            const overlayY = Math.max(0, (box.requestedContentRect.height - overlayHeight) * 0.5);\n            title.setLocalPosition(\n                overlayX + (overlayWidth - titleLayout.width) * 0.5,\n                overlayY,\n                title.localPosition()[2],\n            );\n            subtitle.setLocalPosition(\n                overlayX + (overlayWidth - subtitleLayout.width) * 0.5,\n                overlayY + titleLayout.height + gap,\n                subtitle.localPosition()[2],\n            );\n            box.appendOverlayChild(title);\n            box.appendOverlayChild(subtitle);\n            this.reconnectTitleLabel = title;\n            this.reconnectSubtitleLabel = subtitle;\n        };\n        if(!this.itemsInPath || !this.itemsInPath.data){\n            addReconnectOverlay();\n            return;\n        }\n        this.#syncEmptyDirectoryLabel(spec);\n\n        let itemY = 0;\n        for (const item of this.#visibleDirectoryItems()) {\n                const entry = this.#makeDirectoryRowEntry(item);\n                this.#layoutDirectoryRowEntry(entry, spec, itemY);\n                this.#resetDirectoryRowMotion(entry);\n                this.#mountDirectoryRowEntry(entry);\n                this.rowEntries.push(entry);\n                itemY += DIRECTORY_ROW_PITCH;\n        }\n        box.syncContentLayout();\n\n    }\n\n    /* Open/reuse a subscription and report ready, pending, skipped, superseded, or failed. */\n    async ensureDirectorySubscription(targetParams = this.params, { clearBannerOnSuccess = false, forceRetry = false, forceRefresh = false } = {}) {\n        const state = this.api.state();\n        if ((state.auth !== 'authenticated' && state.auth !== 'local')\n            || (!forceRetry && state.connection !== 'ready')) {\n            this.#applyApiState(state);\n            return { status: 'failed', error: new Error('Directory access is unavailable. Sign in or reconnect, then retry.') };\n        }\n        if (!this._ephemeral) {\n            return { status: 'skipped', reason: 'detached' };\n        }\n        if (targetParams.path == null) {\n            return { status: 'skipped', reason: 'unresolved_path' };\n        }\n\n        const requestedPath = normPath(targetParams.path);\n        if (requestedPath !== normPath(this.params.path)) {\n            this.searchPattern = '';\n            this.searchRegex = null;\n            this.searchError = '';\n            this.searchInput?.syncFromDocument('', 0);\n        }\n        const resolvedParams = {\n            ...this.params,\n            ...targetParams,\n            path: requestedPath,\n        };\n        if (resolvedParams.lake !== this.params.lake || resolvedParams.branch !== this.params.branch\n            || resolvedParams.path !== this.params.path) this.clearDirectorySelection();\n        const live = this.ownDirectoryOwner;\n        const sameSub = !!live\n            && live.lake === resolvedParams.lake\n            && live.branch === resolvedParams.branch\n            && live.path === resolvedParams.path\n            && live.projection === this.ownDirectoryProjection;\n        if (sameSub && !forceRefresh) {\n            this.params = resolvedParams;\n            this.#syncBackButtonState();\n            live.clearBannerOnSuccess = live.clearBannerOnSuccess || clearBannerOnSuccess;\n            this.#logDirectorySubscription('reuse', live, {\n                force_retry: forceRetry,\n                clear_banner_on_success: clearBannerOnSuccess,\n            });\n            if (live.state === 'open') {\n                if (live.clearBannerOnSuccess && !this.#shouldPreserveReadmeBanner()) {\n                    this.#clearBanner();\n                }\n                this.#syncCurrentDirectoryRows();\n            }\n            return { status: live.state === 'open' ? 'ready' : 'pending' };\n        }\n\n        const refreshEpoch = ++this.refreshEpoch;\n        const buildEpoch = this.buildEpoch;\n\n        const changedPath = !live\n            || live.lake !== resolvedParams.lake\n            || live.branch !== resolvedParams.branch\n            || live.path !== resolvedParams.path\n            || live.projection !== this.ownDirectoryProjection;\n        this.params = resolvedParams;\n        if (changedPath) {\n            this.#invalidateDirectoryCreationAccess();\n        }\n        this.#syncBackButtonState();\n        const canReuseRetainedRows = forceRetry && this.#hasRetainedDirectoryStateFor({\n            ...resolvedParams,\n            projection: this.ownDirectoryProjection,\n        });\n        if (changedPath && !canReuseRetainedRows) {\n            this.itemsInPath = null;\n            this._itemsRenderKey = null;\n            this.#renderDirectoryBody();\n        }\n        const owner = this.#newDirectoryOwner({\n            ...resolvedParams,\n            projection: this.ownDirectoryProjection,\n        }, {\n            clearBannerOnSuccess,\n        });\n        this.ownDirectoryOwner = owner;\n        this.#logDirectorySubscription('opening', owner, {\n            force_retry: forceRetry,\n            clear_banner_on_success: clearBannerOnSuccess,\n        });\n        await this.#closeDirectorySubscription(live);\n        if (!this.#isCurrentDirectoryOwner(owner) || refreshEpoch !== this.refreshEpoch\n            || buildEpoch !== this.buildEpoch || !this._ephemeral) return { status: 'superseded' };\n\n        let opened = null;\n        try {\n            opened = await this.api.wsOpenDirectory({\n                ...resolvedParams,\n                projection: this.ownDirectoryProjection,\n            }, {\n                onEvent: ({ body }) => {\n\t\t\t\t\tcastPtrlessNamed('puff_DirectoryWireDeltaEvent', body);\n                    const eventType = body?.field?.('event_type')?.toText?.() ?? '';\n                    if (eventType !== 'directory_delta') {\n                        throw new Error(`Unexpected directory stream event_type ${JSON.stringify(eventType)}.`);\n                    }\n                    this.#handleDirectoryDelta(owner.subscription_uuid, parseDirectoryDeltaPayload(body?.field?.('delta') ?? null));\n                },\n                onClose: (_err) => {\n                    if (!this.#isCurrentDirectoryOwner(owner) || owner.subscription_uuid !== opened?.subscription_uuid || owner.state === 'closing') {\n                        return;\n                    }\n                    this.#logDirectorySubscription('closed_by_server', owner);\n                    this.#retireDirectoryOwner(owner);\n                    if (this.api.state().connection === 'ready') {\n                        queueMicrotask(() => {\n                            void this.ensureDirectorySubscription(this.params, { forceRetry: true });\n                        });\n                    }\n                },\n            });\n        } catch (err) {\n            if (!this.#isCurrentDirectoryOwner(owner) || refreshEpoch !== this.refreshEpoch\n                || buildEpoch !== this.buildEpoch || !this._ephemeral) return { status: 'superseded' };\n            this.#retireDirectoryOwner(owner);\n            owner.state = 'closed';\n            if (err?.code === 'auth/required') {\n                this.#applyApiState(this.api.state());\n                return { status: 'failed', error: err };\n            }\n            const itemName = requestedPath || '/';\n            if (err?.status === 403) {\n                console.warn('Forbidden directory subscription open.', err);\n                this.loadForbidden(itemName);\n                return { status: 'failed', error: err };\n            }\n            if (err?.status === 404) {\n                console.warn('Directory subscription path not found.', err);\n                this.loadNotFound(itemName);\n                return { status: 'failed', error: err };\n            }\n            console.error('Failed to open directory subscription.', err);\n            this.loadConnectionIssue(err);\n            return { status: 'failed', error: err };\n        }\n        owner.subscription_uuid = opened.subscription_uuid;\n        this.#logDirectorySubscription('opened', owner);\n        if (!this.#isCurrentDirectoryOwner(owner) || refreshEpoch !== this.refreshEpoch || buildEpoch !== this.buildEpoch || !this._ephemeral) {\n            owner.state = 'closing';\n            this.#logDirectorySubscription('closing_stale_open', owner, {\n                refresh_epoch: refreshEpoch,\n                current_refresh_epoch: this.refreshEpoch,\n                build_epoch: buildEpoch,\n                current_build_epoch: this.buildEpoch,\n                has_ephemeral: !!this._ephemeral,\n            });\n            await this.api.wsCloseDirectory(opened.subscription_uuid);\n            owner.state = 'closed';\n            this.#logDirectorySubscription('closed_stale_open', owner);\n            return { status: 'superseded' };\n        }\n        owner.state = 'open';\n        this.#installDirectorySnapshot(opened.snapshot, {\n            clearBannerOnSuccess: owner.clearBannerOnSuccess === true,\n        });\n        const drained = this.api.drainWSStreamQueuedEvents(opened.subscription_uuid);\n        if (drained > 0) {\n            this.#rerenderCurrentItems({ force: true });\n        }\n        return { status: 'ready' };\n    }\n\n    #formatCreateError(kind, err) {\n        if (err?.status === 403) {\n            return 'You do not have write access to this folder.';\n        }\n        return err?.detail || err?.message || `Could not create ${kind}.`;\n    }\n\n    #formatUploadError(err) {\n        if (err?.status === 403) {\n            return 'You do not have write access to this folder.';\n        }\n        return err?.detail || err?.message || 'Could not upload file.';\n    }\n\n    #setupSignals() {\n        /*Linking Signals*/\n        CommanderBus.on(\"CREATE_PUFF\", (data) => {\n            if (!data.filename?.trim()) {\n                data.onError(\"Filename name cannot be empty.\");\n                return;\n            }\n\n            if (`${data.filename}`.length > 255) {\n                data.onError(\"Filename cannot exceed 255 characters.\");\n                return;\n            }\n\n            if (!this.assertNoSpecialChars(data.filename)) {\n                data.onError(\"Filename cannot contain special characters.\");\n                return;\n            }\n\n            void (async () => {\n                if (!await this.#refreshDirectoryWriteAccess()) {\n                    data.onError('You cannot create a Puffbook in this folder.');\n                    return;\n                }\n                const error = await this.#validateCreateName(`${data.filename}.puffbook`, 'File already exists.');\n                if (error) {\n                    data.onError(error);\n                    return;\n                }\n                await this.createFile(data.filename);\n                data.onSuccess();\n            })().catch((err) => {\n                console.error('Failed to create puffbook.', err);\n                data.onError(this.#formatCreateError('puffbook', err));\n            });\n        })\n\n        CommanderBus.on('CREATE_CONVO', (data) => {\n            const reject = (msg) => {\n                data.onError(msg);\n                this.#rerenderCurrentItems({ force: true });\n            };\n            if (!data.filename?.trim()) {\n                data.onError(\"Filename name cannot be empty.\");\n                return;\n            }\n\n            if (!this.assertNoSpecialChars(data.filename)) {\n                reject('Filename cannot contain special characters.');\n                return;\n            }\n\n            void (async () => {\n                const error = await this.#validateCreateName(`${data.filename}.convo`, 'File already exists.');\n                if (error) {\n                    reject(error);\n                    return;\n                }\n                await this.createConvoFile(data.filename);\n                data.onSuccess();\n            })().catch((err) => {\n                console.error('Failed to create convo.', err);\n                reject(this.#formatCreateError('convo', err));\n            });\n        })\n\n        CommanderBus.on(\"CREATE_DIR\", (data) => {\n            if (!data.filename?.trim()) {\n                data.onError(\"Directory name cannot be empty.\");\n                return;\n            }\n            if (data.filename.length > 255) {\n                data.onError(\"Directory name cannot exceed 255 characters.\");\n                return;\n            }\n            if (!this.assertNoSpecialChars(data.filename)) {\n                data.onError(\"Directory name cannot contain special characters.\");\n                return;\n            }\n\n            void (async () => {\n                const error = await this.#validateCreateName(data.filename, 'Directory already exists.');\n                if (error) {\n                    data.onError(error);\n                    return;\n                }\n                await this.createDir(data.filename);\n                data.onSuccess();\n            })().catch((err) => {\n                console.error('Failed to create directory.', err);\n                data.onError(this.#formatCreateError('directory', err));\n            });\n        })\n\n        CommanderBus.on(\"RENAME_ITEM\", (data) => {\n            if (!data.newPath?.trim()) {\n                data.onError(\"Filename name cannot be empty.\");\n                return;\n            }\n            if (!this.assertNoSpecialChars(data.newPath)) {\n                data.onError(\"Filename cannot contain special characters.\");\n                return;\n            }\n\n            const extension = data.extension ? `.${data.extension}` : '';\n            if (`${data.newPath}`.length > 255) {\n                data.onError(\"Filename cannot exceed 255 characters.\");\n                return;\n            }\n            if (!this.assertUniqueName(`${data.newPath}${extension}`)) {\n                data.onError(\"File already exists.\");\n                return;\n            }\n          \n            const old = this.params.path + `/${data.oldPath}` + extension\n            const neww = this.params.path + `/${data.newPath}` + extension\n            void this.renameFile(old, neww).then(() => {\n                data.onSuccess();\n            }).catch((err) => {\n                console.error('Failed to rename item.', err);\n                data.onError(this.#formatCreateError('item', err));\n            });\n        })\n    }\n\n    #build() {\n        this.buildEpoch += 1;\n\n        this.removeAllChildren();\n\n        this.ctxMenu = null;\n        this.backDirButton = null;\n        this.itemsInPath = null;\n\n        this.background = null;\n        this.chromeMount = null;\n        this.contentMount = null;\n        this.scrollBox = null;\n        this.quickActionsScrollBox = null;\n        this.quickActionsContainer = null;\n        this.quickActionsRowsContainer = null;\n        this.directoryHeaderScrollBox = null;\n        this.directoryControlsRow = null;\n\n        this._itemsRenderKey = null;\n\n        //Background Static Elements\n        this.#buildBackground()\n        this.appendChild(this.background)\n\n        //Static Interactables\n        this.#buildStaticElements();\n        this.#syncBackButtonState();\n        this.background.appendChild(this.chromeMount)\n\n        //recyclable content\n        this._ephemeral = new ui.Placeholder();\n        this.contentMount = new ui.Placeholder({\n            z: -0.5\n        });\n        this.contentMount.appendChild(this._ephemeral);\n        this.background.appendChild(this.contentMount)\n        this.#renderDirectoryBody();\n\n        if (this.bannerTitle) {\n            this.#presentBannerOverlay();\n        }\n\n        this.#syncRetractionPose();\n        this.#applyApiState(this.api.state(), { preserveBanner: true });\n    }\n\n    #setChromeVisible(state) {\n        if (!this.background) {\n            return;\n        }\n        this.isRetracted = !state;\n        this.#syncRetractionPose();\n        if (this.expandDirButton) {\n            this.expandDirButton.setEnabled(true);\n            this.expandDirButton.setIconColor([1.0, 1.0, 1.0, 1.0]);\n            this.expandDirButton._dirtyResources();\n        }\n    }\n\n    _onDetachNode(shared) {\n        if (this.ownViewportResizeThink !== null) {\n            this.cancelThinkAt(this.ownViewportResizeThink);\n            this.ownViewportResizeThink = null;\n        }\n        if (this.ownOffApiState) {\n            this.ownOffApiState();\n            this.ownOffApiState = null;\n        }\n        void this.#closeDirectorySubscription();\n        this.#hideBannerOverlay();\n        super._onDetachNode(shared);\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        for (const row of this.rowEntries) {\n            syncDirectoryRowFade(row?.button);\n        }\n        if (this.bannerTitle) {\n            this.#presentBannerOverlay();\n        }\n        if (!this.ownDirectoryOwner && this.params.path !== UNRESOLVED_PATH && this.api.state().connection === 'ready') {\n            void this.ensureDirectorySubscription(this.params, { forceRetry: true });\n        }\n    }\n\n\n    destroyCTXMenu() {\n        if (!this.ctxMenu) {\n            return;\n        }\n        const target = this.ctxMenu.ownMount ?? this.ctxMenu;\n        target.parentNode.removeChild(target);\n        this.ctxMenu = null;\n    }\n\n    async #openCTXMenuIfWritable(item, trigger) {\n        try {\n            const payload = await this.api.statPath({\n                lake: this.params.lake,\n                branch: this.params.branch,\n                path: item?.path,\n            });\n            const artifact = payload?.data ?? payload;\n            if (this.canWriteArtifact(artifact)) {\n                this.buildCTXMenu(item);\n                return;\n            }\n        } catch (err) {\n            console.error('Failed to check context-menu permissions.', err);\n        }\n        trigger.toastEnabled = true;\n        trigger.toastText = 'You do not have write access to this item.';\n        trigger.displayToast();\n    }\n\n    buildCTXMenu(item, { permissionsOnly = false, structuralOnly = false } = {}) {\n        const directory = this;\n        const filename = item?.name ?? '';\n        const [x, y] = this.contentMount?.getLocalMouseViewPosition() ?? [0,0]\n\n        if (this.ctxMenu) {\n            this.destroyCTXMenu();\n        }\n\n        if (this.selectedItemPaths.has(this.#directoryItemPath(item)) && this.selectedItemPaths.size > 1) {\n            const selected = this.itemsInPath.data.filter(entry => this.selectedItemPaths.has(this.#directoryItemPath(entry)));\n            if (selected.some(entry => this.#isProtectedDeletePath(this.#directoryItemPath(entry)))) return;\n            this.ctxMenu = ui.ContextMenu.mount(this.contentMount, {\n                font: this.font, fontSize: this.fontSize, x, y,\n                items: [{ label: 'Delete Selected', onInput: () => {\n                    this.destroyCTXMenu();\n                    this.#confirmDeletion(selected, true);\n                } }],\n            });\n            this.ctxMenu.destroy = () => this.destroyCTXMenu();\n            return;\n        }\n\n        const menuItems = [\n            {\n                /*\n                    This calls can be passed by the Commander Bus\n                    for easier handling of UNDO\n                */\n                label: \"Delete\", onInput: () => {\n                    this.destroyCTXMenu();\n                    this.#confirmDeletion([item]);\n                }\n            },\n            {\n                label: \"Rename\", onInput: () => {\n                    this.destroyCTXMenu();\n                    const cleanedName = filename.split('.')[0];\n                    const filetype = filename.split('.')[1] ?? null;\n                    this.#mountWindow({\n                        font: this.font,\n                        fontSize: this.fontSize,\n                        panel: new RenamePanel({\n                            font: this.font,\n                            fontSize: this.fontSize,\n                            initialName: cleanedName,\n                            onSubmit: (newPath, callbacks) => CommanderBus.emit('RENAME_ITEM', {\n                                oldPath: cleanedName,\n                                newPath,\n                                extension: filetype,\n                                ...callbacks,\n                            }),\n                        }),\n                        windowTitle: 'Rename Item',\n                    });\n                }\n            },\n            {\n                label: 'Copy Path',\n                toastEnabled: true,\n                toastText: 'Path coppied to the clipboard',\n                onInput: async function () {\n                    directory.destroyCTXMenu();\n                    await navigator.clipboard.writeText(item.path);\n                    this.displayToast();\n                }\n            },\n            {\n                label: 'Permissions', onInput: async () => {\n                    this.destroyCTXMenu();\n                    const canManagePermissions = await this.canManagePermissionsAlongPath(item.path);\n                    this.#mountWindow({\n                        font: this.font,\n                        fontSize: this.fontSize,\n                        panel: new PermissionPanel({\n                            font: this.font,\n                            fontSize: this.fontSize,\n                            item,\n                            filePath: item.path,\n                            onGrant: ({ principal, privilege, includeFiles }) => this.grantArtifactAccessAlongPath({\n                                path: item.path,\n                                principal,\n                                privilege,\n                                includeFiles,\n                            }),\n                            onRevoke: ({ principal, privilege }) => this.api.revokeArtifactAccess({\n                                lake: this.params.lake,\n                                branch: this.params.branch,\n                                path: item.path,\n                                principal,\n                                privilege,\n                            }),\n                            canManagePermissions,\n                        }),\n                        windowTitle: 'Permissions',\n                    });\n                }\n            }\n        ];\n        if (structuralOnly) {\n            menuItems.splice(2);\n        }\n        if (permissionsOnly) {\n            menuItems.splice(0, 2);\n        }\n        if (!structuralOnly && item?.type !== 'directory') {\n            menuItems.splice(permissionsOnly ? 0 : 2, 0, {\n                label: 'Download',\n                onInput: async () => {\n                    this.destroyCTXMenu();\n                    try {\n                        // MIGRATION DEBT: This HTTP-buffer/Blob download path is temporary.\n                        // Remove it once Tranquility's WebSocket download transport is implemented.\n                        const buffer = await this.api.fileAsBuffer({\n                            lake: this.params.lake,\n                            branch: this.params.branch,\n                            path: item.path,\n                        });\n                        downloadFileBuffer(buffer, filename);\n                    } catch (err) {\n                        console.error(`Failed to download ${item.path}.`, err);\n                    }\n                },\n            });\n        }\n\n        this.ctxMenu = ui.ContextMenu.mount(this.contentMount, {\n            font: this.font,\n            fontSize: this.fontSize,\n            x: x,\n            y: y,\n            items: menuItems\n        })\n\n        this.ctxMenu.destroy = () => {\n            this.destroyCTXMenu();\n        };\n    }\n\n    #buildBackground(){\n        this.background?.removeAllChildren()\n        this.background = new ui.Placeholder({})\n\n        this.frameMount?.removeAllChildren()\n        this.frameMount = new ui.Placeholder({})\n        this.background.appendChild(this.frameMount)\n\n        const frameColor = directoryFrameColor();\n\n        const backTile = new ui.Tile({\n            //tileBatch: 'directory.chrome',\n            width: WIDTH,\n            height: HEIGHT,\n            color: Palette.charcoal,\n            z: 0.0\n        })\n        this.backgroundTile = backTile;\n\n        const lFrame = new ui.Tile({\n           // tileBatch: 'directory.frame',\n            width: FRAME_THICKNESS,\n            height: HEIGHT,\n            z: -0.01,\n            color: frameColor\n        })\n        this.leftFrameTile = lFrame;\n        const rFrame = new ui.Tile({\n          //  tileBatch: 'directory.frame',\n            width: FRAME_THICKNESS,\n            height: HEIGHT,\n            x: WIDTH - FRAME_THICKNESS,\n            z: -0.01,\n            color: frameColor\n        })\n        this.rightFrameTile = rFrame;\n        const tFrame = new ui.Tile({\n          //  tileBatch: 'directory.frame',\n            width: WIDTH,\n            height: FRAME_THICKNESS,\n            z: -0.01,\n            color: frameColor\n        })\n        this.topFrameTile = tFrame;\n        const bFrame = new ui.Tile({\n         //   tileBatch: 'directory.frame',\n            width: WIDTH,\n            height: FRAME_THICKNESS,\n            y: HEIGHT - FRAME_THICKNESS,\n            z: -0.01,\n            color: frameColor\n        })\n        this.bottomFrameTile = bFrame;\n\n        /* Trapezoid Shape*/\n        const positions = new Float32Array([\n            -1, -2.5, 0,  // tl\n            +1, -1, 0,  // tr\n            -1, +2.5, 0,  // bl\n\n            +1, -1, 0,  // tr\n            +1, +1, 0,  // br\n            -1, +2.5, 0   // bl\n        ]);\n        const poly = new ui.Polygon({\n            width: 24,\n            height: 44,\n            x: WIDTH,\n            y: HEIGHT * 0.5 - 22,\n            z: -0.01,\n            mesh: positions,\n            color: frameColor\n        })\n        this.edgeHandlePolygon = poly;\n        this.expandDirButtonMount = new ui.Placeholder({\n            x: 10,\n            y: 22,\n            z: -0.05,\n            rotation_z: this.isRetracted ? Math.PI : 0.0,\n        });\n        this.expandDirButton = new ui.Button({\n            width: 36,\n            height: 36,\n            iconSize: [24, 24],\n            iconID: 15,\n            x: -18,\n            y: -18,\n            z: 0.0,\n            iconColor: Palette.white,\n            color: Palette.clear,\n            onHoverColor: Palette.clear,\n            onHoverIconColor: Palette.teal,\n        })\n        this.expandDirButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            this.isRetracted = !this.isRetracted;\n            this.#syncRetractionPose({ animate: true });\n            return true;\n        };\n\n        this.expandDirButtonMount.appendChild(this.expandDirButton)\n        poly.appendChild(this.expandDirButtonMount)\n        this.frameMount.appendChild(poly)\n       \n        this.frameMount.appendChild(lFrame)\n        this.frameMount.appendChild(rFrame)\n        this.frameMount.appendChild(tFrame)\n        this.frameMount.appendChild(bFrame)\n\n        this.readOnlyIconMount = new ui.Placeholder({\n            name: 'directoryReadOnlyIconMount',\n            x: WIDTH + DIRECTORY_CORNER_ICON_GAP_PX,\n            y: DIRECTORY_CORNER_ICON_GAP_PX,\n            z: -0.1,\n            visible: false,\n        });\n        this.readOnlyIconMount.appendChild(new ui.Icon({\n            name: 'directoryReadOnlyIcon',\n            width: 32,\n            height: 32,\n            iconID: 35,\n            color: Palette.yellow,\n        }));\n        this.frameMount.appendChild(this.readOnlyIconMount);\n        this.#syncReadOnlyIcon();\n    \n        this.background.appendChild(backTile)\n\n        this.#syncVersionDisplay();\n\n    }\n\n    /* Resize the persistent directory frame nodes in place so viewport churn does not recreate chrome resources. */\n    #layoutBackground() {\n        this.backgroundTile?.mutate({\n            width: WIDTH,\n            height: HEIGHT,\n        });\n        this.leftFrameTile?.mutate({\n            width: FRAME_THICKNESS,\n            height: HEIGHT,\n        });\n        this.rightFrameTile?.mutate({\n            width: FRAME_THICKNESS,\n            height: HEIGHT,\n            x: WIDTH - FRAME_THICKNESS,\n        });\n        this.topFrameTile?.mutate({\n            width: WIDTH,\n            height: FRAME_THICKNESS,\n        });\n        this.bottomFrameTile?.mutate({\n            width: WIDTH,\n            height: FRAME_THICKNESS,\n            y: HEIGHT - FRAME_THICKNESS,\n        });\n        this.edgeHandlePolygon?.mutate({\n            x: WIDTH,\n            y: HEIGHT * 0.5 - 22,\n        });\n        this.readOnlyIconMount.setLocalPosition([\n            WIDTH + DIRECTORY_CORNER_ICON_GAP_PX,\n            DIRECTORY_CORNER_ICON_GAP_PX,\n            -0.1,\n        ]);\n        const [, , versionZ = this.versionDisplayNode?.localPosition?.()[2] ?? -0.11] = this.versionDisplayNode?.localPosition?.() ?? [0, 0, -0.11];\n        this.versionDisplayNode?.setLocalPosition([\n            FRAME_THICKNESS + 10,\n            FRAME_THICKNESS + 10,\n            versionZ,\n        ]);\n    }\n\n    #buildStaticElements() {\n        const directory = this\n\n        this.chromeMount?.removeAllChildren()\n        this.chromeMount = new ui.Placeholder({\n            z: - 0.5\n        })\n        this.quickActionsScrollBox = new ui.ScrollBox({\n            width: WIDTH - (FRAME_THICKNESS + 10) * 2,\n            height: 1,\n            x: FRAME_THICKNESS + 10,\n            y: FRAME_THICKNESS + 10,\n            z: -0.1,\n            mouseSpace: 'view',\n        });\n        this.chromeMount.appendChild(this.quickActionsScrollBox);\n\n        /* NEW DIR BUTTON */\n        const newDirButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            width: BUTTON_HEIGHT,\n            height: BUTTON_HEIGHT,\n            iconID: 12,\n            x: WIDTH - FRAME_THICKNESS - 10 - BUTTON_HEIGHT, //padding, button size\n            y: FRAME_THICKNESS + 100, //change to Y later\n            z: -0.1,\n            iconColor: Palette.white,\n            color: Palette.orange,\n            onHoverIconColor: Palette.teal\n        })\n        newDirButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (!newDirButton.enabled) {\n                return true;\n            }\n            this.#mountWindow({\n                font: this.font,\n                fontSize: this.fontSize,\n                panel: new NewDirPanel({\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    onSubmit: (filename, callbacks) => CommanderBus.emit('CREATE_DIR', { filename, ...callbacks }),\n                }),\n                windowTitle: 'New Directory',\n            });\n            return true;\n        };\n        this.newDirButton = newDirButton;\n        /* BACK DIR BUTTON */\n        this.backDirButton = new ui.Button({\n            x: FRAME_THICKNESS + 10,\n            y: FRAME_THICKNESS + 100,\n            z: -0.1,\n            font: this.font,\n            fontSize: this.fontSize,\n            width: BUTTON_HEIGHT,\n            height: BUTTON_HEIGHT,\n            iconID: 14,\n            iconColor: Palette.orange,\n            color: [0.0, 0.0, 0.0, 0.0],\n            hideTile: true,\n            toastEnabled: true,\n            toastText: \"Already at root.\",\n            toastOffsetX: 48,\n        })\n\n        //if its at home directory just disable button, make grey\n        this.backDirButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            void (async () => {\n                let path = this.params.path;\n                if (path == null || path === '') {\n                    this.backDirButton.displayToast();\n                    return;\n                }\n                if (path === '/~') {\n                    path = `/home/${this.currentUsername}`;\n                }\n                const lastSlashIndex = path.replace(/\\/$/, \"\").lastIndexOf(\"/\");\n                if (lastSlashIndex <= 0 && !path) {\n                    this.backDirButton.displayToast();\n                    return;\n                }\n                const nextPath = lastSlashIndex <= 0 ? '' : path.substring(0, lastSlashIndex);\n                await this.ensureDirectorySubscription({\n                    ...this.params,\n                    path: nextPath,\n                }, {\n                    clearBannerOnSuccess: true,\n                    forceRetry: true,\n                });\n            })();\n            return true;\n        };\n\n        const createRowX = FRAME_THICKNESS * 2.0;\n        const createRowWidth = WIDTH - FRAME_THICKNESS * 4.0;\n        const createButtonWidth = createRowWidth;\n        const createButtonY = HEIGHT - BUTTON_HEIGHT * 2.0 - FRAME_THICKNESS * 3.0;\n\n        /* NEW PUFF BUTTON */\n        const newPuffbookButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"New Puffbook\",\n            width: createButtonWidth,\n            height: BUTTON_HEIGHT,\n            x: createRowX,\n            y: createButtonY,\n            z: -0.1,\n            color: Palette.orange,\n            disabledColor: Palette.darkgrey,\n            onHoverColor: Palette.teal,\n            onFocusColor: Palette.teal,\n            defaultTextColor: Palette.white,\n            disabledTextColor: Palette.grey,\n            onHovertextColor: Palette.white,\n            onFocusTextColor: Palette.white,\n            textHAlignment: 'CENTER',\n            textVAlignment: 'MIDDLE',\n            toastOffsetX: 160,\n        })\n        let newPuffbookCheckOpen = false;\n        newPuffbookButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (!newPuffbookButton.enabled || newPuffbookCheckOpen) {\n                return true;\n            }\n            newPuffbookCheckOpen = true;\n            void this.#refreshDirectoryWriteAccess().then((allowed) => {\n                if (!allowed) {\n                    return;\n                }\n                this.#mountWindow({\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    panel: new NewPuffbookPanel({\n                        font: this.font,\n                        fontSize: this.fontSize,\n                        onSubmit: (filename, callbacks) => CommanderBus.emit('CREATE_PUFF', { filename, ...callbacks }),\n                    }),\n                    windowTitle: 'New Puffbook',\n                });\n            }).finally(() => {\n                newPuffbookCheckOpen = false;\n            });\n            return true;\n        };\n        this.newPuffbookButton = newPuffbookButton;\n\n        /* UPLOAD PUFF BUTTON */\n        const uploadFile = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            width: createRowWidth,\n            height: BUTTON_HEIGHT,\n            text: \"Upload File\",\n            x: createRowX,\n            y: HEIGHT - BUTTON_HEIGHT - FRAME_THICKNESS * 2.0,\n            z: -0.1,\n            color: Palette.grey,\n            disabledColor: Palette.darkgrey,\n            onHoverColor: Palette.teal,\n            onFocusColor: Palette.teal,\n            defaultTextColor: Palette.white,\n            disabledTextColor: Palette.grey,\n            onHovertextColor: Palette.white,\n            onFocusTextColor: Palette.white,\n            textHAlignment: 'CENTER',\n            textVAlignment: 'MIDDLE',\n            toastOffsetX: 160,\n        })\n        let uploadPickerOpen = false;\n        uploadFile.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (!uploadFile.enabled || uploadPickerOpen) {\n                return true;\n            }\n            uploadPickerOpen = true;\n            void this.#openWritableDirectoryUploadPicker().finally(() => {\n                uploadPickerOpen = false;\n            });\n            return true;\n        };\n        this.uploadFileButton = uploadFile;\n        this.#syncDirectoryMutationActionButtons();\n\n        this.directoryHeaderScrollBox = new ui.ScrollBox({\n            width: WIDTH - (FRAME_THICKNESS + 10) * 2,\n            height: 1,\n            z: -0.1,\n            mouseSpace: 'view',\n        });\n        this.directoryControlsRow = new ui.Placeholder({\n            width: WIDTH - (FRAME_THICKNESS + 10) * 2,\n            height: BUTTON_HEIGHT,\n            z: -0.1,\n        });\n        this.directoryControlsRow.appendChild(this.backDirButton);\n        this.directoryControlsRow.appendChild(this.newDirButton);\n        this.directoryHeaderScrollBox.appendChild(this.directoryControlsRow);\n        this.chromeMount.appendChild(this.directoryHeaderScrollBox);\n\n        this.chromeMount.appendChild(uploadFile)\n        this.chromeMount.appendChild(newPuffbookButton)\n        this.#layoutStaticElements();\n    }\n\n    #layoutQuickActions(){\n        if (!this.chromeMount) {\n            return;\n        }\n        if (!this.quickActionsRowsContainer) {\n            this.quickActionsRowsContainer = new ui.VBoxContainer({\n                spacing: 6,\n            });\n            this.quickActionsScrollBox.contentHost.appendChild(this.quickActionsRowsContainer);\n        } else {\n            this.quickActionsRowsContainer.removeAllChildren();\n        }\n        this.quickActionsContainer = null;\n\n        const commonState = {\n            font: this.font,\n            fontSize: this.fontSize,\n            width: 32,\n            height: 32,\n            z: -0.1,\n            color: Palette.orange,\n            iconColor: Palette.white,\n            onHoverIconColor: Palette.white,\n            onHoverColor: Palette.teal\n        };\n\n        const makeButton = (overrides = {}) => new ui.Button({\n            ...commonState,\n            ...overrides,\n        });\n\n        // Construct actions in their displayed order so instance-order Tab navigation matches.\n        const homeButton = makeButton({ iconID: 30 });\n        homeButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            void this.ensureDirectorySubscription({\n                ...this.params,\n                path: `/home/${this.currentUsername}`,\n            }, {\n                clearBannerOnSuccess: true,\n                forceRetry: true,\n            });\n            return true;\n        };\n        this.homeButton = homeButton;\n\n        const docsButton = makeButton({ iconID: 28 });\n        docsButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            window.open('https://docs.evilworks.com/', '_blank');\n            return true;\n        };\n\n        const discordButton = makeButton({ iconID: 29 });\n        discordButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            window.open('https://discord.gg/4u2AaGQbRg', '_blank');\n            return true;\n        };\n\n        const bugReportButton = makeButton({ iconID: 18 });\n        bugReportButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            window.open('https://discord.gg/4BXCgqEj3R', '_blank');\n            return true;\n        };\n        this.bugReportButton = bugReportButton;\n\n        const userButton = makeButton({ iconID: 33 });\n        userButton.onInput = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (this.ctxMenu) {\n                this.destroyCTXMenu();\n            }\n            this.ctxMenu = ui.ContextMenu.mount(userButton, {\n                font: this.font,\n                fontSize: this.fontSize,\n                x: userButton.state.width,\n                y: userButton.state.height,\n                items: [{\n                    label: 'Sign out',\n                    onInput: () => {\n                        this.destroyCTXMenu();\n                        void this.onRequestSignout?.();\n                    },\n                }],\n            });\n            this.ctxMenu.destroy = () => {\n                this.destroyCTXMenu();\n            };\n            return true;\n        };\n        this.userButton = userButton;\n\n        const visualTesterEnabled = principalMatchesUsername('evildoers', this.currentUsername, this.currentGroups);\n        const restartControlsEnabled = visualTesterEnabled && isDevelopmentPortal();\n        let visualTesterButton = null;\n        if (visualTesterEnabled) {\n            visualTesterButton = makeButton({\n                iconID: 41,\n                name: 'visualTesterButton',\n                toastEnabled: true,\n            });\n            visualTesterButton.onInput = (event) => {\n                if (!isActivationEvent(event)) {\n                    return false;\n                }\n                if (this.ctxMenu) {\n                    this.destroyCTXMenu();\n                }\n                this.ctxMenu = ui.ContextMenu.mount(visualTesterButton, {\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    x: visualTesterButton.state.width,\n                    y: visualTesterButton.state.height,\n                    items: [\n                        {\n                            label: 'Visual Tester',\n                            onInput: () => {\n                                this.destroyCTXMenu();\n                                this.visualTesterWindow = this.#mountWindow({\n                                    font: this.font,\n                                    fontSize: this.fontSize,\n                                    panel: new VisualTesterPanel(),\n                                    windowTitle: 'Visual Tester',\n                                    modal: false,\n                                    bodyBacking: false,\n                                });\n                            },\n                        },\n                        ...(restartControlsEnabled && this.onPuffworkerRestartInput ? [{\n                            label: 'Restart Puffworker',\n                            onInput: () => {\n                                if (this.puffworkerRestartPending) return;\n                                this.destroyCTXMenu();\n                                this.onPuffworkerRestartInput();\n                            },\n                        }] : []),\n                        ...(restartControlsEnabled && this.onTranquilityRestartInput ? [{\n                            label: 'Restart Tranquility',\n                            onInput: () => {\n                                if (this.tranquilityRestartPending) return;\n                                this.destroyCTXMenu();\n                                this.#mountWindow({\n                                    font: this.font,\n                                    fontSize: this.fontSize,\n                                    windowTitle: 'Confirm Restart',\n                                    panel: new ConfirmationPanel({\n                                        font: this.font,\n                                        fontSize: this.fontSize,\n                                        confirmationText: 'Restart Tranquility for everyone?',\n                                        action: () => this.onTranquilityRestartInput(),\n                                    }),\n                                });\n                            },\n                        }] : []),\n                    ],\n                });\n                this.ctxMenu.getButton('Restart Puffworker')?.setEnabled(!this.puffworkerRestartPending);\n                this.ctxMenu.getButton('Restart Tranquility')?.setEnabled(!this.tranquilityRestartPending);\n                this.ctxMenu.destroy = () => {\n                    this.destroyCTXMenu();\n                };\n                return true;\n            };\n        }\n        this.visualTesterButton = visualTesterButton;\n\n        let recordingButton = null;\n        if (visualTesterEnabled && this.onRecordingControlInput) {\n            recordingButton = makeButton({\n                iconID: 43,\n                name: 'recordingButton',\n                recordingKey: 'portal.recording-control',\n                tooltipEnabled: true,\n                tooltipText: recordingTooltip('Start Recording'),\n                toastEnabled: true,\n            });\n            recordingButton.onInput = (event) => {\n                if (!isActivationEvent(event) || recordingButton.enabled === false) return false;\n                this.onRecordingControlInput();\n                return true;\n            };\n            recordingButton.onIconCreated = () => this.#syncRecordingButtonAnimation();\n        }\n        this.recordingButton = recordingButton;\n        if (recordingButton) {\n            this.setRecordingControlState(this.recordingControlState.text, this.recordingControlState);\n        }\n\n        const buttons = [homeButton, docsButton, discordButton, bugReportButton, userButton];\n        if (visualTesterButton) {\n            buttons.push(visualTesterButton);\n        }\n        if (recordingButton) {\n            buttons.push(recordingButton);\n        }\n\n        const actionRowWidth = WIDTH - (FRAME_THICKNESS + 10) * 2;\n        const actionRowSpacing = 6;\n        let row = null;\n        let rowWidth = 0;\n        for (const button of buttons) {\n            const buttonWidth = button.state.width;\n            const nextRowWidth = rowWidth + (row ? actionRowSpacing : 0) + buttonWidth;\n            if (!row || nextRowWidth > actionRowWidth) {\n                row = new ui.HBoxContainer({\n                    width: actionRowWidth,\n                    height: button.state.height,\n                    spacing: actionRowSpacing,\n                });\n                this.quickActionsRowsContainer.appendChild(row);\n                if (!this.quickActionsContainer) {\n                    this.quickActionsContainer = row;\n                }\n                rowWidth = 0;\n            }\n            row.appendChild(button);\n            rowWidth += (rowWidth ? actionRowSpacing : 0) + buttonWidth;\n        }\n\n        const [, , z = -0.1] = this.quickActionsRowsContainer.localPosition?.() ?? [0, 0, -0.1];\n        this.quickActionsRowsContainer.width = actionRowWidth;\n        this.quickActionsRowsContainer.height = buttons.length\n            ? this.quickActionsRowsContainer.children.length * commonState.height\n                + (this.quickActionsRowsContainer.children.length - 1) * actionRowSpacing\n            : 0;\n        this.quickActionsRowsContainer.setLocalPosition([0, 0, z]);\n        this.#layoutQuickActionsViewport();\n    }\n\n    setRecordingControlState(text, { disabled = false, state = 'idle', toastText = null } = {}) {\n        this.recordingControlState = { text, disabled, state };\n        const button = this.recordingButton;\n        if (!button) return;\n        const colors = {\n            idle: Palette.orange,\n            recording: Palette.darkred,\n            saving: Palette.darkgrey,\n            failed: Palette.maroon,\n        };\n        const iconID = state === 'saving'\n            ? 24\n            : (state === 'recording' || /save/i.test(text) ? 44 : 43);\n        const tooltipText = state === 'recording'\n            ? recordingTooltip('End Recording')\n            : (state === 'saving' ? 'Saving Recording\u2026' : (iconID === 43 ? recordingTooltip('Start Recording') : text));\n        button.tooltipText = tooltipText;\n        button.state.tooltipText = tooltipText;\n        button.mutate({\n            color: colors[state] ?? Palette.orange,\n            iconID,\n        });\n        button.setEnabled(!disabled);\n        this.#syncRecordingButtonAnimation();\n        if (toastText) {\n            button.toastText = toastText;\n            button.displayToast();\n        }\n    }\n\n    #syncRecordingButtonAnimation() {\n        const button = this.recordingButton;\n        const spinNode = button?.iconPivot ?? button?.icon ?? null;\n        if (!spinNode) return;\n\n        const wantsSpin = this.recordingControlState.state === 'saving';\n        if (wantsSpin) {\n            if (!button.__recordingIconSpinActive) {\n                spinNode.stopAnimation('rotation_z');\n                spinNode.stopAnimation('clock_s');\n                button.icon?.setGpuSpin(RECORDING_SAVING_SPIN_PERIOD_S);\n                spinNode.animateTo({\n                    clock_s: 1,\n                    duration_s: RECORDING_SAVING_SPIN_PERIOD_S,\n                    ease: 'linear',\n                    loop: 'repeat',\n                    accumulate: true,\n                });\n                button.__recordingIconSpinActive = true;\n            }\n            return;\n        }\n\n        if (button.__recordingIconSpinActive) {\n            spinNode.stopAnimation('clock_s');\n            button.icon?.setGpuSpin(null);\n            spinNode.setLocalRotationZ(0);\n            button.__recordingIconSpinActive = false;\n        }\n    }\n\n    #layoutQuickActionsViewport() {\n        if (!this.quickActionsScrollBox) {\n            return;\n        }\n        const spec = this.#directoryBodyLayout();\n        const width = WIDTH - spec.inset * 2;\n        this.quickActionsScrollBox.mutate({ width, height: spec.actionsHeight });\n        this.quickActionsScrollBox.setLocalPosition([\n            spec.inset,\n            spec.actionsY,\n            this.quickActionsScrollBox.localPosition()[2],\n        ]);\n    }\n\n    #layoutDirectoryHeader(spec) {\n        if (!this.directoryHeaderScrollBox || !this.directoryControlsRow) {\n            return;\n        }\n        const width = WIDTH - spec.inset * 2;\n        this.directoryHeaderScrollBox.mutate({ width, height: spec.headerHeight });\n        this.directoryHeaderScrollBox.setLocalPosition([\n            spec.inset,\n            spec.directoryTop,\n            this.directoryHeaderScrollBox.localPosition()[2],\n        ]);\n        this.directoryControlsRow.mutate({ width, height: BUTTON_HEIGHT });\n        this.backDirButton?.setLocalPosition([-4, 0, this.backDirButton.localPosition()[2]]);\n        this.newDirButton?.setLocalPosition([\n            width - BUTTON_HEIGHT,\n            0,\n            this.newDirButton.localPosition()[2],\n        ]);\n        this.pathContainer?.setLocalPosition([\n            spec.x,\n            spec.y,\n            this.pathContainer.localPosition()[2],\n        ]);\n        this.directoryHeaderScrollBox.syncContentLayout();\n    }\n\n\n    /* Reposition the persistent chrome buttons after a viewport resize without recreating the buttons themselves. */\n    #layoutStaticElements() {\n        const createRowX = FRAME_THICKNESS * 2.0;\n        const createRowWidth = WIDTH - FRAME_THICKNESS * 4.0;\n        const createButtonY = HEIGHT - BUTTON_HEIGHT * 2.0 - FRAME_THICKNESS * 3.0;\n\n        this.#layoutQuickActions();\n        const spec = this.#directoryBodyLayout();\n        this.newDirButton?.mutate({\n            width: BUTTON_HEIGHT,\n            height: BUTTON_HEIGHT,\n        });\n        this.backDirButton?.mutate({\n            width: BUTTON_HEIGHT,\n            height: BUTTON_HEIGHT,\n        });\n        this.#layoutDirectoryHeader(spec);\n        this.newPuffbookButton?.mutate({\n            width: createRowWidth,\n            height: BUTTON_HEIGHT,\n        });\n        this.newPuffbookButton?.setLocalPosition([\n            createRowX,\n            createButtonY,\n            this.newPuffbookButton.localPosition()[2],\n        ]);\n        this.uploadFileButton?.mutate({\n            width: createRowWidth,\n            height: BUTTON_HEIGHT,\n        });\n        this.uploadFileButton?.setLocalPosition([\n            createRowX,\n            HEIGHT - BUTTON_HEIGHT - FRAME_THICKNESS * 2.0,\n            this.uploadFileButton.localPosition()[2],\n        ]);\n    }\n\n    #layoutPanelSections() {\n        if (!this.chromeMount) {\n            return;\n        }\n        this.#layoutStaticElements();\n        if (this._ephemeral) {\n            this.#layoutDirectoryBody();\n        }\n    }\n\n    #clearBanner() {\n        this.bannerTitle = ''\n        this.bannerSubtitle = ''\n        this.bannerKind = null\n        this.bannerWantsSignin = false\n        if (this.bannerOverlay?.parentNode) {\n            this.bannerOverlay.fadeOutAndDetach();\n        }\n    }\n\n    #shouldPreserveReadmeBanner() {\n        return this.bannerKind === 'readme' && !this.curPuffbook;\n    }\n\n    /* Keep the route-loading headline stable so the filename can live in the subtitle slot. */\n    #routeLoadingTitle(_path) {\n        return 'Loading';\n    }\n\n    /* Derive one compact filename-style subtitle for the route-loading banner. */\n    #routeLoadingSubtitle(path) {\n        const cleanPath = path?.startsWith('/') ? path : `/${path ?? ''}`;\n        const parts = cleanPath.split('/').filter(Boolean);\n        return parts.at(-1) ?? cleanPath;\n    }\n\n    #isShowingRouteLoading(path) {\n        return this.bannerKind === 'loading'\n            && this.bannerTitle === this.#routeLoadingTitle(path)\n            && this.bannerSubtitle === this.#routeLoadingSubtitle(path);\n    }\n\n    showRouteLoading(path) {\n        this.bannerWantsSignin = false;\n        this.bannerKind = 'loading';\n        this.bannerTitle = this.#routeLoadingTitle(path);\n        this.bannerSubtitle = this.#routeLoadingSubtitle(path);\n        this.#presentBannerOverlay();\n    }\n\n    hideRouteLoading() {\n        if (this.bannerKind !== 'loading') {\n            return;\n        }\n        this.#clearBanner();\n    }\n\n    #showBanner(title, subtitle = '', kind = 'status') {\n        if (this.bannerTitle === title && this.bannerSubtitle === subtitle && this.bannerKind === kind) {\n            return;\n        }\n        this.bannerTitle = title\n        this.bannerSubtitle = subtitle\n        this.bannerKind = kind\n        this.#presentBannerOverlay();\n    }\n\n    #showSignInButton() {\n        this.bannerWantsSignin = true;\n        this.#presentBannerOverlay();\n    }\n\n    loadReadme() {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        this.#showBanner('Welcome to Puffbook', 'Please select an existing puffbook or convo from your directory.', 'readme')\n    }\n\n    loadConnecting() {\n        this.bannerWantsSignin = false\n        this.#showBanner('Connecting', 'Portal is waiting for the backend to become available.')\n    }\n\n    loadForbidden(itemName) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        this.#showBanner('Forbidden', `You do not have read access to ${itemName}.`)\n    }\n\n    loadConnectionIssue(err = null) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        if (isBackendUnavailableError(err)) {\n            this.#showBanner(\n                'Backend Unavailable',\n                'Portal cannot reach the backend service. Start tranquility on port 8002, then reload or wait for reconnect.',\n            )\n            return;\n        }\n        this.#showBanner('No Connection', 'Portal cannot reach the backend service.')\n    }\n\n    loadAuthRequired() {\n        // Authentication does not end the document lifecycle; retain the mounted Puffbook and pending edits.\n        this.bannerWantsSignin = true\n        this.#showBanner('Sign-in Required', 'Automatic retry is paused. Use Sign in to continue.')\n        this.#showSignInButton()\n    }\n\n    loadReadOnlyConvo(itemName) {\n        this.bannerWantsSignin = false\n        this.#showBanner('Read-only Convo', `You do not have write access to ${itemName}.`)\n    }\n\n    loadNotFound(itemName) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        this.#showBanner('Not Found', `Could not find ${itemName}.`)\n    }\n\n    /* Recover a missing direct artifact route to the signed-in user's home while retaining the failed target as a visible banner. */\n    loadMissingRouteArtifact(path) {\n        const homePath = this.currentUsername ? `/home/${this.currentUsername}` : '';\n        this.changeCurPath(homePath, { clearBannerOnSuccess: false });\n        this.updateBrowserPath(homePath, { directory: true });\n        this.loadNotFound(routeArtifactLabel(path));\n    }\n\n    loadUnsupportedItem(itemName, itemType) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        this.#showBanner('Not Supported', `Artifact type '${itemType}' is not supported.`)\n    }\n\n    loadPuffbookError(itemName, err) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        const title = err?.title || 'Load Failed'\n        const detail = `${err?.detail || err?.message || err || ''}`.trim() || `Could not load ${itemName}.`\n        this.#showBanner(title, detail)\n    }\n\n    loadConvoError(itemName, err) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        const detail = `${err?.detail || err?.message || err || ''}`.trim() || `Could not load ${itemName}.`\n        this.#showBanner('Convo Load Failed', detail)\n    }\n\n    /* Present one direct-route artifact read failure through the shared directory banner path. */\n    loadUnreadableRouteArtifact(path, err) {\n        this.#closeCurrentPuffbook()\n        this.bannerWantsSignin = false\n        const banner = describeArtifactReadErrorBanner(path, err, {\n            backendUnavailable: isBackendUnavailableError(err),\n        })\n        this.#showBanner(banner.title, banner.detail, 'status')\n    }\n\n    #creationWriteAccessMatchesCurrentDirectory(state = this.directoryCreationAccess) {\n        return !!state\n            && state.status === 'writable'\n            && state.lake === this.params.lake\n            && state.branch === this.params.branch\n            && state.path === normPath(this.params.path ?? '')\n            && state.username === this.currentUsername\n            && state.groupKey === [...this.currentGroups].sort().join('\\0');\n    }\n\n    #syncDirectoryMutationActionButtons() {\n        const enabled = this.#creationWriteAccessMatchesCurrentDirectory();\n        this.newDirButton?.setEnabled(enabled);\n        this.uploadFileButton?.setEnabled(enabled);\n        this.newPuffbookButton?.setEnabled(enabled);\n        this.onUploadAccessChange?.(enabled);\n    }\n\n    #invalidateDirectoryCreationAccess() {\n        this.directoryCreationAccessEpoch += 1;\n        this.directoryCreationAccess = null;\n        this.#syncDirectoryMutationActionButtons();\n    }\n\n    /* Structural mutations follow the directory's effective write permission.\n     * Permission grants separately retain their owner-only preflight. */\n    async #refreshDirectoryWriteAccess() {\n        const epoch = ++this.directoryCreationAccessEpoch;\n        const target = {\n            lake: this.params.lake,\n            branch: this.params.branch,\n            path: normPath(this.params.path ?? ''),\n            username: this.currentUsername,\n            groupKey: [...this.currentGroups].sort().join('\\0'),\n        };\n        this.directoryCreationAccess = { ...target, status: 'unknown' };\n        this.#syncDirectoryMutationActionButtons();\n        if (!target.username || this.params.path === UNRESOLVED_PATH) {\n            return false;\n        }\n\n        let payload = null;\n        try {\n            payload = await this.api.statPath({\n                lake: target.lake,\n                branch: target.branch,\n                path: target.path,\n            });\n        } catch (_err) {\n            // Fail closed. Directory loading owns user-facing connection errors.\n        }\n        if (epoch !== this.directoryCreationAccessEpoch\n            || target.lake !== this.params.lake\n            || target.branch !== this.params.branch\n            || target.path !== normPath(this.params.path ?? '')\n            || target.username !== this.currentUsername\n            || target.groupKey !== [...this.currentGroups].sort().join('\\0')) {\n            return false;\n        }\n\n        const directory = payload?.data ?? payload;\n        const writable = directory?.type === 'directory' && this.canWriteArtifact(directory);\n        this.directoryCreationAccess = {\n            ...target,\n            status: writable ? 'writable' : 'not_writable',\n        };\n        this.#syncDirectoryMutationActionButtons();\n        return writable;\n    }\n\n    async #openWritableDirectoryUploadPicker() {\n        if (!await this.#refreshDirectoryWriteAccess()) {\n            return;\n        }\n\n        const fileInput = document.createElement('input');\n        fileInput.type = 'file';\n        fileInput.accept = '.puffbook, .convo, .json, .txt , .csv, .png, .jpg, .jpeg';\n        await new Promise((resolve) => {\n            const closePicker = () => {\n                fileInput.onchange = null;\n                fileInput.oncancel = null;\n                resolve();\n            };\n            fileInput.oncancel = closePicker;\n            fileInput.onchange = async (inputEvent) => {\n                const file = inputEvent.target.files[0];\n                try {\n                    if (!file) {\n                        return;\n                    }\n                    await this.uploadFiles([file]);\n                } catch (err) {\n                    this.showUploadError(err);\n                } finally {\n                    closePicker();\n                }\n            };\n            fileInput.click();\n        });\n    }\n\n    get canUploadFiles() {\n        return this.#creationWriteAccessMatchesCurrentDirectory();\n    }\n\n    refreshUploadAccess() {\n        return this.#refreshDirectoryWriteAccess();\n    }\n\n    showUploadError(err) {\n        console.error('Failed to upload file.', err);\n        this.uploadFileButton.toastText = this.#formatUploadError(err);\n        this.uploadFileButton.displayToast();\n    }\n\n    /* Capture the destination synchronously, before any permission or file reads await. */\n    async uploadFiles(files) {\n        const destination = { ...this.params };\n        const username = this.currentUsername;\n        const groupKey = [...this.currentGroups].sort().join('\\0');\n        if (!username || destination.path === UNRESOLVED_PATH) return;\n        if (files.length === 0) return;\n        return this.uploadQueue.run(report => this.#uploadBatch(files, destination, username, groupKey, report));\n    }\n\n    async #chooseUploadReplacements(files) {\n        return new Promise(resolve => {\n            const window = this.#mountWindow({\n                font: this.font, fontSize: 18, padding: 8,\n                windowTitle: 'Existing files',\n                panel: new UploadConflictsPanel({ font: this.font, files, onSubmit: resolve }),\n                onClose: () => resolve(null),\n            });\n            if (!window) throw new Error('Cannot show upload conflicts: directory presentation camera is unavailable.');\n        });\n    }\n\n    async #uploadBatch(files, destination, username, groupKey, report) {\n        const identityMatches = () => username === this.currentUsername\n            && groupKey === [...this.currentGroups].sort().join('\\0');\n        if (!identityMatches()) return;\n        let uploaded = false;\n        try {\n            const canUpload = async () => {\n                const payload = await this.api.statPath(destination);\n                if (!identityMatches()) return false;\n                const directory = payload?.data ?? payload;\n                if (directory?.type !== 'directory' || !this.canWriteArtifact(directory)) {\n                    this.showUploadError(new Error('You dont have permission to upload files here'));\n                    return false;\n                }\n                return true;\n            };\n            if (!await canUpload()) return;\n            const listing = await this.api.listPath(destination);\n            if (!identityMatches()) return;\n            if (!Array.isArray(listing?.data)) throw new Error('Upload conflict check requires a directory listing in data.');\n            const existing = new Map(listing.data.map(item => [item.name, item]));\n            const conflicts = files.filter(file => existing.has(file.name));\n            if (conflicts.some(file => existing.get(file.name).type === 'directory')) {\n                throw new Error('Cannot upload a file over an existing directory.');\n            }\n            if (conflicts.length > 0) {\n                report({ stage: 'awaiting_selection' });\n                const selected = await this.#chooseUploadReplacements(conflicts);\n                if (selected === null || !identityMatches()) return;\n                const conflicting = new Set(conflicts);\n                files = files.filter(file => !conflicting.has(file) || selected.has(file));\n                if (files.length === 0) return;\n                report({ stage: 'preparing' });\n                if (!await canUpload()) return;\n            }\n            for (const file of files) {\n                if (!identityMatches()) return;\n                try {\n                    if (!file.name || /[/\\\\]/.test(file.name) || file.name === '.' || file.name === '..') {\n                        throw new Error(`Invalid upload filename: ${file.name}`);\n                    }\n                    const ref = { ...destination, path: childPath(destination.path, file.name) };\n                    const lower = file.name.toLowerCase();\n                    report({ stage: 'uploading', filename: file.name });\n                    if (lower.endsWith('.puffbook')) {\n                        await this.api.putPuffbook(ref, await file.text());\n                    } else if (lower.endsWith('.convo')) {\n                        await this.api.putConvo(ref, await file.text());\n                    } else {\n                        await this.api.uploadFile(ref, file);\n                    }\n                    uploaded = true;\n                } catch (err) {\n                    this.showUploadError(new Error(`${file.name}: ${this.#formatUploadError(err)}`));\n                }\n            }\n        } finally {\n            if (uploaded) {\n                const result = await this.#refreshFileActivityDirectory(destination, username, groupKey, report);\n                if (result.status === 'failed') throw new Error(`Files uploaded, but the directory could not be refreshed: ${result.error.message}`);\n            }\n        }\n    }\n\n    /* Refresh the visible destination without navigating back after a user moves away. */\n    async #refreshFileActivityDirectory(destination, username, groupKey, report) {\n        const stillCurrent = () => username === this.currentUsername && groupKey === [...this.currentGroups].sort().join('\\0')\n            && destination.lake === this.params.lake && destination.branch === this.params.branch\n            && normPath(destination.path) === normPath(this.params.path);\n        if (!stillCurrent()) return { status: 'superseded' };\n        report({ stage: 'refreshing' });\n        const result = await this.ensureDirectorySubscription({ ...this.params }, {\n            forceRetry: true, forceRefresh: true, clearBannerOnSuccess: true,\n        });\n        return stillCurrent() ? result : { status: 'superseded' };\n    }\n\n    canWriteArtifact(art) {\n        if (!art) {\n            return false;\n        }\n        if (art.type === 'symbol' || art.type === 'conflict') {\n            return false;\n        }\n        if (typeof art.can_write === 'boolean') {\n            return art.can_write;\n        }\n        if (art.owner === PUBLIC_PRINCIPAL) {\n            return true;\n        }\n        if (!this.currentUsername) {\n            return false;\n        }\n\n        if (principalMatchesUsername(art.owner, this.currentUsername, this.currentGroups)) {\n            return true;\n        }\n        return Array.isArray(art.write_groups)\n            && art.write_groups.some((principal) => principal === PUBLIC_PRINCIPAL || principalMatchesUsername(principal, this.currentUsername, this.currentGroups));\n    }\n\n    canReadArtifact(art) {\n        if (!art) {\n            return false;\n        }\n        if (art.type === 'symbol' || art.type === 'conflict') {\n            return true;\n        }\n        if (typeof art.can_read === 'boolean') {\n            return art.can_read;\n        }\n        if (art.owner === ROOT_PRINCIPAL && art.type === 'directory') {\n            return true;\n        }\n        if (art.owner === PUBLIC_PRINCIPAL) {\n            return true;\n        }\n        const readGroups = Array.isArray(art.read_groups) ? art.read_groups : [];\n        const writeGroups = Array.isArray(art.write_groups) ? art.write_groups : [];\n        if (readGroups.includes(PUBLIC_PRINCIPAL) || writeGroups.includes(PUBLIC_PRINCIPAL)) {\n            return true;\n        }\n        if (!this.currentUsername) {\n            return false;\n        }\n        if (principalMatchesUsername(art.owner, this.currentUsername, this.currentGroups)) {\n            return true;\n        }\n        return [...readGroups, ...writeGroups].some((principal) => principalMatchesUsername(principal, this.currentUsername, this.currentGroups));\n    }\n\n    /* Open one puffbook path and optionally place the caret on a specific line once the authoritative body arrives. */\n    async loadPuffBook(itemName, art = null, focus = null) {\n        let params = { ...this.params };\n        params.path = itemName.startsWith('/')\n            ? normPath(itemName)\n            : normPath(`${params.path}/${itemName}`)\n        const dirPath = this.#parentDirectoryPath(params.path);\n        this.params.path = dirPath;\n        void this.ensureDirectorySubscription({\n            ...this.params,\n            path: dirPath,\n        });\n        const keepRouteLoading = this.#isShowingRouteLoading(params.path);\n        const focusSpec = normalizePuffbookFocus(focus);\n\n        if (!keepRouteLoading) {\n            this.#clearBanner()\n        }\n        if (this.matchesCurrentOrPendingFileRef(params)) {\n            this.updateBrowserPath(params.path);\n            this.#syncCurrentDirectoryRows();\n            this.#focusMountedPuffbook(focusSpec);\n            return;\n        }\n        this.#closeCurrentPuffbook()\n        const owner = this.#beginPendingPuffbookOpen(params, focusSpec);\n        setTestingPuffbookError(null);\n\n        if (art === null) {\n            const payload = await this.api.statPath(params);\n            art = payload?.data ?? null;\n        }\n        if (!this.#isCurrentPuffbookSession(owner) || !this.#pendingPuffbookRefMatches(params)) {\n            return;\n        }\n        if (!art) {\n            this.#clearPendingPuffbookOpen(owner);\n            if (isDocumentArtifactPath(params.path)) {\n                this.loadUnreadableRouteArtifact(params.path, { status: 404 });\n            } else {\n                this.loadNotFound(itemName);\n            }\n            return;\n        }\n        const readOnly = !this.canWriteArtifact(art);\n        if (!keepRouteLoading) {\n            this.showRouteLoading(params.path);\n        }\n\n        const doc = createPuffbook(this.api, params, {\n            read_only: readOnly,\n            username: this.currentUsername,\n            onLifecycleChange: (lifecycle, changedDoc) => {\n                this.#handlePuffbookLifecycleChange(owner, lifecycle, changedDoc);\n            },\n            onComputeAvailabilityChange: (available, changedDoc) => {\n                if (this.#isCurrentPuffbookSession(owner) && owner.doc === changedDoc) {\n                    this.onPuffbookComputeAvailabilityChange?.(available, changedDoc);\n                }\n            },\n            onLoadReady: (loadedDoc) => {\n                if (!this.#isCurrentPuffbookSession(owner) || owner.doc !== loadedDoc) {\n                    return;\n                }\n                this.#removeStalePuffbookScreens(owner.screen, loadedDoc);\n                if (!loadedDoc.canMountScreen?.()) {\n                    throw new Error(`Puffbook became ready in non-mountable lifecycle state '${loadedDoc.lifecycleState?.() ?? 'unknown'}'.`);\n                }\n                let screen = owner.screen;\n                if (screen) {\n                    if (screen.state?.doc !== loadedDoc) {\n                        throw new Error('Puffbook reconnect tried to reuse a mounted screen for a different document.');\n                    }\n                } else {\n                    screen = this.#mountPuffbookScreen(loadedDoc);\n                    owner.screen = screen;\n                }\n                owner.state = 'mounted';\n                this.#applyPendingPuffbookFocus(screen);\n                setTestingCurrentDocument(loadedDoc);\n                setTestingCurrentScreen(screen);\n                this.#syncCurrentDirectoryRows();\n                this.#syncPuffbookIndicator();\n                this.onRecordingPuffbookEpoch?.({\n                    cause: loadedDoc.recordingReplayReadiness().subscription_generation > 1\n                        ? 'resubscribe'\n                        : 'document_open',\n                    doc: loadedDoc,\n                });\n            },\n            onInitialPresentationReady: (presentedDoc) => {\n                if (!this.#isCurrentPuffbookSession(owner) || owner.doc !== presentedDoc || !owner.screen) {\n                    return;\n                }\n                this.hideRouteLoading();\n            },\n            onLoadError: (err, failedDoc) => {\n                if (this.#isPuffbookRenameInFlight(owner)) {\n                    return;\n                }\n                const isPendingFailure = this.#isCurrentPuffbookSession(owner) && owner.doc === failedDoc && owner.screen === null;\n                const screen = this.#activePuffbookScreen();\n                const isMountedFailure = screen?.state?.doc === failedDoc && this.#isCurrentPuffbookSession(owner);\n                if (!isPendingFailure && !isMountedFailure) {\n                    return;\n                }\n                const live = this.api.state();\n                const transportInterrupted = isBackendUnavailableError(err)\n                    || live?.connection !== 'ready'\n                    || `${err?.message || err || ''}`.startsWith('WebSocket connection closed.')\n                    || `${err?.message || err || ''}`.startsWith('WebSocket connection dropped unexpectedly.');\n                if (isPendingFailure) {\n                    this.#clearPendingPuffbookOpen(owner);\n                }\n                this.hideRouteLoading();\n                if (isMountedFailure && transportInterrupted && failedDoc.canMountScreen?.()) {\n                    setTestingPuffbookError(err);\n                    return;\n                }\n                setTestingCurrentDocument(null);\n                setTestingCurrentScreen(null);\n                setTestingPuffbookError(err);\n                if (err.status === 403) {\n                    this.loadForbidden(itemName);\n                    return;\n                }\n                if (err.status === 404) {\n                    this.loadNotFound(itemName);\n                    return;\n                }\n                this.#retirePuffbookSession(owner);\n                this.loadUnreadableRouteArtifact(params.path, err);\n            }\n        });\n        owner.doc = doc;\n        this.#syncPuffbookIndicator();\n        this.updateBrowserPath(params.path);\n    }\n\n    async loadConvo(itemName, art = null) {\n        this.#clearBanner()\n        this.#closeCurrentPuffbook()\n        setTestingPuffbookError(null);\n\n        let params = { ...this.params };\n        params.path = itemName.startsWith('/')\n            ? normPath(itemName)\n            : normPath(`${params.path}/${itemName}`)\n        const dirPath = this.#parentDirectoryPath(params.path);\n        this.params.path = dirPath;\n        const keepRouteLoading = this.#isShowingRouteLoading(params.path);\n\n        if (!keepRouteLoading) {\n            this.showRouteLoading(params.path);\n        }\n\n        if (art === null) {\n            const payload = await this.api.statPath(params);\n            art = payload?.data ?? null;\n        }\n        if (!art) {\n            this.hideRouteLoading();\n            if (isDocumentArtifactPath(params.path)) {\n                this.loadUnreadableRouteArtifact(params.path, { status: 404 });\n            } else {\n                this.loadNotFound(itemName);\n            }\n            return;\n        }\n        const readOnly = !this.canWriteArtifact(art);\n\n        let doc = null;\n        try {\n            doc = await createConvo(this.api, params, {\n                read_only: readOnly,\n                onLoadError: (err, failedDoc) => {\n                    const screen = this.curPuffbook;\n                    if (screen?.state?.doc !== failedDoc) {\n                        return;\n                    }\n                    this.curPuffbook = null;\n                    this.hideRouteLoading();\n                    this.#detachPuffbookScreen(screen);\n                    setTestingCurrentDocument(null);\n                    setTestingCurrentScreen(null);\n                    setTestingPuffbookError(err);\n                    if (err.status === 403) {\n                        this.loadForbidden(itemName);\n                        return;\n                    }\n                    if (err.status === 404) {\n                        this.loadNotFound(itemName);\n                        return;\n                    }\n                    this.loadUnreadableRouteArtifact(params.path, err);\n                }\n            });\n        } catch (err) {\n            this.hideRouteLoading();\n            if (err?.status === 403) {\n                this.loadForbidden(itemName);\n                return;\n            }\n            if (err?.status === 404) {\n                this.loadNotFound(itemName);\n                return;\n            }\n            this.loadUnreadableRouteArtifact(params.path, err);\n            return;\n        }\n\n        this.curPuffbook = new PuffbookScreen({ doc, font: this.puffbookFont, tableviewFont: this.tableviewFont, tableviewHeaderFont: this.tableviewHeaderFont });\n        setTestingCurrentDocument(doc);\n        setTestingCurrentScreen(this.curPuffbook);\n\n        const scene = this.#documentPresentationScene();\n        const cam = this.#documentCamera();\n        if (!scene?.rootViewport || !cam) {\n            throw new Error('Directory.loadConvo() requires an attached document presentation scene.');\n        }\n\n        scene.rootViewport.appendChild(this.curPuffbook);\n        this.curPuffbook.teleportCamera(cam);\n\n        if (readOnly) {\n            this.loadReadOnlyConvo(itemName);\n        }\n        this.hideRouteLoading();\n        this.updateBrowserPath(params.path);\n        void this.ensureDirectorySubscription({\n            ...this.params,\n            path: dirPath,\n        });\n        this.#syncCurrentDirectoryRows();\n    }\n\n    #detachPuffbookScreen(screen) {\n        const parent = screen?.parentNode;\n        if (!parent) {\n            return;\n        }\n        const expectedParent = this.#documentPresentationScene()?.rootViewport ?? null;\n        if (parent !== expectedParent) {\n            console.warn('Detaching puffbook screen from an unexpected parent during teardown.');\n        }\n        parent.removeChild(screen);\n    }\n\n    /**\n        Mount a fully opened puffbook document only after the initial\n        authoritative body has arrived, so blank provisional screens do not flash.\n    */\n    #mountPuffbookScreen(doc) {\n        const scene = this.#documentPresentationScene();\n        const cam = this.#documentCamera();\n        if (!scene?.rootViewport || !cam) {\n            throw new Error('Directory.#mountPuffbookScreen() requires an attached document presentation scene.');\n        }\n        if (!doc?.canMountScreen?.()) {\n            throw new Error(`Directory.#mountPuffbookScreen() requires a mountable puffbook lifecycle (was '${doc?.lifecycleState?.() ?? 'unknown'}').`);\n        }\n        this.#removeStalePuffbookScreens(null, doc);\n        const screen = new PuffbookScreen({\n            doc,\n            font: this.puffbookFont,\n            tableviewFont: this.tableviewFont,\n            tableviewHeaderFont: this.tableviewHeaderFont,\n        });\n        this.curPuffbook = screen;\n        scene.rootViewport.appendChild(screen);\n        screen.teleportCamera(cam);\n        return screen;\n    }\n\n    /* The shared presentation viewport has no per-document ownership fence.\n       Reconnects can therefore leave an old interactive screen reachable even\n       after its Directory session is superseded. Remove it before mounting so\n       input, camera teleportation, and testing hooks have exactly one owner. */\n    #removeStalePuffbookScreens(keep = null, replacementDoc = null) {\n        const scene = this.#documentPresentationScene();\n        const viewport = scene?.rootViewport;\n        if (!viewport) {\n            return;\n        }\n        for (const child of [...(viewport.children ?? [])]) {\n            if (!(child instanceof PuffbookScreen) || child === keep) {\n                continue;\n            }\n            const staleDoc = child.state?.doc ?? null;\n            console.warn('Removing stale PuffbookScreen before continuing document lifecycle.', {\n                stale_file_ref: staleDoc?.fileRef ?? null,\n                replacement_file_ref: replacementDoc?.fileRef ?? null,\n            });\n            this.#detachPuffbookScreen(child);\n            if (staleDoc && staleDoc !== replacementDoc) {\n                staleDoc.close?.();\n            }\n        }\n    }\n\n    /* Drop any mounted or still-opening puffbook immediately so closing means off-screen straight away. */\n    #closeCurrentPuffbook() {\n        const owner = this.ownPuffbookSession;\n        if (!owner) {\n            return;\n        }\n        const screen = owner.screen;\n        const doc = owner.doc ?? screen?.state?.doc ?? null;\n        this.onPuffbookComputeAvailabilityChange?.(null, doc);\n        this.#retirePuffbookSession(owner);\n        this.ownPendingPuffbookFocus = null;\n        if (!screen) {\n            doc?.close?.();\n            setTestingCurrentDocument(null);\n            setTestingCurrentScreen(null);\n            return;\n        }\n        setTestingCurrentDocument(null);\n        setTestingCurrentScreen(null);\n        try {\n            this.#detachPuffbookScreen(screen);\n            this.#syncCurrentDirectoryRows();\n        } finally {\n            doc?.close?.();\n        }\n    }\n\n    changeCurPath(newPath, { clearBannerOnSuccess = true } = {}) {\n        void this.ensureDirectorySubscription({\n            ...this.params,\n            path: normPath(newPath),\n        }, {\n            clearBannerOnSuccess,\n        })\n    }\n\n    #parentDirectoryPath(path) {\n        const norm = normPath(path);\n        if (!norm) {\n            return '';\n        }\n        const lastSlash = norm.lastIndexOf('/');\n        if (lastSlash <= 0) {\n            return '';\n        }\n        return norm.substring(0, lastSlash);\n    }\n\n    #normalizeHomeAliasPath(path) {\n        const norm = normPath(path);\n        if (!this.currentUsername) {\n            return norm;\n        }\n        if (norm === '/~') {\n            return `/home/${this.currentUsername}`;\n        }\n        if (norm.startsWith('/~/')) {\n            return `/home/${this.currentUsername}/${norm.substring(3)}`;\n        }\n        return norm;\n    }\n\n    setCurrentUsername(username, { refresh = true, groups = [] } = {}) {\n        const previousIdentity = JSON.stringify([this.currentUsername, [...this.currentGroups].sort()]);\n        const hadVisualTesterAccess = principalMatchesUsername('evildoers', this.currentUsername, this.currentGroups);\n        this.currentUsername = username || null;\n        this.currentGroups = new Set(Array.isArray(groups) ? groups : []);\n        if (previousIdentity !== JSON.stringify([this.currentUsername, [...this.currentGroups].sort()])) this.clearDirectorySelection();\n        this.#invalidateDirectoryCreationAccess();\n        const hasVisualTesterAccess = principalMatchesUsername('evildoers', this.currentUsername, this.currentGroups);\n        if (hadVisualTesterAccess !== hasVisualTesterAccess && this.chromeMount) {\n            if (!hasVisualTesterAccess && this.ctxMenu) {\n                this.destroyCTXMenu();\n            }\n            this.#layoutPanelSections();\n        }\n        const hadResolvedPath = this.params.path !== UNRESOLVED_PATH;\n        const normalizedPath = this.#normalizeHomeAliasPath(this.params.path);\n        if (normalizedPath !== this.params.path) {\n            this._itemsRenderKey = null;\n            if (!refresh) {\n                this.params = {\n                    ...this.params,\n                    path: normalizedPath,\n                };\n                this.#syncBackButtonState();\n                if (this.ownDirectoryOwner?.state === 'open') {\n                    void this.#refreshDirectoryWriteAccess();\n                }\n                return;\n            }\n            void this.ensureDirectorySubscription({\n                ...this.params,\n                path: normalizedPath,\n            }, {\n                clearBannerOnSuccess: true,\n            });\n            // Preserve the initial route until the startup route bootstrap has\n            // classified it. Rewriting null -> '' here would collapse\n            // `/lake/<artifact>` to `/lake` before route load runs.\n            if (hadResolvedPath) {\n                this.updateBrowserPath(normalizedPath, { directory: true });\n            }\n            return;\n        }\n        this._itemsRenderKey = null;\n        if (!refresh) {\n            this.#syncBackButtonState();\n            if (this.ownDirectoryOwner?.state === 'open') {\n                void this.#refreshDirectoryWriteAccess();\n            }\n            return;\n        }\n        void this.ensureDirectorySubscription();\n        if (this.ownDirectoryOwner?.state === 'open') {\n            void this.#refreshDirectoryWriteAccess();\n        }\n        this.#syncBackButtonState();\n    }\n\n    /* Internal users may inspect artifact types that Portal does not render as documents. */\n    shouldShowUnsupportedArtifactBanner() {\n        return !principalMatchesUsername('evildoers', this.currentUsername, this.currentGroups);\n    }\n\n    #syncBackButtonState() {\n        if (this.params.path == null || this.params.path === \"\") {\n            this.disableBackBtn();\n        } else {\n            this.enableBackBtn();\n        }\n    }\n\n    disableBackBtn() {\n        if (this.backDirButton) {\n            this.backDirButton.setIconColor([0.3, 0.3, 0.3, 1.0]) //dark grey\n            this.backDirButton.setEnabled(false)\n        }\n    }\n    enableBackBtn() {\n        if (this.backDirButton) {\n            this.backDirButton.setIconColor(Palette.orange) //dark grey\n            this.backDirButton.setEnabled(true)\n        }\n    }\n\n    assertUniqueName(targetName) {\n        const items = this.itemsInPath?.data || [];\n        const comparableName = `${targetName ?? ''}`.normalize('NFC').toLowerCase();\n\n        return !items.some((item) => `${item?.name ?? ''}`.normalize('NFC').toLowerCase() === comparableName);\n    }\n\n    /* The directory metadata is returned by the backend. Check it immediately before\n     * a create request, after the local name collision check and without path policy. */\n    async #validateCreateName(targetName, duplicateMessage) {\n        if (!this.assertUniqueName(targetName)) {\n            return duplicateMessage;\n        }\n        const payload = await this.api.statPath({\n            lake: this.params.lake,\n            branch: this.params.branch,\n            path: normPath(this.params.path ?? ''),\n        });\n        const directory = payload?.data ?? payload;\n        if (!this.canWriteArtifact(directory)) {\n            console.log(directory)\n            return 'You do not have write access to this folder.';\n        }\n        return null;\n    }\n\n    assertNoSpecialChars(filename) {\n        // Allows letters (a-z, A-Z), numbers (0-9), spaces, underscores (_), and hyphens (-).\n        const validPattern = /^[a-zA-Z0-9 _-]+$/;\n        return validPattern.test(filename);\n    }\n\n    #computePortalBasePath() {\n        const url = new URL(window.location.href);\n        // Preserve any proxy prefix before /lake/ when writing browser paths.\n        const lakeIndex = url.pathname.indexOf('/lake/');\n        if (lakeIndex !== -1) {\n            return url.pathname.substring(0, lakeIndex + 1) || '/';\n        }\n        if (url.pathname === '/lake') {\n            return '/';\n        }\n        if (url.pathname.endsWith('/')) {\n            return url.pathname;\n        }\n        const lastSlash = url.pathname.lastIndexOf('/');\n        return lastSlash === -1 ? '/' : url.pathname.substring(0, lastSlash + 1);\n    }\n\n    /* Rewrite the browser URL to one canonical portal route for either a directory or one artifact. */\n    updateBrowserPath(filePath, { directory = false } = {}) {\n        const url = new URL(window.location.href);\n        // Directory navigation owns the path route; hash routing is obsolete.\n        url.pathname = `${this.portalBasePath.replace(/\\/+$/, '')}${portalLakePathFromFilePath(filePath, {\n            directory,\n        })}`;\n        url.hash = '';\n        window.history.replaceState({ path: filePath ?? '' }, '', url.href);\n    }\n\n    async createFile(filename) {\n        const puffbookPath = childPath(this.params.path, `${filename}.puffbook`);\n        await this.api.putPuffbook({\n            ...this.params,\n            path: puffbookPath\n        }, '', {waitForDurable: true})\n        // The successful PUT is authoritative for this newly-created artifact.\n        // Avoid a race-prone stat immediately after the write becomes visible\n        // on the directory stream but before the stat projection catches up.\n        await this.loadPuffBook(puffbookPath, {\n            type: 'puffbook',\n            owner: this.currentUsername,\n            can_read: true,\n            can_write: true,\n        });\n    }\n\n    async createConvoFile(filename) {\n        const convoPath = childPath(this.params.path, `${filename}.convo`);\n        const initial = createDefaultConvo();\n        initial.title = filename;\n        await this.api.putConvo({\n            ...this.params,\n            path: convoPath\n        }, serializeConvo(initial))\n        await this.loadConvo(convoPath)\n    }\n\n    async createDir(dirName) {\n        await this.api.makeDirectory({\n            ...this.params,\n            path: childPath(this.params.path, dirName)\n        })\n    }\n\n    async renameFile(oldPath, newPath) {\n        const oldPuffbookPath = normPath(oldPath);\n        const newPuffbookPath = normPath(newPath);\n        const owner = this.ownPuffbookSession;\n        const reopenRenamedPuffbook = Boolean(\n            oldPuffbookPath\n            && owner\n            && this.#activeOrPendingPuffbookPath() === oldPuffbookPath\n        );\n        const rename = reopenRenamedPuffbook ? { owner, oldPath: oldPuffbookPath } : null;\n        if (rename) {\n            this.ownPuffbookRename = rename;\n        }\n        try {\n            await this.api.rename({\n                ...this.params,\n                path: oldPath,\n            }, newPath);\n            if (rename\n                && this.ownPuffbookSession === owner\n                && this.#activeOrPendingPuffbookPath() === oldPuffbookPath) {\n                await this.loadPuffBook(newPuffbookPath);\n            }\n        } finally {\n            if (this.ownPuffbookRename === rename) {\n                this.ownPuffbookRename = null;\n            }\n        }\n    }\n\n    #isProtectedDeletePath(path) {\n        return path === '/' || path === '/home' || path === `/home/${this.currentUsername}`;\n    }\n\n    #confirmDeletion(items, multiple = false) {\n        const destination = { ...this.params };\n        const username = this.currentUsername;\n        const groups = [...this.currentGroups].sort().join('\\0');\n        let remaining = [...new Map(items.map(item => {\n            const path = this.#directoryItemPath(item);\n            return [path, { lake: destination.lake, branch: destination.branch, path, name: item.name }];\n        })).values()];\n        let refreshRequired = false;\n        const panel = new ConfirmationPanel({\n            font: this.font, fontSize: this.fontSize,\n            confirmationText: multiple\n                ? `Are you sure you want to delete ${remaining.length} files?`\n                : `Item \"${remaining[0].name}\" will be deleted, are you sure you want to continue?`,\n            action: async () => {\n                if (username !== this.currentUsername || groups !== [...this.currentGroups].sort().join('\\0')) {\n                    if (remaining.length === 0) return;\n                    throw new Error('The signed-in identity changed. Select the items again before deleting.');\n                }\n                const result = await this.deleteItems(remaining, destination, { refreshRequired });\n                remaining = result.failed.map(entry => entry.target);\n                refreshRequired = result.refreshError !== null;\n                const errors = result.failed.map(({ target, error }) => `${target.name}: ${error.message}`);\n                if (result.refreshError) {\n                    errors.push(remaining.length === 0\n                        ? `Files deleted, but the directory could not be refreshed: ${result.refreshError.message}`\n                        : `Could not refresh directory: ${result.refreshError.message}`);\n                }\n                if (errors.length > 0) {\n                    panel.setActionLabel(remaining.length > 0 ? 'Retry failed' : 'Retry refresh');\n                    throw new Error(errors.join('\\n'));\n                }\n            },\n        });\n        this.#mountWindow({\n            font: this.font, fontSize: this.fontSize,\n            windowTitle: 'Confirm Action', panel,\n        });\n    }\n\n    /* Capture absolute targets before queueing; refresh recovery never repeats successful deletes. */\n    async deleteItems(targets, destination = this.params, { refreshRequired = false } = {}) {\n        const captured = targets.map(target => ({ ...target }));\n        const origin = { ...destination };\n        const username = this.currentUsername;\n        const groups = [...this.currentGroups].sort().join('\\0');\n        if (captured.length === 0 && !refreshRequired) return { failed: [], refreshError: null };\n        return this.deleteQueue.run(async report => {\n            const failed = [];\n            let deleted = false;\n            let refreshError = null;\n            const identityMatches = () => username === this.currentUsername && groups === [...this.currentGroups].sort().join('\\0');\n            for (const [index, target] of captured.entries()) {\n                report({ stage: 'deleting', filename: target.name, index: index + 1, total: captured.length });\n                try {\n                    if (!identityMatches()) throw new Error('The signed-in identity changed.');\n                    if (this.#isProtectedDeletePath(target.path)) throw new Error('This directory cannot be deleted.');\n                    await this.api.deletePath({ lake: target.lake, branch: target.branch, path: target.path });\n                    deleted = true;\n                } catch (error) {\n                    failed.push({ target, error });\n                    continue;\n                }\n                if (identityMatches() && origin.lake === this.params.lake && origin.branch === this.params.branch\n                    && normPath(origin.path) === normPath(this.params.path)) {\n                    this.selectedItemPaths.delete(target.path);\n                    if (this.selectionAnchorPath === target.path) this.selectionAnchorPath = null;\n                    this.#syncDirectorySelection();\n                }\n                const active = this.#activePuffbookDoc()?.fileRef;\n                if (identityMatches() && active && active.lake === target.lake && active.branch === target.branch\n                    && (normPath(active.path) === target.path || normPath(active.path).startsWith(`${target.path}/`))) {\n                    this.loadReadme();\n                }\n            }\n            if (deleted || refreshRequired) {\n                const result = await this.#refreshFileActivityDirectory(origin, username, groups, report);\n                if (result.status === 'failed') refreshError = result.error;\n            }\n            return { failed, refreshError };\n        }, captured.length === 0 ? 'refreshing' : 'preparing');\n    }\n\n    #clearVersionDisplay() {\n        this.versionDisplayRequestToken += 1;\n        if (this.versionDisplayNode?.parentNode) {\n            this.versionDisplayNode.parentNode.removeChild(this.versionDisplayNode);\n        }\n        this.versionDisplayNode = null;\n        this.versionDisplayHeight = 0;\n        if (this.quickActionsContainer) {\n            this.#layoutPanelSections();\n        }\n    }\n\n    /* Reconcile the version chrome with API readiness instead of depending on the initial build race. */\n    #syncVersionDisplay() {\n        const state = this.api.state();\n        if (state.auth === 'renewing') {\n            return;\n        }\n        if (!this.background || !apiCanServeRoutes(state)) {\n            this.#clearVersionDisplay();\n            return;\n        }\n        void this.createVersionDisplay(this.background);\n    }\n\n    async createVersionDisplay(background) {\n        if (!background) {\n            return;\n        }\n        this.#clearVersionDisplay();\n        const requestToken = this.versionDisplayRequestToken;\n\n        try {\n            const status = await this.api.status();\n            if (requestToken !== this.versionDisplayRequestToken\n                || background !== this.background\n                || !apiCanServeRoutes(this.api.state())) {\n                return;\n            }\n            const authentication = status?.data?.authentication;\n            if (authentication?.username === this.currentUsername) {\n                this.currentGroups = new Set(Array.isArray(authentication.groups) ? authentication.groups : []);\n            }\n            let env = status?.data.app_environment || \"development\"\n            const portalEnv = getPortalEnvironment()\n            if (portalEnv === 'local' || portalEnv === 'e2e') {\n                env = portalEnv // local override while status doesn't support it\n            }\n            const basePosition = [\n                FRAME_THICKNESS + 10,\n                FRAME_THICKNESS + 10,\n                -0.11,\n            ];\n            //make it a button\n            if (env === 'development' || env === 'staging' || env === 'local' || env === 'e2e') {\n\n                const hashID = status.data?.build_version || \"local\";\n                const envLabel = env === 'staging' ? 'staging' : 'dev';\n                const displayText = `${envLabel}: ${hashID}`\n        \n                this.appEnvironment = 'development'\n                const verButton = new ui.Button({\n                    font: this.font,\n                    fontSize: 14,\n                    textExpand: true,\n                    z: basePosition[2],\n                    text: displayText,\n                    textPadding: 0,\n                    color: Palette.clear,\n                });\n                verButton.setLocalPosition(basePosition);\n                verButton.onInput = (event) => {\n                    if (!isActivationEvent(event)) {\n                        return false;\n                    }\n                    if (hashID !== \"local\") {\n                        window.open(`https://github.com/evilwrks/puffprime/commit/${hashID}`);\n                    }\n                    return true;\n                };\n                background.appendChild(verButton);\n                this.versionDisplayNode = verButton;\n                this.versionDisplayHeight = verButton.state?.height ?? 24;\n\n            }\n            //just text \n            else {\n                const version = status.data?.build_version || \"no_version\"\n                const displayText = `prod: ${version}`\n                this.appEnvironment = 'production'\n                const label = new evilfont.MSDFText({\n                    font: this.font,\n                    fontSize: 15,\n                    z: basePosition[2],\n                    text: displayText,\n                    fontColor: Palette.white\n                });\n                label.setLocalPosition(basePosition);\n                background.appendChild(label);\n                this.versionDisplayNode = label;\n                this.versionDisplayHeight = label.state?.fontSize ?? 18;\n            }\n            this.#layoutPanelSections();\n        }\n        catch (err) {\n            if (requestToken !== this.versionDisplayRequestToken) {\n                return;\n            }\n            console.error(\"Failed to load status:\", err);\n            this.versionDisplayNode = null;\n            this.versionDisplayHeight = 0;\n            return;\n        }\n    }\n\n    // Passive websocket churn should retain the current screen and only surface\n    // the disconnect indicator; user-triggered loads may still mount banners.\n    #applyApiState(state, { preserveBanner = false } = {}) {\n        if (state.auth === 'reauth_required') {\n            this.#setChromeVisible(false);\n            this.loadAuthRequired();\n            return;\n        }\n        if (state.auth === 'renewing') {\n            this.#setChromeVisible(true);\n            return;\n        }\n        if (state.connection !== 'ready') {\n            this.#setChromeVisible(true);\n            return;\n        }\n\n        this.#setChromeVisible(true);\n        if (!preserveBanner && !this.#shouldPreserveReadmeBanner()) {\n            this.#clearBanner();\n        }\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { DEFAULT_SCENE_LIGHTING } from './scene-lighting.mjs';\n\nexport const VISUAL_TESTER_SIZE = 200;\nexport const VISUAL_TESTER_LOD_MAX = 7;\nexport const VISUAL_TESTER_LOD_TRAVEL_S = 4;\nconst VISUAL_TESTER_RESPONSE_DEFAULTS = Object.freeze({\n    diffuseStrength: 1,\n    specularStrength: 1,\n    shininess: 0.5,\n});\nconst DEFAULT_DIRECTIONAL_LIGHT = DEFAULT_SCENE_LIGHTING.lights\n    .find(light => light.kind === 'directional');\nconst DEFAULT_POINTER_LIGHT = DEFAULT_SCENE_LIGHTING.lights\n    .find(light => light.kind === 'point' && light.source === 'pointer');\nconst VISUAL_TESTER_CONTROLS_STYLE_ID = 'visual-tester-material-controls-style';\nlet g_visualTesterControlsInstance = 0;\nlet g_activeVisualTesterControls = null;\n\nexport function visualTesterBlurLodAt(elapsedS) {\n    if (!Number.isFinite(elapsedS)) {\n        throw new Error(`visualTesterBlurLodAt requires finite elapsed seconds; got '${elapsedS}'.`);\n    }\n    const rawPhase = elapsedS / VISUAL_TESTER_LOD_TRAVEL_S;\n    const phase = ((rawPhase % 2) + 2) % 2;\n    const t = phase <= 1 ? phase : 2 - phase;\n    return VISUAL_TESTER_LOD_MAX * t;\n}\n\n\nexport class VisualTesterLodAnimator extends ui.Node {\n    constructor(target) {\n        super({ name: 'visualTesterLodAnimator' });\n        if (!target) {\n            throw new Error('VisualTesterLodAnimator requires a target tile.');\n        }\n        this.target = target;\n        this.startedAtS = 0;\n        this.ownLoopThink = null;\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.startedAtS = this.sceneNowS();\n        this.#setBlurLod(0);\n        this.#scheduleLoop();\n    }\n\n    _onDetachNode(shared) {\n        this.#clearLoop();\n        super._onDetachNode(shared);\n    }\n\n    #clearLoop() {\n        if (this.ownLoopThink === null) {\n            return;\n        }\n        this.cancelThinkAt(this.ownLoopThink);\n        this.ownLoopThink = null;\n    }\n\n    #setBlurLod(blurLod) {\n        const material = this.target.material;\n        if (material?.kind !== 'frostedGlass') {\n            throw new Error('VisualTesterLodAnimator target requires a frosted-glass material.');\n        }\n        this.target.mutate({\n            material: ui.materials.frostedGlass({ ...material, blurLod }),\n        });\n    }\n\n    #scheduleLoop() {\n        this.#clearLoop();\n        if (!this.scene) {\n            return;\n        }\n        this.ownLoopThink = this.thinkAt(\n            this.sceneNowS() + this.sceneFrameStepS(),\n            ({ now_s }) => {\n                this.ownLoopThink = null;\n                this.#setBlurLod(visualTesterBlurLodAt(now_s - this.startedAtS));\n                this.#scheduleLoop();\n            },\n            { reason: 'visual_tester_lod_animation' },\n        );\n    }\n}\n\nfunction visualTesterBevelMaterial(bevelType, response = VISUAL_TESTER_RESPONSE_DEFAULTS) {\n    return ui.materials.beveled({\n        bevelType,\n        bevelWidth: 30,\n        bevelMargin: 10,\n        maxTilt: Math.PI / 3,\n        normalGrid: {\n            size: 3,\n            xAngles: [\n                -0.62, 0.00, 0.62,\n                -0.62, 0.00, 0.62,\n                -0.62, 0.00, 0.62,\n            ],\n            yAngles: [\n                -0.62, -0.62, -0.62,\n                 0.00,  0.00,  0.00,\n                 0.62,  0.62,  0.62,\n            ],\n        },\n        diffuseStrength: response.diffuseStrength,\n        specularStrength: response.specularStrength,\n        shininess: response.shininess,\n    });\n}\n\nfunction visualTesterBevelTile({ name, y, bevelType, response }) {\n    return new ui.Tile({\n        name,\n        width: VISUAL_TESTER_SIZE,\n        height: VISUAL_TESTER_SIZE,\n        y,\n        z: -0.2,\n        color: [1, 1, 1, 1],\n        material: visualTesterBevelMaterial(bevelType, response),\n    });\n}\n\nfunction rgbToHex(rgb) {\n    return `#${rgb.map(channel => Math.round(Math.min(1, Math.max(0, channel)) * 255)\n        .toString(16).padStart(2, '0')).join('')}`;\n}\n\nfunction hexToRgb(hex) {\n    return [1, 3, 5].map(offset => Number.parseInt(hex.slice(offset, offset + 2), 16) / 255);\n}\n\nfunction visualTesterLightingValues(scene) {\n    const directional = scene?.lighting?.lights?.find(light => light.kind === 'directional')\n        ?? DEFAULT_DIRECTIONAL_LIGHT;\n    const pointer = scene?.lighting?.lights?.find(light => light.kind === 'point' && light.source === 'pointer')\n        ?? DEFAULT_POINTER_LIGHT;\n    const ambient = scene?.lighting?.ambient ?? DEFAULT_SCENE_LIGHTING.ambient;\n    const ambientIntensity = Math.max(...ambient);\n    const ambientColor = ambientIntensity > 0\n        ? ambient.map(channel => channel / ambientIntensity)\n        : [1, 1, 1];\n    return {\n        ambientColor: rgbToHex(ambientColor),\n        ambientIntensity,\n        directionalColor: rgbToHex(directional.color),\n        directionalIntensity: directional.intensity,\n        directionalX: directional.direction[0],\n        directionalY: directional.direction[1],\n        directionalZ: directional.direction[2],\n        pointerIntensity: pointer.intensity,\n        pointerAttenuation: pointer.attenuation,\n        pointerZ: pointer.z,\n    };\n}\n\nfunction installVisualTesterControlsStyle() {\n    if (typeof document === 'undefined' || document.getElementById(VISUAL_TESTER_CONTROLS_STYLE_ID)) {\n        return;\n    }\n    const style = document.createElement('style');\n    style.id = VISUAL_TESTER_CONTROLS_STYLE_ID;\n    style.textContent = `\n.visual-tester-material-controls {\n    position: fixed;\n    top: 50%;\n    right: 16px;\n    z-index: 10020;\n    width: 230px;\n    max-height: calc(100vh - 32px);\n    box-sizing: border-box;\n    transform: translateY(-50%);\n    padding: 12px;\n    border: 1px solid rgba(255, 255, 255, 0.2);\n    border-radius: 8px;\n    background: rgba(20, 23, 29, 0.94);\n    box-shadow: 0 10px 28px rgba(0, 0, 0, 0.36);\n    color: #f3f5f8;\n    font: 12px/1.35 system-ui, sans-serif;\n    overflow-y: auto;\n    user-select: none;\n}\n.visual-tester-material-controls h2 {\n    margin: 0 0 10px;\n    font-size: 13px;\n    font-weight: 650;\n}\n.visual-tester-material-controls h3 {\n    margin: 12px 0 2px;\n    padding-top: 8px;\n    border-top: 1px solid rgba(255, 255, 255, 0.12);\n    font-size: 11px;\n    font-weight: 650;\n    color: #c8d1dc;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n}\n.visual-tester-material-control {\n    display: grid;\n    grid-template-columns: 1fr auto;\n    gap: 4px 8px;\n    margin-top: 9px;\n}\n.visual-tester-material-control label {\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n.visual-tester-material-control output {\n    min-width: 48px;\n    text-align: right;\n    font-variant-numeric: tabular-nums;\n    color: #b8d7ff;\n}\n.visual-tester-material-control input {\n    grid-column: 1 / -1;\n    width: 100%;\n    margin: 0;\n}\n.visual-tester-material-controls button {\n    width: 100%;\n    margin-top: 12px;\n    padding: 5px 8px;\n    border: 1px solid rgba(255, 255, 255, 0.22);\n    border-radius: 5px;\n    background: rgba(255, 255, 255, 0.08);\n    color: inherit;\n    font: inherit;\n    cursor: pointer;\n}\n.visual-tester-material-controls button:hover {\n    background: rgba(255, 255, 255, 0.14);\n}\n`;\n    document.head.appendChild(style);\n}\n\nclass VisualTesterMaterialControls {\n    constructor({ values, onChange }) {\n        g_activeVisualTesterControls?.destroy();\n        g_activeVisualTesterControls = this;\n        this.values = { ...values };\n        this.defaults = { ...values };\n        this.onChange = onChange;\n        this.inputs = new Map();\n        this.frameHandle = null;\n        this.frameUsesAnimationFrame = false;\n        this.root = null;\n        this.instanceId = ++g_visualTesterControlsInstance;\n        if (typeof document === 'undefined') {\n            return;\n        }\n        installVisualTesterControlsStyle();\n        this.root = document.createElement('aside');\n        this.root.className = 'visual-tester-material-controls';\n        this.root.setAttribute('aria-label', 'Visual tester material controls');\n\n        const title = document.createElement('h2');\n        title.textContent = 'Visual Tester Material';\n        this.root.appendChild(title);\n\n        this.#appendLinearControl('diffuseStrength', 'Diffuse strength', 0, 2, 0.01);\n        this.#appendLinearControl('specularStrength', 'Specular strength', 0, 2, 0.01);\n        this.#appendLogControl('shininess', 'Shininess', 0.05, 128);\n\n        this.#appendSection('Ambient light');\n        this.#appendColorControl('ambientColor', 'Color');\n        this.#appendLinearControl('ambientIntensity', 'Intensity', 0, 2, 0.01);\n\n        this.#appendSection('Directional light');\n        this.#appendColorControl('directionalColor', 'Color');\n        this.#appendLinearControl('directionalIntensity', 'Intensity', 0, 5, 0.01);\n        this.#appendLinearControl('directionalX', 'Direction X', -1, 1, 0.01);\n        this.#appendLinearControl('directionalY', 'Direction Y', -1, 1, 0.01);\n        this.#appendLinearControl('directionalZ', 'Direction Z', -1, 1, 0.01);\n\n        this.#appendSection('Mouse point light');\n        this.#appendLinearControl('pointerIntensity', 'Intensity', 0, 5, 0.01);\n        this.#appendLogControl('pointerAttenuation', 'Attenuation power', 0.1, 8);\n        this.#appendLinearControl('pointerZ', 'Z position', -3000, 3000, 1);\n\n        const reset = document.createElement('button');\n        reset.type = 'button';\n        reset.textContent = 'Reset';\n        reset.addEventListener('click', () => this.#reset());\n        this.root.appendChild(reset);\n        document.body.appendChild(this.root);\n    }\n\n    #appendSection(label) {\n        const heading = document.createElement('h3');\n        heading.textContent = label;\n        this.root.appendChild(heading);\n    }\n\n    #appendControl(name, labelText, slider) {\n        const row = document.createElement('div');\n        row.className = 'visual-tester-material-control';\n        const label = document.createElement('label');\n        label.htmlFor = slider.id;\n        label.textContent = labelText;\n        const output = document.createElement('output');\n        output.setAttribute('for', slider.id);\n        row.append(label, output, slider);\n        this.root.appendChild(row);\n        return output;\n    }\n\n    #appendLinearControl(name, labelText, min, max, step) {\n        const slider = document.createElement('input');\n        slider.type = 'range';\n        slider.id = `visual-tester-${this.instanceId}-${name}`;\n        slider.min = String(min);\n        slider.max = String(max);\n        slider.step = String(step);\n        slider.value = String(this.values[name]);\n        const output = this.#appendControl(name, labelText, slider);\n        const sync = () => {\n            this.values[name] = Number(slider.value);\n            output.value = this.#formatValue(this.values[name]);\n            this.#scheduleChange();\n        };\n        slider.addEventListener('input', sync);\n        output.value = this.#formatValue(this.values[name]);\n        this.inputs.set(name, {\n            setValue: value => {\n                slider.value = String(value);\n                output.value = this.#formatValue(value);\n            },\n        });\n    }\n\n    #appendLogControl(name, labelText, min, max) {\n        const slider = document.createElement('input');\n        slider.type = 'range';\n        slider.id = `visual-tester-${this.instanceId}-${name}`;\n        slider.min = String(Math.log2(min));\n        slider.max = String(Math.log2(max));\n        slider.step = '0.01';\n        slider.value = String(Math.log2(this.values[name]));\n        const output = this.#appendControl(name, labelText, slider);\n        const sync = () => {\n            this.values[name] = 2 ** Number(slider.value);\n            output.value = this.#formatValue(this.values[name]);\n            this.#scheduleChange();\n        };\n        slider.addEventListener('input', sync);\n        output.value = this.#formatValue(this.values[name]);\n        this.inputs.set(name, {\n            setValue: value => {\n                slider.value = String(Math.log2(value));\n                output.value = this.#formatValue(value);\n            },\n        });\n    }\n\n    #appendColorControl(name, labelText) {\n        const picker = document.createElement('input');\n        picker.type = 'color';\n        picker.id = `visual-tester-${this.instanceId}-${name}`;\n        picker.value = this.values[name];\n        const output = this.#appendControl(name, labelText, picker);\n        const sync = () => {\n            this.values[name] = picker.value;\n            output.value = picker.value.toUpperCase();\n            this.#scheduleChange();\n        };\n        picker.addEventListener('input', sync);\n        output.value = picker.value.toUpperCase();\n        this.inputs.set(name, {\n            setValue: value => {\n                picker.value = value;\n                output.value = value.toUpperCase();\n            },\n        });\n    }\n\n    #formatValue(value) {\n        if (value >= 10) return value.toFixed(1);\n        if (value >= 1) return value.toFixed(2);\n        return value.toFixed(3);\n    }\n\n    #reset() {\n        this.values = { ...this.defaults };\n        for (const [name, { setValue }] of this.inputs) {\n            setValue(this.values[name]);\n        }\n        this.#scheduleChange();\n    }\n\n    #scheduleChange() {\n        if (this.frameHandle !== null || typeof this.onChange !== 'function') {\n            return;\n        }\n        const apply = () => {\n            this.frameHandle = null;\n            this.onChange?.({ ...this.values });\n        };\n        if (typeof globalThis.requestAnimationFrame === 'function') {\n            this.frameUsesAnimationFrame = true;\n            this.frameHandle = globalThis.requestAnimationFrame(apply);\n        } else {\n            this.frameUsesAnimationFrame = false;\n            this.frameHandle = globalThis.setTimeout(apply, 0);\n        }\n    }\n\n    destroy() {\n        if (this.frameHandle !== null) {\n            if (this.frameUsesAnimationFrame && typeof globalThis.cancelAnimationFrame === 'function') {\n                globalThis.cancelAnimationFrame(this.frameHandle);\n            } else {\n                globalThis.clearTimeout(this.frameHandle);\n            }\n            this.frameHandle = null;\n        }\n        this.onChange = null;\n        this.root?.remove();\n        this.root = null;\n        this.inputs.clear();\n        if (g_activeVisualTesterControls === this) {\n            g_activeVisualTesterControls = null;\n        }\n    }\n}\n\n/* Minimal local-only surface for evaluating screen-space materials in a real UIWindow. */\nexport class VisualTesterPanel extends Placeholder {\n    constructor() {\n        super({ name: 'visual-tester-panel', width: VISUAL_TESTER_SIZE, height: VISUAL_TESTER_SIZE * 2 });\n        this.headerStyle = {\n            material: ui.materials.solid(),\n            color: Palette.orange,\n        };\n        this.response = { ...VISUAL_TESTER_RESPONSE_DEFAULTS };\n        this.originalLighting = new Map();\n        this.appliedLighting = new Map();\n        this.controls = null;\n    }\n\n    build(_window) {\n        this.beveledSquare = visualTesterBevelTile({\n            name: 'visualTesterBeveledSquare',\n            y: 0,\n            bevelType: 'outer',\n            response: this.response,\n        });\n        this.appendChild(this.beveledSquare);\n\n        this.innerBeveledSquare = visualTesterBevelTile({\n            name: 'visualTesterInnerBeveledSquare',\n            y: VISUAL_TESTER_SIZE,\n            bevelType: 'inner',\n            response: this.response,\n        });\n        this.appendChild(this.innerBeveledSquare);\n\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.controls = new VisualTesterMaterialControls({\n            values: {\n                ...this.response,\n                ...visualTesterLightingValues(this.#lightingSourceScene()),\n            },\n            onChange: values => this.#applyControls(values),\n        });\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.destroy();\n        super._onBeforeDetachNode(shared);\n    }\n\n    #lightingSourceScene() {\n        const scene = this.scene;\n        return scene?.stage?.sceneLightingSource?.(scene) ?? scene;\n    }\n\n    #applyControls(values) {\n        this.#replaceBevelTiles(values);\n        this.#applyLighting(values);\n    }\n\n    #applyLighting(values) {\n        const scene = this.#lightingSourceScene();\n        if (!scene?.lighting || typeof scene.setLighting !== 'function') {\n            return;\n        }\n        if (!this.originalLighting.has(scene)) {\n            this.originalLighting.set(scene, scene.lighting);\n        }\n\n        const lights = scene.lighting.lights.map(light => ({ ...light }));\n        let directionalIndex = lights.findIndex(light => light.kind === 'directional');\n        if (directionalIndex < 0 && lights.length < 4) {\n            directionalIndex = lights.length;\n            lights.push({ ...DEFAULT_DIRECTIONAL_LIGHT });\n        }\n        if (directionalIndex >= 0) {\n            const previousDirection = lights[directionalIndex].direction;\n            const requestedDirection = [values.directionalX, values.directionalY, values.directionalZ];\n            const direction = Math.hypot(...requestedDirection) > 0.001\n                ? requestedDirection\n                : previousDirection;\n            lights[directionalIndex] = {\n                ...lights[directionalIndex],\n                color: hexToRgb(values.directionalColor),\n                intensity: values.directionalIntensity,\n                direction,\n            };\n        }\n        let pointerIndex = lights.findIndex(light => light.kind === 'point' && light.source === 'pointer');\n        if (pointerIndex < 0 && lights.length < 4) {\n            pointerIndex = lights.length;\n            lights.push({ ...DEFAULT_POINTER_LIGHT });\n        }\n        if (pointerIndex >= 0) {\n            lights[pointerIndex] = {\n                ...lights[pointerIndex],\n                intensity: values.pointerIntensity,\n                attenuation: values.pointerAttenuation,\n                z: values.pointerZ,\n            };\n        }\n        scene.setLighting({\n            ambient: hexToRgb(values.ambientColor)\n                .map(channel => channel * values.ambientIntensity),\n            lights,\n        });\n        this.appliedLighting.set(scene, scene.lighting);\n    }\n\n    #replaceBevelTiles(response) {\n        if (!this.beveledSquare?.parentNode || !this.innerBeveledSquare?.parentNode) {\n            return;\n        }\n        this.response = {\n            diffuseStrength: response.diffuseStrength,\n            specularStrength: response.specularStrength,\n            shininess: response.shininess,\n        };\n        const outer = visualTesterBevelTile({\n            name: 'visualTesterBeveledSquare',\n            y: 0,\n            bevelType: 'outer',\n            response: this.response,\n        });\n        const inner = visualTesterBevelTile({\n            name: 'visualTesterInnerBeveledSquare',\n            y: VISUAL_TESTER_SIZE,\n            bevelType: 'inner',\n            response: this.response,\n        });\n        this.replaceChild(this.beveledSquare, outer);\n        this.replaceChild(this.innerBeveledSquare, inner);\n        this.beveledSquare = outer;\n        this.innerBeveledSquare = inner;\n    }\n\n    destroy() {\n        this.controls?.destroy();\n        this.controls = null;\n        for (const [scene, lighting] of this.originalLighting) {\n            if (scene.lighting === this.appliedLighting.get(scene)) {\n                scene.setLighting(lighting);\n            }\n        }\n        this.originalLighting.clear();\n        this.appliedLighting.clear();\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport { FormSubmission } from './form-submission.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n\n/*\n    Each window may have a very difrent layout\n    with difrent porpuses, they will share the same\n    window pop up features of interaction, but the \n    \"Panel\" will be built with a custom blueprint.\n*/\nexport class RenamePanel extends Placeholder {\n\n    PANEL_WIDTH = 350;\n    BUTTON_HEIGHT = 42;\n\n    constructor(state) {\n        super({ name: 'rename-panel' });\n        if (!state.font) throw new Error('RenamePanel requires a font.');\n        if (typeof state.onSubmit !== 'function') throw new Error('RenamePanel requires an onSubmit callback.');\n        this.onSubmit = state.onSubmit;\n        \n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n\n        this.mutate({ height: 75 });\n        this.initialName = state.initialName ?? \"newPuffbook\"\n\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    #build() {\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n\n        const padding = 8\n        const uiName = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"File Name:\",\n            y: panelY + padding,\n            x: padding ,\n            z: -0.1,\n            fontColor: [1.0, 0.9411, 0.8745, 1.0]\n        \n        })\n\n        const uiNameLayout = evilfont.MSDFText.measureFromState(uiName.state)\n\n        const filenameInput = new ui.InputCell({\n            font: this.font,\n            fontSize: this.fontSize,\n            textInput: this.initialName,\n            cursorIndex: this.initialName.length,\n            width: this.PANEL_WIDTH - uiNameLayout.width - padding * 3.0,\n            height: 25,\n            y: panelY + padding,\n            x: uiNameLayout.width + padding * 2.0,\n            focusContainerOwner: this.window,\n        })\n\n        const createButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Rename\",\n            y: panelY + uiNameLayout.height + padding * 2.0,\n            x: this.PANEL_WIDTH * 0.5 - 50, //temporary, buttons needs to center themselves\n            z: -0.1,\n            textPadding: 12,\n            width: 100,\n            height: 27,\n            color: Palette.orange,\n            textExpand: true,\n            textVAlignment: 'MIDDLE',\n            textHAlignment: 'CENTER',\n        })\n\n        const submission = new FormSubmission({\n            panel: this,\n            button: createButton,\n            onSubmit: (value, callbacks) => this.onSubmit(value, callbacks),\n            onSuccess: () => this.window.closeFocusContainer(),\n        });\n        const submit = () => submission.submit(filenameInput.textInput);\n        createButton.onInput = ui.Button.onPrimaryRelease(submit);\n        filenameInput.onEnterKey = submit;\n\n        this.appendChild(uiName);\n        this.appendChild(filenameInput);\n        this.appendChild(createButton);\n        this.appendChild(submission);\n\n        this.window.registerInputField('filename', filenameInput);\n\n    }\n\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { Placeholder } from './base.mjs';\nimport { MSDFText } from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { formatCellValue } from './text-utils.mjs';\n\n/* Retained form feedback also owns submission lifetime; removing it retires\n * callbacks without cancelling the feature's already-dispatched operation.\n * onSubmit(value, { onSuccess, onError }) must complete through one callback.\n * Expected failures supply a non-empty message; unexpected throws stay visible\n * to the caller after restoring the form's ability to submit.\n */\nexport class FormSubmission extends Placeholder {\n    #panel;\n    #button;\n    #onSubmit;\n    #onSuccess;\n    #idleHeight;\n    #ownErrorText;\n    #attempt = null;\n    #live = false;\n\n    constructor({ panel, button, onSubmit, onSuccess }) {\n        super({ name: 'formSubmission', width: panel.state.width - 16, height: 0 });\n        this.#panel = panel;\n        this.#button = button;\n        this.#onSubmit = onSubmit;\n        this.#onSuccess = onSuccess;\n        this.#idleHeight = panel.state.height;\n        this.#ownErrorText = new MSDFText({\n            name: 'formSubmissionError',\n            font: panel.font,\n            fontSize: Math.min(panel.fontSize, 16),\n            fontColor: Palette.red,\n            text: '',\n            visible: false,\n        });\n        this.appendChild(this.#ownErrorText);\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#live = true;\n        this.#button.setEnabled(true);\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.#live = false;\n        this.#attempt = null;\n        super._onBeforeDetachNode(shared);\n    }\n\n    #showError(message) {\n        const text = formatCellValue(message, this.state.width, this.#ownErrorText.state, Infinity);\n        this.#ownErrorText.setText(text);\n        this.#ownErrorText.setVisibility(message !== '');\n        const height = message === '' ? 0 : this.#ownErrorText.height();\n        const y = this.#button.localPosition()[1] + this.#button.height + 8;\n        this.setLocalPosition(8, y, -0.2);\n        this.mutate({ height });\n        this.#panel.mutate({ height: message === '' ? this.#idleHeight : Math.max(this.#idleHeight, y + height + 8) });\n        this.#panel.window.requestLayout();\n    }\n\n    #settle(attempt, complete) {\n        if (!this.#live || this.#attempt !== attempt || attempt.settled) return;\n        attempt.settled = true;\n        try {\n            complete();\n        } finally {\n            if (this.#attempt === attempt) this.#attempt = null;\n            if (this.#live) this.#button.setEnabled(true);\n        }\n    }\n\n    submit(value) {\n        if (!this.#live || this.#attempt !== null) return false;\n        const attempt = { settled: false };\n        this.#attempt = attempt;\n        try {\n            this.#button.setEnabled(false);\n            this.#showError('');\n            this.#onSubmit(value, {\n                onSuccess: () => this.#settle(attempt, this.#onSuccess),\n                onError: message => this.#settle(attempt, () => {\n                    if (typeof message !== 'string' || !message.trim()) {\n                        throw new Error('FormSubmission.onError(message): expected a non-empty error message.');\n                    }\n                    this.#showError(message);\n                }),\n            });\n        } catch (error) {\n            this.#settle(attempt, () => this.#showError('Could not submit. Please try again.'));\n            throw error;\n        }\n        return true;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as ui from './evilui.mjs';\nimport { ConfirmationPanel } from './confirmation-panel.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { formatCellValueLayout } from './text-utils.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nconst PANEL_WIDTH = 430;\nconst PANEL_PADDING = 16;\nconst PANEL_SPACING = 8;\nconst INPUT_HEIGHT = 25;\nconst BUTTON_WIDTH = 170;\nconst BUTTON_HEIGHT = 42;\nconst LIST_HEIGHT = 220;\nconst LIST_ROW_HEIGHT = 34;\nconst FEEDBACK_LINE_LIMIT = 2;\nconst SEPARATOR_HEIGHT = 1;\nconst LIST_SPACING = 2;\nconst REVOKE_PERMISSION_BUTTON_SIZE = 24;\nconst REVOKE_PERMISSION_BUTTON_PADDING = 4;\nconst PRINCIPAL_NAME_LEFT_PADDING = REVOKE_PERMISSION_BUTTON_SIZE + REVOKE_PERMISSION_BUTTON_PADDING;\nconst PERMISSION_BUTTON_WIDTH = 76;\nconst LIST_FRAME = 6;\n\n/* Keep every permission-list descendant within its UIWindow's one-unit peer depth interval. */\nconst CONTENT_Z = 0.0;\nconst LIST_AREA_Z = 0.0;\nconst LIST_Z = 0.0;\n\n/* Manage one artifact's permission-name list; added names receive read access for now. */\nexport class PermissionPanel extends Placeholder {\n    constructor(state) {\n        super({ name: 'permission-panel' });\n        if (!state.font) throw new Error('PermissionPanel requires a font.');\n        if (!state.item) throw new Error('PermissionPanel requires an artifact item.');\n        if (typeof state.onGrant !== 'function') throw new Error('PermissionPanel requires an onGrant callback.');\n        if (typeof state.onRevoke !== 'function') throw new Error('PermissionPanel requires an onRevoke callback.');\n        this.font = state.font;\n        this.fontSize = state.fontSize || 32;\n        this.item = state.item;\n        this.filePath = state.filePath ?? state.item.path ?? '';\n        this.onGrant = state.onGrant;\n        this.onRevoke = state.onRevoke;\n        this.canManagePermissions = state.canManagePermissions === true;\n        this.pending = false;\n        this.revokeConfirmationPending = false;\n        this.permissionActionButtons = new Set();\n        this.ownMenus = new Set();\n        this.usernameInput = null;\n        this.addButton = null;\n        this.includeFilesCheckbox = null;\n        this.nameList = null;\n        this.feedbackLabel = null;\n        this.feedbackMaxWidth = 0;\n        this.feedbackRow = null;\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    _onBeforeDetachNode(shared) {\n        this.#closeMenus();\n        super._onBeforeDetachNode(shared);\n    }\n\n    #closeMenus() {\n        for (const menu of [...this.ownMenus]) menu.destroy();\n    }\n\n    #syncPermissionActionsEnabled() {\n        const enabled = this.canManagePermissions && !this.revokeConfirmationPending && !this.pending;\n        this.addButton?.setEnabled(enabled);\n        this.includeFilesCheckbox?.setEnabled(enabled);\n        for (const button of this.permissionActionButtons) {\n            button.setEnabled(enabled);\n        }\n    }\n\n    #permissionNames() {\n        const names = new Set();\n        const add = (name) => {\n            const value = String(name ?? '').trim();\n            if (value) names.add(value);\n        };\n        add(this.item.owner);\n        for (const name of this.item.write_groups ?? []) add(name);\n        for (const name of this.item.read_groups ?? []) add(name);\n        return [...names];\n    }\n\n    #storedPermissionLevel(name) {\n        return (this.item.write_groups ?? []).includes(name) ? 'editor' : 'viewer';\n    }\n\n    #permissionLevel(name) {\n        return this.#storedPermissionLevel(name);\n    }\n\n    async #setPermissionLevel(button, name, level) {\n        const currentLevel = this.#permissionLevel(name);\n        if (level === currentLevel) {\n            return;\n        }\n        button.setEnabled(false);\n        try {\n            let payload;\n            if (level === 'editor') {\n                payload = await this.onGrant({ principal: name, privilege: 'write' });\n            } else {\n                await this.onRevoke({ principal: name, privilege: 'write' });\n                payload = await this.onGrant({ principal: name, privilege: 'read' });\n            }\n            const artifact = payload?.data ?? payload;\n            this.item = { ...this.item, ...artifact };\n            this.#renderPermissionNames();\n            this.#setFeedback(`Permissions changed to ${level}`, { success: true });\n        } catch (error) {\n            const message = error?.detail || error?.message || String(error);\n            this.#setFeedback(message);\n        } finally {\n            button.setEnabled(true);\n        }\n    }\n\n    async #copyFilePath(copyPathButton) {\n        if (!this.filePath || !document.hasFocus()) return;\n        try {\n            await navigator.clipboard.writeText(this.filePath);\n            copyPathButton.toastText = 'Path copied successfully.';\n            copyPathButton.displayToast();\n        } catch (error) {\n            console.error('Failed to copy file path:', error);\n            copyPathButton.toastText = 'Could not copy path.';\n            copyPathButton.displayToast();\n        }\n    }\n\n    async #revokePermission(name) {\n        const privilege = this.#storedPermissionLevel(name) === 'editor' ? 'write' : 'read';\n        const payload = await this.onRevoke({ principal: name, privilege });\n        const artifact = payload?.data ?? payload;\n        this.item = { ...this.item, ...artifact };\n        this.#renderPermissionNames();\n        this.#setFeedback('Permissions successfully revoked', { success: true });\n    }\n\n    #openRevokePermissionConfirmation(name) {\n        if (this.revokeConfirmationPending) return;\n        this.revokeConfirmationPending = true;\n        this.#syncPermissionActionsEnabled();\n        ui.UIWindow.mount(this, {\n            font: this.font,\n            fontSize: this.fontSize,\n            ownerWindow: this.window,\n            panel: new ConfirmationPanel({\n                font: this.font,\n                fontSize: this.fontSize,\n                confirmationText: 'Are you sure you want to revoke permissions from this user/group?',\n                action: () => this.#revokePermission(name),\n            }),\n            anchor: 'center',\n            x: this.state.width * 0.5,\n            y: this.state.height * 0.5,\n            onClose: () => {\n                this.revokeConfirmationPending = false;\n                this.#syncPermissionActionsEnabled();\n            },\n            windowTitle: 'Confirm Action',\n        });\n    }\n\n    #positionRelativeTo(node, ancestor) {\n        let x = 0;\n        let y = 0;\n        let current = node;\n        while (current && current !== ancestor) {\n            const [currentX, currentY] = current.localPosition();\n            x += currentX;\n            y += currentY;\n            current = current.parentNode;\n        }\n        if (current !== ancestor) {\n            throw new Error('Permission menu button must be attached to its parent window.');\n        }\n        return [x, y];\n    }\n\n    #openPermissionMenu(button, name) {\n        if (button.permissionMenu) return;\n        const levels = ['viewer', 'editor'];\n        const options = [...levels, 'Remove'];\n        const [x, y] = this.#positionRelativeTo(button, this.window);\n        button.permissionMenu = ui.ContextMenu.mount(this.window, {\n            font: this.font,\n            fontSize: this.fontSize,\n            ownerWindow: this.window,\n            x: x + button.state.width,\n            y,\n            separators: [1],\n            itemsArray: {\n                labels: options,\n                onInput: (index) => {\n                    button.permissionMenu?.destroy();\n                    if (index === levels.length) {\n                        this.#openRevokePermissionConfirmation(name);\n                        return;\n                    }\n                    const level = levels[index];\n                    void this.#setPermissionLevel(button, name, level);\n                },\n            },\n        });\n        this.ownMenus.add(button.permissionMenu);\n        button.permissionMenu.destroy = () => {\n            const menu = button.permissionMenu;\n            if (!menu) return;\n            const target = menu.ownMount ?? menu;\n            target.parentNode?.removeChild(target);\n            this.ownMenus.delete(menu);\n            button.permissionMenu = null;\n        };\n    }\n\n    #renderPermissionNames() {\n        this.#closeMenus();\n        this.nameList.contentHost?.removeAllChildren();\n        this.permissionActionButtons.clear();\n        const rowWidth = this.nameList.requestedContentWidth - this.nameList.thumbWidth - PANEL_SPACING;\n        for (const name of this.#permissionNames()) {\n            const isOwner = name === this.item.owner;\n            const nameWidth = rowWidth - PRINCIPAL_NAME_LEFT_PADDING - PERMISSION_BUTTON_WIDTH - PANEL_SPACING * 2;\n            let revokePermissionButtonContainer = null;\n            if (!isOwner && this.canManagePermissions) {\n                const revokePermissionButton = new ui.Button({\n                    width: REVOKE_PERMISSION_BUTTON_SIZE,\n                    height: REVOKE_PERMISSION_BUTTON_SIZE,\n                    x: REVOKE_PERMISSION_BUTTON_PADDING,\n                    y: REVOKE_PERMISSION_BUTTON_PADDING,\n                    z: -0.1,\n                    color: Palette.darkgrey,\n                    iconID: 9,\n                    iconColor: Palette.white,\n                });\n                revokePermissionButton.onInput = ui.Button.onPrimaryRelease(() => {\n                    this.#openRevokePermissionConfirmation(name);\n                });\n                this.permissionActionButtons.add(revokePermissionButton);\n                revokePermissionButtonContainer = new ui.Placeholder({\n                    width: PRINCIPAL_NAME_LEFT_PADDING,\n                    height: LIST_ROW_HEIGHT,\n                });\n                revokePermissionButtonContainer.appendChild(revokePermissionButton);\n            }\n            const nameLabel = new evilfont.MSDFText({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: name,\n                width: nameWidth,\n                height: LIST_ROW_HEIGHT,\n                z: -0.1,\n                fontColor: Palette.white,\n            });\n            const row = new ui.HBoxContainer({\n                width: rowWidth,\n                height: LIST_ROW_HEIGHT,\n                spacing: PANEL_SPACING,\n                crossAlign: 'center',\n            });\n            if (revokePermissionButtonContainer) {\n                row.appendChild(revokePermissionButtonContainer);\n            } else {\n                row.appendChild(new ui.Placeholder({\n                    width: PRINCIPAL_NAME_LEFT_PADDING,\n                    height: LIST_ROW_HEIGHT,\n                }));\n            }\n            row.appendChild(nameLabel);\n            if (isOwner || !this.canManagePermissions) {\n                row.appendChild(new evilfont.MSDFText({\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    text: isOwner ? 'Owner' : this.#permissionLevel(name),\n                    width: PERMISSION_BUTTON_WIDTH,\n                    height: LIST_ROW_HEIGHT,\n                    z: -0.1,\n                    fontColor: Palette.silver,\n                }));\n            } else {\n                const permissionButton = new ui.Button({\n                    font: this.font,\n                    fontSize: this.fontSize,\n                    text: this.#permissionLevel(name),\n                    width: PERMISSION_BUTTON_WIDTH,\n                    height: LIST_ROW_HEIGHT,\n                    z: -0.1,\n                    color: Palette.darkgrey,\n                    material: ui.materials.beveled({ bevelType: 'inner' }),\n                    textHAlignment: 'CENTER',\n                    textVAlignment: 'MIDDLE',\n                    textPadding: 0,\n                });\n                permissionButton.onInput = ui.Button.onPrimaryRelease(() => {\n                    this.#openPermissionMenu(permissionButton, name);\n                });\n                this.permissionActionButtons.add(permissionButton);\n                row.appendChild(permissionButton);\n            }\n            this.nameList.appendChild(row);\n        }\n        this.nameList.syncContentLayout();\n    }\n\n    #setFeedback(text, { success = false } = {}) {\n        if (!this.feedbackLabel) return;\n        const formatted = formatCellValueLayout(text, this.feedbackMaxWidth, {\n            font: this.font,\n            fontSize: this.feedbackLabel.state.fontSize,\n        }, FEEDBACK_LINE_LIMIT).text;\n        const layout = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: this.feedbackLabel.state.fontSize,\n            text: formatted,\n        });\n        this.feedbackLabel.mutate({\n            fontColor: text ? (success ? Palette.green : Palette.red) : Palette.white,\n            width: layout.width,\n            height: layout.height,\n        });\n        this.feedbackLabel.setText(formatted);\n        this.feedbackRow.invalidateLayout();\n    }\n\n    async #submit() {\n        if (!this.canManagePermissions || this.revokeConfirmationPending || this.pending) return;\n        this.#setFeedback('');\n        const principal = this.usernameInput.textInput.trim();\n        if (!principal) {\n            this.addButton.toastText = 'Enter a username or group.';\n            return;\n        }\n        if (this.#permissionNames().includes(principal)) {\n            this.addButton.toastText = 'This name already has access.';\n            return;\n        }\n        this.pending = true;\n        this.#syncPermissionActionsEnabled();\n        try {\n            const payload = await this.onGrant({\n                principal,\n                privilege: 'read',\n                includeFiles: this.includeFilesCheckbox?.checked === true,\n            });\n            const artifact = payload?.data ?? payload;\n            this.item = { ...this.item, ...artifact };\n            this.usernameInput.syncFromDocument('', 0);\n            this.#renderPermissionNames();\n            this.#setFeedback('Permissions successfully assigned', { success: true });\n        } catch (error) {\n            const message = error?.detail || error?.message || String(error);\n            this.#setFeedback(message);\n        } finally {\n            this.pending = false;\n            this.#syncPermissionActionsEnabled();\n        }\n    }\n\n    #build() {\n        const panelY = 0;\n        const contentWidth = PANEL_WIDTH - PANEL_PADDING * 2;\n        const title = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize - 2,\n            text: 'Insert username or group and manage permissions of:',\n            z: -0.1,\n            fontColor: Palette.silver,\n        });\n        const titleLayout = evilfont.MSDFText.measureFromState(title.state);\n        title.state.width = titleLayout.width;\n        title.state.height = titleLayout.height;\n        const titleRow = new ui.HBoxContainer({\n            width: contentWidth, height: titleLayout.height, mainAlign: 'center', crossAlign: 'center',\n        });\n        titleRow.appendChild(title);\n\n        const targetName = `${this.item.name ?? this.filePath.split('/').filter(Boolean).at(-1) ?? ''}`;\n        const targetFontSize = this.fontSize - 2;\n        const targetText = formatCellValueLayout(targetName, contentWidth - INPUT_HEIGHT - PANEL_SPACING, {\n            font: this.font,\n            fontSize: targetFontSize,\n        }, 1).text;\n        const targetIcon = new ui.Icon({\n            width: INPUT_HEIGHT,\n            height: INPUT_HEIGHT,\n            iconID: this.item.type === 'directory' ? 13 : 20,\n            z: -0.1,\n            color: Palette.white,\n        });\n        const targetLabel = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: targetFontSize,\n            text: targetText,\n            z: -0.1,\n            fontColor: Palette.orange,\n        });\n        const targetLabelLayout = evilfont.MSDFText.measureFromState(targetLabel.state);\n        targetLabel.state.width = targetLabelLayout.width;\n        targetLabel.state.height = targetLabelLayout.height;\n        const targetRow = new ui.HBoxContainer({\n            width: contentWidth,\n            height: INPUT_HEIGHT,\n            spacing: PANEL_SPACING,\n            crossAlign: 'center',\n        });\n        targetRow.appendChild(targetIcon);\n        targetRow.appendChild(targetLabel);\n\n        const usernameLabel = new evilfont.MSDFText({\n            font: this.font, fontSize: this.fontSize, text: 'username', z: -0.1, fontColor: Palette.white,\n        });\n        const labelLayout = evilfont.MSDFText.measureFromState(usernameLabel.state);\n        usernameLabel.state.width = labelLayout.width;\n        usernameLabel.state.height = labelLayout.height;\n        const usernameInput = new ui.InputCell({\n            font: this.font,\n            fontSize: this.fontSize,\n            textInput: '',\n            cursorIndex: 0,\n            width: contentWidth - labelLayout.width - PANEL_SPACING,\n            height: INPUT_HEIGHT,\n            focusContainerOwner: this.window\n        });\n        this.usernameInput = usernameInput;\n        const usernameRow = new ui.HBoxContainer({\n            width: contentWidth, height: INPUT_HEIGHT, spacing: PANEL_SPACING, crossAlign: 'center',\n        });\n        usernameRow.appendChild(usernameLabel);\n        usernameRow.appendChild(usernameInput);\n\n        let includeFilesRow = null;\n        if (this.item.type === 'directory') {\n            const checkbox = new ui.Checkbox({\n                checked: true,\n                width: INPUT_HEIGHT,\n                height: INPUT_HEIGHT,\n                z: -0.1,\n                color: Palette.darkgrey,\n            });\n            this.includeFilesCheckbox = checkbox;\n            const includeFilesLabel = new evilfont.MSDFText({\n                font: this.font,\n                fontSize: this.fontSize,\n                text: 'Include files',\n                z: -0.1,\n                fontColor: Palette.white,\n            });\n            const includeFilesLabelLayout = evilfont.MSDFText.measureFromState(includeFilesLabel.state);\n            includeFilesLabel.state.width = includeFilesLabelLayout.width;\n            includeFilesLabel.state.height = includeFilesLabelLayout.height;\n            includeFilesRow = new ui.HBoxContainer({\n                width: contentWidth,\n                height: INPUT_HEIGHT,\n                spacing: PANEL_SPACING,\n                mainAlign: 'center',\n                crossAlign: 'center',\n            });\n            includeFilesRow.appendChild(checkbox);\n            includeFilesRow.appendChild(includeFilesLabel);\n        }\n\n        const addButton = new ui.Button({\n            font: this.font, fontSize: this.fontSize, text: 'Add User or Group',\n            x: (contentWidth - BUTTON_WIDTH) * 0.5,\n            width: BUTTON_WIDTH, height: BUTTON_HEIGHT, z: -0.1, color: Palette.orange,\n            textExpand: true, textVAlignment: 'MIDDLE', textHAlignment: 'CENTER',\n            toastEnabled: false,\n        });\n        this.addButton = addButton;\n        this.#syncPermissionActionsEnabled();\n        const copyPathButton = new ui.Button({\n            font: this.font, fontSize: this.fontSize,\n            iconID: 36,\n            x: contentWidth - 30,\n            y: (BUTTON_HEIGHT - 20) * 0.5,\n            width: 30,\n            height: 30,\n            z: -0.1,\n            color: Palette.darkgrey,\n            textHAlignment: 'CENTER',\n            textVAlignment: 'MIDDLE',\n            tooltipText: 'Copy file path',\n            tooltipEnabled: true,\n            toastEnabled: true,\n            toastText: 'Path copied successfully.'\n        });\n        copyPathButton.onInput = ui.Button.onPrimaryRelease(() => {\n            void this.#copyFilePath(copyPathButton);\n        });\n        addButton.onInput = (event) => {\n            if (!isActivationEvent(event)) return false;\n            void this.#submit();\n            return true;\n        };\n        usernameInput.onEnterKey = () => this.#submit();\n        const buttonRow = new ui.Placeholder({\n            width: contentWidth,\n            height: BUTTON_HEIGHT,\n        });\n        buttonRow.appendChild(addButton);\n        buttonRow.appendChild(copyPathButton);\n\n        const separator = new ui.Placeholder({\n            width: contentWidth,\n            height: SEPARATOR_HEIGHT,\n        });\n        const separatorPadding = 25;\n        separator.appendChild(new ui.Tile({\n            tileBatch: 'context_menu.separator',\n            x: separatorPadding * 0.5,\n            y: 0.25,\n            width: contentWidth - separatorPadding,\n            height: 0.5,\n            z: -0.1,\n            color: [0.3647, 0.3647, 0.3647, 1.0],\n        }));\n\n        const currentPermissionsTextState = {\n            font: this.font,\n            fontSize: this.fontSize - 2,\n            text: 'Current Permissions',\n        };\n        const currentPermissionsLayout = evilfont.MSDFText.measureFromState(currentPermissionsTextState);\n        const [currentPermissionsX, currentPermissionsY] = evilfont.MSDFText.getTextAligment(\n            currentPermissionsTextState,\n            contentWidth,\n            currentPermissionsLayout.height,\n            'MIDDLE',\n            'CENTER',\n        );\n        const currentPermissionsLabel = new evilfont.MSDFText({\n            ...currentPermissionsTextState,\n            x: currentPermissionsX,\n            y: currentPermissionsY,\n            z: -0.1,\n            fontColor: Palette.silver,\n        });\n        const currentPermissionsRow = new ui.Placeholder({\n            width: contentWidth,\n            height: currentPermissionsLayout.height,\n        });\n        currentPermissionsRow.appendChild(currentPermissionsLabel);\n\n        const feedbackFontSize = this.fontSize - 4;\n        const feedbackHeight = evilfont.MSDFText.measureFromState({\n            font: this.font,\n            fontSize: feedbackFontSize - 8,\n            text: '\\n',\n        }).height;\n        const feedbackLabel = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: feedbackFontSize,\n            text: '',\n            width: 0,\n            height: feedbackHeight,\n            z: -0.1,\n            fontColor: Palette.white,\n        });\n        this.feedbackLabel = feedbackLabel;\n        this.feedbackMaxWidth = contentWidth;\n        const feedbackRow = new ui.HBoxContainer({\n            width: contentWidth,\n            height: feedbackHeight,\n            mainAlign: 'center',\n            crossAlign: 'center',\n        });\n        feedbackRow.appendChild(feedbackLabel);\n        this.feedbackRow = feedbackRow;\n\n        const nameList = new ui.ScrollBox({\n            width: contentWidth,\n            height: LIST_HEIGHT,\n            padding: LIST_FRAME,\n            layout: 'vertical',\n            spacing: LIST_SPACING,\n            mouseSpace: 'view',\n            z: LIST_Z,\n        });\n        this.nameList = nameList;\n        this.#renderPermissionNames();\n\n        const listArea = new ui.Placeholder({\n            width: contentWidth,\n            height: LIST_HEIGHT,\n            z: LIST_AREA_Z,\n        });\n        listArea.appendChild(new ui.Tile({\n            width: contentWidth,\n            height: LIST_HEIGHT,\n            z: 0.0,\n            color: Palette.darkgrey,\n            material: ui.materials.beveled({ bevelType: 'inner' }),\n        }));\n        listArea.appendChild(nameList);\n\n        const includeFilesHeight = includeFilesRow ? INPUT_HEIGHT + PANEL_SPACING : 0;\n        const contentHeight = titleLayout.height + INPUT_HEIGHT * 2 + includeFilesHeight + feedbackHeight + BUTTON_HEIGHT + SEPARATOR_HEIGHT + currentPermissionsLayout.height + LIST_HEIGHT + PANEL_SPACING * 7;\n        const content = new ui.VBoxContainer({\n            width: contentWidth, height: contentHeight, x: PANEL_PADDING, y: panelY + PANEL_PADDING,\n            spacing: PANEL_SPACING, crossAlign: 'center',\n        });\n        content.appendChild(titleRow);\n        content.appendChild(targetRow);\n        content.appendChild(usernameRow);\n        if (includeFilesRow) content.appendChild(includeFilesRow);\n        content.appendChild(buttonRow);\n        content.appendChild(feedbackRow);\n        content.appendChild(separator);\n        content.appendChild(currentPermissionsRow);\n        content.appendChild(listArea);\n\n        this.mutate({ width: PANEL_WIDTH });\n        this.mutate({ height: panelY + contentHeight + PANEL_PADDING * 2 });\n        content.state.z = CONTENT_Z;\n        this.appendChild(content);\n        this.window.registerInputField('permissionPrincipal', usernameInput);\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './activation.mjs';\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport * as textutils from './text-utils.mjs';\n\n\n\nexport class ConfirmationPanel extends Placeholder {\n\n    PANEL_WIDTH = 350;\n    PANEL_HEIGHT = 58;\n    BUTTON_HEIGHT = 32;\n\n    constructor(state) {\n        super({ name: 'confirmation-panel' });\n        if (!state.font) throw new Error('ConfirmationPanel requires a font.');\n\n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n        this.confirmationText = state.confirmationText || 'Are you sure you want to continue?'\n        this.action = typeof state.action === 'function' ? state.action : null;\n        this.actionLabel = 'Yes';\n        this.ownActionButton = null;\n        this.ownCancelButton = null;\n        this.mutate({ height: this.PANEL_HEIGHT });\n    }\n\n    setActionLabel(text) {\n        this.actionLabel = text;\n        this.ownActionButton?.mutate({ text });\n        this.#layoutActionButtons();\n    }\n\n    #layoutActionButtons() {\n        if (!this.ownActionButton) return;\n        const width = Math.max(100, evilfont.MSDFText.measureFromState({\n            font: this.font, fontSize: this.fontSize, text: this.actionLabel,\n        }).width + 24);\n        const x = (this.PANEL_WIDTH - width - 16 - 100) / 2;\n        this.ownActionButton.mutate({ width });\n        const [, actionY, actionZ] = this.ownActionButton.localPosition();\n        const [, cancelY, cancelZ] = this.ownCancelButton.localPosition();\n        this.ownActionButton.setLocalPosition([x, actionY, actionZ]);\n        this.ownCancelButton.setLocalPosition([x + width + 16, cancelY, cancelZ]);\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    #build() {\n        if (!this.font || !this.fontSize) {\n            console.warn(\"Skipping confirmation panel build because no font or fontsize were given.\")\n            return;\n        }\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n        const padding = 12;\n\n        const formattedText = textutils.formatCellValue(\n            this.confirmationText,\n            this.PANEL_WIDTH - padding * 2.0,\n            {\n                font: this.font,\n                fontSize: this.fontSize,\n                maxCellHeight: 200,\n            }\n        );\n\n        const textState = {\n            font: this.font,\n            fontSize: this.fontSize,\n            text: formattedText,\n        };\n        const [x, y] = evilfont.MSDFText.getTextAligment({\n            ...textState,\n        },\n        this.PANEL_WIDTH, 1, 'MIDDLE','MIDDLE')\n\n        const textLabel = new evilfont.MSDFText({\n            ...textState,\n            x: x,\n            y: panelY + padding,\n            z: -0.1,\n            fontColor: Palette.white,\n        });\n\n        const buttonY = panelY + textLabel._layout?.height + padding * 2.0;\n        const gap = 16;\n        const buttonWidth = 100;\n        const buttonHeight = this.BUTTON_HEIGHT;\n        const buttonsTotalWidth = buttonWidth * 2 + gap;\n        const buttonsX = (this.PANEL_WIDTH - buttonsTotalWidth) * 0.5;\n\n        const yesButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: this.actionLabel,\n            y: buttonY,\n            x: buttonsX,\n            z: -0.1,\n            textPadding: 12,\n            width: buttonWidth,\n            height: buttonHeight,\n            color: Palette.grey,\n            textExpand: true,\n            textVAlignment: 'MIDDLE',\n            textHAlignment: 'CENTER'\n        })\n\n        const noButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"No\",\n            y: buttonY,\n            x: buttonsX + buttonWidth + gap,\n            z: -0.1,\n            textPadding: 12,\n            width: buttonWidth,\n            height: buttonHeight,\n            color: Palette.orange,\n            textExpand: true,\n            textVAlignment: 'MIDDLE',\n            textHAlignment: 'CENTER'\n        })\n\n        let pending = false;\n        const setButtonsEnabled = (enabled) => {\n            yesButton.setEnabled(enabled);\n            noButton.setEnabled(enabled);\n        };\n        const showError = (error) => {\n            const message = error?.detail || error?.message || 'Could not complete this action.';\n            console.error('ConfirmationPanel action failed:', error);\n            yesButton.toastText = message;\n            if (yesButton.scene && yesButton.parentNode) {\n                yesButton.displayToast();\n            }\n        };\n        const handleYes = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (pending) {\n                return true;\n            }\n            pending = true;\n            setButtonsEnabled(false);\n            void Promise.resolve()\n                .then(() => this.action?.())\n                .then(() => {\n                    this.window.closeFocusContainer();\n                })\n                .catch((error) => {\n                    pending = false;\n                    setButtonsEnabled(true);\n                    showError(error);\n                });\n            return true;\n        };\n        const handleNo = (event) => {\n            if (!isActivationEvent(event)) {\n                return false;\n            }\n            if (pending) {\n                return true;\n            }\n            this.window.closeFocusContainer();\n            return true;\n        };\n\n        yesButton.onInput = handleYes;\n        noButton.onInput = handleNo;\n\n        this.appendChild(textLabel);\n        this.appendChild(yesButton);\n        this.appendChild(noButton)\n        this.ownActionButton = yesButton;\n        this.ownCancelButton = noButton;\n        this.#layoutActionButtons();\n        this.window.initialFocusControl = noButton;\n\n        const requiredHeight = buttonY + buttonHeight + padding;\n        this.mutate({ height: Math.max(this.PANEL_HEIGHT, requiredHeight) });\n    }\n\n   \n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport { FormSubmission } from './form-submission.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\n\n\nexport class NewPuffbookPanel extends Placeholder {\n\n    PANEL_WIDTH = 350;\n    BUTTON_HEIGHT = 42;\n\n    constructor(state) {\n        super({ name: 'new-file-panel' });\n        if (!state.font) throw new Error('NewPuffbookPanel requires a font.');\n        if (typeof state.onSubmit !== 'function') throw new Error('NewPuffbookPanel requires an onSubmit callback.');\n        this.onSubmit = state.onSubmit;\n        \n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n\n        this.mutate({ height: 75 });\n\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    #build() {\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n\n        const padding = 8\n        const uiName = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"File Name:\",\n            y: panelY + padding,\n            x: padding ,\n            z: -0.2,\n            fontColor: Palette.white\n        \n        })\n\n        const uiNameLayout = evilfont.MSDFText.measureFromState(uiName.state)\n\n        const filenameInput = new ui.InputCell({\n            font: this.font,\n            fontSize: this.fontSize,\n            textInput: \"newPuffbook\",\n            cursorIndex: \"newPuffbook\".length,\n            width: this.PANEL_WIDTH - uiNameLayout.width - padding * 3.0,\n            height: 25,\n            y: panelY + padding,\n            x: uiNameLayout.width + padding * 2.0,\n            focusContainerOwner: this.window,\n            \n        })\n\n        const createButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Create\",\n            y: panelY + uiNameLayout.height + padding * 2.0,\n            x: this.PANEL_WIDTH * 0.5 - 50, //temporary, buttons needs to center themselves\n            z: -0.1,\n            textPadding: 12,\n            width: 100,\n            height: 27,\n            color: Palette.orange,\n            textExpand: true,\n            textVAlignment : 'MIDDLE',\n            textHAlignment : 'CENTER',\n        })\n\n        const submission = new FormSubmission({\n            panel: this,\n            button: createButton,\n            onSubmit: (value, callbacks) => this.onSubmit(value, callbacks),\n            onSuccess: () => this.window.closeFocusContainer(),\n        });\n        const submit = () => submission.submit(filenameInput.textInput);\n        createButton.onInput = ui.Button.onPrimaryRelease(submit);\n        filenameInput.onEnterKey = submit;\n\n        this.appendChild(uiName);\n        this.appendChild(filenameInput);\n        this.appendChild(createButton);\n        this.appendChild(submission);\n\n        this.window.registerInputField('filename', filenameInput);\n\n    }\n\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { Placeholder } from './base.mjs';\nimport { FormSubmission } from './form-submission.mjs';\nimport * as evilfont from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\n\nexport class NewDirPanel extends Placeholder {\n\n    PANEL_WIDTH = 350;\n    BUTTON_HEIGHT = 42;\n\n    constructor(state) {\n        super({ name: 'new-dir-panel' });\n        if (!state.font) throw new Error('NewDirPanel requires a font.');\n        if (typeof state.onSubmit !== 'function') throw new Error('NewDirPanel requires an onSubmit callback.');\n        this.onSubmit = state.onSubmit;\n        \n        this.font = state.font\n        this.fontSize = state.fontSize || 32\n\n        this.mutate({ height: 75 });\n\n    }\n\n    build(window) {\n        this.window = window;\n        this.#build();\n    }\n\n    #build() {\n\n        this.mutate({ width: this.PANEL_WIDTH });\n        const panelY = 0;\n\n        const padding = 8\n        const uiName = new evilfont.MSDFText({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Directory Name:\",\n            y: panelY + padding,\n            x: padding ,\n            z: -0.2,\n            fontColor: [1.0, 0.9411, 0.8745, 1.0]\n        \n        })\n\n        const uiNameLayout = evilfont.MSDFText.measureFromState(uiName.state)\n\n        const filenameInput = new ui.InputCell({\n            font: this.font,\n            fontSize: this.fontSize,\n            textInput: \"newDirectory\",\n            cursorIndex: \"newDirectory\".length,\n            width: this.PANEL_WIDTH - uiNameLayout.width - padding * 3.0,\n            height: 25,\n            y: panelY + padding,\n            x: uiNameLayout.width + padding * 2.0,\n            focusContainerOwner: this.window,\n            \n        })\n\n        const createButton = new ui.Button({\n            font: this.font,\n            fontSize: this.fontSize,\n            text: \"Create\",\n            y: panelY + uiNameLayout.height + padding * 2.0,\n            x: this.PANEL_WIDTH * 0.5 - 50, //temporary, buttons needs to center themselves\n            z: -0.1,\n            textPadding: 12,\n            width: 100,\n            height: 27,\n            color: Palette.orange,\n            textExpand: true,\n            textVAlignment: 'MIDDLE',\n            textHAlignment: 'CENTER',\n        })\n\n        const submission = new FormSubmission({\n            panel: this,\n            button: createButton,\n            onSubmit: (value, callbacks) => this.onSubmit(value, callbacks),\n            onSuccess: () => this.window.closeFocusContainer(),\n        });\n        const submit = () => submission.submit(filenameInput.textInput);\n        createButton.onInput = ui.Button.onPrimaryRelease(submit);\n        filenameInput.onEnterKey = submit;\n\n        this.appendChild(uiName);\n        this.appendChild(filenameInput);\n        this.appendChild(createButton);\n        this.appendChild(submission);\n\n        this.window.registerInputField('dirname', filenameInput);\n\n    }\n\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* One serial operation queue; its current activity stays visible between batches. */\nexport class FileActivityQueue {\n    constructor(operation, onChange) {\n        this.operation = operation;\n        this.onChange = onChange;\n        this.pendingCount = 0;\n        this.tail = null;\n        this.activity = null;\n    }\n\n    run(action, initialStage = 'preparing') {\n        const previous = this.tail;\n        this.pendingCount += 1;\n        const report = progress => {\n            this.activity = { operation: this.operation, ...progress };\n            this.onChange();\n        };\n        const pending = (async () => {\n            try {\n                if (previous) await previous;\n                report({ stage: initialStage });\n                return await action(report);\n            } finally {\n                this.pendingCount -= 1;\n                if (this.pendingCount === 0) {\n                    this.activity = null;\n                    this.onChange();\n                }\n            }\n        })();\n        // Report failures to the caller while allowing later batches to proceed.\n        const settled = pending.catch(() => {});\n        this.tail = settled;\n        void settled.then(() => {\n            if (this.tail === settled) this.tail = null;\n        });\n        return pending;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport * as ui from './evilui.mjs';\nimport { MSDFText } from '../evilfont/evilfont.mjs';\nimport { Palette } from './evil_palette.mjs';\nimport { isActivationEvent } from './activation.mjs';\n\nconst WIDTH = 380;\nconst ROW_HEIGHT = 36;\n\n/* Own the replacement selection independently of scrolling and row visibility. */\nexport class UploadConflictsPanel extends ui.Placeholder {\n    constructor({ font, files, onSubmit }) {\n        super({ name: 'upload-conflicts-panel' });\n        if (!font) throw new Error('UploadConflictsPanel requires a font.');\n        if (!Array.isArray(files) || files.length === 0) throw new Error('UploadConflictsPanel requires conflicting files.');\n        if (typeof onSubmit !== 'function') throw new Error('UploadConflictsPanel requires an onSubmit callback.');\n        this.font = font;\n        this.files = [...files];\n        this.selectedFiles = new Set(files);\n        this.onSubmit = onSubmit;\n        this.rows = [];\n        this.submitted = false;\n    }\n\n    build(window) {\n        this.window = window;\n        const title = new MSDFText({\n            text: 'Uploading already existing files:',\n            font: this.font, fontSize: 18, fontColor: Palette.white, z: -0.1,\n        });\n        this.appendChild(title);\n        const listY = MSDFText.measureFromState(title.state).height + 12;\n        const listHeight = Math.min(4, this.files.length) * ROW_HEIGHT + 20;\n        this.list = new ui.ScrollBox({\n            x: 0, y: listY, width: WIDTH, height: listHeight,\n            axes: 'both', contentZ: 0, scrollbarZ: -0.1, scrollbarHandleZ: -0.2,\n        });\n        for (const [index, file] of this.files.entries()) {\n            const name = new MSDFText({\n                text: file.name.replace(/[\\r\\n\\t]/g, ' '), font: this.font, fontSize: 16,\n                fontColor: Palette.white, x: 64, z: -0.1,\n            });\n            const size = MSDFText.measureFromState(name.state);\n            name.setLocalPosition([64, (ROW_HEIGHT - size.height) / 2, -0.1]);\n            const row = new ui.Placeholder({\n                y: index * ROW_HEIGHT, width: Math.max(WIDTH - 20, size.width + 72), height: ROW_HEIGHT,\n            });\n            const checkbox = new ui.Checkbox({\n                checked: true, x: 0, y: 6, width: 24, height: 24,\n                z: -0.1, color: Palette.darkgrey,\n                onChange: checked => {\n                    if (checked) this.selectedFiles.add(file);\n                    else this.selectedFiles.delete(file);\n                },\n            });\n            row.appendChild(checkbox);\n            row.appendChild(new ui.Icon({ iconID: 20, x: 32, y: 6, width: 24, height: 24, z: -0.1, color: Palette.white }));\n            row.appendChild(name);\n            this.list.appendChild(row);\n            this.rows.push({ file, checkbox, row });\n        }\n        this.appendChild(this.list);\n        const buttonY = listY + listHeight + 12;\n        const button = (text, x, width, color, selection) => {\n            const control = new ui.Button({\n                text, font: this.font, fontSize: 15, x, y: buttonY,\n                width, height: 36, z: -0.1, color,\n                textExpand: true, textPadding: 4, textHAlignment: 'CENTER', textVAlignment: 'MIDDLE',\n            });\n            control.onInput = event => {\n                if (!isActivationEvent(event)) return false;\n                if (!this.submitted) {\n                    this.submitted = true;\n                    this.onSubmit(selection());\n                    this.window.closeFocusContainer();\n                }\n                return true;\n            };\n            this.appendChild(control);\n            return control;\n        };\n        this.replaceButton = button('Replace selected', 0, 140, Palette.orange, () => new Set(this.selectedFiles));\n        this.keepButton = button('Keep existing', 148, 128, Palette.grey, () => new Set());\n        this.cancelButton = button('Cancel', 284, 96, Palette.grey, () => null);\n        this.window.initialFocusControl = this.cancelButton;\n        this.mutate({ width: WIDTH, height: buttonY + 36 });\n    }\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { isActivationEvent } from './lib/evilui/activation.mjs';\nimport { CommanderBus } from './lib/commander.mjs';\nimport { PORTAL_MIN_BUILD } from './lib/build-flags.mjs';\nimport * as ptlf from './lib/ptrless/flags.mjs';\nimport * as ui from './lib/evilui/evilui.mjs';\nimport { Palette } from './lib/evilui/evil_palette.mjs';\nimport { SPACE_TAB_TEXT, isSpaceTabKey } from './lib/evilui/space-tabs.mjs';\nimport {\n    cloneSelection, selectionAt, primaryFocus, selectionCommand,\n    selectedSource, transformSelection, validateSelection, rangeIsEmpty,\n    normaliseSelection, SelectionSourceRequired, requireSelectionSource, selectionWithCaret,\n} from './puffbook-selection.mjs';\nimport * as twgl from 'twgl';\n\nimport {\n    editChainLen,\n    editChainPartsAt,\n    applyEditChain,\n    editFromLegacyLineEditBatchLines,\n    newEditChain,\n    editFromBodies,\n    splitBody,\n} from './puffbook-editchain.mjs';\nimport { projectionOutputRecords } from './puffbook-output-records.mjs';\nimport { completePuffbookRecordingState } from './puffbook-recording-state.mjs';\nimport {\n    materialiseNullOutput,\n    prefixOutputAxis,\n} from './puffbook-output-display.mjs';\nimport {\n    withPortalTimingScope,\n    pushTestingPortalTimingTrace,\n    pushTestingPuffbookTrace,\n    recordTestingPuffbookForensic,\n    flushTestingPuffbookForensicArtifact,\n    pushTestingTableviewTrace,\n} from './lib/evilui/testing-trace.mjs';\nimport { isUnconditionallyMute } from './puffbook-line-policy.mjs';\nimport {\n    LINE_STATUS_ERROR,\n    LINE_STATUS_PARTIAL,\n    LINE_STATUS_PAYLOAD_REF,\n    LINE_STATUS_RECOMPUTE,\n    LINE_STATUS_SUCCESS,\n    normaliseLineStatus,\n} from './puffbook-line-status.mjs';\nimport {\n    PuffbookLifecycleController,\n    PUFFBOOK_LIFECYCLE,\n} from './puffbook-lifecycle.mjs';\nimport {\n    isRecoverablePuffbookOpenError,\n    puffbookReconnectDelayMS,\n} from './puffbook-reconnect.mjs';\nimport {\n    buildLineOffsetIndex,\n    byteOffsetForLineColWithIndex,\n    localCanonicalOutputLine,\n    lineForOffsetFromIndex,\n} from './puffbook-output-lines.mjs';\nimport { EXTERNAL_RIGHT_ICON_GAP } from './lib/evilui/chrome-spacing.mjs';\nimport { fieldUnit, isTableViewData, tableViewData } from './lib/evilui/tableview-helpers.mjs';\nimport {\n    copyLine,\n    copyProjectionViewportState,\n    NULL_OUTPUT_CELL,\n    projectInputBlock,\n    projectLineBlocks,\n    projectOutputBlock,\n    rebaseLineMap,\n    rebaseOutputCells,\n} from './puffbook-state.mjs';\nimport {\n    clonePredictedState,\n    PredictedPuffbookState,\n    diffPredictedStates,\n    materialisePredictedLines,\n    pendingLocalInputSpans,\n    rebaseLineRecordMap,\n    updateViewportWindow,\n    validatePredictedState,\n} from './puffbook-predicted-state.mjs';\nimport { buildServerEditDocEdits } from './puffbook-doc-edits.mjs';\nimport { PROJECTION_CANARIES, ProjectionInvariantError } from './puffbook-invariants.mjs';\nimport { castPtrlessNamed } from './lib/puffrpc/puffrpc.ptrless.mjs';\nimport {\n    mergeProjectedBodyWindowPatch,\n    validateProjectedBodyWindow,\n    replayPredictedBodyWindow,\n    rebasePendingLocalOpsToBodyWindow,\n    completePredictedSourceSnapshot,\n} from './puffbook-body-window.mjs';\nimport {\n    cloneLocalInputTextOp,\n    cloneLocalInputTextOps,\n    compactLocalInputOps,\n    localInputOpIsInFlight,\n    localInputOpIsLocal,\n    localInputTransportState,\n    makeLocalInputTextOp,\n    makeLocalInputTextOpFromSpan,\n    projectLocalInputOpEdit,\n    setLocalInputTransportState,\n} from './puffbook-ops.mjs';\nimport {\n    applyReplaceSpan,\n    materialiseReplaceSpans,\n    rebaseLocalSpanChainOverRemoteChain,\n    replaceSpanFromEdit,\n    replaceSpanChainFromChange,\n    transformStickyPositionThroughReplaceSpanChain,\n    transformRemoteThroughLocalChain,\n} from './puffbook-replacespan.mjs';\nimport {\n    absorbLocalInputTextOp,\n    applyLocalInputTextOpDirect,\n    absorbServerTextChange,\n    absorbUndoneServerTextChange,\n    assertPredictedBodyMatchesLocalOps,\n    beginPredictedMutation,\n    finishPredictedMutation,\n    predictedBodyFromLocalOps,\n    ratifyOriginBatch,\n    tryProjectLocalInputOpsToBaseFrame,\n    reconcileTransportRecoveryLocalOps,\n} from './puffbook-mutation.mjs';\nimport {\n    currentRevisionFromPending,\n} from './puffbook-pending-base.mjs';\nconst textEncoder = new TextEncoder();\nconst UNDO_COALESCE_MS = 800;\nconst PENDING_FLUSH_IDLE_MS = 250;\nconst PENDING_FLUSH_MAX_AGE_MS = 500;\nconst MAX_OUTBOUND_EDIT_ROWS = 64;\nconst MIN_BOOTSTRAP_PROJECTION_VIEWPORT_LINES = 24;\nconst BOOTSTRAP_PROJECTION_LINE_PITCH_PX = 28;\nconst BOOTSTRAP_PROJECTION_WARM_MULTIPLIER = 2;\nconst VIEWPORT_SYNC_INTERVAL_MS = 1000;\nconst VIEWPORT_SYNC_IDLE_STOP_MS = 5000;\nconst PUFFBOOK_DOC_X = -200;\nconst PUFFBOOK_TOP_PAD = 48;\nconst PUFFBOOK_COPY_BUTTON_TOP_PAD = 0;\nconst PUFFBOOK_COPY_BUTTON_GAP = EXTERNAL_RIGHT_ICON_GAP;\n\nfunction utf8ByteLength(text) {\n    return textEncoder.encode(`${text ?? ''}`).length;\n}\n\n/* Describe one local edit compactly when authoritative reconciliation removes it. */\nfunction describeOverwrittenLocalInputOp(op) {\n    const span = op?.span ?? null;\n    return {\n        transport_state: localInputTransportState(op),\n        edit_ordinal: Number.isInteger(op?.edit_ordinal) ? op.edit_ordinal : null,\n        accepted_version: Number.isInteger(op?.accepted_version) ? op.accepted_version : null,\n        line: Number.isInteger(span?.start_line) ? span.start_line : null,\n        col: Number.isInteger(span?.start_col) ? span.start_col : null,\n        deleted_text: span?.deleted_text ?? null,\n        inserted_text: span?.inserted_text ?? null,\n    };\n}\n\nfunction sameLocalInputSpan(left, right) {\n    return left?.span?.start_line === right?.span?.start_line\n        && left?.span?.start_col === right?.span?.start_col\n        && left?.span?.deleted_text === right?.span?.deleted_text\n        && left?.span?.inserted_text === right?.span?.inserted_text;\n}\n\nfunction sourceEditDiagnostic(change) {\n    try {\n        const count = editChainLen(change, 'source delta');\n        const first = count > 0 ? editChainPartsAt(change, 0, 'source delta') : null;\n        return {\n            edit_count: count,\n            first_line: first?.line ?? null,\n            first_col: first?.col ?? null,\n            first_old_bytes: first ? utf8ByteLength(first.old_text) : null,\n            first_new_bytes: first ? utf8ByteLength(first.new_text) : null,\n        };\n    } catch (err) {\n        return { edit_count: null, decode_error: `${err?.message || err}` };\n    }\n}\n\nfunction firstMismatchIndex(a, b) {\n    const left = `${a ?? ''}`;\n    const right = `${b ?? ''}`;\n    const limit = Math.min(left.length, right.length);\n    for (let i = 0; i < limit; i += 1) {\n        if (left[i] !== right[i]) {\n            return i;\n        }\n    }\n    return left.length === right.length ? -1 : limit;\n}\n\n// Validate and replay a recovery snapshot without touching the live predicted\n// state. This is deliberately a pure pre-install check for desynchronisation\n// recovery, not an alternate document authority.\nfunction isolatedRecoveryReplay(snapshot, authoritativeBefore, pending) {\n    const window = validateProjectedBodyWindow(\n        snapshot?.body,\n        snapshot?.body_start_line,\n        snapshot?.body_end_line,\n        snapshot?.total_lines,\n    );\n    const reconciled = reconcileTransportRecoveryLocalOps(\n        authoritativeBefore,\n        window.body,\n        pending,\n    );\n    const replayed = replayPredictedBodyWindow(\n        window.body,\n        window.start_line,\n        window.end_line,\n        window.total_lines,\n        reconciled.localOpsNext,\n    );\n    return {\n        window,\n        replayed,\n        body_bytes: utf8ByteLength(replayed.body),\n        local_ops_count: reconciled.localOpsNext.length,\n    };\n}\n\n/* Produce bounded text evidence without treating either side as live authority. */\nfunction buildRecoveryStructuralDiff(left, right) {\n    if (typeof left !== 'string' || typeof right !== 'string') {\n        return {\n            status: 'unavailable',\n            first_mismatch: null,\n            left_bytes: utf8ByteLength(left),\n            right_bytes: utf8ByteLength(right),\n            left_context: null,\n            right_context: null,\n        };\n    }\n    const firstMismatch = firstMismatchIndex(left, right);\n    return {\n        status: firstMismatch < 0 ? 'equal' : 'different',\n        first_mismatch: firstMismatch,\n        left_bytes: utf8ByteLength(left),\n        right_bytes: utf8ByteLength(right),\n        left_context: firstMismatch < 0 ? null : snippetAround(left, firstMismatch, 48),\n        right_context: firstMismatch < 0 ? null : snippetAround(right, firstMismatch, 48),\n    };\n}\n\nfunction recoveryFrameTailEvidence(cut) {\n    const frames = cut?.frame_tail;\n    const advertised = cut?.frame_tail_count;\n    if (!Array.isArray(frames) || !Number.isInteger(advertised) || advertised < 0) {\n        return { status: 'unavailable', count: null, bytes: null };\n    }\n    const bytes = frames.reduce((total, frame) => total + (frame instanceof Uint8Array ? frame.byteLength : 0), 0);\n    return {\n        status: frames.length === advertised ? 'complete' : 'truncated',\n        count: frames.length,\n        bytes,\n    };\n}\n\n/* Validate decoded tail shape and FIFO before any isolated reducer consumes it. */\nexport function validateDecodedRecoveryTail(envelopes, lastGoodSeq) {\n    if (!Array.isArray(envelopes) || !Number.isInteger(lastGoodSeq)) {\n        return { status: 'unavailable', count: 0, first_seq: null, last_seq: null, error: 'decoded recovery tail is unavailable' };\n    }\n    let previous = lastGoodSeq;\n    try {\n        for (const [index, envelope] of envelopes.entries()) {\n            const body = envelope?.body;\n            const eventType = fieldText(body, 'event_type');\n            castPuffbookEvent(eventType, body);\n            const seq = fieldInt(body, 'seq');\n            if (!Number.isInteger(seq) || seq <= previous) {\n                throw new Error(`decoded recovery tail sequence is not strictly increasing at index=${index} seq=${seq} previous=${previous}`);\n            }\n            const required = eventType === 'source_edit_applied'\n                ? ['edits']\n                : eventType === 'apply_line_changes'\n                    ? ['line_changes']\n                    : eventType === 'viewport_window'\n                        ? ['body', 'body_start_line', 'body_end_line', 'total_lines', 'outputs', 'start_line', 'end_line']\n                        : null;\n            if (required === null) {\n                throw new Error(`decoded recovery tail has unsupported event_type=${JSON.stringify(eventType)}`);\n            }\n            for (const name of required) {\n                if (structField(body, name) === null) {\n                    throw new Error(`decoded recovery tail event_type=${eventType} is missing field=${name}`);\n                }\n            }\n            previous = seq;\n        }\n    } catch (err) {\n        return {\n            status: 'replay_failed',\n            count: 0,\n            first_seq: null,\n            last_seq: null,\n            error: `${err?.message || err || ''}`,\n        };\n    }\n    return {\n        status: 'ready',\n        count: envelopes.length,\n        first_seq: envelopes.length === 0 ? null : fieldInt(envelopes[0].body, 'seq'),\n        last_seq: envelopes.length === 0 ? null : previous,\n        error: null,\n    };\n}\n\n/* Apply decoded source operations to a detached body; projection rows remain separate state. */\nexport function replayDecodedRecoveryTail(envelopes, initialBody, lastGoodSeq) {\n    const validation = validateDecodedRecoveryTail(envelopes, lastGoodSeq);\n    if (validation.status !== 'ready') {\n        return { ...validation, body: null, applied_operations: 0 };\n    }\n    let body = initialBody;\n    let applied = 0;\n    try {\n        for (const envelope of envelopes) {\n            const eventBody = envelope.body;\n            const eventType = fieldText(eventBody, 'event_type');\n            castPuffbookEvent(eventType, eventBody);\n            if (eventType === 'source_edit_applied') {\n                body = applyEditChain(body, structField(eventBody, 'edits'));\n            } else if (eventType === 'viewport_window') {\n                validateProjectedBodyWindow(\n                    fieldText(eventBody, 'body'),\n                    fieldInt(eventBody, 'body_start_line'),\n                    fieldInt(eventBody, 'body_end_line'),\n                    fieldInt(eventBody, 'total_lines'),\n                );\n            }\n            applied += 1;\n        }\n    } catch (err) {\n        return {\n            status: 'replay_failed',\n            count: 0,\n            first_seq: null,\n            last_seq: null,\n            error: `${err?.message || err || ''}`,\n            body: null,\n            applied_operations: applied,\n        };\n    }\n    return {\n        ...validation,\n        body,\n        applied_operations: applied,\n    };\n}\n\nfunction detachedProjectionLineState(record) {\n    const state = fieldText(record, 'state');\n    switch (state) {\n    case 'blank':\n        return makeServerLineState(SERVER_LINE_STATE.BLANK);\n    case 'continuation':\n        return makeServerLineState(SERVER_LINE_STATE.CONTINUATION);\n    case 'terminal_pending':\n        return makeServerLineState(SERVER_LINE_STATE.TERMINAL_PENDING);\n    case 'terminal_refreshing':\n        return makeServerLineState(SERVER_LINE_STATE.TERMINAL_PENDING, { refreshing: true });\n    case 'terminal_success':\n        return makeServerLineState(SERVER_LINE_STATE.TERMINAL_SUCCESS, {\n            hasPayloadRef: typeof optionalFieldText(record, 'payload_ref') === 'string'\n                && optionalFieldText(record, 'payload_ref') !== '',\n        });\n    case 'terminal_failure':\n        return makeServerLineState(SERVER_LINE_STATE.TERMINAL_FAILURE, {\n            hasPayloadRef: typeof optionalFieldText(record, 'payload_ref') === 'string'\n                && optionalFieldText(record, 'payload_ref') !== '',\n        });\n    default:\n        throw new Error(`Detached projection row has unsupported state=${JSON.stringify(state)}.`);\n    }\n}\n\nfunction applyDetachedProjectionRows(lineRecords, outputRecords) {\n    let applied = 0;\n    for (const record of outputRecords) {\n        const line = fieldInt(record, 'line');\n        if (!Number.isInteger(line) || line < 0) {\n            throw new Error(`Detached projection row has invalid line=${JSON.stringify(line)}.`);\n        }\n        lineRecords.set(line, {\n            ...(lineRecords.get(line) ?? {}),\n            lineState: detachedProjectionLineState(record),\n            status: optionalFieldText(record, 'status'),\n            payloadRef: optionalFieldText(record, 'payload_ref'),\n        });\n        applied += 1;\n    }\n    return applied;\n}\n\n/* Replay detached projection rows through the same coordinate map contract as live state. */\nexport function replayDecodedProjectionRows(envelopes, initialBody, initialLineRecords, lastGoodSeq, bodyStartLine = 0) {\n    const validation = validateDecodedRecoveryTail(envelopes, lastGoodSeq);\n    if (validation.status !== 'ready' || !(initialLineRecords instanceof Map)) {\n        return {\n            status: validation.status === 'ready' ? 'unavailable' : validation.status,\n            error: validation.error ?? 'detached projection line records are unavailable',\n            body: null,\n            line_records: null,\n            applied_rows: 0,\n        };\n    }\n    let body = initialBody;\n    let lineRecords = new Map([...initialLineRecords].map(([line, record]) => [line, { ...record }]));\n    let appliedRows = 0;\n    try {\n        for (const envelope of envelopes) {\n            const eventBody = envelope.body;\n            const eventType = fieldText(eventBody, 'event_type');\n            castPuffbookEvent(eventType, eventBody);\n            if (eventType === 'source_edit_applied') {\n                const edits = structField(eventBody, 'edits');\n                const nextBody = applyEditChain(body, edits);\n                lineRecords = rebaseLineRecordMap(body, nextBody, lineRecords, edits, bodyStartLine, bodyStartLine);\n                body = nextBody;\n            } else if (eventType === 'apply_line_changes') {\n                appliedRows += applyDetachedProjectionRows(\n                    lineRecords,\n                    projectionOutputRecords(structField(eventBody, 'line_changes')),\n                );\n            } else if (eventType === 'viewport_window') {\n                validateProjectedBodyWindow(\n                    fieldText(eventBody, 'body'),\n                    fieldInt(eventBody, 'body_start_line'),\n                    fieldInt(eventBody, 'body_end_line'),\n                    fieldInt(eventBody, 'total_lines'),\n                );\n                appliedRows += applyDetachedProjectionRows(\n                    lineRecords,\n                    projectionOutputRecords(structField(eventBody, 'outputs')),\n                );\n            }\n        }\n    } catch (err) {\n        return {\n            status: 'replay_failed',\n            error: `${err?.message || err || ''}`,\n            body: null,\n            line_records: null,\n            applied_rows: appliedRows,\n        };\n    }\n    return {\n        status: 'ready',\n        error: null,\n        body,\n        line_records: lineRecords,\n        applied_rows: appliedRows,\n    };\n}\n\n/* Build the complete detached recovery evidence before touching the live subscription. */\nexport function buildProjectionRecoveryArtifact(cut, snapshot, authoritativeBefore, pending, liveBody, initialLineRecords = null) {\n    const structuralDiff = buildRecoveryStructuralDiff(liveBody, snapshot?.body);\n    const frameTail = recoveryFrameTailEvidence(cut);\n    const decodedTail = validateDecodedRecoveryTail(cut?.frame_tail_envelopes, cut?.last_good_seq);\n    const decodedReplay = replayDecodedRecoveryTail(cut?.frame_tail_envelopes, authoritativeBefore, cut?.last_good_seq);\n    const rowReplay = replayDecodedProjectionRows(\n        cut?.frame_tail_envelopes,\n        authoritativeBefore,\n        initialLineRecords,\n        cut?.last_good_seq,\n    );\n    const base = {\n        diagnostic_id: cut?.diagnostic_id ?? null,\n        recovery_attempt: cut?.recovery_attempt ?? null,\n        last_good_seq: cut?.last_good_seq ?? null,\n        evidence_status: cut?.evidence_status ?? 'unavailable',\n        checkpoint_tail_count: cut?.checkpoint_tail_count ?? null,\n        last_good_body_bytes: cut?.last_good_body_bytes ?? null,\n        current_body_bytes: cut?.current_body_bytes ?? null,\n        body_first_mismatch: cut?.body_first_mismatch ?? null,\n        frame_tail_count: cut?.frame_tail_count ?? null,\n        frame_tail_bytes: cut?.frame_tail_bytes ?? null,\n        frame_tail_first_seq: cut?.frame_tail_first_seq ?? null,\n        frame_tail_last_seq: cut?.frame_tail_last_seq ?? null,\n        frame_tail_status: frameTail.status,\n        frame_tail_observed_count: frameTail.count,\n        frame_tail_observed_bytes: frameTail.bytes,\n        frame_tail_decode_status: cut?.frame_tail_decode_status ?? 'unavailable',\n        frame_tail_decode_error: cut?.frame_tail_decode_error ?? null,\n        failed_input_kind: cut?.failed_input_kind ?? null,\n        failed_input_major: cut?.failed_input_major ?? null,\n        failed_input_minor: cut?.failed_input_minor ?? null,\n        failed_input_bytes: cut?.failed_input_bytes ?? null,\n        failed_input_truncated: cut?.failed_input_truncated ?? null,\n        failed_input_observed_bytes: cut?.failed_input instanceof Uint8Array ? cut.failed_input.byteLength : null,\n        stream_owner: cut?.stream_owner ?? null,\n        request_ordinal: cut?.request_ordinal ?? null,\n        outbound_queue_depth: cut?.outbound_queue_depth ?? null,\n        outbound_queue_capacity: cut?.outbound_queue_capacity ?? null,\n        frame_tail_replay_status: decodedTail.status,\n        frame_tail_replay_count: decodedTail.count,\n        frame_tail_replay_first_seq: decodedTail.first_seq,\n        frame_tail_replay_last_seq: decodedTail.last_seq,\n        frame_tail_replay_error: decodedTail.error,\n        frame_tail_applied_operations: decodedReplay.applied_operations,\n        frame_tail_replay_body_bytes: decodedReplay.body === null ? null : utf8ByteLength(decodedReplay.body),\n        frame_tail_row_replay_status: rowReplay.status,\n        frame_tail_row_replay_error: rowReplay.error,\n        frame_tail_row_replay_applied_rows: rowReplay.applied_rows,\n        live_body_bytes: utf8ByteLength(liveBody),\n        replacement_body_bytes: utf8ByteLength(snapshot?.body),\n        first_body_mismatch: firstMismatchIndex(liveBody, snapshot?.body),\n        diff_status: structuralDiff.status,\n        diff_first_mismatch: structuralDiff.first_mismatch,\n        diff_left_bytes: structuralDiff.left_bytes,\n        diff_right_bytes: structuralDiff.right_bytes,\n        diff_left_context: structuralDiff.left_context,\n        diff_right_context: structuralDiff.right_context,\n    };\n    try {\n        const isolated = isolatedRecoveryReplay(snapshot, authoritativeBefore, pending);\n        return {\n            ...base,\n            status: 'ready',\n            replay_body_bytes: isolated.body_bytes,\n            replay_start_line: isolated.replayed.start_line,\n            replay_end_line: isolated.replayed.end_line,\n            replay_total_lines: isolated.replayed.total_lines,\n            pending_count: isolated.local_ops_count,\n        };\n    } catch (err) {\n        return {\n            ...base,\n            status: 'diff_failed',\n            error: `${err?.message || err || ''}`,\n        };\n    }\n}\n\nfunction localInputOpChangesLineStructure(op) {\n    const span = op?.span ?? null;\n    if (!span) {\n        return false;\n    }\n    return `${span.deleted_text ?? ''}`.includes('\\n') || `${span.inserted_text ?? ''}`.includes('\\n');\n}\n\nfunction localInputOpIsSingleLineInsert(op) {\n    const span = op?.span ?? null;\n    if (!span) {\n        return false;\n    }\n    const deletedText = `${span.deleted_text ?? ''}`;\n    const insertedText = `${span.inserted_text ?? ''}`;\n    return deletedText === '' && insertedText !== '' && !insertedText.includes('\\n');\n}\n\nfunction snippetAround(text, index, radius = 32) {\n    const source = `${text ?? ''}`;\n    if (index < 0) {\n        return source.slice(0, radius * 2);\n    }\n    const start = Math.max(0, index - radius);\n    const end = Math.min(source.length, index + radius);\n    return source.slice(start, end);\n}\n\nfunction pendingOpsSample(localOps, limit = 6) {\n    const ops = Array.isArray(localOps) ? localOps : [];\n    return ops.slice(0, limit).map((op, index) => ({\n        index,\n        transport_state: op?.kind === 'input_text_edit' ? localInputTransportState(op) : null,\n        edit_ordinal: Number.isInteger(op?.edit_ordinal) ? op.edit_ordinal : null,\n        start_line: op?.span?.start_line ?? null,\n        start_col: op?.span?.start_col ?? null,\n        deleted_text: op?.span?.deleted_text ?? '',\n        inserted_text: op?.span?.inserted_text ?? '',\n    }));\n}\n\nfunction errorLifecycleReason(err, fallback) {\n    const msg = `${err?.message || err || ''}`.trim();\n    return msg ? `${fallback}: ${msg}` : fallback;\n}\n\nfunction isRetryablePayloadRefFetchError(err) {\n    const msg = `${err?.message || err || ''}`;\n    return msg.startsWith('WebSocket data connection failed.')\n        || msg.startsWith('WebSocket connection closed.')\n        || msg.startsWith('WebSocket connection dropped unexpectedly.');\n}\n\nfunction structField(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        throw new Error(`Field ${JSON.stringify(name)} requires a Struct value.`);\n    }\n    return obj.field(name);\n}\n\n// Read a field which the declared sparse wire shape genuinely permits to be\n// absent. Inspecting metadata keeps absence distinct from conversion failure.\nfunction optionalField(obj, name) {\n    if (!obj || typeof obj.field !== 'function') {\n        throw new Error(`Sparse field ${JSON.stringify(name)} requires a Struct value.`);\n    }\n    if (typeof obj.fieldNames !== 'function') {\n        // Some in-process Struct projections expose field lookup without a\n        // materialised names vector. Field lookup remains strict: conversion\n        // errors propagate and only a returned null means declared absence.\n        const value = obj.field(name);\n        return value && typeof value.valid === 'function' && !value.valid() ? null : value;\n    }\n    const names = obj.fieldNames();\n    if (!Array.isArray(names)) {\n        throw new Error(`Sparse field ${JSON.stringify(name)} requires readable Struct metadata.`);\n    }\n    if (!names.includes(name)) return null;\n    const value = obj.field(name);\n    return value && typeof value.valid === 'function' && !value.valid() ? null : value;\n}\n\nfunction optionalFieldText(obj, name) {\n    const value = optionalField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value === 'string') {\n        return value;\n    }\n    if (typeof value.toText !== 'function') {\n        throw new Error(`Sparse field ${JSON.stringify(name)} must be text when present.`);\n    }\n    return value.toText();\n}\n\n// presentField treats ptrless null fields as absent at the transport seam.\nfunction presentField(obj, name) {\n    const field = structField(obj, name);\n    if (field && typeof field.valid === 'function' && !field.valid()) {\n        return null;\n    }\n    return field;\n}\n\nfunction fieldText(obj, name) {\n    const value = structField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value === 'string') {\n        return value;\n    }\n    if (typeof value.toText !== 'function') {\n        throw new Error(`Field ${JSON.stringify(name)} must be text when present.`);\n    }\n    return value.toText();\n}\n\nfunction castPuffbookEvent(eventType, body) {\n    const nominal = {\n        projection_snapshot: 'puff_PuffbookProjectionSnapshot',\n        viewport_window: 'puff_PuffbookViewportWindow',\n        source_edit_applied: 'puff_PuffbookSourceEditApplied',\n        apply_line_changes: 'puff_PuffbookApplyLineChanges',\n    }[eventType];\n    if (!nominal) {\n        throw new Error(`Unsupported Puffbook event type ${JSON.stringify(eventType)}.`);\n    }\n    return castPtrlessNamed(nominal, body);\n}\n\nfunction fieldBinHex(obj, name) {\n    const value = structField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value.toUint8Array !== 'function') {\n        throw new Error(`Field ${JSON.stringify(name)} must be binary when present.`);\n    }\n    return ptl.uuidToHex(value.toUint8Array());\n}\n\nfunction fieldInt(obj, name) {\n    const value = structField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value === 'number') {\n        if (!Number.isSafeInteger(value)) {\n            throw new Error(`Field ${JSON.stringify(name)} must be a safe integer.`);\n        }\n        return value;\n    }\n    if (typeof value === 'bigint') {\n        const ret = Number(value);\n        if (!Number.isSafeInteger(ret)) {\n            throw new Error(`Field ${JSON.stringify(name)} exceeds JavaScript's safe integer range.`);\n        }\n        return ret;\n    }\n    if (typeof value.value !== 'function') {\n        throw new Error(`Field ${JSON.stringify(name)} must be an integer when present.`);\n    }\n    const ret = value.value();\n    if (typeof ret === 'bigint') {\n        const number = Number(ret);\n        if (!Number.isSafeInteger(number)) {\n            throw new Error(`Field ${JSON.stringify(name)} exceeds JavaScript's safe integer range.`);\n        }\n        return number;\n    }\n    if (!Number.isSafeInteger(ret)) {\n        throw new Error(`Field ${JSON.stringify(name)} must decode to a safe integer.`);\n    }\n    return ret;\n}\n\n/* Count one canonical edit payload for tracing, accepting either a single Edit or an EditChain. */\nfunction canonicalEditCount(change, label = 'canonical edit payload') {\n    if (change === null) {\n        return 0;\n    }\n    try {\n        return editChainLen(change, label);\n    } catch (chainErr) {\n        try {\n            void editParts(change);\n            return 1;\n        } catch (_editErr) {\n            throw chainErr;\n        }\n    }\n}\n\n// describeTestingValue summarises one decoded field value without forcing full payload serialisation.\nfunction describeTestingValue(value) {\n    if (value === null) {\n        return { type: 'null' };\n    }\n    if (value === undefined) {\n        return { type: 'undefined' };\n    }\n    if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n        return {\n            type: typeof value,\n            value,\n        };\n    }\n    return {\n        type: value?.constructor?.name ?? typeof value,\n        logical_type: typeof value?.logicalType === 'function' ? value.logicalType() : null,\n        physical_type: typeof value?.physicalType === 'function' ? value.physicalType() : null,\n        has_to_text: typeof value?.toText === 'function',\n        has_value: typeof value?.value === 'function',\n        has_at: typeof value?.at === 'function',\n        has_length: typeof value?.length === 'function',\n    };\n}\n\nfunction fieldBool(obj, name) {\n    const value = structField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value === 'boolean') {\n        return value;\n    }\n    if (typeof value.value !== 'function') {\n        throw new Error(`Field ${JSON.stringify(name)} must be boolean when present.`);\n    }\n    const ret = value.value();\n    if (typeof ret !== 'boolean') {\n        throw new Error(`Field ${JSON.stringify(name)} must decode to boolean.`);\n    }\n    return ret;\n}\n\nfunction objItems(obj) {\n    if (isLazyPhysicalType(obj)) {\n        return [];\n    }\n    const logicalType = obj && typeof obj.logicalType === 'function' ? obj.logicalType() : '';\n    const physicalType = obj && typeof obj.physicalType === 'function' ? obj.physicalType() : '';\n    const isStruct = typeof logicalType === 'string' && logicalType.startsWith('Struct');\n    const isTuple = physicalType === 'Tuple';\n    if (isTuple && obj && typeof obj.numFields === 'function' && typeof obj.at === 'function') {\n        const out = [];\n        const n = obj.numFields();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.at(i));\n        }\n        return out;\n    }\n    if (!isStruct && obj && typeof obj.length === 'function' && typeof obj.at === 'function') {\n        const out = [];\n        const n = obj.length();\n        for (let i = 0; i < n; i++) {\n            out.push(obj.at(i));\n        }\n        return out;\n    }\n    if (obj && typeof obj.rowAt === 'function' && typeof obj.length === 'function') {\n        let names = null;\n        try {\n            names = typeof obj.fieldNames === 'function' ? obj.fieldNames() : null;\n        } catch (_err) {\n            names = null;\n        }\n        if (Array.isArray(names) && names.length > 0) {\n            const out = [];\n            const n = obj.length();\n            for (let i = 0; i < n; i++) {\n                out.push(obj.rowAt(i));\n            }\n            return out;\n        }\n    }\n    if (obj && typeof obj.field === 'function') {\n        return [obj];\n    }\n    return [];\n}\n\nfunction fieldIntText(obj, name) {\n    const value = structField(obj, name);\n    if (value === null) {\n        return null;\n    }\n    if (typeof value.valueBig === 'function') {\n        const big = value.valueBig();\n        if (big === null || big === undefined) {\n            throw new Error(`Field ${JSON.stringify(name)} returned no integer value.`);\n        }\n        return `${big}`;\n    }\n    if (typeof value.value === 'function') {\n        const n = value.value();\n        if (n === null || n === undefined) {\n            throw new Error(`Field ${JSON.stringify(name)} returned no integer value.`);\n        }\n        return `${n}`;\n    }\n    throw new Error(`Field ${JSON.stringify(name)} must be an integer when present.`);\n}\n\nfunction eventLagMS(emittedAt) {\n    const atMS = unixEpochToMS(emittedAt);\n    if (atMS === null) {\n        return null;\n    }\n    return Math.max(0, Date.now() - atMS);\n}\n\n// unixEpochToMS keeps browser diagnostics on one millisecond epoch even when backend transport still emits UnixNano values.\nfunction unixEpochToMS(value) {\n    if (value === null || value === undefined || value === '') {\n        return null;\n    }\n    const n = Number(value);\n    if (!Number.isFinite(n)) {\n        return null;\n    }\n    if (Math.abs(n) >= 1e15) {\n        return Math.round(n / 1e6);\n    }\n    if (Math.abs(n) >= 1e12) {\n        return Math.round(n);\n    }\n    if (Math.abs(n) >= 1e9) {\n        return Math.round(n * 1000);\n    }\n    return Math.round(n);\n}\n\nfunction unquoteText(text) {\n    if (typeof text !== 'string') {\n        return text;\n    }\n    if (text.length >= 2 && text.startsWith('\\'') && text.endsWith('\\'')) {\n        return text.slice(1, -1);\n    }\n    return text;\n}\n\nfunction outputUnitText(obj) {\n    try {\n        return fieldUnit(obj) || '';\n    } catch (_err) {\n        return '';\n    }\n}\n\nfunction formatOutputValue(obj, text) {\n    if (!obj || typeof text !== 'string') {\n        return text;\n    }\n    const value = prefixOutputAxis(obj, text);\n    const unit = outputUnitText(obj);\n    if (!unit) {\n        return value;\n    }\n    return `${value} ${unit}`;\n}\n\nfunction outputScalarText(obj) {\n    if (!obj || typeof obj.toString !== 'function' || typeof obj.logicalType !== 'function') {\n        return null;\n    }\n    if (!obj.logicalType().endsWith('Str')) {\n        return null;\n    }\n    return unquoteText(obj.toString());\n}\n\nfunction outputScalarBinPreview(obj) {\n    if (!obj || typeof obj.logicalType !== 'function') {\n        return null;\n    }\n    if (!obj.logicalType().endsWith('Bin')) {\n        return null;\n    }\n    let head;\n    if (typeof obj.previewBytes === 'function') {\n        head = obj.previewBytes(16);\n    } else if (typeof obj.toUint8Array === 'function') {\n        head = obj.toUint8Array().slice(0, 16);\n    } else {\n        return null;\n    }\n    const hex = Array.from(head, (b) => b.toString(16).padStart(2, '0')).join(' ');\n    const ascii = Array.from(head, (b) => (b >= 0x20 && b <= 0x7e) ? String.fromCharCode(b) : '.').join('');\n    const bytes = typeof obj.bytes === 'function'\n        ? obj.bytes()\n        : head.length;\n    const suffix = typeof obj.open === 'function' && obj.open() ? ' open' : '';\n    return `Bin ${bytes} bytes${suffix} [${hex}] '${ascii}'`;\n}\n\nfunction outputMetadataTitle(obj) {\n    if (!obj || typeof obj.meta !== 'function') {\n        return '';\n    }\n    try {\n        const meta = obj.meta();\n        if (!meta || typeof meta.field !== 'function') {\n            return '';\n        }\n        const title = meta.field('title');\n        if (!title || typeof title.toText !== 'function') {\n            return '';\n        }\n        return title.toText();\n    } catch (_err) {\n        return '';\n    }\n}\n\nfunction noteOutputTiming(event, obj, startedMS, extra = {}) {\n    const durationMS = Math.round((performance.now() - startedMS) * 1000) / 1000;\n    const logicalType = obj && typeof obj.logicalType === 'function' ? obj.logicalType() : '';\n    pushTestingPuffbookTrace(event, {\n        data_type: logicalType,\n        duration_ms: durationMS,\n        ...extra,\n    });\n    if (durationMS >= 50) {\n        console.warn(`Portal output timing: ${event}`, {\n            duration_ms: durationMS,\n            data_type: logicalType,\n            ...extra,\n        });\n    }\n    return durationMS;\n}\n\n// Keep preview diagnostics for large structured outputs summary-only so one\n// trace path never materialises the entire table as text.\nfunction outputStructuredPreviewText(obj) {\n    const logicalType = typeof obj?.logicalType === 'function' ? obj.logicalType() : 'Struct';\n    const rows = typeof obj?.length === 'function' ? obj.length() : null;\n    const cols = typeof obj?.fieldNames === 'function' ? obj.fieldNames().length : null;\n    const shape = rows === null || cols === null ? '' : ` ${rows} rows x ${cols} columns`;\n    return `${logicalType}${shape}`;\n}\n\nfunction outputPreviewText(obj) {\n    const startedMS = performance.now();\n    if (!obj) {\n        noteOutputTiming('puffbook_output_preview_text', obj, startedMS, { result_kind: 'empty' });\n        return '';\n    }\n    const txt = outputScalarText(obj);\n    if (txt !== null) {\n        noteOutputTiming('puffbook_output_preview_text', obj, startedMS, {\n            result_kind: 'scalar_text',\n            text_length: txt.length,\n        });\n        return txt;\n    }\n    const bin = outputScalarBinPreview(obj);\n    if (bin !== null) {\n        noteOutputTiming('puffbook_output_preview_text', obj, startedMS, {\n            result_kind: 'scalar_bin',\n            text_length: bin.length,\n        });\n        return bin;\n    }\n    if (typeof obj?.logicalType === 'function' && obj.logicalType().startsWith('Struct')) {\n        const text = outputStructuredPreviewText(obj);\n        noteOutputTiming('puffbook_output_preview_text', obj, startedMS, {\n            result_kind: 'structured_summary',\n            text_length: text.length,\n        });\n        return text;\n    }\n    if (typeof obj.toString !== 'function') {\n        noteOutputTiming('puffbook_output_preview_text', obj, startedMS, { result_kind: 'no_to_string' });\n        return '';\n    }\n    const text = obj.toString();\n    noteOutputTiming('puffbook_output_preview_text', obj, startedMS, {\n        result_kind: 'to_string',\n        text_length: typeof text === 'string' ? text.length : null,\n    });\n    return text;\n}\n\nfunction previewOutputText(text) {\n    const raw = typeof text === 'string' ? text : String(text ?? '');\n    const flat = raw.replaceAll('\\r', '\\\\r').replaceAll('\\n', '\\\\n').replaceAll('\\t', '\\\\t');\n    if (flat.length <= 180) {\n        return flat;\n    }\n    return `${flat.slice(0, 180)}...`;\n}\n\nfunction hasOpenFlag(obj) {\n    if (!obj || typeof obj.flags !== 'function') {\n        return false;\n    }\n    try {\n        return ptlf.isOpen(obj.flags());\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction isLazyPhysicalType(obj) {\n    if (!obj || typeof obj.physicalType !== 'function') {\n        return false;\n    }\n    try {\n        const physicalType = obj.physicalType();\n        return physicalType === 'Lazy'\n            || physicalType === 'LazyHandle'\n            || physicalType === 'LazyHash'\n            || physicalType === 'LazyDerived';\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction childObjects(obj) {\n    if (!obj) {\n        return [];\n    }\n    if (typeof obj.fieldNames === 'function' && typeof obj.field === 'function') {\n        return obj.fieldNames().map((name) => {\n            try {\n                return obj.field(name);\n            } catch (_err) {\n                return null;\n            }\n        }).filter(Boolean);\n    }\n    if (typeof obj.chunkCount === 'function' && typeof obj.chunkAt === 'function') {\n        const out = [];\n        const n = Math.min(8, obj.chunkCount());\n        for (let i = 0; i < n; i++) {\n            try {\n                out.push(obj.chunkAt(i));\n            } catch (_err) {\n            }\n        }\n        return out;\n    }\n    if (typeof obj.length === 'function' && typeof obj.at === 'function' && typeof obj.isScalar === 'function' && !obj.isScalar()) {\n        const out = [];\n        const n = Math.min(8, obj.length());\n        for (let i = 0; i < n; i++) {\n            try {\n                out.push(obj.at(i));\n            } catch (_err) {\n            }\n        }\n        return out;\n    }\n    return [];\n}\n\n// Metadata outputs use the same table path as structs.\nfunction isMetadataPreviewStruct(obj) {\n    if (!obj) {\n        return false;\n    }\n    try {\n        const physical = typeof obj.physicalType === 'function' ? obj.physicalType() : '';\n        const logical = typeof obj.logicalType === 'function' ? obj.logicalType() : '';\n        return physical === 'MetadataV1' || physical === 'MetadataV2'\n            || logical === 'MetadataV1' || logical === 'MetadataV2';\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction isPartialOutput(obj, seen = new Set(), budget = { remaining: 128 }) {\n    if (!obj || budget.remaining <= 0 || seen.has(obj)) {\n        return false;\n    }\n    seen.add(obj);\n    budget.remaining -= 1;\n    // Metadata may contain lazy-looking children but is ready to render.\n    if (isMetadataPreviewStruct(obj)) {\n        return false;\n    }\n    if (hasOpenFlag(obj) || isLazyPhysicalType(obj)) {\n        return true;\n    }\n    for (const child of childObjects(obj)) {\n        if (isPartialOutput(child, seen, budget)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction normalizeUsername(text) {\n    if (typeof text !== 'string') {\n        return null;\n    }\n    let name = text.trim();\n    if (name === '') {\n        return null;\n    }\n    if (name.startsWith('user-')) {\n        name = name.slice(5);\n    }\n    return name;\n}\n\nfunction classifyOutputCell(obj, previewHints = null) {\n    const startedMS = performance.now();\n    let state = 'none';\n    if (!obj) {\n        const cell = renderOutputCell(null, state, previewHints);\n        noteOutputTiming('puffbook_classify_output_cell', obj, startedMS, {\n            state: cell.state,\n            block_type: cell.block_type,\n        });\n        return cell;\n    }\n    if (typeof obj.flags === 'function' && (obj.flags() & ptlf.sentinel_ANY_ERRORS) !== 0n) {\n        state = 'error';\n        const cell = renderOutputCell(obj, state, previewHints);\n        noteOutputTiming('puffbook_classify_output_cell', obj, startedMS, {\n            state: cell.state,\n            block_type: cell.block_type,\n        });\n        return cell;\n    }\n    if (isPartialOutput(obj)) {\n        state = 'partial';\n        const cell = renderOutputCell(obj, state, previewHints);\n        noteOutputTiming('puffbook_classify_output_cell', obj, startedMS, {\n            state: cell.state,\n            block_type: cell.block_type,\n            preview_kind: 'partial',\n        });\n        return cell;\n    }\n    state = 'ptrless';\n    const cell = renderOutputCell(obj, state, previewHints);\n    noteOutputTiming('puffbook_classify_output_cell', obj, startedMS, {\n        state: cell.state,\n        block_type: cell.block_type,\n        preview_kind: 'ptrless',\n    });\n    return cell;\n}\n\n// requireTablePreviewHints enforces the transport contract that table-like\n// outputs always arrive with preview hints attached.\nfunction requireTablePreviewHints(obj, state, previewHints) {\n    if (!obj) {\n        return;\n    }\n    const logicalType = obj.logicalType();\n    const metadataTitle = outputMetadataTitle(obj);\n    const standalonePreview = metadataTitle === 'image' || metadataTitle === 'damon_sdf';\n    if (!(isTableViewData(obj) || logicalType.startsWith('Struct')) || previewHints || standalonePreview) {\n        return;\n    }\n    let hash = '';\n    try {\n        hash = typeof obj.totalHashHex === 'function' ? obj.totalHashHex() : '';\n    } catch (_err) {\n        hash = '!hash_error';\n    }\n    throw new Error(\n        `Table output missing preview hints. state='${state}' logical_type='${logicalType}' `\n        + `metadata_title='${outputMetadataTitle(obj)}' rows=${obj.length()} hash='${hash}'.`,\n    );\n}\n\nconst SERVER_LINE_STATE = Object.freeze({\n    BLANK: 'blank',\n    CONTINUATION: 'continuation',\n    TERMINAL_PENDING: 'terminal_pending',\n    TERMINAL_SUCCESS: 'terminal_success',\n    TERMINAL_FAILURE: 'terminal_failure',\n});\n\n// makeServerLineState seals one authoritative per-line projection state.\nfunction makeServerLineState(kind, { refreshing = false, hasPayloadRef = false } = {}) {\n    if (!Object.values(SERVER_LINE_STATE).includes(kind)) {\n        throw new Error(`Unknown server line state kind='${kind}'.`);\n    }\n    if (kind !== SERVER_LINE_STATE.TERMINAL_PENDING && refreshing) {\n        throw new Error(`Only pending server line states may carry the refreshing flag; got kind='${kind}'.`);\n    }\n    if (kind !== SERVER_LINE_STATE.TERMINAL_SUCCESS && kind !== SERVER_LINE_STATE.TERMINAL_FAILURE && hasPayloadRef) {\n        throw new Error(`Only terminal success/failure server line states may carry hasPayloadRef; got kind='${kind}'.`);\n    }\n    return {\n        kind,\n        refreshing,\n        has_payload_ref: hasPayloadRef,\n    };\n}\n\nfunction testingOutputState(lineState, line) {\n    if (!lineState) {\n        return 'unknown';\n    }\n    if (lineState.kind === SERVER_LINE_STATE.TERMINAL_PENDING) {\n        if (lineState.refreshing === true) {\n            return 'refreshing';\n        }\n        return 'pending';\n    }\n    if (lineState.kind === SERVER_LINE_STATE.CONTINUATION) {\n        return 'continuation';\n    }\n    if ((lineState.kind === SERVER_LINE_STATE.TERMINAL_SUCCESS || lineState.kind === SERVER_LINE_STATE.TERMINAL_FAILURE)\n        && lineState.has_payload_ref === true && (line?.output_state ?? 'none') === 'none') {\n        return 'payload_ref';\n    }\n    return line?.output_state ?? 'none';\n}\n\nfunction testingRowTracked(lineState, resolved, line) {\n    return lineState !== null || resolved || testingOutputState(lineState, line) !== 'unknown';\n}\n\nfunction assertProjectionSnapshotAbsLineInBodyWindow(absLine, bodyAbsStartLine, bodyAbsEndLine) {\n    if (!Number.isInteger(absLine)\n        || !Number.isInteger(bodyAbsStartLine)\n        || !Number.isInteger(bodyAbsEndLine)) {\n        return;\n    }\n    if (absLine < bodyAbsStartLine || absLine >= bodyAbsEndLine) {\n        throw new Error(\n            `Projection snapshot absLine ${absLine} lies outside current body window `\n            + `[${bodyAbsStartLine}, ${bodyAbsEndLine}). Snapshot output lines must remain absolute.`\n        );\n    }\n}\n\nfunction terminalKindForCell(cell) {\n    if (!cell || typeof cell !== 'object') {\n        return SERVER_LINE_STATE.TERMINAL_SUCCESS;\n    }\n    return cell.state === 'error' ? SERVER_LINE_STATE.TERMINAL_FAILURE : SERVER_LINE_STATE.TERMINAL_SUCCESS;\n}\n\n// terminalKindAcceptsCell keeps authoritative success/failure on the transport\n// separate from the payload classifier, which only describes how the output renders.\nfunction terminalKindAcceptsCell(cell, terminalKind) {\n    if (!cell || typeof cell !== 'object') {\n        return terminalKind === SERVER_LINE_STATE.TERMINAL_SUCCESS;\n    }\n    if (cell.state === 'none') {\n        return terminalKind === SERVER_LINE_STATE.TERMINAL_SUCCESS;\n    }\n    if (terminalKind === SERVER_LINE_STATE.TERMINAL_FAILURE) {\n        return true;\n    }\n    return cell.state !== 'error';\n}\n\nfunction serverLineStateIsSettled(kind) {\n    return kind === SERVER_LINE_STATE.BLANK\n        || kind === SERVER_LINE_STATE.CONTINUATION\n        || kind === SERVER_LINE_STATE.TERMINAL_SUCCESS\n        || kind === SERVER_LINE_STATE.TERMINAL_FAILURE;\n}\n\n// describeTerminalKindDecision captures one compact mismatch payload for live debugging.\nfunction describeTerminalKindDecision(cell, terminalKind) {\n    return {\n        terminal_kind: terminalKind,\n        terminal_kind_type: typeof terminalKind,\n        terminal_is_success: terminalKind === SERVER_LINE_STATE.TERMINAL_SUCCESS,\n        terminal_is_failure: terminalKind === SERVER_LINE_STATE.TERMINAL_FAILURE,\n        cell_type: typeof cell,\n        cell_state: cell?.state ?? null,\n        cell_state_type: typeof cell?.state,\n        cell_state_is_none: cell?.state === 'none',\n        cell_state_is_error: cell?.state === 'error',\n        accepted: terminalKindAcceptsCell(cell, terminalKind),\n    };\n}\n\n// Table output includes ordinary structs, canonical List[Hetero] values, and metadata rows.\nfunction isRenderableTableOutput(obj, logicalType = '') {\n    return isTableViewData(obj) || logicalType.startsWith('Struct') || isMetadataPreviewStruct(obj);\n}\n\nfunction renderOutputCell(obj, state, previewHints = null) {\n    switch (state) {\n    case 'none':\n        return {\n            obj: null,\n            state,\n            block_type: 'hidden',\n            text: '',\n            preview_hints: null,\n        };\n\n    case 'error': {\n        const text = outputPreviewText(obj);\n        return {\n            obj,\n            state,\n            block_type: text.length === 0 ? 'hidden' : 'text',\n            text,\n            preview_hints: null,\n        };\n    }\n\n    case 'ptrless':\n    case 'partial': {\n        if (!obj) {\n            throw new Error('ptrless output state requires an object.');\n        }\n        // Compact transport summaries such as inline parse-error strings are\n        // already-rendered text, not ptrless objects with logicalType().\n        if (typeof obj === 'string') {\n            return {\n                obj: null,\n                state,\n                block_type: obj.length === 0 ? 'hidden' : 'text',\n                text: obj,\n                preview_hints: null,\n            };\n        }\n        const logicalType = obj.logicalType();\n        const metadataTitle = outputMetadataTitle(obj);\n        if (isRenderableTableOutput(obj, logicalType)) {\n            requireTablePreviewHints(obj, state, previewHints);\n            const fields = tableViewData(obj)?.fieldNames() ?? obj.fieldNames();\n            const previewKind = ['scatterplot', 'lineplot', 'image'].includes(metadataTitle) ? metadataTitle : 'tableview';\n            return {\n                obj,\n                state,\n                block_type: 'tableview',\n                preview_kind: previewKind,\n                text: `${logicalType}\\n${obj.length()} rows x ${fields.length} columns`,\n                preview_hints: previewHints,\n            };\n        }\n        if (metadataTitle === 'damon_sdf') {\n            return {\n                obj,\n                state,\n                block_type: 'tableview',\n                preview_kind: 'damon_sdf',\n                text: 'damon_sdf()',\n                preview_hints: null,\n            };\n        }\n        const raw = outputPreviewText(obj);\n        const plainScalar = outputScalarText(obj);\n        if (plainScalar !== null) {\n            return {\n                obj,\n                state,\n                block_type: 'text',\n                text: formatOutputValue(obj, plainScalar),\n                preview_hints: null,\n            };\n        }\n        return {\n            obj,\n            state,\n            block_type: 'text',\n            // Keep the common value path to one line. Detailed type information\n            // remains available through the result metadata affordance.\n            text: formatOutputValue(obj, raw),\n            preview_hints: null,\n        };\n    }\n\n    default:\n        throw new Error(`Unknown output cell state='${state}'.`);\n    }\n}\n\nfunction ptrlessHash(obj) {\n    if (!obj || typeof obj.totalHashHex !== 'function') {\n        return null;\n    }\n    try {\n        return obj.totalHashHex();\n    } catch (_err) {\n        return '!hash_error';\n    }\n}\n\nexport class PuffbookScreen extends ui.Screen {\n    #docView;\n    #copyButton;\n\n    constructor(state) {\n        super(state);\n\n        this.#docView = new ui.DocumentView({\n            font: state.font,\n            tableviewFont: state.tableviewFont,\n            tableviewHeaderFont: state.tableviewHeaderFont,\n            doc: state.doc,\n            onFind: documentView => ui.SearchPuffbookPanel.open(documentView),\n        });\n        this.appendChild(this.#docView);\n\n        this.#buildCopyButton()\n    }\n\n    /* Keep the puffbook top row inside the live viewport instead of depending on one fixed historical offset. */\n    #syncLayout() {\n        const cam = this.scene?.presentationCamera?.() ?? this.scene?.camera ?? null;\n        if (!cam) {\n            return;\n        }\n        const [width, height] = cam.getViewportSize();\n        if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n            return;\n        }\n        const topY = -0.5 * height + PUFFBOOK_TOP_PAD;\n        this.#docView.setLocalPosition([PUFFBOOK_DOC_X, topY, this.#docView.localPosition()[2]]);\n        if (this.#copyButton) {\n            const copyButtonX = this.#docView.state.width + PUFFBOOK_COPY_BUTTON_GAP;\n            this.#copyButton.setLocalPosition([\n                copyButtonX,\n                PUFFBOOK_COPY_BUTTON_TOP_PAD,\n                this.#copyButton.localPosition()[2],\n            ]);\n        }\n    }\n\n    _onAttachNode(shared) {\n        super._onAttachNode(shared);\n        this.#syncLayout();\n        this.#docView.syncViewportAfterHostLayout?.({ reseedFromPresentation: true });\n    }\n\n    onViewportResized(_gl) {\n        this.#syncLayout();\n    }\n\n    #buildCopyButton(){\n        this.#copyButton = new ui.Button({\n            recordingKey: 'puffbook.copy-all',\n            width: 32,\n            height: 32,\n            z: -0.2,\n            iconID: 19,\n            color: Palette.orange,\n            onHoverColor: Palette.teal,\n            onFocusColor: Palette.teal,\n            tooltipEnabled: true,\n            tooltipText: 'Copy whole puffbook content',\n            toastEnabled: true,\n            toastText: 'Puffbook content copied.',\n            toastOffsetX: -230,\n            toastOffsetY: 48,\n            font: this.state.font,\n            fontSize: 16,\n        });\n\n        this.#copyButton.onInput = (event) => {\n            if (isActivationEvent(event)) {\n                void this.state.doc.copyWholePuffbookToClipboard().then((copied) => {\n                    if (copied) {\n                        this.#copyButton.displayToast();\n                    }\n                }).catch((err) => {\n                    console.error('Failed to copy whole puffbook content:', err);\n                });\n                return true;\n            }\n        };\n        this.#docView.mountContentChrome(this.#copyButton);\n        this.#syncLayout();\n    }\n\n    testingTableHeadersForLine(lineNum) {\n        return this.#docView.testingTableHeadersForLine(lineNum);\n    }\n\n    testingTableControlsForLine(lineNum) {\n        return this.#docView.testingTableControlsForLine(lineNum);\n    }\n\n    /* Activate one tableview chrome command for test code without depending on picker timing. */\n    testingActivateTableControlForLine(lineNum, control) {\n        return this.#docView.testingActivateTableControlForLine(lineNum, control);\n    }\n\n    /* Force one tableview line back to passive preview so picker tests can close deterministically in CI. */\n    testingLeaveTableForLine(lineNum, sendLeaveSignal = true) {\n        return this.#docView.testingLeaveTableForLine(lineNum, sendLeaveSignal);\n    }\n\n    testingLineGeometry(lineNum) {\n        return this.#docView.testingLineGeometry(lineNum);\n    }\n\n    testingCopyButtonGeometry() {\n        if (!this.#copyButton) {\n            return null;\n        }\n        return {\n            local: this.#copyButton.localPosition?.() ?? null,\n            world: this.#copyButton.worldPosition?.() ?? null,\n        };\n    }\n\n    testingExpandTableForLine(lineNum) {\n        return this.#docView.testingExpandTableForLine(lineNum);\n    }\n\n    /* Expose one mounted preview TableView instance for integration tests that need identity checks across puffbook mutations. */\n    testingTableViewForLine(lineNum) {\n        return this.#docView?.testingTableViewForLine?.(lineNum) ?? null;\n    }\n\n    /* Expose one mounted preview viewport for integration tests that need identity checks across puffbook mutations. */\n    testingTableViewportForLine(lineNum) {\n        return this.#docView?.testingTableViewportForLine?.(lineNum) ?? null;\n    }\n\n    /* Expose one line-local TableView perf snapshot for test and profiling hooks. */\n    testingTablePerfForLine(lineNum) {\n        const tableview = this.#docView.testingTableViewForLine(lineNum);\n        if (!tableview || typeof tableview.testingPerfSummary !== 'function') {\n            return null;\n        }\n        return tableview.testingPerfSummary();\n    }\n\n    /* Expose one line-local chunk-memory summary for live browser leak triage. */\n    testingTableChunkMemoryForLine(lineNum) {\n        const tableview = this.#docView.testingTableViewForLine(lineNum);\n        if (!tableview || typeof tableview.testingChunkMemorySummary !== 'function') {\n            return null;\n        }\n        return tableview.testingChunkMemorySummary();\n    }\n\n    /* Expose one line-local chunk-allocation bundle so browser leak probes can track each JS retention category. */\n    testingTableChunkAllocationForLine(lineNum) {\n        const tableview = this.#docView.testingTableViewForLine(lineNum);\n        if (!tableview || typeof tableview.testingChunkAllocationSummary !== 'function') {\n            return null;\n        }\n        return tableview.testingChunkAllocationSummary();\n    }\n\n    /* Expose one line-local ptrless-memory summary so browser leak probes can inspect the imported table graph directly. */\n    testingTablePtrlessMemoryForLine(lineNum) {\n        const tableview = this.#docView.testingTableViewForLine(lineNum);\n        if (!tableview || typeof tableview.testingPtrlessMemorySummary !== 'function') {\n            return null;\n        }\n        return tableview.testingPtrlessMemorySummary();\n    }\n\n    /* Expose one retained document-view summary so browser leak probes can inspect output-row shell state. */\n    testingDocumentRetentionSummary() {\n        if (!this.#docView || typeof this.#docView.testingRetentionSummary !== 'function') {\n            return null;\n        }\n        return this.#docView.testingRetentionSummary();\n    }\n\n    testingSnapshot() {\n        return {\n            has_table_headers: typeof this.#docView.testingTableHeadersForLine === 'function',\n            focus: typeof this.#docView.testingFocusState === 'function'\n                ? this.#docView.testingFocusState()\n                : null,\n        };\n    }\n\n    /* Focus one document line and open it near mid-viewport so symbol jumps do not strand the caret offscreen. */\n    focusLine(lineNum = 0, col = 0) {\n        return this.#docView.focusLine(lineNum, col, { scroll: 'middle' });\n    }\n\n    /* Preserve the existing test helper name while routing real line jumps through the same focus seam. */\n    testingFocusLine(lineNum = 0, col = 0) {\n        return this.focusLine(lineNum, col);\n    }\n\n    getDocumentView() {\n        return this.#docView;\n    }\n\n    assistantDocumentSnapshot() {\n        return this.state.doc.assistantDocumentSnapshot();\n    }\n\n}\n\nexport async function fetchPuffbook(api, fileRef) {\n    const payload = await api.getPuffbook(fileRef);\n    return payload.data ?? '';\n}\n\nexport function createPuffbook(api, fileRef, opts = {}) {\n    if (!api) {\n        throw new Error('api instance is required.');\n    }\n    const doc = new Puffbook(api, fileRef, {\n        read_only: opts.read_only === true,\n        onLoadError: opts.onLoadError ?? null,\n        onLoadReady: opts.onLoadReady ?? null,\n        onInitialPresentationReady: opts.onInitialPresentationReady ?? null,\n        onLifecycleChange: opts.onLifecycleChange ?? null,\n        onComputeAvailabilityChange: opts.onComputeAvailabilityChange ?? null,\n        username: opts.username ?? null,\n    });\n    void doc.open();\n    return doc;\n}\n\nclass PuffbookViewBinding {\n    #owner;\n    #onProjection;\n    #detached;\n\n    constructor(owner, { onProjection = null } = {}) {\n        if (onProjection !== null && typeof onProjection !== 'function') {\n            throw new Error('Puffbook view binding onProjection must be a function when provided.');\n        }\n        this.#owner = owner;\n        this.#onProjection = onProjection;\n        this.#detached = false;\n        this.viewID = crypto.randomUUID();\n        this.participantID = this.viewID;\n    }\n\n    detach() {\n        if (this.#detached) {\n            return false;\n        }\n        this.#detached = true;\n        this.#owner._detachViewBinding(this);\n        this.#owner = null;\n        this.#onProjection = null;\n        return true;\n    }\n\n    _deliverProjection(edits) {\n        this.#requireAttached('_deliverProjection');\n        this.#onProjection?.({ edits: edits.slice() });\n    }\n\n    #requireAttached(operation) {\n        if (this.#detached || !this.#owner) {\n            throw new Error(`Cannot ${operation} on a detached Puffbook view binding.`);\n        }\n    }\n}\n\nclass Puffbook extends ui.Document {\n    #api;\n    #readOnly;\n    #onLoadError;\n    #onLoadReady;\n    #onInitialPresentationReady;\n    #onLifecycleChange;\n    #onComputeAvailabilityChange;\n    #username;\n    #queuedEdits;\n    #serverSeq;\n    #serverVersion;\n    #predicted;\n    #subscriptionUUID;\n    #recordingSubscriptionGeneration;\n    #pending;\n    #pendingBaseBody;\n    #pendingAmend;\n    #amendQueue = [];\n    #nextAmendID = 1;\n    #sending;\n    #mutateInFlightCount;\n    #nextEditOrdinal;\n    #puffbookInstanceID;\n    #pendingFlushScheduled;\n    #pendingFlushRunning;\n    #pendingFlushAgain;\n    #pendingFlushTimer;\n    #pendingFlushStartedAt;\n    #payloadCache;\n    #payloadLoads;\n    #payloadDebug;\n    #projectionBatchDepth;\n    #projectionBatchDirty;\n    #suppressProjectionBatchCommit;\n    #rapidOff;\n    #closed;\n    #reopening;\n    #reconnectRetryAttempt;\n    #ownReconnectRetryTimer;\n    #viewportDirty;\n    #viewportInFlight;\n    #viewportTerminalError;\n    #viewportObservedAtMS;\n    #ownPendingViewportSyncTimer;\n    #testingChurn;\n    #testingLineChanges;\n    #testingProjectionIngest;\n    #payloadDiagnostics;\n    #lifecycle;\n    #viewBindings;\n    #sourceInputQueue = [];\n    #sourceDemand = null;\n    #searchSourceDemand = null;\n\n    constructor(api, fileRef, state = {}) {\n        super(fileRef);\n\n        this.#api = api;\n        this.#readOnly = state.read_only === true;\n        this.#onLoadError = state.onLoadError ?? null;\n        this.#onLoadReady = state.onLoadReady ?? null;\n        this.#onInitialPresentationReady = state.onInitialPresentationReady ?? null;\n        this.#onLifecycleChange = state.onLifecycleChange ?? null;\n        this.#onComputeAvailabilityChange = state.onComputeAvailabilityChange ?? null;\n        this.#username = normalizeUsername(state.username ?? null);\n        this.#queuedEdits = [];\n        this.#serverSeq = 0;\n        this.#serverVersion = 0;\n        this.#predicted = PredictedPuffbookState.empty();\n        this.#subscriptionUUID = null;\n        this.#recordingSubscriptionGeneration = 0;\n        this.#pending = [];\n        this.#pendingBaseBody = this.#predicted.body;\n        this.#pendingAmend = null;\n        this.#sending = false;\n        this.#mutateInFlightCount = 0;\n        this.#nextEditOrdinal = 1;\n        this.#puffbookInstanceID = crypto.randomUUID();\n        this.#pendingFlushScheduled = false;\n        this.#pendingFlushRunning = false;\n        this.#pendingFlushAgain = false;\n        this.#pendingFlushTimer = null;\n        this.#pendingFlushStartedAt = 0;\n        this.#payloadCache = new Map();\n        this.#payloadLoads = new Map();\n        this.#payloadDebug = new Map();\n        this.#projectionBatchDepth = 0;\n        this.#projectionBatchDirty = false;\n        this.#suppressProjectionBatchCommit = false;\n        this.#rapidOff = null;\n        this.#closed = false;\n        this.#reopening = false;\n        this.#reconnectRetryAttempt = 0;\n        this.#ownReconnectRetryTimer = null;\n        this.#viewportDirty = false;\n        this.#viewportInFlight = false;\n        this.#viewportTerminalError = null;\n        this.#viewportObservedAtMS = 0;\n        this.#ownPendingViewportSyncTimer = null;\n        this.#undoCoalesce = null;\n        this.#testingChurn = this.#makeTestingChurn();\n        this.#testingLineChanges = new Map();\n        this.#testingProjectionIngest = null;\n        this.#payloadDiagnostics = [];\n        this.#lifecycle = new PuffbookLifecycleController();\n        this.#viewBindings = new Set();\n\n        this._editHistory = [];\n        this._lines = this.#predicted.lines;\n        this.#setupSignals();\n    }\n\n    #setupSignals() {\n    }\n\n    get _editHistory() { return this.#predicted.undoHistory; }\n    set _editHistory(value) { this.#predicted.undoHistory = value; }\n    get #undoCoalesce() { return this.#predicted.undoCoalesce; }\n    set #undoCoalesce(value) { this.#predicted.undoCoalesce = value; }\n    get #redoHistory() { return this.#predicted.redoHistory; }\n    set #redoHistory(value) { this.#predicted.redoHistory = value; }\n    get #composition() { return this.#predicted.composition; }\n    set #composition(value) { this.#predicted.composition = value; }\n\n    /* Positional projection state belongs to the document reducer, not to a\n     * parallel Puffbook-side coordinate owner. */\n    get #projectedCursor() {\n        return this.#predicted.projectedCursor;\n    }\n\n    set #projectedCursor(value) {\n        this.#predicted.projectedCursor = value ? { ...value } : null;\n    }\n\n    get #projectedSelection() {\n        return this.#predicted.projectedSelection;\n    }\n\n    set #projectedSelection(value) {\n        this.#predicted.projectedSelection = cloneSelection(value);\n    }\n\n    get #projectedViewport() {\n        return this.#predicted.projectedViewport;\n    }\n\n    set #projectedViewport(value) {\n        this.#predicted.projectedViewport = value ? { ...value } : null;\n    }\n\n    get #observedViewportState() {\n        return this.#predicted.observedViewportState;\n    }\n\n    set #observedViewportState(value) {\n        this.#predicted.observedViewportState = value ? { ...value } : null;\n    }\n\n    #scheduleFlushPending() {\n        if (this.#closed) {\n            return;\n        }\n        if (this.#pendingFlushRunning) {\n            this.#pendingFlushAgain = true;\n            return;\n        }\n        const firstLocal = this.#pending.findIndex((entry) => localInputOpIsLocal(entry));\n        if (firstLocal < 0) {\n            this.#pendingFlushStartedAt = 0;\n            if (this.#pendingFlushTimer !== null) {\n                globalThis.clearTimeout(this.#pendingFlushTimer);\n                this.#pendingFlushTimer = null;\n            }\n            this.#pendingFlushScheduled = false;\n            return;\n        }\n        const pendingPrefix = this.#pending.slice(0, firstLocal);\n        const localSuffix = this.#pending.slice(firstLocal);\n        const hasStructuralPendingPrefix = firstLocal > 0\n            && pendingPrefix.some((entry) => localInputOpIsInFlight(entry) && localInputOpChangesLineStructure(entry));\n        const hasTypingPendingPrefix = firstLocal > 0\n            && pendingPrefix.length > 0\n            && pendingPrefix.every((entry) => localInputOpIsInFlight(entry) && localInputOpIsSingleLineInsert(entry))\n            && localSuffix.every((entry) => localInputOpIsLocal(entry) && localInputOpIsSingleLineInsert(entry));\n        if (firstLocal === 0 || (!hasStructuralPendingPrefix && !hasTypingPendingPrefix)) {\n            this.#pendingFlushStartedAt = 0;\n            if (this.#pendingFlushTimer !== null) {\n                globalThis.clearTimeout(this.#pendingFlushTimer);\n                this.#pendingFlushTimer = null;\n                this.#pendingFlushScheduled = false;\n            }\n            if (this.#pendingFlushScheduled) {\n                return;\n            }\n            this.#pendingFlushScheduled = true;\n            const enqueueMicrotask = typeof globalThis.queueMicrotask === 'function'\n                ? globalThis.queueMicrotask.bind(globalThis)\n                : (fn) => Promise.resolve().then(fn);\n            enqueueMicrotask(() => {\n                this.#pendingFlushTimer = null;\n                if (!this.#pendingFlushScheduled) {\n                    return;\n                }\n                this.#pendingFlushScheduled = false;\n                void this.#flushPending();\n            });\n            return;\n        }\n        const now = performance.now();\n        if (this.#pendingFlushStartedAt === 0) {\n            this.#pendingFlushStartedAt = now;\n        }\n        const due = Math.min(now + PENDING_FLUSH_IDLE_MS, this.#pendingFlushStartedAt + PENDING_FLUSH_MAX_AGE_MS);\n        if (this.#pendingFlushTimer !== null) {\n            globalThis.clearTimeout(this.#pendingFlushTimer);\n        }\n        this.#pendingFlushScheduled = true;\n        this.#pendingFlushTimer = globalThis.setTimeout(() => {\n            this.#pendingFlushTimer = null;\n            this.#pendingFlushStartedAt = 0;\n            if (!this.#pendingFlushScheduled) {\n                return;\n            }\n            this.#pendingFlushScheduled = false;\n            void this.#flushPending();\n        }, Math.max(0, due - now));\n    }\n\n    /* Keep one private accessor seam so predicted document state has one authoritative owner. */\n    get #predictedBody() {\n        return this.#predicted.body;\n    }\n\n    set #predictedBody(body) {\n        this.#predicted.body = body;\n    }\n\n    /* Keep one private accessor seam for the predicted body window metadata. */\n    get #serverBodyStartLine() {\n        return this.#predicted.bodyStartLine;\n    }\n\n    set #serverBodyStartLine(line) {\n        this.#predicted.bodyStartLine = line;\n    }\n\n    get #serverBodyEndLine() {\n        return this.#predicted.bodyEndLine;\n    }\n\n    set #serverBodyEndLine(line) {\n        this.#predicted.bodyEndLine = line;\n    }\n\n    get #serverTotalLines() {\n        return this.#predicted.totalLines;\n    }\n\n    set #serverTotalLines(lines) {\n        this.#predicted.totalLines = lines;\n    }\n\n    /* The browser owns one canonical record per current absolute source line. */\n    #serverLineRecord(line, create = false) {\n        let record = this.#predicted.lineRecords.get(line) ?? null;\n        if (!record && create) {\n            record = {};\n            this.#predicted.lineRecords.set(line, record);\n        }\n        return record;\n    }\n\n    #serverLineField(line, field) {\n        return this.#serverLineRecord(line)?.[field];\n    }\n\n    #setServerLineField(line, field, value) {\n        this.#serverLineRecord(line, true)[field] = value;\n    }\n\n    #deleteServerLineField(line, field) {\n        const record = this.#serverLineRecord(line);\n        if (!record || !Object.hasOwn(record, field)) {\n            return false;\n        }\n        delete record[field];\n        if (Object.keys(record).length === 0) {\n            this.#predicted.lineRecords.delete(line);\n        }\n        return true;\n    }\n\n    #clearServerLineRecords() {\n        this.#predicted.lineRecords = new Map();\n    }\n\n    #evictServerLineRecordsOutside(startLine, endLine) {\n        const released = new Set();\n        for (const line of this.#predicted.lineRecords.keys()) {\n            if (line < startLine || line >= endLine) {\n                const payloadRef = this.#serverPayloadRef(line);\n                if (payloadRef) {\n                    released.add(payloadRef);\n                }\n                this.#predicted.lineRecords.delete(line);\n            }\n        }\n        for (const payloadRef of released) {\n            if (this.#payloadRefLines(payloadRef).length !== 0 || !this.#subscriptionUUID) {\n                continue;\n            }\n            this.#recordPayloadDiagnostic('release_requested', {\n                payload_ref: payloadRef,\n                reason: 'viewport_eviction',\n                server_start_line: this.#serverBodyStartLine,\n                server_end_line: this.#serverBodyEndLine,\n            });\n            void this.#api.wsReleasePuffbookPayload(this.#subscriptionUUID, payloadRef)\n                .then(() => {\n                    this.#recordPayloadDiagnostic('release_completed', {\n                        payload_ref: payloadRef,\n                        reason: 'viewport_eviction',\n                    });\n                })\n                .catch((err) => {\n                    this.#recordPayloadDiagnostic('release_failed', {\n                        payload_ref: payloadRef,\n                        reason: 'viewport_eviction',\n                        detail: `${err?.message || err || ''}`,\n                    });\n                    pushTestingPuffbookTrace('puffbook_payload_ref_release_error', {\n                        payload_ref: payloadRef,\n                        error: `${err?.message || err || ''}`,\n                    });\n                });\n            pushTestingPuffbookTrace('puffbook_payload_ref_released', { payload_ref: payloadRef });\n        }\n    }\n\n    #serverLineEntries(field) {\n        return [...this.#predicted.lineRecords.entries()]\n            .filter(([, record]) => Object.hasOwn(record, field))\n            .map(([line, record]) => [line, record[field]]);\n    }\n\n    #serverLineFieldCount(field) {\n        return this.#serverLineEntries(field).length;\n    }\n\n    /* Report the authoritative desired viewport band used for subscribe and deferred viewport sync. */\n    #desiredProjectionViewport() {\n        return this.#projectedViewport;\n    }\n\n    /* Resolve one bootstrap half-open viewport range for subscribe, reusing the last projected range when reconnecting. */\n    #subscriptionViewportOpenArgs() {\n        const desiredViewport = this.#desiredProjectionViewport();\n        if (desiredViewport !== null) {\n            return {\n                start_line: desiredViewport.start_line,\n                end_line: desiredViewport.end_line,\n            };\n        }\n        return {\n            start_line: 0,\n            end_line: bootstrapProjectionViewportLineCount(),\n        };\n    }\n\n    /* Store one predicted body window and validate that its declared span matches the payload body. */\n    #setPredictedBodyWindow(body, absStartLine, absEndLine, totalLines) {\n        const win = validateProjectedBodyWindow(body, absStartLine, absEndLine, totalLines);\n        updateViewportWindow(this.#predicted, {\n            body: win.body,\n            start_line: win.start_line,\n            end_line: win.end_line,\n            total_lines: win.total_lines,\n        });\n        return this.#predicted.body;\n    }\n\n    /* Report whether the predicted body window currently covers the whole puffbook body rather than one viewport slice. */\n    #hasFullPredictedBodyWindow() {\n        return this.#serverBodyStartLine === 0\n            && this.#serverBodyEndLine === this.#serverTotalLines;\n    }\n\n    /* Expose one current predicted body window snapshot. */\n    #predictedBodyWindow() {\n        return {\n            body: this.#predictedBody,\n            start_line: this.#serverBodyStartLine,\n            end_line: this.#serverBodyEndLine,\n            total_lines: this.#serverTotalLines,\n        };\n    }\n\n    /* Assert that the current predicted body text and window metadata still describe the same slice. */\n    #assertPredictedBodyWindowConsistent() {\n        try {\n            validateProjectedBodyWindow(\n                this.#predictedBody,\n                this.#serverBodyStartLine,\n                this.#serverBodyEndLine,\n                this.#serverTotalLines,\n            );\n        } catch (err) {\n            recordTestingPuffbookForensic('predicted_body_window_invariant', {\n                operation: 'assertPredictedBodyWindowConsistent',\n                server_seq: this.#serverSeq,\n                server_version: this.#serverVersion,\n                body_start_line: this.#serverBodyStartLine,\n                body_end_line: this.#serverBodyEndLine,\n                total_lines: this.#serverTotalLines,\n                body_bytes: utf8ByteLength(this.#predictedBody),\n                expected_shape: 'body length matches [body_start_line, body_end_line)',\n                error: `${err?.message || err || ''}`,\n            });\n            throw err;\n        }\n    }\n\n    /* Advance the predicted body window through one text delta without reconstructing a second snapshot. */\n    #applyPredictedBodyDelta(body) {\n        const nextBody = typeof body === 'string' ? body : '';\n        const nextLines = splitBody(nextBody).length;\n        const prevLines = splitBody(this.#predictedBody).length;\n        const lineDelta = nextLines - prevLines;\n        return this.#setPredictedBodyWindow(\n            nextBody,\n            this.#serverBodyStartLine,\n            this.#serverBodyEndLine + lineDelta,\n            this.#serverTotalLines + lineDelta,\n        );\n    }\n\n    /* Convert one absolute server line into the current window-local coordinate space used by pending local spans. */\n    #serverLineToWindowLine(line) {\n        if (!Number.isInteger(line) || line < this.#serverBodyStartLine) {\n            throw new Error(\n                `Server line ${line} lies outside current body window `\n                + `[${this.#serverBodyStartLine}, ${this.#serverBodyEndLine}).`,\n            );\n        }\n        return line - this.#serverBodyStartLine;\n    }\n\n    /* Convert one viewport-local line index back into the current absolute server line number. */\n    #windowLineToServerLine(line) {\n        if (!Number.isInteger(line) || line < 0) {\n            throw new Error(`Window line ${line} out of range.`);\n        }\n        return this.#serverBodyStartLine + line;\n    }\n\n    /* Snapshot the one persistent predicted state so bounded mutations can work on a local clone. */\n    #snapshotPredictedState() {\n        return clonePredictedState(this.#predicted);\n    }\n\n    /* Publish one predicted-state transaction result back onto the runtime fields and current scene-facing line cache. */\n    #restorePredictedState(state) {\n        validatePredictedState(state);\n        this.#predicted = state;\n        this._lines = state.lines;\n    }\n\n    /* Run one bounded predicted-state transaction and commit only the final doc delta to the scene graph. */\n    #runPredictedMutation(reason, fn, { suppressDocEdits = false, preserveUndoHistory = false } = {}) {\n        return withPortalTimingScope('puffbook.run_predicted_mutation', {\n            reason,\n            pending_count: this.#pending.length,\n        }, () => {\n            const txn = beginPredictedMutation({\n                reason,\n                predicted: this.#snapshotPredictedState(),\n                localOps: this.#pending,\n                baseBody: this.#pendingBaseBody,\n            });\n            fn(txn);\n            const out = finishPredictedMutation(txn);\n            this.#assertMutationOutputInvariant(\n                `runPredictedMutation:${reason}`,\n                out.localOpsNext.length === 0 ? out.predictedNext.body : out.baseBodyNext,\n                out.localOpsNext,\n                out.predictedNext.body,\n            );\n            const rebasedUiState = rebaseProjectedUiStateThroughSpans(txn.before.body, out.textSpans, {\n                projectedCursor: this.#projectedCursor,\n                projectedSelection: this.#projectedSelection,\n                projectedViewport: this.#projectedViewport,\n                observedViewportState: this.#observedViewportState,\n            }, txn.before.bodyStartLine);\n            const viewportChanged = !sameProjectionViewport(this.#projectedViewport, rebasedUiState.projectedViewport);\n            const rebasedUndoState = preserveUndoHistory\n                ? { editHistory: this._editHistory, undoCoalesce: this.#undoCoalesce }\n                : rebaseUndoStateThroughSpans(txn.before.body, out.textSpans, {\n                    editHistory: this._editHistory,\n                    undoCoalesce: this.#undoCoalesce,\n                }, txn.before.bodyStartLine);\n            const rebasedAmend = preserveUndoHistory ? this.#pendingAmend\n                : rebasePendingAmendThroughSpans(txn.before.body, out.textSpans, this.#pendingAmend);\n            const touchedOutputLines = out.docEdits\n                .filter((edit) => edit?.kind === 'line_output' && Number.isInteger(edit?.line) && edit.line >= 0)\n                .map((edit) => edit.line);\n            if (touchedOutputLines.length > 0) {\n                const sample = Array.from(new Set(touchedOutputLines)).sort((a, b) => a - b).slice(0, 12);\n                pushTestingPortalTimingTrace('puffbook_predicted_mutation', {\n                    reason,\n                    edit_count: out.docEdits.length,\n                    line_output_count: touchedOutputLines.length,\n                    touched_lines_sample: sample,\n                    before_rows: sample.map((line) => this.#describePredictedMutationRow(txn.before, line)),\n                    after_rows: sample.map((line) => this.#describePredictedMutationRow(out.predictedNext, line)),\n                });\n            }\n            if (out.textSpans.length > 0) out.predictedNext.sourceDrag = null;\n            this.#restorePredictedState(out.predictedNext);\n            this.#pending = out.localOpsNext;\n            this.#pendingBaseBody = out.localOpsNext.length === 0 ? out.predictedNext.body : out.baseBodyNext;\n            this.#rebuildPendingQueueForPrediction();\n            this.#projectedCursor = rebasedUiState.projectedCursor;\n            this.#projectedSelection = rebasedUiState.projectedSelection;\n            this.#projectedViewport = rebasedUiState.projectedViewport;\n            if (viewportChanged) {\n                this.#viewportDirty = true;\n                void this.#flushViewport();\n            }\n            this.#observedViewportState = rebasedUiState.observedViewportState;\n            this._editHistory = rebasedUndoState.editHistory;\n            if (!preserveUndoHistory && out.textSpans.length > 0) this.#redoHistory = [];\n            this.#undoCoalesce = rebasedUndoState.undoCoalesce;\n            this.#pendingAmend = rebasedAmend;\n            if (!suppressDocEdits) {\n                this.#stageDocEdits(out.docEdits);\n            }\n            return out;\n        });\n    }\n\n    /* Summarise one predicted row around a mutation so live traces can pinpoint where a table preview becomes hidden. */\n    #describePredictedMutationRow(state, lineNum) {\n        if (!state || !Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        const line = state.lines?.[lineNum] ?? null;\n        const serverLine = state.bodyStartLine + lineNum;\n        const cell = state.outputCells?.get(serverLine) ?? null;\n        return {\n            line: lineNum,\n            server_line: serverLine,\n            has_output_cell: !!cell,\n            cell_block_type: cell?.block_type ?? null,\n            cell_state: cell?.state ?? null,\n            line_block_type: line?.output_block_type ?? null,\n            line_state: line?.output_state ?? null,\n            preview_kind: line?.output_preview_kind ?? null,\n            has_ptrless: line?.output_ptrless != null,\n            input_text: typeof line?.input_text === 'string' ? truncateForLog(line.input_text, 48) : null,\n        };\n    }\n\n    /* Open or reopen one puffbook subscription and ratify the document as live_current on the first baseline. */\n    async open() {\n        try {\n            const openStartMS = performance.now();\n            const recovery = this.#snapshotTransportRecovery();\n            const desiredViewport = this.#subscriptionViewportOpenArgs();\n            const requestedViewport = this.#recoveryViewportOpenArgs(recovery);\n            pushTestingPuffbookTrace('puffbook_open_start', {\n                file_ref: this.fileRef?.path ?? '',\n                read_only: this.#readOnly,\n                requested_start_line: requestedViewport.start_line,\n                requested_end_line: requestedViewport.end_line,\n            });\n            if (!PORTAL_MIN_BUILD) {\n                console.log('Puffbook document opening', {\n                    file_ref: this.fileRef,\n                    read_only: this.#readOnly,\n                    requested_viewport: requestedViewport,\n                });\n            }\n            const opened = await this.#api.wsOpenPuffbook(this.fileRef, {\n                onEvent: ({ body, replay }) => this.#handleSubscriptionEvent(body, replay),\n                onClose: (err) => this.#handleSubscriptionClose(err),\n                onComputeAvailability: (available) => this.#handleComputeAvailability(available),\n            }, requestedViewport);\n            if (this.#closed) {\n                await this.#api.wsClosePuffbook(opened.subscription_uuid);\n                return;\n            }\n            this.#cancelReconnectRetry(true);\n            this.#markLifecycleLiveCurrent(this.#reopening ? 'reconnect_opened' : 'initial_opened');\n            this.#subscriptionUUID = opened.subscription_uuid;\n            this.#recordingSubscriptionGeneration++;\n            this.#serverSeq = opened.seq;\n            this.#serverVersion = opened.version;\n            this.#predictedBody = this.#setPredictedBodyWindow(\n                opened.body,\n                opened.body_start_line,\n                opened.body_end_line,\n                opened.total_lines,\n            );\n            this.#pending = [];\n            if (this.#projectedSelection === null) {\n                this.#projectedSelection = selectionAt({ line: this.#serverBodyStartLine, col: 0 });\n            }\n            this.#pendingBaseBody = this.#predictedBody;\n            this.#clearServerLineRecords();\n            this.#payloadLoads = new Map();\n            this.#payloadDebug = new Map();\n            this.#testingProjectionIngest = null;\n            this.#rapidOff = null;\n            this.#projectedViewport = requireProjectionViewport(opened.start_line, opened.end_line);\n            this.#viewportDirty = false;\n            this.#viewportInFlight = false;\n            this.#viewportTerminalError = null;\n            this.#observedViewportState = null;\n            this.#assertPredictedBodyWindowConsistent();\n            this.#installProjectionSnapshotOutputs(opened.outputs);\n            this.#restorePredictedStateAfterTransportRecovery(recovery);\n            // The open response establishes the document state consumed by\n            // queued stream frames. Drain only after that state is complete.\n            this.#api.drainWSStreamQueuedEvents(opened.subscription_uuid);\n            if (!sameProjectionViewport(requestedViewport, desiredViewport)) {\n                this.#viewportDirty = true;\n                void this.#flushViewport();\n            }\n            pushTestingPuffbookTrace('puffbook_open_response', {\n                subscription_uuid: opened.subscription_uuid,\n                version: opened.version,\n                body_bytes: textEncoder.encode(opened.body).length,\n                output_line_count: this.#serverLineFieldCount('lineState'),\n                unsettled: this.#derivedPendingCount(),\n                duration_ms: Number((performance.now() - openStartMS).toFixed(3)),\n            });\n            if (!PORTAL_MIN_BUILD) {\n                console.log('Puffbook document opened', {\n                file_ref: this.fileRef,\n                subscription_uuid: opened.subscription_uuid,\n                version: opened.version,\n                body_bytes: textEncoder.encode(opened.body).length,\n                body_start_line: opened.body_start_line ?? 0,\n                body_end_line: opened.body_end_line ?? 0,\n                total_lines: opened.total_lines ?? splitBody(opened.body).length,\n                start_line: opened.start_line ?? 0,\n                end_line: opened.end_line ?? 0,\n            });\n            }\n            this.#refreshProjectedLinesFromState();\n            this.#onLoadReady?.(this);\n            // Mount the source document immediately, but do not report the initial\n            // presentation complete until its data lane has settled as well.\n            void this.#attachInitialDataLane(opened.subscription_uuid);\n            void this.#flushPending();\n        } catch (err) {\n            console.error('Puffbook subscription failed', err);\n            this.#handleOpenFailure(err);\n            this.#onLoadError?.(err, this);\n        } finally {\n            this.#reopening = false;\n        }\n    }\n\n    /* Settle the initial data lane after the source baseline is mounted so owners can retire route loading without exposing a half-connected document. */\n    async #attachInitialDataLane(subscriptionUUID) {\n        try {\n            await this.#api.wsAttachPuffbookData(subscriptionUUID);\n        } catch (err) {\n            if (!this.#closed) {\n                console.warn('Puffbook data websocket attachment failed; document remains mounted.', err);\n            }\n        }\n        if (!this.#closed && this.#subscriptionUUID === subscriptionUUID) {\n            this.#onInitialPresentationReady?.(this);\n        }\n    }\n\n    /* Begin local teardown immediately and finish transport close asynchronously if the stream is still live. */\n    close() {\n        this.#predicted.sourceDrag = null;\n        this.#clearSourceInputQueue();\n        this.#composition = null;\n        const state = this.#lifecycle.state();\n        if (state === PUFFBOOK_LIFECYCLE.CLOSING || state === PUFFBOOK_LIFECYCLE.CLOSED) {\n            return;\n        }\n        this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.CLOSING, 'close_requested');\n        this.#closed = true;\n        this._emitChange();\n        this.#cancelAmendQueue('Puffbook closed before its amendment completed.');\n        this.#cancelReconnectRetry(true);\n        this.#cancelViewportSyncTimer();\n        if (!this.#subscriptionUUID) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.CLOSED, 'close_without_subscription');\n            return;\n        }\n        const sub = this.#subscriptionUUID;\n        this.#subscriptionUUID = null;\n        if (!PORTAL_MIN_BUILD) {\n            console.log('Puffbook document closing', {\n                file_ref: this.fileRef,\n                subscription_uuid: sub,\n            });\n        }\n        void this.#api.wsDetachPuffbookData(sub)\n            .catch((err) => {\n                const msg = `${err?.message || err || ''}`;\n                if (msg.includes('unknown puffbook data attachment') || msg.includes('WebSocket data connection closed.')) {\n                    return;\n                }\n                console.error('Failed to detach puffbook data session', err);\n            })\n            .finally(() => this.#api.wsClosePuffbook(sub)\n            .catch((err) => {\n                const msg = `${err?.message || err || ''}`;\n                if (msg.includes('unknown puffbook subscription') || msg.includes('WebSocket connection closed.')) {\n                    return;\n                }\n                console.error('Failed to close puffbook subscription', err);\n            })\n            .finally(() => {\n                if (this.#lifecycle.state() === PUFFBOOK_LIFECYCLE.CLOSING) {\n                    this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.CLOSED, 'close_transport_finished');\n                }\n            }));\n    }\n\n    /* Report whether this document has entered its terminal closed lifecycle. */\n    isClosed() {\n        return this.#closed;\n    }\n\n    /* Return the authoritative frontend lifecycle state for this puffbook. */\n    lifecycleState() {\n        return this.#lifecycle.state();\n    }\n\n    /* Return the current lifecycle snapshot so owners can project one shared state machine directly. */\n    lifecycleSnapshot() {\n        return this.#lifecycle.snapshot();\n    }\n\n    /* Report whether the current lifecycle state permits a mounted puffbook screen. */\n    canMountScreen() {\n        return this.#lifecycle.canMountScreen();\n    }\n\n    matchesFileRef(ref) {\n        return ref?.lake === this.fileRef?.lake\n            && ref?.branch === this.fileRef?.branch\n            && ref?.path === this.fileRef?.path;\n    }\n\n    /* Report one predicted revision head, layering pending locals over the newest seen authority. */\n    currentRevision() {\n        return currentRevisionFromPending(this.#pending, this.#serverVersion);\n    }\n\n    get read_only() {\n        return this.#readOnly;\n    }\n\n    get api() {\n        return this.#api;\n    }\n\n    // Damon targets the open document rather than a selected InputCell. The\n    // existing wire contract uses the document start when no caret is supplied.\n    assistantDocumentSnapshot() {\n        if (!this.#subscriptionUUID) {\n            throw new Error('Puff assistant requires an open puffbook subscription.');\n        }\n        return {\n            subscription_uuid: this.#subscriptionUUID,\n            base_version: this.#serverVersion,\n            cursor_line: 0,\n            cursor_col: 0,\n            selection_line: -1,\n            selection_start: 0,\n            selection_end: 0,\n            selected_text: '',\n            body: this.#predictedBody,\n        };\n    }\n\n    /* The full range collection is authoritative; scalar fields project the primary range. */\n    sourceSelectionState() {\n        return cloneSelection(this.#projectedSelection ?? selectionAt({\n            line: this.#serverBodyStartLine + this.#projectedCursor.line,\n            col: this.#projectedCursor.col,\n        }));\n    }\n\n    // Store the authoritative ranges and derive the window-local primary cursor.\n    // Cancellation and projection publication belong to the calling operation.\n    #storeSourceSelection(selection) {\n        const next = normaliseSelection(validateSelection(selection));\n        const lines = this.#predictedBody.split('\\n');\n        for (const range of next.ranges) for (const point of [range.anchor, range.focus]) {\n            const text = lines[point.line - this.#serverBodyStartLine];\n            if (point.line >= this.#serverTotalLines || (text !== undefined &&\n                (point.col > text.length || (point.col > 0 && text.charCodeAt(point.col) >= 0xdc00 && text.charCodeAt(point.col) <= 0xdfff)))) {\n                throw new Error(`Selection endpoint outside document source: ${JSON.stringify(point)}`);\n            }\n        }\n        this.#projectedSelection = next;\n        const focus = primaryFocus(next);\n        this.#projectedCursor = { line: focus.line - this.#serverBodyStartLine, col: focus.col };\n    }\n\n    #clearSourceInputQueue() {\n        this.#sourceInputQueue = [];\n        this.#sourceDemand = null;\n    }\n\n    setSourceSelection(selection, { cancelPending = true, sourceDrag = null } = {}) {\n        // Validate before retiring pending work or publishing new selection.\n        this.#storeSourceSelection(selection);\n        if (cancelPending) {\n            this.#clearSourceInputQueue();\n            if (this.#composition) this.#composition = { ...this.#composition, ended: true };\n        }\n        this.#predicted.sourceDrag = sourceDrag;\n        this.#undoCoalesce = null;\n        this.#broadcastProjectionEdits([]);\n        this._emitChange();\n    }\n\n    selectedSourceText() {\n        return selectedSource(this.#predictedBody, this.sourceSelectionState(), this.#serverBodyStartLine);\n    }\n\n    addSourceCaret(point) {\n        const baseSelection = this.sourceSelectionState();\n        baseSelection.ranges = baseSelection.ranges.map(range => ({ anchor: { ...range.focus }, focus: { ...range.focus } }));\n        const selection = selectionAt(point);\n        selection.verticalColumn = point.col;\n        this.setSourceSelection(selectionWithCaret(baseSelection, point), { sourceDrag: { kind: 'carets', baseSelection, selection } });\n    }\n\n    beginSourceSelectionDrag(point) {\n        const baseSelection = this.sourceSelectionState();\n        const selection = selectionAt(point);\n        requireSelectionSource(this.#predictedBody, selection, this.#serverBodyStartLine);\n        // The click only starts capture; a non-empty drag adds the new range.\n        this.setSourceSelection(baseSelection, { sourceDrag: {\n            kind: 'selection', baseSelection, selection,\n        } });\n    }\n\n    sourceDragFocus() {\n        return { ...primaryFocus(this.#predicted.sourceDrag.selection) };\n    }\n\n    hasSourceDrag() {\n        return this.#predicted.sourceDrag !== null;\n    }\n\n    extendSourceDrag(point, columns) {\n        this.applyKeyDown({ key: 'extend_source_drag', line: point.line, col: point.col, columns }, [0, 0], null, { source: 'view' });\n    }\n\n    finishSourceDrag(cancelPending = false) {\n        if (cancelPending) {\n            this.#clearSourceInputQueue();\n        }\n        if (!cancelPending && this.#predicted.sourceDrag !== null && this.#sourceInputQueue.some(command => command.key === 'extend_source_drag')) {\n            this.#predicted.sourceDrag.ending = true;\n        } else this.#predicted.sourceDrag = null;\n    }\n\n    copySourceSelection(evt) {\n        if (this.#sourceInputQueue.length) {\n            this.#sourceInputQueue.push(snapshotSourceInput(evt));\n            return;\n        }\n        let text;\n        try { text = this.selectedSourceText(); }\n        catch (error) {\n            if (!(error instanceof SelectionSourceRequired)) throw error;\n            this.#queueSourceInput({ key: evt.key }, error.line);\n            return;\n        }\n        if (text === '') return;\n        const selection = JSON.stringify(this.sourceSelectionState());\n        const body = this.#predictedBody;\n        const cut = () => {\n            if (evt.key === 'cut' && !this.#closed && body === this.#predictedBody\n                && selection === JSON.stringify(this.sourceSelectionState())) {\n                this.applyKeyDown({ key: 'cut' }, [0, 0], null, { source: 'view' });\n            }\n        };\n        if (evt.writeClipboard) { evt.writeClipboard(text); cut(); }\n        else void navigator.clipboard.writeText(text).then(cut)\n            .catch(error => console.error('Could not copy selected source; source was preserved.', error));\n    }\n\n    #queueSourceInput(evt, line) {\n        this.#sourceInputQueue.push(snapshotSourceInput(evt));\n        const ranges = this.sourceSelectionState().ranges;\n        const endpoints = ranges.flatMap(r => [r.anchor.line, r.focus.line]);\n        const target = evt.key === 'extend_source_drag' ? evt.line : line;\n        const all = (evt.ctrlKey || evt.metaKey) && evt.key?.toLowerCase() === 'a';\n        this.#sourceDemand = all ? { start_line: 0, end_line: this.#serverTotalLines }\n            : { start_line: Math.min(line, target, ...endpoints, this.#sourceDemand?.start_line ?? Infinity),\n                end_line: Math.max(line + 1, target + 1, ...endpoints.map(endpoint => endpoint + 1), this.#sourceDemand?.end_line ?? -Infinity) };\n        this.#viewportDirty = true;\n        void this.#flushViewport();\n    }\n\n    #resumeSourceInput() {\n        if (this.#sourceInputQueue.length === 0) return;\n        const commands = this.#sourceInputQueue;\n        this.#clearSourceInputQueue();\n        for (const command of commands) {\n            // A source edit ends the gesture; its queued pointer updates no\n            // longer have a starting state and must not recreate that gesture.\n            if (command.key === 'extend_source_drag' && this.#predicted.sourceDrag === null) continue;\n            if (command.inputType) this.applySourceBeforeInput(command);\n            else if (command.key === 'compositionend') this.finishSourceComposition(command.data);\n            else if (command.key === 'copy' || command.key === 'cut') this.copySourceSelection(command);\n            else this.applyKeyDown(command, [0, 0], null, { source: 'view' });\n        }\n        if (this.#sourceInputQueue.length === 0 && this.#predicted.sourceDrag?.ending) this.#predicted.sourceDrag = null;\n        this._emitChange();\n    }\n\n    applySourceBeforeInput(evt) {\n        if (!evt || typeof evt.inputType !== 'string') return false;\n        if (this.#readOnly) return true;\n        if (this.#composition?.ended) {\n            const committed = this.#composition.text;\n            this.#composition = null;\n            if (['insertFromComposition', 'insertText'].includes(evt.inputType) && evt.data === committed) return true;\n        }\n        const compositionInput = ['insertCompositionText', 'insertFromComposition'].includes(evt.inputType);\n        if (compositionInput && evt.inputType === 'insertFromComposition' && this.#composition?.text === evt.data) {\n            this.finishSourceComposition(evt.data);\n            return true;\n        }\n        const key = ['deleteContentBackward', 'deleteContentForward'].includes(evt.inputType)\n            ? evt.inputType === 'deleteContentBackward' ? 'Backspace' : 'Delete'\n            : ['insertText', 'insertCompositionText', 'insertFromComposition', 'insertFromPaste'].includes(evt.inputType) ? 'paste'\n                : evt.inputType === 'insertLineBreak' || evt.inputType === 'insertParagraph' ? 'Enter' : null;\n        if (key === null) return false;\n        const command = { inputType: evt.inputType, data: typeof evt.data === 'string'\n            ? evt.data : evt.dataTransfer?.getData('text/plain') ?? '' };\n        if (this.#sourceInputQueue.length) {\n            this.#sourceInputQueue.push(snapshotSourceInput(command));\n            return true;\n        }\n        try { requireSelectionSource(this.#predictedBody, this.sourceSelectionState(), this.#serverBodyStartLine); }\n        catch (error) {\n            if (!(error instanceof SelectionSourceRequired)) throw error;\n            this.#queueSourceInput(command, error.line);\n            return true;\n        }\n        if (compositionInput && !this.#composition) {\n            this.#composition = { text: '', historyStart: this._editHistory.length };\n        }\n        if (compositionInput && this.#composition) {\n            const text = typeof evt.data === 'string' ? evt.data : '';\n            const historyStart = this.#composition.historyStart;\n            this.applyKeyDown({ key: 'paste', clipboardData: text }, [0, 0], null, { source: 'view', compositionText: text });\n            if (this._editHistory.length > historyStart + 1) {\n                const entries = this._editHistory.splice(historyStart + 1);\n                this._editHistory[historyStart].undo_spans.unshift(...entries.toReversed().flatMap(e => e.undo_spans));\n            }\n            this.#composition.text = text;\n            if (evt.inputType === 'insertFromComposition') this.finishSourceComposition(text);\n            return true;\n        }\n        this.applyKeyDown({ key, clipboardData: typeof evt.data === 'string' ? evt.data : evt.dataTransfer?.getData('text/plain') ?? '' },\n            [0, 0], null, { source: 'view' });\n        return true;\n    }\n\n    finishSourceComposition(text) {\n        if (this.#sourceInputQueue.length) {\n            this.#sourceInputQueue.push(snapshotSourceInput({ key: 'compositionend', data: text }));\n            return;\n        }\n        if (!this.#composition || this.#composition.ended) return;\n        const committed = this.#composition;\n        if (text === '' && this._editHistory.length > this.#composition.historyStart) {\n            this.undo();\n            this.#redoHistory = [];\n        } else {\n            const selection = this.sourceSelectionState();\n            selection.ranges = selection.ranges.map(r => ({ anchor: { ...r.focus }, focus: { ...r.focus } }));\n            this.#storeSourceSelection(selection);\n        }\n        this.#composition = text === '' ? null : { ...committed, ended: true };\n        this.#broadcastProjectionEdits([]);\n        this._emitChange();\n    }\n\n    projectionFocusState() {\n        const selection = this.sourceSelectionState();\n        const primary = selection.ranges[selection.primaryIndex];\n        const sameLine = primary.anchor.line === primary.focus.line;\n        return {\n            cursor_line: primary.focus.line - this.#serverBodyStartLine,\n            cursor_col: primary.focus.col,\n            has_selection: selection.ranges.some(r => !rangeIsEmpty(r)),\n            selection_line: sameLine ? primary.focus.line - this.#serverBodyStartLine : -1,\n            selection_start: sameLine ? Math.min(primary.anchor.col, primary.focus.col) : 0,\n            selection_end: sameLine ? Math.max(primary.anchor.col, primary.focus.col) : 0,\n            source_selection: selection,\n        };\n    }\n\n    /* Expose one visible-band snapshot so DocumentView can restore the last server-owned viewport seam. */\n    projectionViewportBand() {\n        if (this.#projectedViewport === null) {\n            return null;\n        }\n        return {\n            start_line: this.#projectedViewport.start_line,\n            end_line: this.#projectedViewport.end_line,\n        };\n    }\n\n    /* Convert a DocumentView-local row index to the absolute line used by the subscription API. */\n    serverLineForWindowLine(lineNum) {\n        return this.#windowLineToServerLine(lineNum);\n    }\n\n    /* Accept one DocumentView focus report and retain it for the next mutate/amend or resubscribe snapshot. */\n    observeProjectionFocus(state) {\n        if (state?.source_selection) {\n            this.setSourceSelection(state.source_selection);\n            return true;\n        }\n        // A view focus report is a presentation report once document ranges exist.\n        // Pointer and keyboard changes enter setSourceSelection/applyKeyDown.\n        if (this.#projectedSelection !== null) return false;\n        const nextCursor = requireProjectionCursor(state?.cursor_line, state?.cursor_col);\n        const start = state?.selection_range?.[0] ?? state?.selection_start;\n        const end = state?.selection_range?.[1] ?? state?.selection_end;\n        this.#projectedCursor = nextCursor;\n        this.#projectedSelection = state?.has_selection === true\n            ? requireProjectionSelection(this.#serverBodyStartLine + nextCursor.line, start, end) : null;\n        return true;\n    }\n\n    /* Accept one DocumentView warm-band report and flush it lazily over the projection control channel. */\n    observeProjectionViewport(state) {\n        const currentViewport = this.#projectedViewport;\n        const nextViewport = projectionViewportFromBands(state, currentViewport);\n        this.#observedViewportState = copyProjectionViewportState(state);\n        this.#viewportObservedAtMS = Date.now();\n        this.#scheduleViewportSyncTimer();\n        return !sameProjectionViewport(currentViewport, nextViewport);\n    }\n\n\n    render() {\n        // A full projection already contains every queued state transition.\n        // Do not replay pre-mount deltas against the newly rendered blocks.\n        this.#queuedEdits = [];\n        const lines = this._lines;\n        const blocks = new Array(lines.length * 2);\n        for (let i = 0; i < lines.length; i++) {\n            const [inBlk, outBlk] = this.#renderLine(lines[i]);\n            blocks[i * 2] = inBlk;\n            blocks[i * 2 + 1] = outBlk;\n        }\n        return blocks;\n    }\n\n    renderLine(lineNum) {\n        const line = this._lines[lineNum];\n        if (!line) {\n            throw new Error(`Cannot render line ${lineNum}; out of bounds.`);\n        }\n        return this.#renderLine(line);\n    }\n\n    output(line) {\n        return this._lines[line]?.output_ptrless ?? null;\n    }\n\n    /* Map one current window-local display row back to its absolute source line number. */\n    displayLineNumber(line) {\n        return this.#windowLineToServerLine(line);\n    }\n\n    /* Map one absolute source line back into the current window-local row space for DocumentView restore. */\n    windowLineForDisplayLine(line) {\n        if (!Number.isInteger(line) || line < this.#serverBodyStartLine || line >= this.#serverBodyEndLine) {\n            return -1;\n        }\n        return this.#serverLineToWindowLine(line);\n    }\n\n    getCurrentOutputText() {\n        return this._lines.map(line => line?.output_text);\n    }\n\n    getWholePuffbookContent() {\n        return this.#currentBody();\n    }\n\n    /* A source-only identity: output publication and viewport movement do not\n       invalidate search; local overlays are expressed in absolute coordinates. */\n    sourceTextToken() {\n        return JSON.stringify([this.#closed, this.#recordingSubscriptionGeneration, this.#serverVersion,\n            this.#pending.map(op => [op.span.start_line + this.#serverBodyStartLine,\n                op.span.start_col, op.span.deleted_text, op.span.inserted_text])]);\n    }\n\n    /* Acquire a coherent complete source without installing another editable\n       document or replacing the live viewport projection. */\n    async completeSourceSnapshot() {\n        for (let attempt = 0; attempt < 3; attempt++) {\n            if (this.#closed) throw new Error('Cannot search a closed Puffbook.');\n            const token = this.sourceTextToken();\n            if (this.#hasFullPredictedBodyWindow()) return { token, body: this.#predictedBody };\n            const version = this.#serverVersion;\n            const startLine = this.#serverBodyStartLine;\n            const pending = cloneLocalInputTextOps(this.#pending);\n            const snap = await this.#api.wsSnapshotPuffbook(this.fileRef);\n            if (token !== this.sourceTextToken() || snap.version !== version) continue;\n            return { token, body: completePredictedSourceSnapshot(snap, pending, startLine).body };\n        }\n        throw new Error('Document changed while search was loading. Type again to retry.');\n    }\n\n    /* Search uses current predicted source coordinates, including pending local\n       edits, just like the observed viewport. It never changes selection. */\n    setSearchSourceDemand(line = null) {\n        const totalLines = this.#predicted.totalLines;\n        if (line !== null && (!Number.isInteger(line) || line < 0 || line >= totalLines)) {\n            throw new Error(`Search source line outside Puffbook: ${line}.`);\n        }\n        const demand = line === null ? null : {\n            start_line: Math.max(0, line - 32),\n            end_line: Math.min(totalLines, line + 33),\n        };\n        if (sameProjectionViewport(this.#searchSourceDemand, demand)) return;\n        this.#searchSourceDemand = demand;\n        // A retraction must be sent even when it equals the last server echo:\n        // an earlier demand may already be in flight beyond that echoed band.\n        if (!this.#closed) {\n            this.#viewportDirty = true;\n            void this.#flushViewport();\n        }\n    }\n\n    /* Freeze the browser's authoritative base and optimistic overlay at recording start. */\n    recordingStateSnapshot() {\n        return {\n            format: 'evil-portal-puffbook-recording-state-v1',\n            source_selection: this.sourceSelectionState(),\n            file_ref: { ...this.fileRef },\n            source_version: this.#serverVersion,\n            subscription_generation: this.#recordingSubscriptionGeneration,\n            recording_instance_id: this.#puffbookInstanceID,\n            acknowledged_body: this.#pendingBaseBody,\n            predicted_body: this.#predictedBody,\n            pending_ops: this.#pending.map((op) => ({\n                transport_state: op?.kind === 'input_text_edit' ? localInputTransportState(op) : null,\n                edit_ordinal: Number.isInteger(op?.edit_ordinal) ? op.edit_ordinal : null,\n                accepted_version: Number.isInteger(op?.accepted_version) ? op.accepted_version : null,\n                start_line: op?.span?.start_line ?? null,\n                start_col: op?.span?.start_col ?? null,\n                deleted_text: op?.span?.deleted_text ?? '',\n                inserted_text: op?.span?.inserted_text ?? '',\n            })),\n            body_window: {\n                start_line: this.#serverBodyStartLine,\n                end_line: this.#serverBodyEndLine,\n                total_lines: this.#serverTotalLines,\n                full: this.#hasFullPredictedBodyWindow(),\n            },\n        };\n    }\n\n    /* Capture a whole-document base at one known server version, then retain any\n       optimistic local edits over that base.  A bounded retry handles an edit\n       acknowledgement racing the snapshot request without silently saving a\n       viewport-only recording. */\n    async recordingFullStateSnapshot({ freezeAtCall = false } = {}) {\n        for (let attempt = 0; attempt < 3; attempt++) {\n            const state = this.recordingStateSnapshot();\n            if (state.body_window.full) {\n                return state;\n            }\n            const pending = cloneLocalInputTextOps(this.#pending);\n            const snap = await this.#api.wsSnapshotPuffbook(this.fileRef);\n            const current = this.recordingStateSnapshot();\n            if (snap.version !== state.source_version) {\n                if (freezeAtCall) {\n                    throw new Error(\n                        `Puffbook advanced from version ${state.source_version} to ${snap.version} while its document epoch was captured.`,\n                    );\n                }\n                continue;\n            }\n            if (!freezeAtCall && (current.source_version !== state.source_version\n                || current.predicted_body !== state.predicted_body\n                || JSON.stringify(current.pending_ops) !== JSON.stringify(state.pending_ops))) {\n                continue;\n            }\n            return completePuffbookRecordingState(state, pending, snap);\n        }\n        throw new Error('Puffbook changed while its recording snapshot was being prepared; retry the recording.');\n    }\n\n    recordingReplayReadiness() {\n        return {\n            file_ref: { ...this.fileRef },\n            subscription_generation: this.#recordingSubscriptionGeneration,\n            recording_instance_id: this.#puffbookInstanceID,\n            unsettled: this.#derivedPendingCount(),\n            pending_edits: this.#pending.length,\n            subscription_open: this.#subscriptionUUID !== null,\n        };\n    }\n\n    recordingReplayCheckpoint() {\n        return {\n            file_ref: { ...this.fileRef },\n            subscription_generation: this.#recordingSubscriptionGeneration,\n            recording_instance_id: this.#puffbookInstanceID,\n            predicted_body: this.#predictedBody,\n            pending_edits: this.#pending.length,\n        };\n    }\n\n    async copyWholePuffbookToClipboard() {\n        if (!document.hasFocus()) {\n            return false;\n        }\n        if (this.#hasFullPredictedBodyWindow()) {\n            await navigator.clipboard.writeText(this.getWholePuffbookContent());\n            return true;\n        }\n        const snap = await this.#api.wsSnapshotPuffbook(this.fileRef);\n        await navigator.clipboard.writeText(snap.body);\n        return true;\n    }\n\n    testingSummary() {\n        const pendingOps = this.#pending.map((op) => ({\n            transport_state: op?.kind === 'input_text_edit' ? localInputTransportState(op) : null,\n            edit_ordinal: Number.isInteger(op?.edit_ordinal) ? op.edit_ordinal : null,\n            accepted_version: Number.isInteger(op?.accepted_version) ? op.accepted_version : null,\n            start_line: op?.span?.start_line ?? null,\n            start_col: op?.span?.start_col ?? null,\n            deleted_text: op?.span?.deleted_text ?? null,\n            inserted_text: op?.span?.inserted_text ?? null,\n        }));\n        const outputRows = this._lines.map((line, lineNum) => ({\n            line: lineNum,\n            server_line: this.#windowLineToServerLine(lineNum),\n            resolved: this.#serverLineRecord(this.#windowLineToServerLine(lineNum))?.cell !== undefined,\n            pending: this.#serverLineState(this.#windowLineToServerLine(lineNum))?.kind === SERVER_LINE_STATE.TERMINAL_PENDING,\n            tracked_row: testingRowTracked(\n                this.#serverLineState(this.#windowLineToServerLine(lineNum)),\n                this.#serverLineRecord(this.#windowLineToServerLine(lineNum))?.cell !== undefined,\n                line,\n            ),\n            state: testingOutputState(this.#serverLineState(this.#windowLineToServerLine(lineNum)), line),\n            visible: line?.output_block_type !== 'hidden',\n            block_type: line?.output_block_type ?? 'hidden',\n            preview: previewOutputText(line?.output_text ?? ''),\n            payload_debug: this.#payloadDebug.get(this.#windowLineToServerLine(lineNum)) ?? null,\n        }));\n        return {\n            file_ref: this.fileRef,\n            subscription_uuid: this.#subscriptionUUID,\n            server_seq: this.#serverSeq,\n            server_version: this.#serverVersion,\n            current_revision: this.currentRevision(),\n            body: this.#predictedBody,\n            pending_base_body: this.#pendingBaseBody,\n            source_version: this.#serverVersion,\n            body_start_line: this.#serverBodyStartLine,\n            body_end_line: this.#serverBodyEndLine,\n            total_lines: this.#serverTotalLines,\n            line_count: this._lines.length,\n            output_rows: outputRows,\n            unsettled: this.#derivedPendingCount(),\n            pending_edits: this.#pending.length,\n            source_selection: this.sourceSelectionState(),\n            pending_selection_inputs: this.#sourceInputQueue.length,\n            pending_ops: pendingOps,\n            subscription_open: this.#subscriptionUUID !== null,\n            read_only: this.#readOnly,\n            closed: this.#closed,\n            lifecycle: this.#lifecycle.snapshot(),\n            projection_ingest: this.#testingProjectionIngest,\n            testing_churn: this.testingChurnSummary(),\n            testing_line_changes: this.testingLineChangeSummary(),\n        };\n    }\n\n    /* Report one retained puffbook/output summary so leak probes can separate model state from live UI cells. */\n    testingRetentionSummary() {\n        const outputRows = this._lines.map((line, lineNum) => ({\n            line: lineNum,\n            server_line: this.#windowLineToServerLine(lineNum),\n            resolved: this.#serverLineRecord(this.#windowLineToServerLine(lineNum))?.cell !== undefined,\n            pending: this.#serverLineState(this.#windowLineToServerLine(lineNum))?.kind === SERVER_LINE_STATE.TERMINAL_PENDING,\n            tracked_row: testingRowTracked(\n                this.#serverLineState(this.#windowLineToServerLine(lineNum)),\n                this.#serverLineRecord(this.#windowLineToServerLine(lineNum))?.cell !== undefined,\n                line,\n            ),\n            block_type: line?.output_block_type ?? 'hidden',\n            state: testingOutputState(this.#serverLineState(this.#windowLineToServerLine(lineNum)), line),\n            has_ptrless: !!line?.output_ptrless,\n            text_length: typeof line?.output_text === 'string' ? line.output_text.length : 0,\n            has_preview_hints: !!line?.output_preview_hints,\n            payload_debug: this.#payloadDebug.get(this.#windowLineToServerLine(lineNum)) ?? null,\n        }));\n        const byBlockType = {};\n        const byState = {};\n        let ptrlessOutputs = 0;\n        let previewHintOutputs = 0;\n        let outputTextBytes = 0;\n        for (const row of outputRows) {\n            byBlockType[row.block_type] = (byBlockType[row.block_type] ?? 0) + 1;\n            byState[row.state] = (byState[row.state] ?? 0) + 1;\n            ptrlessOutputs += row.has_ptrless ? 1 : 0;\n            previewHintOutputs += row.has_preview_hints ? 1 : 0;\n            outputTextBytes += row.text_length;\n        }\n        outputRows.sort((a, b) => b.text_length - a.text_length || a.line - b.line);\n        return {\n            subscription_uuid: this.#subscriptionUUID,\n            lines: this._lines.length,\n            server_output_cells: this.#serverLineFieldCount('cell'),\n            pending_edits: this.#pending.length,\n            queued_edits: this.#queuedEdits.length,\n            view_bindings: this.#viewBindings.size,\n            unsettled: this.#derivedPendingCount(),\n            subscription_open: this.#subscriptionUUID !== null,\n            ptrless_outputs: ptrlessOutputs,\n            preview_hint_outputs: previewHintOutputs,\n            output_text_bytes: outputTextBytes,\n            by_block_type: Object.fromEntries(Object.entries(byBlockType).sort(([a], [b]) => a.localeCompare(b))),\n            by_state: Object.fromEntries(Object.entries(byState).sort(([a], [b]) => a.localeCompare(b))),\n            top_output_rows: outputRows.slice(0, 24),\n            payload_diagnostics: this.#payloadDiagnostics.slice(-64),\n        };\n    }\n\n    /* Retain a bounded payload lifecycle ring so browser reports explain the\n     * reference, retry sequence, and release/reannounce decisions. */\n    #recordPayloadDiagnostic(event, fields = {}) {\n        const entry = { at_ms: Date.now(), event, ...fields };\n        this.#payloadDiagnostics.push(entry);\n        if (this.#payloadDiagnostics.length > 64) {\n            this.#payloadDiagnostics.splice(0, this.#payloadDiagnostics.length - 64);\n        }\n        return entry;\n    }\n\n    testingChurnSummary() {\n        return structuredClone(this.#testingChurn);\n    }\n\n    testingResetChurn() {\n        this.#testingChurn = this.#makeTestingChurn();\n        this.#testingLineChanges = new Map();\n        return true;\n    }\n\n    testingLineChangeSummary() {\n        const out = {};\n        for (const [lineNum, change] of this.#testingLineChanges.entries()) {\n            out[lineNum] = structuredClone(change);\n        }\n        return out;\n    }\n\n    testingOutputForLine(lineNum) {\n        const line = this._lines[lineNum] ?? null;\n        if (!line) {\n            return null;\n        }\n        const serverLine = this.#windowLineToServerLine(lineNum);\n        return {\n            line: lineNum,\n            server_line: serverLine,\n            resolved: this.#serverLineRecord(serverLine)?.cell !== undefined,\n            pending: this.#serverLineState(serverLine)?.kind === SERVER_LINE_STATE.TERMINAL_PENDING,\n            tracked_row: testingRowTracked(this.#serverLineState(serverLine), this.#serverLineRecord(serverLine)?.cell !== undefined, line),\n            state: testingOutputState(this.#serverLineState(serverLine), line),\n            visible: line.output_block_type !== 'hidden',\n            block_type: line.output_block_type ?? 'hidden',\n            text: line.output_text ?? '',\n        };\n    }\n\n    update() {\n        const edits = this.#queuedEdits;\n        this.#queuedEdits = [];\n        return { edits };\n    }\n\n    /* Attach one independent projection consumer without transferring Puffbook model ownership to the view. */\n    attachView(options = {}) {\n        if (this.#closed) {\n            throw new Error('Cannot attach a view to a closed Puffbook.');\n        }\n        const binding = new PuffbookViewBinding(this, options);\n        this.#viewBindings.add(binding);\n        return binding;\n    }\n\n    /* Release exactly one view; transport lifetime remains owned by the Puffbook session. */\n    _detachViewBinding(binding) {\n        if (!this.#viewBindings.delete(binding)) {\n            throw new Error('Cannot detach a Puffbook view binding that is not owned by this document.');\n        }\n    }\n\n    /* Deliver one sequential edit programme after the reducer commits it. */\n    #broadcastProjectionEdits(edits) {\n        const bindings = [...this.#viewBindings];\n        for (const binding of bindings) {\n            if (!this.#viewBindings.has(binding)) {\n                continue;\n            }\n            try {\n                binding._deliverProjection(edits);\n            } catch (err) {\n                console.error('Puffbook view projection notification failed.', err);\n            }\n        }\n    }\n\n    applyKeyDown(evt, cursor, selectionRange = null, options = null) {\n        if (options?.undoScope) return this.#applyInspectKeyDown(evt, cursor, selectionRange, options);\n        if (evt.isComposing) return [false, null];\n        if (this.#composition?.ended) this.#composition = null;\n        if (evt.key === 'Escape') {\n            this.#clearSourceInputQueue();\n        }\n        const undo = ((evt.ctrlKey || evt.metaKey) && evt.key?.toLowerCase() === 'z' && !evt.shiftKey)\n            || (evt.altKey && evt.key === 'Backspace');\n        const redo = (evt.ctrlKey || evt.metaKey) && ((evt.key?.toLowerCase() === 'z' && evt.shiftKey) || evt.key?.toLowerCase() === 'y');\n        if (redo) { const restored = this.redo(); return [restored !== false, restored || null]; }\n        if (undo) {\n            const restored = this.undo();\n            return [restored !== false, restored || null];\n        }\n        if (evt.key === 'copy') { this.copySourceSelection(evt); return [false, [this.#projectedCursor.line, this.#projectedCursor.col]]; }\n        if (this.#sourceInputQueue.length && evt.key !== 'Escape') {\n            if (evt.key === 'extend_source_drag') {\n                this.#queueSourceInput(evt, evt.line);\n                return [false, [this.#projectedCursor.line, this.#projectedCursor.col]];\n            }\n            this.#sourceInputQueue.push(snapshotSourceInput(evt));\n            return [false, [this.#projectedCursor.line, this.#projectedCursor.col]];\n        }\n        let selection = this.sourceSelectionState();\n        if (options?.source !== 'view') {\n            const point = { line: this.#serverBodyStartLine + cursor[0], col: cursor[1] };\n            if (compareSourcePoint(primaryFocus(selection), point) !== 0) selection = selectionAt(point);\n            if (selectionRange && selectionRange[0] !== selectionRange[1]) {\n                selection = { ranges: [{ anchor: { line: point.line, col: selectionRange[0] },\n                    focus: { line: point.line, col: selectionRange[1] } }], primaryIndex: 0, verticalColumn: null };\n            }\n        }\n        const beforeSelection = cloneSelection(selection);\n        let result;\n        try {\n            result = selectionCommand(this.#predictedBody, selection, evt, {\n                startLine: this.#serverBodyStartLine, totalLines: this.#serverTotalLines,\n                sourceDrag: this.#predicted.sourceDrag,\n            });\n        } catch (error) {\n            if (!(error instanceof SelectionSourceRequired)) throw error;\n            this.#queueSourceInput(evt, error.line);\n            return [false, [this.#projectedCursor.line, this.#projectedCursor.col]];\n        }\n        if (!result.handled) return [false, null];\n        if (typeof options?.compositionText === 'string') {\n            const text = options.compositionText;\n            const parts = text.split('\\n');\n            const nextLines = result.spans.reduce(applyReplaceSpan, this.#predictedBody).split('\\n');\n            // Publish the provisional ranges with their text, so every view\n            // observes the same complete composition state.\n            for (const range of result.selection.ranges) {\n                range.anchor = parts.length === 1\n                    ? { line: range.focus.line, col: range.focus.col - text.length }\n                    : { line: range.focus.line - parts.length + 1,\n                        col: nextLines[range.focus.line - this.#serverBodyStartLine - parts.length + 1].length - parts[0].length };\n            }\n        }\n        const focus = primaryFocus(result.selection);\n        const nextCursor = [focus.line - this.#serverBodyStartLine, focus.col];\n        if (this.#readOnly && result.spans.length > 0) return [false, null];\n        if (result.spans.length === 0) {\n            this.setSourceSelection(result.selection, { cancelPending: false, sourceDrag: result.sourceDrag ?? null });\n            return [false, nextCursor];\n        }\n        this.#redoHistory = [];\n        if (beforeSelection.ranges.length === 1 && result.spans.length === 1) {\n            const nextBody = applyReplaceSpan(this.#predictedBody, result.spans[0]);\n            const canonicalChange = editFromBodies(this.#predictedBody, nextBody);\n            result.spans = canonicalChange === null ? [] : replaceSpanChainFromChange(this.#predictedBody, canonicalChange);\n        }\n        const ops = result.spans.map(span => makeLocalInputTextOpFromSpan(span, { createdAtMS: Date.now() }));\n        const out = this.#runPredictedMutation('source_selection_edit', txn => {\n            for (const op of ops) absorbLocalInputTextOp(txn, op);\n        }, { suppressDocEdits: true, preserveUndoHistory: true });\n        this.#storeSourceSelection(result.selection);\n        const primaryBefore = primaryFocus(beforeSelection);\n        const singleCaret = beforeSelection.ranges.length === 1 && rangeIsEmpty(beforeSelection.ranges[0]);\n        const coalesce = singleCaret ? undoCoalesceForKeyDown(evt, [{ type: 'replace' }],\n            [primaryBefore.line - this.#serverBodyStartLine, primaryBefore.col], nextCursor, {\n                isPrintable: typeof evt.key === 'string' && Array.from(evt.key).length === 1 && !evt.ctrlKey && !evt.metaKey,\n                isBackspace: evt.key === 'Backspace', isDelete: evt.key === 'Delete', isEnter: evt.key === 'Enter',\n            }) : null;\n        const inverse = ops.toReversed().map(op => op.inverse_span);\n        if (shouldCoalesceUndo(this.#undoCoalesce, coalesce) && this._editHistory.at(-1)?.sourceSelection) {\n            this._editHistory.at(-1).undo_spans.unshift(...inverse);\n            this._editHistory.at(-1).cursor = nextCursor;\n        } else this._editHistory.push({ undo_spans: inverse, cursor: nextCursor, scope: null,\n            selectionLength: 0, sourceSelection: beforeSelection });\n        this.#undoCoalesce = coalesce;\n        this.#stageDocEdits(out.docEdits);\n        this.#noteRapidFeedbackCursor(nextCursor);\n        this.#publishPredictedLines('rapid_feedback');\n        this.#scheduleFlushPending();\n        return [true, nextCursor];\n    }\n\n    /* Apply one local keydown directly onto predicted state and record which sub-phase still behaves like snapshot work. */\n    #applyInspectKeyDown(evt, cursor, selectionRange = null, options = null) {\n        if (evt.ctrlKey || evt.metaKey) {\n            if (!evt.shiftKey && typeof evt.key === 'string' && evt.key.toLowerCase() === 'z') {\n                const undone = this.undo(options?.undoScope ?? null);\n                if (undone !== false) {\n                    return options?.undoScope\n                        ? [true, undone, this.projectionFocusState()]\n                        : [true, undone];\n                }\n            }\n            if (evt.key === 'copy') {\n                return [false, null];\n            } \n            if (!['Backspace', 'Enter', 'Tab'].includes(evt.key)) {\n                return [false, null];\n            }\n        } else if (evt.altKey) {\n            // Alt+Backspace = old \"Undo\" shortcut\n            if (!this.#readOnly && evt.key === 'Backspace') {\n                const undone = this.undo(options?.undoScope ?? null);\n                if (undone !== false) {\n                    return options?.undoScope\n                        ? [true, undone, this.projectionFocusState()]\n                        : [true, undone];\n                }\n            }\n        }\n\n        const isBackspace = evt.key === 'Backspace';\n        const isDelete = evt.key === 'Delete';\n        const isPaste = evt.key === 'paste';\n        const isCut = evt.key === 'cut';\n        const isEnter = evt.key === 'Enter';\n        const isPrintable = !evt.ctrlKey && !evt.metaKey && typeof evt.key === 'string' && evt.key.length === 1;\n\n        const fromView = options?.source === 'view';\n        const isCaretNavigation = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(evt?.key);\n        // A focused InputCell can expose its pre-refresh caret during a\n        // same-frame browser burst. Keep the reducer's last post-edit caret\n        // for ordinary edits; explicit navigation and direct reducer callers\n        // remain authoritative.\n        if (fromView && !isCaretNavigation) {\n            // InputCell can report its pre-refresh caret in the same frame as a\n            // local edit. The document state's committed projected cursor is\n            // the sole authority for that burst; no shadow cursor is needed.\n            cursor = [this.#projectedCursor.line, this.#projectedCursor.col];\n        }\n        const beforeBody = this.#predictedBody;\n        const baseLines = splitBody(beforeBody);\n        if (!Array.isArray(cursor) || !Number.isInteger(cursor[0]) || !Number.isInteger(cursor[1])\n            || cursor[0] < 0 || cursor[0] >= baseLines.length\n            || cursor[1] < 0 || cursor[1] > (baseLines[cursor[0]] ?? '').length) {\n            recordTestingPuffbookForensic('keyboard_cursor_coordinate_invariant', {\n                operation: 'applyKeyDown',\n                server_seq: this.#serverSeq,\n                server_version: this.#serverVersion,\n                cursor_line: cursor?.[0] ?? null,\n                cursor_col: cursor?.[1] ?? null,\n                body_line_count: baseLines.length,\n                expected_shape: 'cursor is within the authoritative predicted body window',\n            });\n            throw new Error(`Puffbook keyboard cursor lies outside authoritative body window: ${JSON.stringify(cursor)}.`);\n        }\n        let workingCursor = [cursor[0], cursor[1]];\n        const lineIndex = workingCursor[0];\n        let lineText = baseLines[lineIndex] ?? '';\n        const beforeCursor = newCursorCopy(workingCursor);\n        let changed = false;\n        let hadSelectionEdit = false;\n        let undoSelectionLength = 0;\n        const legacyEdits = [];\n        const startedMS = performance.now();\n        const lineSnapshotStartedMS = performance.now();\n        const workingLines = baseLines.slice();\n        const lineSnapshotDurationMS = performance.now() - lineSnapshotStartedMS;\n        let selectionDurationMS = 0;\n        let selectionChangeDurationMS = 0;\n        let decodeDurationMS = 0;\n        let changeBuildDurationMS = 0;\n        let commitDurationMS = 0;\n\n        const renderedLineText = this._lines[lineIndex]?.input_text ?? null;\n        if (renderedLineText !== null && renderedLineText !== lineText) {\n            pushTestingPortalTimingTrace('puffbook_keydown_line_cache_drift', {\n                line_index: lineIndex,\n                rendered_cursor_col: Number.isInteger(cursor?.[1]) ? cursor[1] : null,\n                authoritative_cursor_col: workingCursor[1],\n                rendered_len: renderedLineText.length,\n                authoritative_len: lineText.length,\n            });\n        }\n\n        if (!this.#readOnly && Array.isArray(selectionRange) && selectionRange.length === 2) {\n            const selectionStartedMS = performance.now();\n            const [rawStart, rawEnd] = selectionRange;\n            if (typeof rawStart === 'number' && typeof rawEnd === 'number' && rawStart !== rawEnd) {\n                if (!Number.isInteger(rawStart) || !Number.isInteger(rawEnd)\n                    || rawStart < 0 || rawEnd < 0\n                    || rawStart > lineText.length || rawEnd > lineText.length) {\n                    throw new Error(`Keyboard selection is outside the authoritative line (line=${lineIndex} range=${JSON.stringify(selectionRange)} line_chars=${lineText.length}).`);\n                }\n                const selStart = Math.min(rawStart, rawEnd);\n                const selEnd = Math.max(rawStart, rawEnd);\n                if (!evt.shiftKey) {\n                    if (evt.key === 'ArrowLeft' || evt.key === 'Home') {\n                        return [false, [lineIndex, evt.key === 'Home' ? 0 : selStart]];\n                    }\n                    if (evt.key === 'ArrowRight' || evt.key === 'End') {\n                        return [false, [lineIndex, evt.key === 'End' ? lineText.length : selEnd]];\n                    }\n                }\n                const shouldRemoveSelection = isBackspace || isDelete || isPaste || isEnter || isPrintable || isCut || isSpaceTabKey(evt);\n                if (selStart !== selEnd && shouldRemoveSelection) {\n                    const before = lineText.substring(0, selStart);\n                    const after = lineText.substring(selEnd);\n                    const selectionEdit = {\n                        type: 'replace',\n                        position: lineIndex,\n                        old_content: lineText,\n                        new_content: before + after,\n                    };\n                    legacyEdits.push(selectionEdit);\n                    workingLines[lineIndex] = before + after;\n                    changed = true;\n                    hadSelectionEdit = true;\n                    undoSelectionLength = selEnd - selStart;\n                    workingCursor = [lineIndex, selStart];\n                    lineText = before + after;\n                }\n            }\n            selectionDurationMS = performance.now() - selectionStartedMS;\n            if (changed && (isBackspace || isDelete || isCut)) {\n                const selectionChangeStartedMS = performance.now();\n                const selectionChange = editFromLegacyLineEditBatchLines(baseLines, legacyEdits);\n                selectionChangeDurationMS = performance.now() - selectionChangeStartedMS;\n                const commitStartedMS = performance.now();\n                this.#commitPredictedEdit(beforeBody, selectionChange, newCursorCopy(workingCursor), null, options?.undoScope ?? null, undoSelectionLength);\n                commitDurationMS = performance.now() - commitStartedMS;\n                pushTestingPortalTimingTrace('puffbook_apply_keydown', {\n                    key: evt?.key ?? null,\n                    line_count: this._lines.length,\n                    changed,\n                    selection_shortcut: true,\n                    legacy_edit_count: legacyEdits.length,\n                    snapshot_lines_ms: Number(lineSnapshotDurationMS.toFixed(3)),\n                    selection_ms: Number(selectionDurationMS.toFixed(3)),\n                    selection_change_ms: Number(selectionChangeDurationMS.toFixed(3)),\n                    decode_ms: Number(decodeDurationMS.toFixed(3)),\n                    change_build_ms: Number(changeBuildDurationMS.toFixed(3)),\n                    commit_ms: Number(commitDurationMS.toFixed(3)),\n                    total_ms: Number((performance.now() - startedMS).toFixed(3)),\n                });\n                return [true, workingCursor];\n            }\n        }\n\n        const decodeStartedMS = performance.now();\n        const [edits, newCursor] = ui.decodeMultilineTextEditKeyDown(\n            evt,\n            workingCursor,\n            (b) => workingLines[b] ?? '',\n            workingLines.length,\n        );\n        decodeDurationMS = performance.now() - decodeStartedMS;\n        if (this.#readOnly) {\n            if (edits.length !== 0) {\n                return [false, null];\n            }\n            return [changed, newCursor];\n        }\n\n        if (edits.length !== 0) {\n            legacyEdits.push(...edits);\n            changed = true;\n        }\n        if (!changed) {\n            return [false, newCursor];\n        }\n\n        const changeBuildStartedMS = performance.now();\n        const change = editFromLegacyLineEditBatchLines(baseLines, legacyEdits);\n        changeBuildDurationMS = performance.now() - changeBuildStartedMS;\n        const commitStartedMS = performance.now();\n        this.#commitPredictedEdit(\n            beforeBody,\n            change,\n            newCursorCopy(newCursor),\n            undoCoalesceForKeyDown(evt, edits, beforeCursor, newCursor, {\n                hadSelectionEdit,\n                isPrintable,\n                isBackspace,\n                isDelete,\n                isEnter,\n            }),\n            options?.undoScope ?? null,\n            undoSelectionLength,\n        );\n        commitDurationMS = performance.now() - commitStartedMS;\n        pushTestingPortalTimingTrace('puffbook_apply_keydown', {\n            key: evt?.key ?? null,\n            line_count: this._lines.length,\n            changed,\n            selection_shortcut: false,\n            legacy_edit_count: legacyEdits.length,\n            decode_edit_count: edits.length,\n            snapshot_lines_ms: Number(lineSnapshotDurationMS.toFixed(3)),\n            selection_ms: Number(selectionDurationMS.toFixed(3)),\n            selection_change_ms: Number(selectionChangeDurationMS.toFixed(3)),\n            decode_ms: Number(decodeDurationMS.toFixed(3)),\n            change_build_ms: Number(changeBuildDurationMS.toFixed(3)),\n            commit_ms: Number(commitDurationMS.toFixed(3)),\n            total_ms: Number((performance.now() - startedMS).toFixed(3)),\n        });\n        return [true, newCursor];\n    }\n\n    /* Replace one inclusive source-line range as a single predicted document edit. */\n    replaceSourceRange(range, insertedText) {\n        if (this.#readOnly || typeof insertedText !== 'string') {\n            return [false, null];\n        }\n        const beforeBody = this.#predictedBody;\n        const lines = splitBody(beforeBody);\n        if (!range || !Number.isInteger(range.start) || !Number.isInteger(range.end)\n            || range.start < 0 || range.end < range.start || range.end >= lines.length) {\n            return [false, null];\n        }\n        const insertedLines = splitBody(insertedText);\n        const nextBody = [\n            ...lines.slice(0, range.start),\n            ...insertedLines,\n            ...lines.slice(range.end + 1),\n        ].join('\\n');\n        const cursor = [range.start + insertedLines.length - 1, insertedLines.at(-1)?.length ?? 0];\n        const change = editFromBodies(beforeBody, nextBody);\n        if (change === null) return [true, cursor];\n        this.#commitPredictedEdit(beforeBody, change, cursor, null);\n        return [true, cursor];\n    }\n\n    /* A scoped editor may undo only its own latest edits, never an earlier session. */\n    canUndo(scope = null) {\n        const entry = this._editHistory.at(-1);\n        return !this.#readOnly && !this.#closed && !!entry\n            && (scope === null || entry.scope === scope);\n    }\n\n    undo(scope = null) {\n        if (!this.canUndo(scope)) {\n            return false;\n        }\n        const pendingEntry = this._editHistory.at(-1);\n        if (pendingEntry.pendingAmendID !== undefined) {\n            const amend = this.#amendQueue.find((item) => item.id === pendingEntry.pendingAmendID);\n            amend.undoRequested = true;\n            return false;\n        }\n        this.#undoCoalesce = null;\n        const entry = this._editHistory.pop();\n        const undoSpans = Array.isArray(entry?.undo_spans) ? entry.undo_spans : [];\n        if (undoSpans.length === 0) {\n            return false;\n        }\n        const beforeBody = this.#predictedBody;\n        const redoSelection = this.sourceSelectionState();\n        const out = this.#runPredictedMutation('undo', (txn) => {\n            for (const span of undoSpans) {\n                const op = makeLocalInputTextOp(span, txn.work.body, { transportState: 'local' });\n                absorbLocalInputTextOp(txn, op);\n            }\n        }, { preserveUndoHistory: true, suppressDocEdits: true });\n        this.#scheduleFlushPending();\n        const cursor = Array.isArray(entry?.cursor) ? entry.cursor : [0, 0];\n        const movedCursor = rebaseProjectionCursorThroughSpans(\n            beforeBody,\n            { line: cursor[0], col: cursor[1] },\n            out.textSpans,\n        );\n        const restoredCursor = movedCursor ?? { line: cursor[0], col: cursor[1] };\n        if (entry.sourceSelection) {\n            this.#storeSourceSelection(entry.sourceSelection);\n            this.#redoHistory.push({ spans: undoSpans.toReversed().map(span => ({ ...span,\n                deleted_text: span.inserted_text, inserted_text: span.deleted_text })),\n                selection: redoSelection, original: entry });\n        } else {\n            // Scoped and older single-line actions retain their existing history format.\n            this.#projectedCursor = restoredCursor;\n            const selection = entry.selectionLength > 0\n                ? requireProjectionSelection(this.#serverBodyStartLine + restoredCursor.line,\n                    restoredCursor.col - entry.selectionLength, restoredCursor.col) : null;\n            if (selection === null) this.#projectedSelection = null;\n            else this.#storeSourceSelection(selection);\n        }\n        this.#stageDocEdits(out.docEdits);\n        return [this.#projectedCursor.line, this.#projectedCursor.col];\n    }\n\n    redo() {\n        if (this.#readOnly || this.#closed || this.#redoHistory.length === 0) return false;\n        const entry = this.#redoHistory.pop();\n        const out = this.#runPredictedMutation('redo', txn => {\n            for (const span of entry.spans) absorbLocalInputTextOp(txn, makeLocalInputTextOpFromSpan(span));\n        }, { suppressDocEdits: true, preserveUndoHistory: true });\n        this.#storeSourceSelection(entry.selection);\n        this._editHistory.push(entry.original);\n        this.#stageDocEdits(out.docEdits);\n        this.#scheduleFlushPending();\n        return [this.#projectedCursor.line, this.#projectedCursor.col];\n    }\n\n    async amendPuffbook(newBody, lineNum, { undoScope = null } = {}) {\n        if (this.#readOnly) {\n            console.warn('Puffbook rejected amend: document is read-only.', {\n                line_num: lineNum,\n                file_ref: this.fileRef ?? null,\n            });\n            return;\n        }\n        if (this.#closed) {\n            console.warn('Puffbook rejected amend: document is already closed.', {\n                line_num: lineNum,\n                file_ref: this.fileRef ?? null,\n            });\n            return;\n        }\n        if (!this.#subscriptionUUID) {\n            console.warn('Puffbook rejected amend: subscription is no longer open.', {\n                line_num: lineNum,\n                file_ref: this.fileRef ?? null,\n            });\n            return;\n        }\n        const lines = splitBody(this.#predictedBody);\n        if (!Number.isInteger(lineNum) || lineNum < 0 || lineNum >= lines.length) {\n            throw new Error(`Puffbook amend line ${lineNum} is outside the current document.`);\n        }\n        // Reserve the action's position before later keystrokes. The send\n        // boundary waits for preceding source edits, never output computation.\n        const amend = {\n            id: this.#nextAmendID++, newBody, line_num: lineNum,\n            preceding_ops: this.#pending.length, scope: undoScope,\n            phase: 'queued', awaiting_server_edit: true, awaiting_recompute: true,\n            accepted_version: null, source_version: null, undoRequested: false,\n        };\n        const completion = new Promise((resolve, reject) => {\n            amend.resolve = resolve;\n            amend.reject = reject;\n        });\n        this.#undoCoalesce = null;\n        this._editHistory.push({\n            undo_spans: [], cursor: [lineNum, lines[lineNum].length],\n            scope: undoScope, selectionLength: 0, pendingAmendID: amend.id,\n        });\n        this.#amendQueue.push(amend);\n        this.#pumpAmendQueue();\n        this.#scheduleFlushPending();\n        return completion;\n    }\n\n    #pumpAmendQueue() {\n        const amend = this.#amendQueue[0];\n        if (!amend || amend.phase !== 'queued' || amend.preceding_ops !== 0\n            || this.#closed || !this.#subscriptionUUID) return;\n        amend.phase = 'sent';\n        amend.base_version = this.#serverVersion;\n        amend.edit_ordinal = this.#nextEditOrdinal++;\n        this.#pendingAmend = amend;\n        const subscription = this.#subscriptionUUID;\n        void this.#api.wsAmendPuffbook(subscription, amend.base_version, amend.line_num, amend.newBody,\n            this.#puffbookInstanceID, amend.edit_ordinal)\n            .then((version) => {\n                if (this.#subscriptionUUID !== subscription || !this.#amendQueue.includes(amend)) return;\n                if (!Number.isSafeInteger(version) || version <= amend.base_version) {\n                    throw new Error(`Puffbook amend returned invalid source revision ${version}.`);\n                }\n                amend.accepted_version = version;\n                this.#finishAmendSource(amend);\n                amend.resolve();\n            }).catch((err) => {\n                if (!this.#amendQueue.includes(amend)) return;\n                this.#removeAmendReservation(amend);\n                this.#amendQueue.splice(this.#amendQueue.indexOf(amend), 1);\n                if (this.#pendingAmend?.id === amend.id) this.#pendingAmend = null;\n                amend.reject(err);\n                this.#pumpAmendQueue();\n                this.#scheduleFlushPending();\n            });\n    }\n\n    #removeAmendReservation(amend) {\n        this._editHistory = this._editHistory.filter((entry) => entry.pendingAmendID !== amend.id);\n    }\n\n    #finishAmendSource(amend) {\n        if (amend.accepted_version === null || amend.source_version === null) return;\n        if (amend.accepted_version !== amend.source_version) {\n            throw new Error(`Puffbook amend source revision mismatch: RPC=${amend.accepted_version}, source=${amend.source_version}.`);\n        }\n        this.#amendQueue.shift();\n        this.#pumpAmendQueue();\n        this.#scheduleFlushPending();\n    }\n\n    #cancelAmendQueue(reason) {\n        for (const amend of this.#amendQueue) {\n            this.#removeAmendReservation(amend);\n            amend.reject(new Error(reason));\n        }\n        this.#amendQueue = [];\n        this.#pendingAmend = null;\n    }\n\n    #finishPendingAmendRecompute(line) {\n        if (this.#pendingAmend?.line_num !== line || this.#pendingAmend.awaiting_recompute !== true) {\n            return;\n        }\n        this.#pendingAmend.awaiting_recompute = false;\n        if (this.#pendingAmend.awaiting_server_edit !== true) {\n            this.#pendingAmend = null;\n        }\n        CommanderBus.emit('AMEND_RECOMPUTE_FINISHED', {\n            lineNum: this.#serverLineToDisplayLine(line),\n        });\n    }\n\n    #handleSubscriptionEvent(body, replay = null) {\n        if (this.#closed) {\n            return;\n        }\n        const replayed = typeof replay === 'function' ? replay()?.body ?? null : null;\n        if (typeof replay === 'function' && !replayed) {\n            this.#scheduleAtomicResubscribe(\n                new Error('Puffbook projection event replay failed; resubscribe required.'),\n                { closeCurrent: true },\n            );\n            return;\n        }\n        body = replayed ?? body;\n        const eventType = fieldText(body, 'event_type');\n        const seq = fieldInt(body, 'seq');\n        const expectedSeq = this.#serverSeq + 1;\n        if (!Number.isInteger(seq) || seq !== expectedSeq) {\n            const kind = !Number.isInteger(seq)\n                ? 'malformed'\n                : seq < expectedSeq ? 'repeat_or_regression' : 'gap';\n            const err = new Error(`Puffbook projection seq continuity lost; resubscribe required (kind=${kind} current_seq=${this.#serverSeq} expected_seq=${expectedSeq} received_seq=${seq} event_type=${eventType}).`);\n            err.projectionSequenceDiagnostic = {\n                kind,\n                current_seq: this.#serverSeq,\n                expected_seq: expectedSeq,\n                received_seq: seq,\n                event_type: eventType,\n            };\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: true });\n            return;\n        }\n        try {\n            this.#applySubscriptionEvent(body, seq);\n            this.#serverSeq = seq;\n        } catch (err) {\n            void this.#recoverProjectionDesynchronisation(err);\n        }\n    }\n\n    async #recoverProjectionDesynchronisation(err) {\n        const subscriptionUUID = this.#subscriptionUUID;\n        const lastGoodSeq = this.#serverSeq;\n        recordTestingPuffbookForensic('projection_recovery_requested', {\n            operation: 'recoverProjectionDesynchronisation',\n            server_seq: lastGoodSeq,\n            server_version: this.#serverVersion,\n            body_bytes: utf8ByteLength(this.#predictedBody),\n            pending_count: this.#pending.length,\n            error: `${err?.message || err || ''}`,\n        });\n        if (!subscriptionUUID || typeof this.#api.wsPuffbookRecoveryCut !== 'function') {\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: true });\n            return;\n        }\n        try {\n            const cut = await this.#api.wsPuffbookRecoveryCut(subscriptionUUID, lastGoodSeq);\n            const snapshot = cut.snapshot;\n            const artifact = buildProjectionRecoveryArtifact(\n                cut,\n                snapshot,\n                this.#pendingBaseBody,\n                this.#pending,\n                this.#predictedBody,\n                new Map(this.#predicted.lineRecords),\n            );\n            flushTestingPuffbookForensicArtifact({\n                operation: 'recoverProjectionDesynchronisation',\n                ...artifact,\n                last_good_semantic_digest: cut.last_good_semantic_digest,\n                current_semantic_digest: cut.current_semantic_digest,\n                expected_shape: 'detached evidence is flushed before replacement subscription',\n            });\n            this.#scheduleAtomicResubscribe(\n                new Error(`Puffbook projection recovery ${cut.diagnostic_id} captured before reconnect: ${err?.message || err || ''}`),\n                { closeCurrent: true },\n            );\n        } catch (recoveryErr) {\n            recordTestingPuffbookForensic('projection_recovery_failed', {\n                operation: 'recoverProjectionDesynchronisation',\n                server_seq: lastGoodSeq,\n                error: `${recoveryErr?.message || recoveryErr || ''}`,\n            });\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: true });\n        }\n    }\n\n    // applySubscriptionEvent consumes one already-ordered subscription event body.\n\t#applySubscriptionEvent(body, seq) {\n\t\tconst eventType = fieldText(body, 'event_type');\n\t\tconst emittedAt = fieldIntText(body, 'emitted_at');\n        const sourceVersion = this.#serverVersion + 1;\n        const line = null;\n        const who = eventType === 'source_edit_applied' ? fieldText(body, 'who') : null;\n        if (seq !== null) {\n            try {\n\t\t\t\tthis.#assertOrderedProjectionEvent(eventType, seq);\n            } catch (err) {\n                recordTestingPuffbookForensic('ordered_projection_event_invariant', {\n                    operation: 'assertOrderedProjectionEvent',\n                    server_seq: this.#serverSeq,\n                    received_seq: seq,\n                    server_version: this.#serverVersion,\n                    event_type: eventType ?? '',\n                    line,\n\t\t\t\t\texpected_shape: 'strictly monotonic stream sequence',\n                    error: `${err?.message || err || ''}`,\n                });\n                throw err;\n            }\n        }\n        pushTestingPuffbookTrace('puffbook_subscription_event', {\n            event_type: eventType ?? '',\n            version: eventType === 'source_edit_applied' ? sourceVersion : this.#serverVersion,\n            line,\n            who: who ?? '',\n            seq: seq ?? '',\n            emitted_at: emittedAt ?? '',\n        });\n        switch (eventType) {\n        case 'viewport_window':\n            withPortalTimingScope('puffbook.handle_server_viewport', {\n                seq,\n                body_start_line: fieldInt(body, 'body_start_line'),\n                body_end_line: fieldInt(body, 'body_end_line'),\n                total_lines: fieldInt(body, 'total_lines'),\n            }, () => this.#handleServerViewport(\n                fieldText(body, 'body') ?? '',\n                fieldInt(body, 'body_start_line'),\n                fieldInt(body, 'body_end_line'),\n                fieldInt(body, 'total_lines'),\n                structField(body, 'outputs'),\n                fieldInt(body, 'start_line'),\n                fieldInt(body, 'end_line'),\n                emittedAt,\n                seq,\n                fieldText(body, 'body_mode') ?? 'replace',\n                fieldText(body, 'body_prefix') ?? '',\n                fieldText(body, 'body_suffix') ?? '',\n            ));\n            return;\n\n        case 'source_edit_applied':\n            this.#handleServerEdit(\n                sourceVersion,\n                structField(body, 'edits'),\n                who,\n                fieldText(body, 'puffbook_instance_id'),\n                fieldInt(body, 'edit_ordinal'),\n                emittedAt,\n                seq,\n            );\n            return;\n\n        case 'apply_line_changes':\n            this.#handleServerOutputDeltas(\n                structField(body, 'line_changes'),\n                emittedAt,\n                seq,\n            );\n            return;\n\n        default:\n            throw new Error(`Puffbook ordered projection event has unsupported event_type=${JSON.stringify(eventType)} seq=${seq}.`);\n        }\n    }\n\n    // assertOrderedProjectionEvent validates the next FIFO transport frame.\n    // Stream order alone supplies the coordinate system.\n\t#assertOrderedProjectionEvent(eventType, seq) {\n        if (typeof eventType !== 'string' || eventType === '') {\n            throw new Error(`Puffbook ordered projection event seq=${seq} has no event_type.`);\n        }\n    }\n\n    /* Reopen one puffbook stream from a fresh atomic baseline after continuity loss. */\n    #scheduleAtomicResubscribe(err, { closeCurrent = false } = {}) {\n        if (this.#closed || this.#reopening) {\n            return;\n        }\n        this.#cancelReconnectRetry(false);\n        console.warn('Puffbook continuity lost; resubscribing.', {\n            file_ref: this.fileRef,\n            subscription_uuid: this.#subscriptionUUID,\n            reason: `${err?.message || err || ''}`,\n            projection_sequence: err?.projectionSequenceDiagnostic ?? null,\n            error: err,\n        });\n        const sequenceDiagnostic = err?.projectionSequenceDiagnostic ?? null;\n        pushTestingPuffbookTrace('puffbook_resubscribe_scheduled', {\n            subscription_uuid: this.#subscriptionUUID ?? '',\n            reason: `${err?.message || err || ''}`,\n            close_current: closeCurrent,\n            continuity_kind: sequenceDiagnostic?.kind ?? '',\n            current_seq: sequenceDiagnostic?.current_seq ?? '',\n            expected_seq: sequenceDiagnostic?.expected_seq ?? '',\n            received_seq: sequenceDiagnostic?.received_seq ?? '',\n            event_type: sequenceDiagnostic?.event_type ?? '',\n        });\n        this.#prepareTransportRecovery();\n        const sub = this.#subscriptionUUID;\n        if (sub) {\n            this.#api.forgetWSPuffbookDataSubscription?.(sub);\n        }\n        this.#subscriptionUUID = null;\n        this.#reopening = true;\n        this.#markLifecycleLapsedReconnecting(errorLifecycleReason(err, 'resubscribe_scheduled'));\n        queueMicrotask(() => {\n            void (async () => {\n                if (closeCurrent && sub) {\n                    try {\n                        await this.#api.wsClosePuffbook(sub);\n                    } catch (closeErr) {\n                        const msg = `${closeErr?.message || closeErr || ''}`;\n                        if (!msg.includes('unknown puffbook subscription') && !msg.includes('WebSocket connection closed.')) {\n                            console.warn('Failed to close stale puffbook subscription before resubscribe.', closeErr);\n                        }\n                    }\n                }\n                await this.open();\n            })();\n        });\n    }\n\n    #handleSubscriptionClose(err) {\n        if (this.#closed) {\n            return;\n        }\n        // The old transport may report its close asynchronously after an\n        // atomic resubscribe has already started. Its callback must not\n        // demote the reconnecting lifecycle or overwrite the fresh stream.\n        if (this.#reopening) {\n            return;\n        }\n        this.#handleComputeAvailability(false);\n        if (this.#subscriptionUUID) {\n            void this.#api.wsDetachPuffbookData(this.#subscriptionUUID).catch(() => {});\n        }\n        const msg = `${err?.message || err || ''}`;\n        if ((msg.startsWith('WebSocket connection closed.') || msg.startsWith('WebSocket connection dropped unexpectedly.'))\n            && !this.#reopening) {\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n            return;\n        }\n        if ((msg.includes('resubscribe required') || msg.includes('continuity lost'))\n            && !this.#reopening) {\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n            return;\n        }\n        console.error('Puffbook subscription closed', {\n            file_ref: this.fileRef,\n            subscription_uuid: this.#subscriptionUUID,\n            error: err,\n        });\n        this.#markLifecycleLapsedIdle(errorLifecycleReason(err, 'subscription_closed'));\n        this.#onLoadError?.(err, this);\n    }\n\n    #handleComputeAvailability(available) {\n        const next = available === true;\n        if (this.#predicted.computeAvailable !== next) {\n            const prev = this.#snapshotCommittedDisplayState();\n            this.#predicted.computeAvailable = next;\n            this.#refreshProjectedLinesFromState();\n            this.#publishPredictedLinesFromPrev(prev, 'compute_availability');\n        }\n        // The initial open response commonly starts with computeAvailable=true.\n        // Still notify the shell so a prior document's global No compute badge\n        // cannot leak into a newly opened, healthy Puffbook.\n        this.#onComputeAvailabilityChange?.(next, this);\n    }\n\n    /* Notify outer owners after one real lifecycle transition so screen/chrome state can stay interlocked. */\n    #emitLifecycleChange() {\n        this.#onLifecycleChange?.(this.#lifecycle.snapshot(), this);\n    }\n\n    /* Advance lifecycle state and emit the shared notification only when the state truly changed. */\n    #transitionLifecycle(nextState, reason) {\n        if (this.#lifecycle.transition(nextState, reason)) {\n            this.#emitLifecycleChange();\n            return true;\n        }\n        return false;\n    }\n\n    /* Promote one opened or reopened transport to the authoritative live_current frontend state. */\n    #markLifecycleLiveCurrent(reason) {\n        const state = this.#lifecycle.state();\n        if (state === PUFFBOOK_LIFECYCLE.OPENING || state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.LIVE_CURRENT, reason);\n            return;\n        }\n        if (state === PUFFBOOK_LIFECYCLE.CLOSING || state === PUFFBOOK_LIFECYCLE.CLOSED) {\n            return;\n        }\n        throw new Error(`Puffbook cannot become live_current from lifecycle state '${state}'.`);\n    }\n\n    /* Mark one mounted puffbook as transport-lapsed with no reconnect currently in flight. */\n    #markLifecycleLapsedIdle(reason) {\n        const state = this.#lifecycle.state();\n        if (state === PUFFBOOK_LIFECYCLE.LIVE_CURRENT || state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE, reason);\n        }\n    }\n\n    /* Mark one mounted puffbook as transport-lapsed while reconnect work is scheduled or running. */\n    #markLifecycleLapsedReconnecting(reason) {\n        const state = this.#lifecycle.state();\n        if (state === PUFFBOOK_LIFECYCLE.LIVE_CURRENT || state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING, reason);\n        }\n    }\n\n    /* Collapse one failed open path onto the correct non-mounted lifecycle state for this instance. */\n    #handleOpenFailure(err) {\n        const state = this.#lifecycle.state();\n        if (state === PUFFBOOK_LIFECYCLE.OPENING) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.CLOSING, errorLifecycleReason(err, 'open_failed'));\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.CLOSED, 'open_failed_closed');\n            return;\n        }\n        if (state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING) {\n            this.#transitionLifecycle(PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE, errorLifecycleReason(err, 'reconnect_failed'));\n            this.#scheduleReconnectRetry(err);\n        }\n    }\n\n    #scheduleReconnectRetry(err) {\n        if (this.#closed || this.#ownReconnectRetryTimer !== null || !isRecoverablePuffbookOpenError(err)) {\n            return;\n        }\n        const attempt = this.#reconnectRetryAttempt;\n        const delayMS = puffbookReconnectDelayMS(attempt);\n        this.#reconnectRetryAttempt += 1;\n        console.warn('Puffbook reconnect failed; retrying.', {\n            file_ref: this.fileRef,\n            attempt: attempt + 1,\n            retry_in_ms: delayMS,\n            reason: `${err?.message || err || ''}`,\n        });\n        pushTestingPuffbookTrace('puffbook_reconnect_retry_scheduled', {\n            attempt: attempt + 1,\n            retry_in_ms: delayMS,\n            reason: `${err?.message || err || ''}`,\n        });\n        this.#ownReconnectRetryTimer = globalThis.setTimeout(() => {\n            this.#ownReconnectRetryTimer = null;\n            if (this.#closed || this.#lifecycle.state() !== PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE) {\n                return;\n            }\n            this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n        }, delayMS);\n    }\n\n    #cancelReconnectRetry(resetAttempt) {\n        if (this.#ownReconnectRetryTimer !== null) {\n            globalThis.clearTimeout(this.#ownReconnectRetryTimer);\n            this.#ownReconnectRetryTimer = null;\n        }\n        if (resetAttempt) {\n            this.#reconnectRetryAttempt = 0;\n        }\n    }\n\n    /* Preserve predicted frontend text across one dead transport before the fresh baseline arrives. */\n    #prepareTransportRecovery() {\n        // A dead transport cannot have an in-flight mutate any more. Keep the\n        // visible predicted text in place and decide what survives once the new\n        // authoritative snapshot arrives.\n        this.#sending = false;\n        this.#mutateInFlightCount = 0;\n        this.#cancelAmendQueue('Puffbook connection changed before its amendment completed.');\n        this.#viewportInFlight = false;\n    }\n\n    #snapshotTransportRecovery() {\n        this.#ensurePendingPredictionInvariant('transport recovery snapshot');\n        const localOps = cloneLocalInputTextOps(this.#pending);\n        if (localOps.length === 0) {\n            return null;\n        }\n        return {\n            server_version: this.#serverVersion,\n            base_body: this.#pendingBaseBody,\n            predicted_body: this.#predictedBody,\n            body_start_line: this.#serverBodyStartLine,\n            body_end_line: this.#serverBodyEndLine,\n            total_lines: this.#serverTotalLines,\n            local_ops: localOps,\n        };\n    }\n\n    /* Reopen transport recovery on the saved authoritative body window rather than a newly widened viewport. */\n    #recoveryViewportOpenArgs(recovery) {\n        if (recovery === null) {\n            return this.#subscriptionViewportOpenArgs();\n        }\n        return {\n            start_line: recovery.body_start_line,\n            end_line: recovery.body_end_line,\n        };\n    }\n\n    /* Assert that the pending local-op chain still reproduces the live predicted body exactly. */\n    #assertPendingPredictionInvariant(label) {\n        assertPredictedBodyMatchesLocalOps(\n            this.#pendingBaseBody,\n            this.#pending,\n            this.#predictedBody,\n            label,\n        );\n    }\n\n    #assertMutationOutputInvariant(label, baseBody, localOps, predictedBody) {\n        try {\n            assertPredictedBodyMatchesLocalOps(baseBody, localOps, predictedBody, label);\n        } catch (err) {\n            const replayedBody = predictedBodyFromLocalOps(baseBody, localOps);\n            const mismatchAt = firstMismatchIndex(replayedBody, predictedBody);\n            pushTestingPuffbookTrace('puffbook_mutation_output_invariant_failed', {\n                label,\n                pending_count: Array.isArray(localOps) ? localOps.length : 0,\n                mismatch_at: mismatchAt,\n                predicted_sample: snippetAround(predictedBody, mismatchAt),\n                replayed_sample: snippetAround(replayedBody, mismatchAt),\n                ops_sample: pendingOpsSample(localOps),\n                error: `${err?.message || err || ''}`,\n            });\n            recordTestingPuffbookForensic('mutation_output_invariant', {\n                operation: label,\n                server_seq: this.#serverSeq,\n                server_version: this.#serverVersion,\n                pending_count: Array.isArray(localOps) ? localOps.length : 0,\n                base_body_bytes: utf8ByteLength(baseBody),\n                predicted_body_bytes: utf8ByteLength(predictedBody),\n                mismatch_at: mismatchAt,\n                expected_shape: 'predicted body equals replay(base body, pending operations)',\n                error: `${err?.message || err || ''}`,\n            });\n            console.error('Puffbook mutation output invariant failed.', {\n                label,\n                pending_count: Array.isArray(localOps) ? localOps.length : 0,\n                mismatch_at: mismatchAt,\n                predicted_sample: snippetAround(predictedBody, mismatchAt),\n                replayed_sample: snippetAround(replayedBody, mismatchAt),\n                ops_sample: pendingOpsSample(localOps),\n            });\n            throw err;\n        }\n    }\n\n    #ensurePendingPredictionInvariant(label) {\n        this.#assertPendingPredictionInvariant(label);\n    }\n\n    #restorePredictedStateAfterTransportRecovery(recovery) {\n        this.#predicted.sourceDrag = null;\n        if (recovery === null) {\n            return;\n        }\n        const recoveryLocalOps = cloneLocalInputTextOps(recovery.local_ops);\n        const recoveryBaseBody = recovery.base_body;\n        const authoritativeAdvanced = this.#predictedBody !== recoveryBaseBody;\n        let reconciled;\n        try {\n            reconciled = reconcileTransportRecoveryLocalOps(\n                recoveryBaseBody,\n                this.#predictedBody,\n                recoveryLocalOps,\n            );\n        } catch (err) {\n            const msg = `${err?.message || err || ''}`;\n            if (!msg.includes('Transport recovery authoritative body advanced without one sent prefix in flight')) {\n                throw err;\n            }\n            const recoveryChange = editFromBodies(this.#predictedBody, recovery.predicted_body);\n            const recoveryOp = recoveryChange === null\n                ? null\n                : makeLocalInputTextOp(recoveryChange, this.#predictedBody, { transportState: 'local' });\n            reconciled = {\n                kind: 'ok',\n                localOpsNext: recoveryOp === null ? [] : [recoveryOp],\n            };\n        }\n        const selectionBeforeRecovery = cloneSelection(this.#projectedSelection);\n        this.#projectedSelection = null;\n        this.#projectedCursor = { line: 0, col: 0 };\n        if (reconciled.localOpsNext.length > 0) {\n            this.#runPredictedMutation('transport_recovery_restore', (txn) => {\n                for (const op of reconciled.localOpsNext) {\n                    const resend = cloneLocalInputTextOp(op);\n                    setLocalInputTransportState(resend, 'local');\n                    absorbLocalInputTextOp(txn, resend);\n                }\n            }, { preserveUndoHistory: true });\n        }\n        const recoverySelectionChange = editFromBodies(recovery.predicted_body, this.#predictedBody);\n        const recoveredSelection = recoverySelectionChange === null ? selectionBeforeRecovery\n            : transformSelection(recovery.predicted_body, selectionBeforeRecovery,\n                replaceSpanChainFromChange(recovery.predicted_body, recoverySelectionChange), this.#serverBodyStartLine);\n        if (recoveredSelection !== null) this.#storeSourceSelection(recoveredSelection);\n        if (authoritativeAdvanced) {\n            this._editHistory = [];\n            this.#redoHistory = [];\n            this.#undoCoalesce = null;\n            pushTestingPuffbookTrace('puffbook_transport_recovery_ratified', {\n                reopened_version: this.#serverVersion,\n            });\n        }\n        pushTestingPuffbookTrace('puffbook_transport_recovery_restored', {\n            reopened_version: this.#serverVersion,\n            pending_count: this.#pending.length,\n        });\n    }\n\n    async #recoverFromEditConflict(err) {\n        const conflict = parseEditConflict(err?.message || err);\n        if (conflict === null || !this.#subscriptionUUID) {\n            return false;\n        }\n\n        const recovery = this.#snapshotTransportRecovery();\n        const beforeServerBody = recovery?.base_body ?? this.#predictedBody;\n        recordTestingPuffbookForensic('edit_conflict_recovery_start', {\n            operation: 'recoverFromEditConflict',\n            server_seq: this.#serverSeq,\n            server_version: this.#serverVersion,\n            pending_count: this.#pending.length,\n            body_bytes: utf8ByteLength(beforeServerBody),\n            conflict_baseline_version: conflict.baseline,\n            conflict_latest_version: conflict.latest,\n            expected_shape: 'live state remains available until replacement snapshot is diffed',\n        });\n        pushTestingPuffbookTrace('puffbook_edit_conflict_recovery_start', {\n            conflict_baseline_version: conflict.baseline,\n            latest_version: conflict.latest,\n            pending_count: this.#pending.length,\n        });\n        const snap = await this.#api.wsSnapshotPuffbook(this.fileRef);\n        recordTestingPuffbookForensic('edit_conflict_recovery_diff', {\n            operation: 'recoverFromEditConflict',\n            server_seq: this.#serverSeq,\n            server_version: this.#serverVersion,\n            replacement_version: snap.version,\n            live_body_bytes: utf8ByteLength(beforeServerBody),\n            replacement_body_bytes: utf8ByteLength(snap.body),\n            first_body_mismatch: firstMismatchIndex(beforeServerBody, snap.body),\n            pending_count: this.#pending.length,\n        });\n        const beforeStartLine = this.#serverBodyStartLine;\n        const serverChange = editFromBodies(beforeServerBody, snap.body);\n        this.#serverVersion = snap.version;\n        this.#predictedBody = this.#setPredictedBodyWindow(\n            snap.body,\n            snap.body_start_line ?? 0,\n            snap.body_end_line ?? splitBody(snap.body).length,\n            snap.total_lines ?? splitBody(snap.body).length,\n        );\n        const afterStartLine = this.#serverBodyStartLine;\n        this.#pending = [];\n        this.#pendingBaseBody = this.#predictedBody;\n        this.#viewportInFlight = false;\n        this.#payloadLoads = new Map();\n        this.#payloadDebug = new Map();\n        this.#predicted.lineRecords = rebaseLineRecordMap(\n            beforeServerBody,\n            snap.body,\n            this.#predicted.lineRecords,\n            serverChange,\n            beforeStartLine,\n            afterStartLine,\n        );\n        this.#rapidOff = null;\n        this.#installProjectionSnapshotOutputs(snap.outputs);\n        this.#restorePredictedStateAfterTransportRecovery(recovery);\n        this.#publishPredictedLines('edit_conflict_recovery');\n        recordTestingPuffbookForensic('edit_conflict_recovery_installed', {\n            operation: 'recoverFromEditConflict',\n            server_seq: this.#serverSeq,\n            server_version: this.#serverVersion,\n            replacement_version: snap.version,\n            body_bytes: utf8ByteLength(this.#predictedBody),\n            pending_count: this.#pending.length,\n        });\n        pushTestingPuffbookTrace('puffbook_edit_conflict_recovery_done', {\n            conflict_baseline_version: conflict.baseline,\n            latest_version: conflict.latest,\n            reopened_version: this.#serverVersion,\n            pending_count: this.#pending.length,\n        });\n        this.#scheduleFlushPending();\n        return true;\n    }\n\n    /* Keep the pending queue in canonical edit-chain form; do not resnapshot unsent typing back into one giant body diff. */\n    #rebuildPendingQueueForPrediction() {\n        this.#pending = compactLocalInputOps(this.#pending);\n        if (this.#pending.length === 0) {\n            this.#pendingBaseBody = this.#predictedBody;\n        }\n    }\n\n    /* Send queued local edits only against the latest authoritative source revision. */\n    #pendingSendBase() {\n        return {\n            baseVersion: this.#serverVersion,\n            prefixIndex: 0,\n        };\n    }\n\n    // derivedPendingLines projects the remaining unresolved latest-version rows from authoritative per-line state.\n    #derivedPendingLines() {\n        const lines = new Set([\n            ...this.#serverLineEntries('lineState').map(([line]) => line),\n            ...this.#serverLineEntries('payloadRef').map(([line]) => line),\n        ]);\n        const out = [];\n        for (const line of lines) {\n            const state = this.#serverLineState(line);\n            if (!state) {\n                continue;\n            }\n            if (state.kind === SERVER_LINE_STATE.TERMINAL_PENDING) {\n                out.push(line);\n                continue;\n            }\n            if (this.#serverLineHasUnresolvedPayloadRef(line, state)) {\n                out.push(line);\n            }\n        }\n        out.sort((a, b) => a - b);\n        return out;\n    }\n\n    // derivedPendingCount keeps tests and diagnostics on the same per-line projection seam as the runtime.\n    #derivedPendingCount() {\n        const pendingLines = this.#derivedPendingLines().length;\n        return pendingLines;\n    }\n\n    // syncDerivedSettlement projects whether the current version still has unresolved rows.\n    #syncDerivedSettlement() {\n        const pending = this.#derivedPendingCount();\n        if (this.#projectionBatchDepth > 0) {\n            this.#projectionBatchDirty = true;\n            return pending;\n        }\n        return pending;\n    }\n\n    /* Start one authoritative output batch so multi-line snapshots never leak transient intermediate rows into DocumentView. */\n    #beginProjectionBatch() {\n        this.#projectionBatchDepth += 1;\n    }\n\n    /* Flush one deferred authoritative output batch once all line-local updates for that bundle are installed. */\n    #endProjectionBatch() {\n        if (this.#projectionBatchDepth <= 0) {\n            throw new Error('Projection batch underflow.');\n        }\n        this.#projectionBatchDepth -= 1;\n        if (this.#projectionBatchDepth !== 0 || this.#projectionBatchDirty !== true) {\n            return;\n        }\n        this.#projectionBatchDirty = false;\n        if (this.#suppressProjectionBatchCommit) {\n            return;\n        }\n        this.#publishPredictedLines('projected_sync');\n    }\n\n    #handleServerViewport(\n        body,\n        bodyAbsStartLine = null,\n        bodyAbsEndLine = null,\n        totalLines = null,\n        outputs = null,\n        viewportAbsStartLine = null,\n        viewportAbsEndLine = null,\n        emittedAt = null,\n        streamSeq = null,\n        bodyMode = 'replace',\n        bodyPrefix = '',\n        bodySuffix = '',\n    ) {\n        const prevDisplay = this.#snapshotCommittedDisplayState();\n        const previousBodyAbsStartLine = this.#serverBodyStartLine;\n        const lagMS = eventLagMS(emittedAt);\n        const outputLines = projectionOutputRecords(outputs).map((record) => fieldInt(record, 'line'));\n        pushTestingPuffbookTrace('puffbook_handle_server_viewport_start', {\n            body_bytes: textEncoder.encode(typeof body === 'string' ? body : '').length,\n            body_start_line: bodyAbsStartLine ?? '',\n            body_end_line: bodyAbsEndLine ?? '',\n            total_lines: totalLines ?? '',\n            start_line: viewportAbsStartLine ?? '',\n            end_line: viewportAbsEndLine ?? '',\n            output_line_sample: outputLines.slice(0, 12),\n            output_line_count: outputLines.length,\n            pending_count: this.#pending.length,\n            seq: streamSeq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: lagMS,\n        });\n        const sparse = bodyMode === 'patch';\n        if (sparse) {\n            const oldStart = this.#serverBodyStartLine;\n            const authoritativeLineCount = this.#pendingBaseBody === ''\n                && this.#serverBodyStartLine === this.#serverBodyEndLine\n                ? 0\n                : splitBody(this.#pendingBaseBody).length;\n            const oldEnd = oldStart + authoritativeLineCount;\n            if (body !== '') {\n                throw new Error('Puffbook sparse viewport body must omit the replacement body.');\n            }\n            body = mergeProjectedBodyWindowPatch({\n                previousBody: this.#pendingBaseBody,\n                previousStartLine: oldStart,\n                previousEndLine: oldEnd,\n                nextStartLine: bodyAbsStartLine,\n                nextEndLine: bodyAbsEndLine,\n                totalLines,\n                prefix: bodyPrefix,\n                suffix: bodySuffix,\n            }).body;\n        }\n        const viewportBody = validateProjectedBodyWindow(body, bodyAbsStartLine, bodyAbsEndLine, totalLines);\n        // snapshot is an outright authoritative replacement. Pending local\n        // input is replayed over that replacement below; prior server rows and a\n        // wider prior body are never merged back into it.\n        const authoritative = viewportBody;\n        this.#pending = rebasePendingLocalOpsToBodyWindow(\n            this.#pending,\n            previousBodyAbsStartLine,\n            authoritative.start_line,\n        );\n        const replayed = replayPredictedBodyWindow(\n            authoritative.body,\n            authoritative.start_line,\n            authoritative.end_line,\n            authoritative.total_lines,\n            this.#pending,\n        );\n        this.#assertMutationOutputInvariant(\n            'handleServerViewport',\n            authoritative.body,\n            this.#pending,\n            replayed.body,\n        );\n        this.#predictedBody = this.#setPredictedBodyWindow(\n            replayed.body,\n            replayed.start_line,\n            replayed.end_line,\n            replayed.total_lines,\n        );\n        this.#pendingBaseBody = authoritative.body;\n        this.#projectedViewport = requireProjectionViewport(viewportAbsStartLine, viewportAbsEndLine);\n        this.#assertPredictedBodyWindowConsistent();\n        if (sparse) {\n            this.#evictServerLineRecordsOutside(viewportBody.start_line, viewportBody.end_line);\n        } else {\n            this.#clearServerLineRecords();\n        }\n        this.#payloadDebug = new Map();\n        this.#testingProjectionIngest = null;\n        try {\n            this.#suppressProjectionBatchCommit = true;\n            this.#installProjectionSnapshotOutputs(\n                outputs,\n                emittedAt,\n                streamSeq,\n                sparse ? 'viewport_patch' : 'snapshot',\n                true,\n                authoritative.start_line,\n                authoritative.end_line,\n            );\n        } finally {\n            this.#suppressProjectionBatchCommit = false;\n        }\n        this.#publishPredictedLinesFromPrev(prevDisplay, 'viewport_reslice');\n        this.#resumeSourceInput();\n        pushTestingPuffbookTrace('puffbook_handle_server_viewport_done', {\n            version: this.#serverVersion,\n            output_line_count: this.#serverLineFieldCount('lineState'),\n            pending_count: this.#pending.length,\n            seq: streamSeq ?? '',\n            event_lag_ms: lagMS,\n        });\n        void this.#flushViewport();\n    }\n\n    #installProjectionSnapshotOutputs(\n        outputs,\n        emittedAt = null,\n        streamSeq = 0,\n        mode = 'snapshot',\n        forceCommit = false,\n        snapshotBodyStartLine = this.#serverBodyStartLine,\n        snapshotBodyEndLine = this.#serverBodyEndLine,\n    ) {\n        const records = projectionOutputRecords(outputs);\n        this.#validateProjectionOutputBatch(\n            records,\n            mode,\n            snapshotBodyStartLine,\n            snapshotBodyEndLine,\n        );\n        let rapidFeedbackCleared = false;\n        if (mode === 'live') {\n            /* The batch itself is ordered native engagement evidence. A wave\n             * with no semantic row changes emits one empty batch on settlement,\n             * so no row-by-row inference is required here. */\n            if (this.#pending.length === 0) {\n                rapidFeedbackCleared = this.#clearRapidFeedback();\n            }\n        }\n        const snapshotLines = mode === 'snapshot' ? new Set() : null;\n        const diag = {\n            records: records.length,\n            readable_lines: 0,\n            readable_states: 0,\n            sample: [],\n        };\n        if (mode !== 'snapshot') {\n            // Live output frames can arrive after a source deletion. Reconcile\n            // the retained row set against the current body window before\n            // admitting those frames so deleted coordinates cannot keep\n            // settlement pending.\n            this.#evictServerLineRecordsOutside(this.#serverBodyStartLine, this.#serverBodyEndLine);\n        }\n        this.#beginProjectionBatch();\n        if (forceCommit || rapidFeedbackCleared) {\n            this.#projectionBatchDirty = true;\n        }\n        try {\n            for (const record of records) {\n                const absLineValue = structField(record, 'line');\n                const stateValue = structField(record, 'state');\n                const absLine = fieldInt(record, 'line');\n                const state = fieldText(record, 'state');\n                const status = fieldText(record, 'status');\n                if (Number.isInteger(absLine)) {\n                    diag.readable_lines += 1;\n                }\n                if (typeof state === 'string') {\n                    diag.readable_states += 1;\n                }\n                if (diag.sample.length < 3) {\n                    diag.sample.push({\n                        line_value: describeTestingValue(absLineValue),\n                        state_value: describeTestingValue(stateValue),\n                        line: absLine,\n                        state,\n                    });\n                }\n                if (!Number.isInteger(absLine) || typeof state !== 'string') {\n                    throw new Error(`Puffbook ${mode} output row must carry integer line and string state fields.`);\n                }\n                if (mode === 'snapshot') {\n                    assertProjectionSnapshotAbsLineInBodyWindow(\n                        absLine,\n                        snapshotBodyStartLine,\n                        snapshotBodyEndLine,\n                    );\n                    if (snapshotLines.has(absLine)) {\n                        throw new Error(`Puffbook projection snapshot repeats line ${absLine}.`);\n                    }\n                    snapshotLines.add(absLine);\n                }\n                switch (state) {\n                case 'terminal_pending':\n                case 'terminal_refreshing': {\n                    if (state === 'terminal_refreshing') {\n                        const payloadRef = optionalFieldText(record, 'payload_ref');\n                        if (typeof payloadRef === 'string' && payloadRef !== '') {\n                            this.#handleServerOutputRef(\n                                absLine,\n                                payloadRef,\n                                SERVER_LINE_STATE.TERMINAL_SUCCESS,\n                                status,\n                                emittedAt,\n                                streamSeq,\n                                true,\n                            );\n                        } else {\n                            const output = optionalField(record, 'output');\n                            if (output !== null && output !== undefined) {\n                                this.#handleServerOutput(\n                                    absLine,\n                                    output,\n                                    optionalField(record, 'preview_hints'),\n                                    SERVER_LINE_STATE.TERMINAL_SUCCESS,\n                                    status,\n                                    emittedAt,\n                                    streamSeq,\n                                    true,\n                                );\n                            } else {\n                                this.#handleServerRefreshing(\n                                    absLine,\n                                    status,\n                                    emittedAt,\n                                    streamSeq,\n                                );\n                            }\n                        }\n                    } else {\n\t\t\t\t\t\tthis.#handleServerPending(\n\t\t\t\t\t\t\tabsLine,\n\t\t\t\t\t\t\tstatus,\n                            emittedAt,\n                            streamSeq,\n                        );\n                    }\n                    break;\n                }\n                case 'terminal_success':\n                case 'terminal_failure': {\n                    const terminalKind = state === 'terminal_failure'\n                        ? SERVER_LINE_STATE.TERMINAL_FAILURE\n                        : SERVER_LINE_STATE.TERMINAL_SUCCESS;\n                    const resultKind = fieldText(record, 'result_kind');\n                    const payloadRef = optionalFieldText(record, 'payload_ref');\n                    if (typeof payloadRef === 'string' && payloadRef !== '') {\n\t\t\t\t\t\tthis.#handleServerOutputRef(\n\t\t\t\t\t\t\tabsLine,\n\t\t\t\t\t\t\tpayloadRef,\n                            terminalKind,\n                            status,\n                            emittedAt,\n                            streamSeq,\n                        );\n                        break;\n                    }\n\t\t\t\t\tif (resultKind === 'absent') {\n\t\t\t\t\t\tthis.#handleServerOutput(\n\t\t\t\t\t\t\tabsLine, null, null, terminalKind, status, emittedAt, streamSeq,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.#handleServerOutput(\n\t\t\t\t\tabsLine,\n\t\t\t\t\t\tmaterialiseNullOutput(resultKind, optionalField(record, 'output')),\n\t\t\t\t\t\toptionalField(record, 'preview_hints'),\n                        terminalKind,\n                        status,\n                        emittedAt,\n                        streamSeq,\n                    );\n                    break;\n                }\n                case 'continuation':\n\t\t\t\t\tthis.#handleServerContinuation(\n\t\t\t\t\tabsLine,\n\t\t\t\t\t\tstatus,\n                        emittedAt,\n                        streamSeq,\n                    );\n                    break;\n                case 'blank':\n\t\t\t\t\tthis.#handleServerBlank(\n\t\t\t\t\tabsLine,\n\t\t\t\t\t\tstatus,\n                        emittedAt,\n                        streamSeq,\n                    );\n                    break;\n                default:\n                    throw new Error(`Puffbook ${mode} output row ${absLine} has unsupported state=${JSON.stringify(state)}.`);\n                }\n            }\n            // A source insertion can precede its native lifecycle record.\n            // Snapshot replacement clears old records; omitted rows remain\n            // unknown until their ordered native line changes arrive.\n        } finally {\n            this.#endProjectionBatch();\n        }\n        this.#testingProjectionIngest = diag;\n        this.#syncDerivedSettlement();\n    }\n\n    /* Validate a complete output batch before any row-local handler can mutate state. */\n    #validateProjectionOutputBatch(records, mode, bodyStartLine, bodyEndLine) {\n        let previousLine = null;\n        const validStates = new Set([\n            'terminal_pending',\n            'terminal_refreshing',\n            'terminal_success',\n            'terminal_failure',\n            'continuation',\n            'blank',\n        ]);\n        for (const record of records) {\n            const line = fieldInt(record, 'line');\n            const state = fieldText(record, 'state');\n            if (mode === 'snapshot') {\n                assertProjectionSnapshotAbsLineInBodyWindow(line, bodyStartLine, bodyEndLine);\n            } else if (!Number.isInteger(line) || line < bodyStartLine || line >= bodyEndLine) {\n                throw new ProjectionInvariantError({\n                    owner: 'portal.projection',\n                    operation: 'apply_line_changes',\n                    canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n                    message: `Projection row is outside the current body window: line=${line} window=[${bodyStartLine},${bodyEndLine}).`,\n                    details: { mode, line, body_start_line: bodyStartLine, body_end_line: bodyEndLine },\n                });\n            }\n            if (previousLine !== null && line <= previousLine) {\n                throw new ProjectionInvariantError({\n                    owner: 'portal.projection',\n                    operation: 'apply_line_changes',\n                    canary: PROJECTION_CANARIES.SEQUENTIAL_DELTA_REJECTED,\n                    message: `Projection rows must be strictly ordered and unique: previous=${previousLine} current=${line}.`,\n                    details: { mode, previous_line: previousLine, line },\n                });\n            }\n            if (!validStates.has(state)) {\n                throw new ProjectionInvariantError({\n                    owner: 'portal.projection',\n                    operation: 'apply_line_changes',\n                    canary: PROJECTION_CANARIES.LIFECYCLE_TRANSITION_INVALID,\n                    message: `Projection row ${line} has unsupported lifecycle state=${JSON.stringify(state)}.`,\n                    details: { mode, line, state },\n                });\n            }\n            const status = optionalFieldText(record, 'status');\n            if (status !== null) {\n                try {\n                    normaliseLineStatus(status);\n                } catch (err) {\n                    throw new ProjectionInvariantError({\n                        owner: 'portal.projection',\n                        operation: 'apply_line_changes',\n                        canary: PROJECTION_CANARIES.LIFECYCLE_TRANSITION_INVALID,\n                        message: `Projection row ${line} has invalid status=${JSON.stringify(status)}: ${err.message}.`,\n                        details: { mode, line, state, status },\n                    });\n                }\n            }\n            const payloadRef = optionalFieldText(record, 'payload_ref');\n            if (payloadRef !== null && payloadRef === '') {\n                throw new ProjectionInvariantError({\n                    owner: 'portal.projection',\n                    operation: 'apply_line_changes',\n                    canary: PROJECTION_CANARIES.PAYLOAD_MEMBERSHIP_MISMATCH,\n                    message: `Projection row ${line} carries an empty payload reference.`,\n                    details: { mode, line, state },\n                });\n            }\n            previousLine = line;\n        }\n    }\n\n    /* Read one predicted row state keyed by absolute line number. */\n    #serverLineState(line) {\n        return this.#serverLineField(line, 'lineState') ?? null;\n    }\n\n    /* Replace one predicted row state without coupling it to payload/display storage. */\n    #setServerLineState(line, kind, opts = {}) {\n        this.#setServerLineField(line, 'lineState', makeServerLineState(kind, opts));\n    }\n\n    /* Keep one authoritative per-line status string distinct from output payload state. */\n    #setServerStatus(line, status) {\n        const next = normaliseLineStatus(status);\n        if (next === null) {\n            this.#deleteServerLineField(line, 'status');\n            return;\n        }\n        this.#setServerLineField(line, 'status', next);\n    }\n\n    /* Drop one stored line status when the authoritative row no longer carries badge semantics. */\n    #clearServerStatus(line) {\n        this.#deleteServerLineField(line, 'status');\n    }\n\n    /* Remove one predicted row state once that row no longer needs explicit tracking. */\n    #clearServerLineState(line) {\n        this.#deleteServerLineField(line, 'lineState');\n    }\n\n    #serverPayloadRef(line) {\n        return this.#serverLineField(line, 'payloadRef') ?? null;\n    }\n\n    #setServerPayloadRef(line, payloadRef) {\n        if (typeof payloadRef !== 'string' || payloadRef === '') {\n            this.#deleteServerLineField(line, 'payloadRef');\n            return;\n        }\n        this.#setServerLineField(line, 'payloadRef', payloadRef);\n    }\n\n    #clearServerPayloadRef(line) {\n        this.#deleteServerLineField(line, 'payloadRef');\n    }\n\n    // payloadRefLines returns the current settled rows still pointing at one external payload ref.\n    #payloadRefLines(payloadRef) {\n        const lines = [];\n        for (const [line, ref] of this.#serverLineEntries('payloadRef')) {\n            if (ref !== payloadRef) {\n                continue;\n            }\n            const state = this.#serverLineState(line);\n            const terminalOwner = (state?.kind === SERVER_LINE_STATE.TERMINAL_SUCCESS\n                || state?.kind === SERVER_LINE_STATE.TERMINAL_FAILURE)\n                && state.has_payload_ref === true;\n            const refreshingOwner = state?.kind === SERVER_LINE_STATE.TERMINAL_PENDING\n                && state.refreshing === true;\n            if (!terminalOwner && !refreshingOwner) {\n                continue;\n            }\n            lines.push(line);\n        }\n        lines.sort((a, b) => a - b);\n        return lines;\n    }\n\n    #handleServerEdit(version, edits = null, who = null, puffbookInstanceID = null, editOrdinal = null, emittedAt = null, streamSeq = null) {\n        if (typeof version !== 'number') {\n            return;\n        }\n        return withPortalTimingScope('puffbook.handle_server_edit', {\n            version,\n            who: who ?? '',\n            seq: streamSeq ?? '',\n        }, () => {\n            const startedMS = performance.now();\n            const lagMS = eventLagMS(emittedAt);\n            const currentVersion = this.#serverVersion;\n            const beforePredictedBody = this.#predictedBody;\n            const pendingBefore = this.#pending.slice();\n            const baseBodyBefore = this.#pendingBaseBody;\n            const serverChange = edits;\n            const sourceDiagnostic = sourceEditDiagnostic(serverChange);\n            const head = pendingBefore[0];\n            let serverSingleSpan = null;\n            let projectedBody = null;\n            try {\n                serverSingleSpan = trySingleChangeSpan(baseBodyBefore, serverChange, 'server single change');\n                projectedBody = this.#pending.length === 0\n                    ? materialiseReplaceSpans(beforePredictedBody, serverChange, 'predicted server change').next_body\n                    : null;\n            } catch (err) {\n                this.#scheduleAtomicResubscribe(\n                    new Error(\n                        `Puffbook source delta could not be decoded `\n                        + `(current_version=${currentVersion} next_version=${version} `\n                        + `source_version=${this.#serverVersion} pending_edits=${pendingBefore.length} `\n                        + `base_body_bytes=${utf8ByteLength(baseBodyBefore)} `\n                        + `predicted_body_bytes=${utf8ByteLength(beforePredictedBody)} `\n                        + `stream_seq=${streamSeq ?? ''} source=${JSON.stringify(sourceDiagnostic)}): `\n                        + `${err?.message || err}`,\n                    ),\n                    { closeCurrent: true },\n                );\n                return;\n            }\n            this.#ensurePendingPredictionInvariant('pre-server-delta pending chain');\n            pushTestingPuffbookTrace('puffbook_handle_server_edit_start', {\n                version,\n                edit_count: canonicalEditCount(serverChange, 'server change'),\n                body_line_delta: projectedBody === null ? '' : splitBody(projectedBody).length - splitBody(beforePredictedBody).length,\n                pending_count: this.#pending.length,\n                who: who ?? '',\n                seq: streamSeq ?? '',\n                emitted_at: emittedAt ?? '',\n                event_lag_ms: lagMS,\n            });\n            let out;\n            const ownEditOrdinal = puffbookInstanceID === this.#puffbookInstanceID\n                && Number.isSafeInteger(editOrdinal) && editOrdinal > 0\n                ? editOrdinal\n                : null;\n            const amend = this.#amendQueue[0];\n            const ownAmend = amend?.phase === 'sent' && amend.awaiting_server_edit\n                && ownEditOrdinal === amend.edit_ordinal;\n            const amendHistoryIndex = ownAmend\n                ? this._editHistory.findIndex((entry) => entry.pendingAmendID === amend.id) : -1;\n            const historyBeforeAmend = ownAmend ? this._editHistory.slice(0, amendHistoryIndex) : null;\n            const historyAfterAmend = ownAmend ? this._editHistory.slice(amendHistoryIndex + 1) : null;\n            let amendedBody = null;\n            try {\n                if (ownAmend) {\n                    if (amendHistoryIndex < 0) throw new Error('Pending amend is missing its undo reservation.');\n                    amendedBody = materialiseReplaceSpans(baseBodyBefore, serverChange, 'accepted amend').next_body;\n                    // The backend replaces a complete expression line. For\n                    // local prediction, project its actual text difference so\n                    // later independent typing is not mistaken for an overlap.\n                    const amendDifference = editFromBodies(baseBodyBefore, amendedBody);\n                    out = this.#runPredictedMutation('accepted_amend', (txn) => {\n                        if (amend.undoRequested) absorbUndoneServerTextChange(txn, serverChange);\n                        else if (amendDifference !== null) absorbServerTextChange(txn, amendDifference);\n                    }, { suppressDocEdits: true, preserveUndoHistory: true });\n                } else if (ownEditOrdinal) {\n                    pushTestingPuffbookTrace('puffbook_handle_server_edit_origin_match', {\n                        version,\n                        who: who ?? '',\n                        seq: streamSeq ?? '',\n                    });\n                    out = ratifyOriginBatch(\n                        this.#predicted,\n                        baseBodyBefore,\n                        pendingBefore,\n                        ownEditOrdinal,\n                    );\n                } else {\n                    pushTestingPuffbookTrace('puffbook_handle_server_edit_origin_miss', {\n                        version,\n                        who: who ?? '',\n                        seq: streamSeq ?? '',\n                    });\n                    out = this.#runPredictedMutation('server_text_edit', (txn) => {\n                        absorbServerTextChange(txn, serverChange);\n                    }, {\n                        suppressDocEdits: true,\n                    });\n                }\n            } catch (err) {\n                this.#scheduleAtomicResubscribe(\n                    new Error(\n                        `Puffbook source delta could not be applied `\n                        + `(current_version=${currentVersion} next_version=${version} `\n                        + `pending_edits=${pendingBefore.length} base_body_bytes=${utf8ByteLength(this.#pendingBaseBody)}): `\n                        + `${err?.message || err}`,\n                    ),\n                    { closeCurrent: true },\n                );\n                return;\n            }\n            if (!ownEditOrdinal && out.localOpsNext.length < pendingBefore.length) {\n                const droppedLocalOps = pendingBefore.slice();\n                for (const survivor of out.localOpsNext) {\n                    const index = droppedLocalOps.findIndex((candidate) => sameLocalInputSpan(candidate, survivor));\n                    if (index >= 0) {\n                        droppedLocalOps.splice(index, 1);\n                    }\n                }\n                console.warn('Authoritative puffbook edit overwrote pending local edits.', {\n                    file_ref: this.fileRef ?? null,\n                    current_version: currentVersion,\n                    authoritative_version: version,\n                    stream_seq: streamSeq ?? null,\n                    puffbook_instance_id: puffbookInstanceID ?? null,\n                    edit_ordinal: editOrdinal ?? null,\n                    pending_before: pendingBefore.length,\n                    pending_after: out.localOpsNext.length,\n                    dropped_local_edits: droppedLocalOps.map(describeOverwrittenLocalInputOp),\n                    authoritative_body_bytes: utf8ByteLength(baseBodyBefore),\n                    predicted_body_bytes: utf8ByteLength(beforePredictedBody),\n                    reason: 'non-local authoritative source edit conflicted with pending local edit',\n                });\n            }\n            this.#pending = out.localOpsNext;\n            this.#pendingBaseBody = out.localOpsNext.length === 0 ? out.predictedNext.body : out.baseBodyNext;\n            this.#serverVersion = version;\n            this.#rebuildPendingQueueForPrediction();\n            // Source edits are the only events that change line coordinates.\n            // Drop records for rows deleted from the current authoritative\n            // body window before live output deltas are applied; retaining a\n            // removed row keeps derived settlement artificially pending.\n            this.#evictServerLineRecordsOutside(this.#serverBodyStartLine, this.#serverBodyEndLine);\n            const ratifiedPredicted = !!(\n                head\n                && serverSingleSpan\n                && out.predictedNext.body === beforePredictedBody\n                && out.localOpsNext.length < pendingBefore.length\n            );\n            pushTestingPuffbookTrace('puffbook_handle_server_edit_reconcile', {\n                version,\n                ratified_predicted: ratifiedPredicted,\n                visible_line_delta: splitBody(out.predictedNext.body).length - splitBody(beforePredictedBody).length,\n                pending_before: pendingBefore.length,\n                pending_after: out.localOpsNext.length,\n                text_span_count: out.textSpans.length,\n                seq: streamSeq ?? '',\n                event_lag_ms: lagMS,\n            });\n            if (ownAmend) {\n                const sourceOp = makeLocalInputTextOp(serverChange, baseBodyBefore, { transportState: 'local' });\n                const afterLines = splitBody(amendedBody);\n                const entry = {\n                    undo_spans: [sourceOp.inverse_span],\n                    cursor: [amend.line_num, afterLines[amend.line_num].length],\n                    scope: amend.scope, selectionLength: 0,\n                };\n                this._editHistory = amend.undoRequested\n                    ? [...historyBeforeAmend, ...historyAfterAmend]\n                    : [\n                        ...historyBeforeAmend, entry,\n                        ...rebaseUndoHistoryThroughSpans(beforePredictedBody, historyAfterAmend, out.textSpans),\n                    ];\n                if (amend.undoRequested) {\n                    // The newly queued inverse precedes every later panel action.\n                    for (const request of this.#amendQueue.slice(1)) request.preceding_ops += 1;\n                }\n                this.#undoCoalesce = null;\n                amend.source_version = version;\n                amend.awaiting_server_edit = false;\n                if (this.#pendingAmend?.id === amend.id) {\n                    this.#pendingAmend.awaiting_server_edit = false;\n                    if (!this.#pendingAmend.awaiting_recompute) this.#pendingAmend = null;\n                }\n            } else {\n                const acknowledged = pendingBefore.length - out.localOpsNext.length;\n                for (const request of this.#amendQueue) {\n                    if (acknowledged > request.preceding_ops) {\n                        this.#cancelAmendQueue('A source edit conflicted with edits queued around an amendment.');\n                        break;\n                    }\n                    request.preceding_ops -= acknowledged;\n                    const reservation = this._editHistory.find((entry) => entry.pendingAmendID === request.id);\n                    if (reservation) request.line_num = reservation.cursor[0];\n                }\n            }\n            this.#sending = this.#pending.some((entry) => localInputOpIsInFlight(entry));\n            this.#rebaseRapidFeedbackSpans(beforePredictedBody, out.textSpans);\n            const prevDisplay = this.#snapshotCommittedDisplayState();\n            this.#refreshProjectedLinesFromState();\n            this.#stageDocEdits(buildServerEditDocEdits(\n                prevDisplay,\n                this.#snapshotCommittedDisplayState(),\n                out.textSpans,\n                version,\n                who,\n                emittedAt,\n                streamSeq,\n            ));\n            pushTestingPuffbookTrace('puffbook_handle_server_edit_done', {\n                version,\n                pending_count: this.#pending.length,\n                seq: streamSeq ?? '',\n                event_lag_ms: lagMS,\n                duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n            });\n            if (this.#viewportDirty) {\n                void this.#flushViewport();\n            }\n            if (ownAmend) this.#finishAmendSource(amend);\n            this.#pumpAmendQueue();\n            this.#scheduleFlushPending();\n        });\n    }\n\n    /* Apply one authoritative output-delta batch without coupling it to source-text reconciliation. */\n    #handleServerOutputDeltas(outputDeltas = null, emittedAt = null, streamSeq = null) {\n        this.#installProjectionSnapshotOutputs(outputDeltas, emittedAt, streamSeq, 'live');\n    }\n\n    #serverStatusForLine(line) {\n        if (this.#serverLineRecord(line)?.status !== undefined) {\n            return this.#serverLineField(line, 'status') ?? null;\n        }\n        const state = this.#serverLineState(line);\n        if (state?.kind !== SERVER_LINE_STATE.TERMINAL_PENDING) {\n            return null;\n        }\n        return LINE_STATUS_RECOMPUTE;\n    }\n\n    // visibleServerStatusLines returns the full row set that should currently show line-status chrome.\n    #visibleServerStatusLines() {\n        const out = new Set();\n        for (const [line, state] of this.#serverLineEntries('lineState')) {\n            if (state.kind !== SERVER_LINE_STATE.TERMINAL_PENDING) {\n                continue;\n            }\n            if (!this.#serverStatusForLine(line)) {\n                continue;\n            }\n            out.add(line);\n        }\n        return out;\n    }\n\n    #handleServerPending(line, status = null, emittedAt = null, streamSeq = null) {\n        if (!Number.isInteger(line) || line < 0) {\n            return;\n        }\n        line = this.#predictedLineForServerEvent(line);\n        const lagMS = eventLagMS(emittedAt);\n        pushTestingPuffbookTrace('puffbook_handle_server_pending_start', {\n            line,\n            seq: streamSeq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: lagMS,\n        });\n        this.#clearServerPayloadRef(line);\n        this.#setServerLineState(line, SERVER_LINE_STATE.TERMINAL_PENDING);\n        this.#setServerStatus(line, status ?? LINE_STATUS_RECOMPUTE);\n        this.#setServerLineField(line, 'cell', classifyOutputCell(null));\n        this.#publishPredictedLines('projected_sync');\n        this.#syncDerivedSettlement();\n        pushTestingPuffbookTrace('puffbook_handle_server_pending_done', {\n            line,\n            seq: streamSeq ?? '',\n            event_lag_ms: lagMS,\n        });\n    }\n\n    #handleServerRefreshing(line, status = null, emittedAt = null, streamSeq = null) {\n        if (!Number.isInteger(line) || line < 0) {\n            return;\n        }\n        line = this.#predictedLineForServerEvent(line);\n        const lagMS = eventLagMS(emittedAt);\n        pushTestingPuffbookTrace('puffbook_handle_server_refreshing_start', {\n            line,\n            seq: streamSeq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: lagMS,\n        });\n        this.#setServerLineState(line, SERVER_LINE_STATE.TERMINAL_PENDING, {\n            refreshing: true,\n        });\n        this.#setServerStatus(line, status ?? LINE_STATUS_RECOMPUTE);\n        this.#publishPredictedLines('projected_sync');\n        this.#syncDerivedSettlement();\n        pushTestingPuffbookTrace('puffbook_handle_server_refreshing_done', {\n            line,\n            seq: streamSeq ?? '',\n            event_lag_ms: lagMS,\n        });\n    }\n\n    #handleServerOutput(line, output, previewHints = null, terminalKind = SERVER_LINE_STATE.TERMINAL_SUCCESS, status = null, emittedAt = null, streamSeq = null, refreshing = false) {\n        line = this.#predictedLineForServerEvent(line);\n        const startedMS = performance.now();\n        const lagMS = eventLagMS(emittedAt);\n        const logicalType = typeof output?.logicalType === 'function' ? output.logicalType() : '';\n        pushTestingPuffbookTrace('puffbook_handle_server_output_start', {\n            line,\n            data_type: logicalType,\n            seq: streamSeq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: lagMS,\n        });\n        if (isRenderableTableOutput(output, logicalType)) {\n            pushTestingTableviewTrace('puffbook_handle_server_output_start', {\n                line,\n                data_type: logicalType,\n                hash: ptrlessHash(output),\n                preview: previewOutputText(outputPreviewText(output)),\n            });\n        }\n        const cell = classifyOutputCell(output, previewHints);\n        if (!refreshing && !terminalKindAcceptsCell(cell, terminalKind)) {\n            pushTestingPuffbookTrace('puffbook_terminal_kind_mismatch', {\n                line,\n                ...describeTerminalKindDecision(cell, terminalKind),\n            });\n            throw new Error(`Server terminal kind mismatch for line ${line}: event='${terminalKind}' cell='${cell.state}'.`);\n        }\n        if (cell.block_type === 'tableview') {\n            pushTestingTableviewTrace('puffbook_handle_server_output_cell', {\n                line,\n                data_type: logicalType,\n                state: cell.state,\n                block_type: cell.block_type,\n                hash: ptrlessHash(cell.obj),\n            });\n        }\n        this.#finishPendingAmendRecompute(line);\n        this.#setServerStatus(line, refreshing\n            ? LINE_STATUS_RECOMPUTE\n            : status ?? (cell.state === 'partial'\n                ? LINE_STATUS_PARTIAL\n                : terminalKind === SERVER_LINE_STATE.TERMINAL_FAILURE\n                    ? LINE_STATUS_ERROR\n                    : LINE_STATUS_SUCCESS));\n        this.#payloadDebug.delete(line);\n        this.#setServerLineState(\n            line,\n            refreshing ? SERVER_LINE_STATE.TERMINAL_PENDING : terminalKind,\n            refreshing ? { refreshing: true } : {},\n        );\n        this.#clearServerPayloadRef(line);\n        this.#setServerLineField(line, 'cell', cell);\n        this.#publishPredictedLines('projected_sync');\n        this.#syncDerivedSettlement();\n        pushTestingPuffbookTrace('puffbook_handle_server_output_done', {\n            line,\n            state: cell.state,\n            block_type: cell.block_type,\n            data_type: logicalType,\n            seq: streamSeq ?? '',\n            event_lag_ms: lagMS,\n            duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n        });\n    }\n\n    #handleServerOutputRef(line, payloadRef, terminalKind = SERVER_LINE_STATE.TERMINAL_SUCCESS, status = null, emittedAt = null, streamSeq = null, refreshing = false) {\n        if (typeof payloadRef !== 'string' || payloadRef === '') {\n            return;\n        }\n        pushTestingPuffbookTrace('puffbook_handle_server_output_ref_start', {\n            line,\n            payload_ref: payloadRef,\n            seq: streamSeq ?? '',\n        });\n        line = this.#predictedLineForServerEvent(line);\n        this.#payloadDebug.set(line, `waiting:${payloadRef}`);\n        this.#setServerLineState(\n            line,\n            refreshing ? SERVER_LINE_STATE.TERMINAL_PENDING : terminalKind,\n            refreshing ? { refreshing: true } : { hasPayloadRef: true },\n        );\n        this.#setServerStatus(\n            line,\n            refreshing ? LINE_STATUS_RECOMPUTE : LINE_STATUS_PAYLOAD_REF,\n        );\n        this.#setServerPayloadRef(line, payloadRef);\n        const cached = this.#payloadCache.get(payloadRef) ?? null;\n        if (cached) {\n            this.#payloadDebug.set(line, `cache_hit:${payloadRef}`);\n            pushTestingPuffbookTrace('puffbook_payload_ref_cache_hit', { line, payload_ref: payloadRef });\n            this.#materialisePayloadRefLines(payloadRef, cached.value, cached.preview_hints ?? null);\n            void this.#api.wsHavePuffbookPayload(this.#subscriptionUUID, payloadRef).catch(() => {});\n            return;\n        }\n        this.#setServerLineField(line, 'cell', classifyOutputCell(null));\n        this.#publishPredictedLines('projected_sync');\n        this.#syncDerivedSettlement();\n        void this.#ensurePayloadRefResolved(line, payloadRef);\n    }\n\n    async #ensurePayloadRefResolved(line, payloadRef) {\n        const subscriptionUUID = this.#subscriptionUUID;\n        if (!subscriptionUUID || this.#closed) {\n            pushTestingPuffbookTrace('puffbook_payload_ref_resolve_skipped', {\n                line,\n                payload_ref: payloadRef,\n                reason: !this.#subscriptionUUID ? 'missing_subscription_uuid' : 'closed',\n            });\n            return;\n        }\n        if (this.#serverPayloadRef(line) !== payloadRef) {\n            pushTestingPuffbookTrace('puffbook_payload_ref_resolve_skipped', {\n                line,\n                payload_ref: payloadRef,\n                reason: 'payload_mismatch',\n                current_payload_ref: this.#serverPayloadRef(line) ?? '',\n            });\n            return;\n        }\n        const loadKey = payloadRef;\n        if (this.#payloadLoads.has(loadKey)) {\n            pushTestingPuffbookTrace('puffbook_payload_ref_resolve_skipped', {\n                line,\n                payload_ref: payloadRef,\n                reason: 'already_loading',\n            });\n            return;\n        }\n        const job = (async () => {\n            this.#payloadDebug.set(line, `loading:${payloadRef}`);\n            this.#recordPayloadDiagnostic('resolve_start', {\n                line,\n                payload_ref: payloadRef,\n            });\n            pushTestingPuffbookTrace('puffbook_payload_ref_resolve_start', { line, payload_ref: payloadRef });\n            for (let attempt = 0; attempt <= 2; attempt++) {\n                if (this.#subscriptionUUID !== subscriptionUUID || this.#closed) {\n                    return;\n                }\n                if (this.#payloadRefLines(payloadRef).length === 0) {\n                    return;\n                }\n                try {\n                    const payload = await this.#api.wsNeedPuffbookPayload(subscriptionUUID, payloadRef);\n                    if (this.#subscriptionUUID !== subscriptionUUID || this.#closed) {\n                        return;\n                    }\n                    if (payload?.status === 'unavailable') {\n                        this.#payloadDebug.set(line, `unavailable:${payloadRef}:attempt=${attempt}`);\n                        this.#recordPayloadDiagnostic('unavailable', {\n                            line,\n                            payload_ref: payloadRef,\n                            attempt,\n                        });\n                        pushTestingPuffbookTrace('puffbook_payload_ref_unavailable', {\n                            line,\n                            payload_ref: payloadRef,\n                            attempt,\n                        });\n                        if (attempt < 2) {\n                            const attachment = await this.#api.wsAttachPuffbookData(subscriptionUUID);\n                            this.#recordPayloadDiagnostic('reannounced', {\n                                line,\n                                payload_ref: payloadRef,\n                                attempt,\n                                announced: attachment?.payload_refs?.includes(payloadRef) === true,\n                            });\n                            pushTestingPuffbookTrace('puffbook_payload_ref_reannounced', {\n                                line,\n                                payload_ref: payloadRef,\n                                attempt,\n                                announced: attachment?.payload_refs?.includes(payloadRef) === true,\n                            });\n                            await new Promise((resolve) => setTimeout(resolve, 100 * (attempt + 1)));\n                            continue;\n                        }\n                        console.error(`Puffbook payload unavailable after bounded retry: ${payloadRef}`);\n                        this.#recordPayloadDiagnostic('recovery_exhausted', {\n                            line,\n                            payload_ref: payloadRef,\n                            attempt,\n                            subscription_open: this.#subscriptionUUID !== null,\n                        });\n                        pushTestingPuffbookTrace('puffbook_payload_ref_recovery_exhausted', {\n                            line,\n                            payload_ref: payloadRef,\n                        });\n                        return;\n                    }\n                    if (this.#payloadRefLines(payloadRef).length === 0) {\n                        pushTestingPuffbookTrace('puffbook_payload_ref_orphan_completion', {\n                            line,\n                            payload_ref: payloadRef,\n                            attempt,\n                        });\n                        if (typeof this.#api.wsReleasePuffbookPayload === 'function') {\n                            void this.#api.wsReleasePuffbookPayload(subscriptionUUID, payloadRef).catch(() => {});\n                        }\n                        return;\n                    }\n                    this.#payloadCache.set(payloadRef, payload);\n                    this.#recordPayloadDiagnostic('fetched', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                    });\n                    this.#payloadDebug.set(line, `fetched:${payloadRef}:attempt=${attempt}`);\n                    pushTestingPuffbookTrace('puffbook_payload_ref_resolve_fetched', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                    });\n                    try {\n                        this.#materialisePayloadRefLines(payloadRef, payload.value, payload.preview_hints ?? null);\n                    } catch (materialiseErr) {\n                        this.#payloadDebug.set(line, `materialise_error:${payloadRef}:${materialiseErr?.message || materialiseErr || ''}`);\n                        pushTestingPuffbookTrace('puffbook_payload_ref_resolve_materialise_error', {\n                            line,\n                            payload_ref: payloadRef,\n                            attempt,\n                            detail: `${materialiseErr?.message || materialiseErr || ''}`,\n                        });\n                        this.#scheduleAtomicResubscribe(materialiseErr, { closeCurrent: true });\n                        return;\n                    }\n                    void this.#api.wsHavePuffbookPayload(subscriptionUUID, payloadRef).catch(() => {});\n                    this.#recordPayloadDiagnostic('resolved', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                    });\n                    this.#payloadDebug.set(line, `materialised:${payloadRef}:attempt=${attempt}`);\n                    pushTestingPuffbookTrace('puffbook_payload_ref_resolve_done', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                    });\n                    return;\n                } catch (err) {\n                    if (this.#subscriptionUUID !== subscriptionUUID || this.#closed) {\n                        return;\n                    }\n                    this.#recordPayloadDiagnostic('fetch_error', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                        detail: `${err?.message || err || ''}`,\n                    });\n                    this.#payloadDebug.set(line, `fetch_error:${payloadRef}:attempt=${attempt}:${err?.message || err || ''}`);\n                    pushTestingPuffbookTrace('puffbook_payload_ref_resolve_fetch_error', {\n                        line,\n                        payload_ref: payloadRef,\n                        attempt,\n                        detail: `${err?.message || err || ''}`,\n                    });\n                    if (isRetryablePayloadRefFetchError(err)) {\n                        if (attempt < 2) {\n                            await new Promise((resolve) => setTimeout(resolve, 100 * (attempt + 1)));\n                            continue;\n                        }\n                        pushTestingPuffbookTrace('puffbook_payload_ref_recovery_exhausted', {\n                            line,\n                            payload_ref: payloadRef,\n                            detail: `${err?.message || err || ''}`,\n                        });\n                        return;\n                    }\n                    this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n                    return;\n                }\n            }\n        })().finally(() => {\n            if (this.#payloadLoads.get(loadKey) === job) {\n                this.#payloadLoads.delete(loadKey);\n            }\n        });\n        this.#payloadLoads.set(loadKey, job);\n        await job;\n    }\n\n    /* Materialise one fetched payload across every current line still pointing at that shared payload ref. */\n    #materialisePayloadRefLines(payloadRef, output, previewHints = null) {\n        for (const line of this.#payloadRefLines(payloadRef)) {\n            const state = this.#serverLineState(line);\n            const refreshing = state?.kind === SERVER_LINE_STATE.TERMINAL_PENDING\n                && state.refreshing === true;\n            const kind = refreshing\n                ? SERVER_LINE_STATE.TERMINAL_SUCCESS\n                : state?.kind ?? null;\n            if (kind !== SERVER_LINE_STATE.TERMINAL_SUCCESS\n                && kind !== SERVER_LINE_STATE.TERMINAL_FAILURE) {\n                continue;\n            }\n            this.#materialisePayloadRef(line, payloadRef, output, previewHints, kind, refreshing);\n        }\n    }\n\n    #materialisePayloadRef(line, payloadRef, output, previewHints = null, terminalKind = SERVER_LINE_STATE.TERMINAL_SUCCESS, refreshing = false) {\n        if (this.#serverPayloadRef(line) !== payloadRef) {\n            return;\n        }\n        this.#payloadDebug.set(line, `materialising:${payloadRef}`);\n        const cell = classifyOutputCell(output, previewHints);\n        if (!refreshing && !terminalKindAcceptsCell(cell, terminalKind)) {\n            pushTestingPuffbookTrace('puffbook_payload_ref_terminal_kind_mismatch', {\n                line,\n                payload_ref: payloadRef,\n                ...describeTerminalKindDecision(cell, terminalKind),\n            });\n            throw new Error(`Payload-ref terminal kind mismatch for line ${line}: event='${terminalKind}' cell='${cell.state}'.`);\n        }\n        this.#finishPendingAmendRecompute(line);\n        if (refreshing) {\n            this.#setServerLineState(line, SERVER_LINE_STATE.TERMINAL_PENDING, { refreshing: true });\n            this.#setServerStatus(line, LINE_STATUS_RECOMPUTE);\n        } else {\n            this.#setServerLineState(line, terminalKind);\n            this.#setServerStatus(\n                line,\n                cell.state === 'partial'\n                    ? LINE_STATUS_PARTIAL\n                    : terminalKind === SERVER_LINE_STATE.TERMINAL_FAILURE\n                        ? LINE_STATUS_ERROR\n                        : LINE_STATUS_SUCCESS,\n            );\n        }\n        this.#clearServerPayloadRef(line);\n        this.#payloadDebug.set(line, `ready:${payloadRef}`);\n        this.#setServerLineField(line, 'cell', cell);\n        this.#publishPredictedLines('projected_sync');\n        this.#syncDerivedSettlement();\n    }\n\n    #handleServerBlank(line, status = null, emittedAt = null, streamSeq = null) {\n        this.#handleServerEmpty(line, SERVER_LINE_STATE.BLANK, 'blank', status, emittedAt, streamSeq);\n    }\n\n    #handleServerContinuation(line, status = null, emittedAt = null, streamSeq = null) {\n        this.#handleServerEmpty(line, SERVER_LINE_STATE.CONTINUATION, 'continuation', status, emittedAt, streamSeq);\n    }\n\n    #handleServerEmpty(line, kind, label, status = null, emittedAt = null, streamSeq = null) {\n        line = this.#predictedLineForServerEvent(line);\n        const lagMS = eventLagMS(emittedAt);\n        pushTestingPuffbookTrace(`puffbook_handle_server_${label}_start`, {\n            line,\n            seq: streamSeq ?? '',\n            emitted_at: emittedAt ?? '',\n            event_lag_ms: lagMS,\n        });\n        this.#clearServerPayloadRef(line);\n        this.#payloadDebug.delete(line);\n        this.#setServerLineState(line, kind);\n        this.#clearServerStatus(line);\n        this.#setServerLineField(line, 'cell', classifyOutputCell(null));\n        this.#publishPredictedLines('projected_sync');\n        this.#finishPendingAmendRecompute(line);\n        this.#syncDerivedSettlement();\n        pushTestingPuffbookTrace(`puffbook_handle_server_${label}_done`, {\n            line,\n            seq: streamSeq ?? '',\n            event_lag_ms: lagMS,\n        });\n    }\n\n    /* Commit one local predicted edit and expose the synchronous rebase/staging costs behind the visible keydown lag. */\n    #commitPredictedEdit(beforeBody, change, cursor, undoCoalesce = null, undoScope = null, undoSelectionLength = 0) {\n        if (change === null) {\n            return;\n        }\n        const undoCoalesceBeforeMutation = (this._editHistory.at(-1)?.scope ?? null) === undoScope\n            ? this.#undoCoalesce : null;\n        const startedMS = performance.now();\n        const beforeViewport = this.#projectedViewport;\n        const beforeBodyStartLine = this.#serverBodyStartLine;\n        const beforeBodyEndLine = this.#serverBodyEndLine;\n        const makeOpStartedMS = performance.now();\n        const op = makeLocalInputTextOp(change, beforeBody, {\n            transportState: 'local',\n            createdAtMS: Date.now(),\n        });\n        const makeOpDurationMS = performance.now() - makeOpStartedMS;\n        const applyLocalStartedMS = performance.now();\n        const out = applyLocalInputTextOpDirect(this.#predicted, this.#pending, op, this.#pendingBaseBody);\n        const applyLocalDurationMS = performance.now() - applyLocalStartedMS;\n        this.#assertMutationOutputInvariant(\n            'commitPredictedEdit',\n            out.localOpsNext.length === 0 ? out.predictedNext.body : this.#pendingBaseBody,\n            out.localOpsNext,\n            out.predictedNext.body,\n        );\n        const rebaseUiStartedMS = performance.now();\n        const rebasedUiState = rebaseProjectedUiStateThroughSpans(beforeBody, out.textSpans, {\n            projectedCursor: this.#projectedCursor,\n            projectedSelection: this.#projectedSelection,\n            projectedViewport: this.#projectedViewport,\n            observedViewportState: this.#observedViewportState,\n        }, beforeBodyStartLine);\n        const rebaseUiDurationMS = performance.now() - rebaseUiStartedMS;\n        // History is a LIFO programme: earlier inverses run only after this\n        // edit has been undone. Do not rebase them over another local edit.\n        const restorePredictedStartedMS = performance.now();\n        out.predictedNext.sourceDrag = null;\n        this.#restorePredictedState(out.predictedNext);\n        const restorePredictedDurationMS = performance.now() - restorePredictedStartedMS;\n        this.#pending = out.localOpsNext;\n        this.#pendingBaseBody = out.localOpsNext.length === 0 ? out.predictedNext.body : this.#pendingBaseBody;\n        const rebuildPendingStartedMS = performance.now();\n        this.#rebuildPendingQueueForPrediction();\n        const rebuildPendingDurationMS = performance.now() - rebuildPendingStartedMS;\n        const assignRuntimeStartedMS = performance.now();\n        // The keydown transaction computes the post-edit caret explicitly.\n        // Commit it with the predicted body instead of retaining a second\n        // last-local-cursor authority outside document state.\n        this.#storeSourceSelection(selectionAt({ line: this.#serverBodyStartLine + cursor[0], col: cursor[1] }));\n        this.#observedViewportState = rebasedUiState.observedViewportState;\n        const recordUndoStartedMS = performance.now();\n        this.#recordUndoEntry(op, cursor, undoCoalesce, undoCoalesceBeforeMutation, undoScope, undoSelectionLength);\n        const recordUndoDurationMS = performance.now() - recordUndoStartedMS;\n        const assignRuntimeDurationMS = performance.now() - assignRuntimeStartedMS;\n        const stageDocEditsStartedMS = performance.now();\n        this.#stageDocEdits(out.docEdits);\n        const stageDocEditsDurationMS = performance.now() - stageDocEditsStartedMS;\n        const repairViewportStartedMS = performance.now();\n        const repairedViewport = deriveProjectionViewportForBodyWindowDelta(\n            rebasedUiState.projectedViewport,\n            beforeBodyStartLine,\n            beforeBodyEndLine,\n            this.#serverBodyStartLine,\n            this.#serverBodyEndLine,\n        );\n        const repairViewportDurationMS = performance.now() - repairViewportStartedMS;\n        const flushViewportStartedMS = performance.now();\n        if (!sameProjectionViewport(beforeViewport, repairedViewport)) {\n            this.#projectedViewport = repairedViewport;\n            this.#viewportDirty = true;\n            void this.#flushViewport();\n        } else {\n            this.#projectedViewport = repairedViewport;\n        }\n        const flushViewportDurationMS = performance.now() - flushViewportStartedMS;\n        const rapidFeedbackStartedMS = performance.now();\n        this.#noteRapidFeedbackCursor(cursor);\n        this.#publishPredictedLines('rapid_feedback');\n        const rapidFeedbackDurationMS = performance.now() - rapidFeedbackStartedMS;\n        const flushPendingStartedMS = performance.now();\n        this.#scheduleFlushPending();\n        const flushPendingDurationMS = performance.now() - flushPendingStartedMS;\n        pushTestingPortalTimingTrace('puffbook_commit_predicted_edit', {\n            line_count: this._lines.length,\n            pending_before: this.#pending.length,\n            local_ops_next_count: out.localOpsNext.length,\n            change_edit_count: canonicalEditCount(change, 'predicted local change'),\n            text_span_count: out.textSpans.length,\n            doc_edit_count: out.docEdits.length,\n            make_local_op_ms: Number(makeOpDurationMS.toFixed(3)),\n            record_undo_ms: Number(recordUndoDurationMS.toFixed(3)),\n            apply_local_op_ms: Number(applyLocalDurationMS.toFixed(3)),\n            rebase_ui_ms: Number(rebaseUiDurationMS.toFixed(3)),\n            restore_predicted_ms: Number(restorePredictedDurationMS.toFixed(3)),\n            rebuild_pending_queue_ms: Number(rebuildPendingDurationMS.toFixed(3)),\n            assign_runtime_ms: Number(assignRuntimeDurationMS.toFixed(3)),\n            stage_doc_edits_ms: Number(stageDocEditsDurationMS.toFixed(3)),\n            repair_viewport_ms: Number(repairViewportDurationMS.toFixed(3)),\n            flush_viewport_kick_ms: Number(flushViewportDurationMS.toFixed(3)),\n            rapid_feedback_ms: Number(rapidFeedbackDurationMS.toFixed(3)),\n            flush_pending_kick_ms: Number(flushPendingDurationMS.toFixed(3)),\n            total_ms: Number((performance.now() - startedMS).toFixed(3)),\n        });\n    }\n\n    // noteRapidFeedbackCursor anchors one ephemeral local status icon to the latest caret.\n    #noteRapidFeedbackCursor(cursor) {\n        if (this.#pending.length === 0) {\n            this.#rapidOff = null;\n            return;\n        }\n        if (!Array.isArray(cursor) || cursor.length !== 2) {\n            return;\n        }\n        const index = buildLineOffsetIndex(this.#predictedBody);\n        const off = byteOffsetForLineColWithIndex(index, cursor[0], cursor[1]);\n        const lineNum = lineForOffsetFromIndex(index, off);\n        const text = splitBody(this.#predictedBody)[lineNum] ?? '';\n        if (isUnconditionallyMute(text)) {\n            this.#rapidOff = null;\n            return;\n        }\n        this.#rapidOff = off;\n    }\n\n\n    /* Report whether one terminal row still points at an unresolved external payload ref rather than a materialised output cell. */\n    #serverLineHasUnresolvedPayloadRef(line, state = this.#serverLineState(line)) {\n        if ((state?.kind !== SERVER_LINE_STATE.TERMINAL_SUCCESS && state?.kind !== SERVER_LINE_STATE.TERMINAL_FAILURE) || state.has_payload_ref !== true) {\n            return false;\n        }\n        const cell = this.#serverLineField(line, 'cell') ?? null;\n        return (cell?.state ?? 'none') === 'none';\n    }\n\n    /* Rebase the rapid-feedback anchor through one concrete predicted-space span sequence without diffing whole bodies. */\n    #rebaseRapidFeedbackSpans(body, spans) {\n        if (this.#rapidOff === null) {\n            return;\n        }\n        if (!Array.isArray(spans) || spans.length === 0) {\n            return;\n        }\n        const beforeIndex = buildLineOffsetIndex(body);\n        if (!Number.isInteger(this.#rapidOff) || this.#rapidOff < 0 || this.#rapidOff > beforeIndex.maxOffset) {\n            throw new Error(`Rapid-feedback offset is outside the authoritative body (offset=${JSON.stringify(this.#rapidOff)} body_bytes=${beforeIndex.maxOffset}).`);\n        }\n        const off = this.#rapidOff;\n        const line = lineForOffsetFromIndex(beforeIndex, off);\n        const lineStart = beforeIndex.starts[line];\n        if (!Number.isInteger(lineStart) || off < lineStart) {\n            throw new Error(`Rapid-feedback offset resolved to an invalid line start (offset=${off} line=${line} start=${JSON.stringify(lineStart)}).`);\n        }\n        const col = off - lineStart;\n        const moved = rebaseProjectionPointThroughSpans(body, { line, col }, spans);\n        let afterBody = body;\n        for (const span of spans) {\n            afterBody = applyReplaceSpan(afterBody, span);\n        }\n        if (moved) {\n            const afterIndex = buildLineOffsetIndex(afterBody);\n            this.#rapidOff = byteOffsetForLineColWithIndex(afterIndex, moved.line, moved.col);\n        }\n    }\n\n    // clearRapidFeedback retires one local rapid overlay once authoritative compute-state arrives.\n    #clearRapidFeedback() {\n        if (this.#rapidOff === null) {\n            return false;\n        }\n        this.#rapidOff = null;\n        return true;\n    }\n\n    // projectedRapidStatusLine maps the rebased local caret onto the current canonical output row.\n    #projectedRapidStatusLine() {\n        if (this.#rapidOff === null) {\n            return null;\n        }\n        const index = buildLineOffsetIndex(this.#predictedBody);\n        const off = Math.min(index.maxOffset, Math.max(0, this.#rapidOff));\n        const displayLine = lineForOffsetFromIndex(index, off);\n        const text = splitBody(this.#predictedBody)[displayLine] ?? '';\n        if (isUnconditionallyMute(text)) {\n            return null;\n        }\n        const localRow = localCanonicalOutputLine(this.#predictedBody, displayLine);\n        if (!Number.isInteger(localRow) || localRow < 0) {\n            return null;\n        }\n        return localRow;\n    }\n\n    // projectedRapidStatusServerLine projects the current local rapid-status row back into absolute server-line space.\n    #projectedRapidStatusServerLine() {\n        const line = this.#projectedRapidStatusLine();\n        if (!Number.isInteger(line) || line < 0) {\n            return null;\n        }\n        return this.#windowLineToServerLine(line);\n    }\n\n    /* Decorate one render projection with the local, unacknowledged edit prediction.\n       The authoritative line record remains untouched. */\n    #applyRapidFeedbackOverlay(lines) {\n        for (const projected of lines) {\n            projected.local_waiting = false;\n        }\n        const line = this.#projectedRapidStatusLine();\n        if (!Number.isInteger(line) || line < 0 || line >= lines.length) {\n            return;\n        }\n        lines[line].local_waiting = true;\n    }\n\n\n    #recordUndoEntry(op, cursor, undoCoalesce, activeUndoCoalesce = this.#undoCoalesce, scope = null, selectionLength = 0) {\n        if (!op?.inverse_span) {\n            throw new Error('Undo history requires an invertible local input op.');\n        }\n        const last = this._editHistory.at(-1) ?? null;\n        if (shouldCoalesceUndo(activeUndoCoalesce, undoCoalesce)) {\n            if (!last) {\n                this.#undoCoalesce = null;\n            } else {\n                last.undo_spans.unshift(op.inverse_span);\n                last.cursor = cursor;\n                this.#undoCoalesce = undoCoalesce ? { ...undoCoalesce } : null;\n                return;\n            }\n        }\n        this._editHistory.push({\n            undo_spans: [op.inverse_span],\n            cursor,\n            scope,\n            selectionLength,\n        });\n        this.#undoCoalesce = undoCoalesce ? { ...undoCoalesce } : null;\n    }\n\n    async #flushPending() {\n        if (this.#pendingFlushRunning) {\n            this.#pendingFlushAgain = true;\n            return;\n        }\n        this.#pendingFlushRunning = true;\n        try {\n            while (!this.#readOnly && !!this.#subscriptionUUID) {\n                this.#pending = compactLocalInputOps(this.#pending);\n                if (this.#pending.length === 0) {\n                    this.#pending = [];\n                    this.#pendingBaseBody = this.#predictedBody;\n                    return;\n                }\n                this.#ensurePendingPredictionInvariant('pre-flush pending chain');\n                const first = this.#pending.findIndex((entry) => localInputOpIsLocal(entry));\n                if (first < 0) {\n                    return;\n                }\n                const unsent = this.#pending.slice(first);\n                if (unsent.some((entry) => localInputOpIsInFlight(entry))) {\n                    throw new Error('Pending queue has an in-flight op after its first local op.');\n                }\n                const boundary = this.#amendQueue[0]?.preceding_ops ?? this.#pending.length;\n                const ops = this.#pending.slice(first, boundary);\n                if (ops.length === 0) {\n                    this.#pumpAmendQueue();\n                    return;\n                }\n                const result = await this.#sendPendingInputOps(ops);\n                if (result === 'sent') {\n                    // Sending only marks this suffix in flight. Keep walking\n                    // the local queue so a later suffix may choose the same\n                    // current source baseline and let the receiver rebase it.\n                    continue;\n                }\n                return;\n            }\n        } finally {\n            this.#pendingFlushRunning = false;\n            if (this.#pendingFlushAgain) {\n                this.#pendingFlushAgain = false;\n                this.#scheduleFlushPending();\n            }\n        }\n    }\n\n    /* Send one buffered local suffix against the latest source baseline, projecting it through its pending prefix. */\n    async #sendPendingInputOps(ops) {\n        if (!Array.isArray(ops) || ops.length === 0 || !this.#subscriptionUUID) {\n            return 'idle';\n        }\n        const pendingIndex = this.#pending.indexOf(ops[0]);\n        if (pendingIndex < 0) {\n            throw new Error('Pending send batch is not present in the local queue.');\n        }\n        for (const op of ops) {\n            if (localInputOpIsInFlight(op)) {\n                throw new Error('Pending send batch contains an in-flight op.');\n            }\n        }\n        // The batch is one ordered sequential EditChain. Its later rows are\n        // validated and projected in the body frame produced by earlier rows;\n        // newline edits therefore need no special transport boundary. The\n        // fixed row bound is syntax-neutral and leaves the suffix queued.\n        const batchOps = ops.slice(0, MAX_OUTBOUND_EDIT_ROWS);\n        const sendBase = this.#pendingSendBase();\n        const prefix = this.#pending.slice(sendBase.prefixIndex, pendingIndex);\n        const projectedBatch = tryProjectLocalInputOpsToBaseFrame(batchOps, prefix);\n        if (projectedBatch.kind !== 'ok') {\n            return 'blocked';\n        }\n        // Project the complete ordered batch together. The projection carries\n        // the transformed inverse prefix forward after each row, so later\n        // rows retain the coordinate frame produced by earlier rows.\n        const projected = projectedBatch.ops;\n        const outboundEdits = projected.map((op) => projectLocalInputOpEdit(op, (line) => this.#windowLineToServerLine(line)));\n        const sendSubscriptionUUID = this.#subscriptionUUID;\n        if (!sendSubscriptionUUID) {\n            return 'idle';\n        }\n        const ordinal = this.#nextEditOrdinal;\n        this.#nextEditOrdinal += 1;\n        for (let i = 0; i < batchOps.length; i += 1) {\n            const op = batchOps[i];\n            setLocalInputTransportState(op, 'in_flight', { editOrdinal: ordinal });\n            this.#stagePendingInputPhase(op.span, 'sent');\n        }\n        this.#pendingFlushStartedAt = 0;\n        this.#sending = true;\n        this.#mutateInFlightCount += 1;\n        const firstOp = ops[0];\n        void (async () => {\n            try {\n                const acceptedVersion = await withPortalTimingScope('puffbook.flush_pending', {\n                    server_version: this.#serverVersion,\n                    base_version: sendBase.baseVersion,\n                    edit_ordinal: ordinal,\n                    line: this.#windowLineToServerLine(projected[0].span.start_line),\n                    edit_count: outboundEdits.length,\n                    queued_edit_count: batchOps.length,\n                }, () => this.#api.wsMutatePuffbook(\n                    sendSubscriptionUUID,\n                    this.#puffbookInstanceID,\n                    sendBase.baseVersion,\n                    ordinal,\n                    newEditChain(outboundEdits),\n                ));\n                if (this.#subscriptionUUID !== sendSubscriptionUUID) {\n                    pushTestingPuffbookTrace('puffbook_mutate_obsolete_completion', {\n                        subscription_uuid: sendSubscriptionUUID,\n                        current_subscription_uuid: this.#subscriptionUUID ?? '',\n                        edit_ordinal: ordinal,\n                        outcome: 'accepted',\n                    });\n                    return;\n                }\n                if (Number.isInteger(acceptedVersion)) {\n                    // Transactions may clone pending ops while this RPC is in flight.\n                    // Completion belongs to the current ordinal, not old object references.\n                    for (const op of this.#pending) {\n                        if (op.edit_ordinal === ordinal) op.accepted_version = acceptedVersion;\n                    }\n                }\n            } catch (err) {\n                if (this.#subscriptionUUID !== sendSubscriptionUUID) {\n                    pushTestingPuffbookTrace('puffbook_mutate_obsolete_completion', {\n                        subscription_uuid: sendSubscriptionUUID,\n                        current_subscription_uuid: this.#subscriptionUUID ?? '',\n                        edit_ordinal: ordinal,\n                        outcome: 'error',\n                        error: `${err?.message || err || ''}`,\n                    });\n                    return;\n                }\n                console.error('Puffbook mutate failed', err);\n                for (const item of this.#pending) {\n                    if (Number.isInteger(item?.edit_ordinal) && item.edit_ordinal === ordinal) {\n                        setLocalInputTransportState(item, 'local', { clearAcceptedVersion: true });\n                    }\n                }\n                this.#stagePendingInputPhase(firstOp.span, 'local');\n                const msg = `${err?.message || err || ''}`;\n                if (isUnknownPuffbookSubscriptionError(msg)) {\n                    this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n                    return;\n                }\n                await this.#recoverFromEditConflict(err);\n            } finally {\n                this.#mutateInFlightCount = Math.max(0, this.#mutateInFlightCount - 1);\n                this.#sending = this.#pending.some((entry) => localInputOpIsInFlight(entry));\n                this.#scheduleFlushPending();\n            }\n        })();\n        return 'sent';\n    }\n\n    /* Flush one latest viewport band while coalescing rapid scroll churn into at most one in-flight RPC. */\n    async #flushViewport() {\n        if (this.#closed || !this.#subscriptionUUID || !this.#viewportDirty\n            || this.#viewportInFlight || this.#viewportTerminalError !== null) {\n            return;\n        }\n        if (typeof this.#api?.wsSetPuffbookViewport !== 'function') {\n            this.#viewportDirty = false;\n            return;\n        }\n        const viewport = this.#pendingViewportForFlush();\n        this.#viewportDirty = false;\n        this.#viewportInFlight = true;\n        let deferRetry = false;\n        try {\n            await this.#api.wsSetPuffbookViewport(\n                this.#subscriptionUUID,\n                viewport?.start_line ?? -1,\n                viewport?.end_line ?? -1,\n            );\n        } catch (err) {\n            const msg = `${err?.message || err || ''}`;\n            if (isUnknownPuffbookSubscriptionError(msg)) {\n                this.#scheduleAtomicResubscribe(err, { closeCurrent: false });\n                return;\n            }\n            if (isPuffbookViewportContractError(msg)) {\n                this.#viewportTerminalError = err;\n                this.#viewportDirty = false;\n                this.#cancelViewportSyncTimer();\n                console.error('Puffbook viewport contract failed; viewport updates are disabled for this subscription.', {\n                    file_ref: this.fileRef,\n                    subscription_uuid: this.#subscriptionUUID,\n                    error: err,\n                });\n                this.#onLoadError?.(err, this);\n                return;\n            }\n            deferRetry = parseEditConflict(msg) !== null || msg.includes('puffbook projection stale:');\n            if (!this.#closed && !msg.includes('WebSocket connection closed.') && !deferRetry) {\n                console.warn('Puffbook viewport update failed', err);\n            }\n            this.#viewportDirty = true;\n        } finally {\n            this.#viewportInFlight = false;\n            if (this.#viewportDirty && !deferRetry) {\n                void this.#flushViewport();\n            }\n        }\n    }\n\n    /* Derive one client-requested warm band without mutating the last authoritative server echo. */\n    #pendingViewportForFlush() {\n        const observed = this.#observedViewportState === null ? this.#projectedViewport\n            : projectionViewportFromBands(this.#observedViewportState, this.#projectedViewport);\n        const ranges = this.#projectedSelection?.ranges ?? [];\n        const pin = ranges.length > 1 || ranges.some(r => !rangeIsEmpty(r));\n        const endpoints = pin ? ranges.flatMap(r => [r.anchor.line, r.focus.line]) : [];\n        const demands = [this.#sourceDemand, this.#searchSourceDemand].filter(Boolean);\n        const demand = demands.length === 0 ? null : {\n            start_line: Math.min(...demands.map(range => range.start_line)),\n            end_line: Math.max(...demands.map(range => range.end_line)),\n        };\n        if (endpoints.length === 0 && demand === null) return observed;\n        return {\n            start_line: Math.min(observed?.start_line ?? this.#serverBodyStartLine,\n                demand?.start_line ?? Infinity, ...endpoints),\n            end_line: Math.max(observed?.end_line ?? this.#serverBodyEndLine,\n                demand?.end_line ?? -Infinity, ...endpoints.map(line => line + 1)),\n        };\n    }\n\n    /* Materialise one pending viewport amendment from the latest observed warm band. */\n    #refreshPendingViewportFromObservation() {\n        const currentViewport = this.#projectedViewport;\n        const nextViewport = this.#pendingViewportForFlush();\n        if (sameProjectionViewport(currentViewport, nextViewport)) {\n            return false;\n        }\n        this.#viewportDirty = true;\n        void this.#flushViewport();\n        return true;\n    }\n\n    /* Ensure one lagged viewport-sync loop stays alive while fresh client observations keep arriving. */\n    #scheduleViewportSyncTimer() {\n        if (this.#closed || this.#ownPendingViewportSyncTimer !== null) {\n            return;\n        }\n        this.#ownPendingViewportSyncTimer = setTimeout(() => {\n            this.#ownPendingViewportSyncTimer = null;\n            this.#runViewportSyncTimer();\n        }, VIEWPORT_SYNC_INTERVAL_MS);\n    }\n\n    /* Stop the lagged viewport-sync loop once the document closes or observations go idle. */\n    #cancelViewportSyncTimer() {\n        if (this.#ownPendingViewportSyncTimer === null) {\n            return;\n        }\n        clearTimeout(this.#ownPendingViewportSyncTimer);\n        this.#ownPendingViewportSyncTimer = null;\n    }\n\n    /* Re-evaluate the latest observed warm band at 1 Hz and stop after sustained idle. */\n    #runViewportSyncTimer() {\n        if (this.#closed) {\n            return;\n        }\n        this.#refreshPendingViewportFromObservation();\n        if ((Date.now() - this.#viewportObservedAtMS) >= VIEWPORT_SYNC_IDLE_STOP_MS) {\n            return;\n        }\n        this.#scheduleViewportSyncTimer();\n    }\n\n    /* Refresh the scene-facing line cache from the current predicted/server state without deriving a doc-edit diff. */\n    #refreshProjectedLinesFromState() {\n        const next = this.#snapshotPredictedState();\n        next.lines = materialisePredictedLines(next, this._lines, this.#pendingLocalInputSpans());\n        this.#applyRapidFeedbackOverlay(next.lines);\n        validatePredictedState(next);\n        this.#restorePredictedState(next);\n    }\n\n    /* Capture the current committed display snapshot before an owner-layer transition mutates window coordinates. */\n    #snapshotCommittedDisplayState() {\n        const prev = this.#snapshotPredictedState();\n        prev.lines = this._lines.map((line) => copyLine(line));\n        return prev;\n    }\n\n    /* Publish one complete state projection; wake mounted consumers when no document edit carries the notification. */\n    #publishPredictedLines(reason = 'unknown') {\n        if (this.#projectionBatchDepth > 0) {\n            this.#projectionBatchDirty = true;\n            return;\n        }\n        return this.#publishPredictedLinesFromPrev(this.#snapshotCommittedDisplayState(), reason);\n    }\n\n    #publishPredictedLinesFromPrev(prev, reason = 'unknown') {\n        const queuedBefore = this.#queuedEdits.length;\n        const result = this.#commitPredictedLinesFromPrev(prev, reason);\n        if (this.#queuedEdits.length === queuedBefore) {\n            this._emitChange();\n        }\n        return result;\n    }\n\n    /* Materialise the current predicted state onto line shells and emit only the final doc-edit delta to the scene graph. */\n    #commitPredictedLines(reason = 'unknown') {\n        return this.#commitPredictedLinesFromPrev(this.#snapshotCommittedDisplayState(), reason);\n    }\n\n    /* Materialise the current predicted state against one captured committed snapshot and stage the resulting doc edits. */\n    #commitPredictedLinesFromPrev(prev, reason = 'unknown') {\n        const startedMS = performance.now();\n        const next = this.#snapshotPredictedState();\n        next.lines = materialisePredictedLines(next, this._lines, this.#pendingLocalInputSpans());\n        this.#applyRapidFeedbackOverlay(next.lines);\n        validatePredictedState(next);\n        const edits = diffPredictedStates(prev, next);\n        this.#restorePredictedState(next);\n        const byKind = {};\n        let minLine = null;\n        let maxLine = null;\n        const touchedLines = [];\n        for (const edit of edits) {\n            const kind = edit?.kind ?? 'unknown';\n            byKind[kind] = (byKind[kind] ?? 0) + 1;\n            const line = edit?.line;\n            if (!Number.isInteger(line) || line < 0) {\n                continue;\n            }\n            minLine = minLine === null ? line : Math.min(minLine, line);\n            maxLine = maxLine === null ? line : Math.max(maxLine, line);\n            if (touchedLines.length < 12 && !touchedLines.includes(line)) {\n                touchedLines.push(line);\n            }\n        }\n        pushTestingPuffbookTrace('puffbook_apply_server_edit_to_display_start', {\n            reason,\n            line_count: this._lines.length,\n            pending_count: this.#pending.length,\n            touched_line_count: edits.length,\n        });\n        this.#stageDocEdits(edits);\n        pushTestingPuffbookTrace('puffbook_apply_server_edit_to_display_done', {\n            reason,\n            line_count: this._lines.length,\n            pending_count: this.#pending.length,\n            touched_line_count: edits.length,\n            duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n        });\n        pushTestingPortalTimingTrace('puffbook_rebuild_projected_states', {\n            reason,\n            refresh_authoritative: false,\n            line_count: this._lines.length,\n            pending_count: this.#pending.length,\n            touched_line_count: edits.length,\n            by_kind: byKind,\n            min_line: minLine,\n            max_line: maxLine,\n            touched_lines_sample: touchedLines,\n            duration_ms: Number((performance.now() - startedMS).toFixed(3)),\n        });\n    }\n\n    #stageDocEdits(edits) {\n        if (!Array.isArray(edits) || edits.length === 0) {\n            return;\n        }\n        const byKind = {};\n        let minLine = null;\n        let maxLine = null;\n        const touchedLines = [];\n        for (const edit of edits) {\n            const kind = edit?.kind ?? 'unknown';\n            byKind[kind] = (byKind[kind] ?? 0) + 1;\n            const line = edit?.line;\n            if (!Number.isInteger(line) || line < 0) {\n                continue;\n            }\n            minLine = minLine === null ? line : Math.min(minLine, line);\n            maxLine = maxLine === null ? line : Math.max(maxLine, line);\n            if (touchedLines.length < 12 && !touchedLines.includes(line)) {\n                touchedLines.push(line);\n            }\n        }\n        pushTestingPortalTimingTrace('puffbook_stage_doc_edits', {\n            pending_count: this.#pending.length,\n            queued_count_before: this.#queuedEdits.length,\n            edit_count: edits.length,\n            materialised_edit_count: edits.length,\n            by_kind: byKind,\n            min_line: minLine,\n            max_line: maxLine,\n            touched_lines_sample: touchedLines,\n        });\n        if (this.#viewBindings.size > 0) {\n            this.#broadcastProjectionEdits(edits);\n            return;\n        }\n        if (edits.some(edit => edit.kind === 'reset')) {\n            this.#queuedEdits = [{ kind: 'reset' }];\n            this._emitChange();\n            return;\n        }\n        if (this.#queuedEdits.some(edit => edit.kind === 'reset')) {\n            return;\n        }\n        this.#queuedEdits.push(...edits);\n        this._emitChange();\n    }\n\n    /* Stage one canonical projected line patch directly from predicted state without row re-render fallback. */\n    #stageProjectedLineEdits(lineNum, { input = false, output = false } = {}) {\n        if (!Number.isInteger(lineNum) || lineNum < 0 || (!input && !output)) {\n            return;\n        }\n        const line = this._lines[lineNum] ?? null;\n        if (!line) {\n            throw new Error(`Cannot stage projected line edit for missing line ${lineNum}.`);\n        }\n        const edits = [];\n        if (input) {\n            edits.push({\n                kind: 'line_input',\n                line: lineNum,\n                input_block: projectInputBlock(line),\n            });\n        }\n        if (output) {\n            edits.push({\n                kind: 'line_output',\n                line: lineNum,\n                output_block: projectOutputBlock(line),\n            });\n        }\n        this.#stageDocEdits(edits);\n    }\n\n    /* Repaint one pending local span phase immediately so send/failure state is visible without waiting for ratification. */\n    #stagePendingInputPhase(span, phase) {\n        if (!span || !Number.isInteger(span.start_line)) {\n            throw new Error('Pending input phase update requires a canonical span.');\n        }\n        if (phase !== 'local' && phase !== 'sent') {\n            throw new Error(`Pending input phase update requires 'local' or 'sent', got ${JSON.stringify(phase)}.`);\n        }\n        const syncSpans = this.#pendingLocalInputSpans();\n        for (let lineNum = 0; lineNum < this._lines.length; lineNum += 1) {\n            const absLine = this.#serverBodyStartLine + lineNum;\n            this._lines[lineNum].input_sync_spans = syncSpans.get(absLine) ?? [];\n            this.#stageProjectedLineEdits(lineNum, { input: true });\n        }\n    }\n\n    #serverLineToDisplayLine(line) {\n        if (!Number.isInteger(line) || line < 0) {\n            throw new Error(`Server line ${line} out of range.`);\n        }\n        const start = {\n            line: this.#serverLineToWindowLine(line),\n            col: 0,\n        };\n        const moved = transformStickyPositionThroughReplaceSpanChain(\n            start,\n            this.#pending.map((entry) => entry?.span).filter(Boolean),\n        );\n        return moved.line;\n    }\n\n    /* Resolve one pending-op anchor onto the current predicted display line after later local line merges. */\n    #pendingOpDisplayLine(op) {\n        const lineNum = op?.span?.start_line;\n        if (!Number.isInteger(lineNum) || lineNum < 0) {\n            return null;\n        }\n        const serverLine = this.#windowLineToServerLine(lineNum);\n        const displayLine = this.#serverLineToDisplayLine(serverLine);\n        if (!Number.isInteger(displayLine) || displayLine < 0 || displayLine >= this._lines.length) {\n            return null;\n        }\n        return displayLine;\n    }\n\n    /* Project the current unratified local text chain onto absolute visible line numbers for display-only tinting. */\n    #pendingLocalInputSpans() {\n        return pendingLocalInputSpans(\n            this.#pendingBaseBody,\n            this.#pending,\n            this.#serverBodyStartLine,\n        );\n    }\n\n    /* Rebase one authoritative server line through the current local text-op chain onto the live predicted line space. */\n    #predictedLineForServerEvent(line) {\n        if (!Number.isInteger(line) || line < 0 || this.#pending.length === 0) {\n            return line;\n        }\n        return this.#windowLineToServerLine(this.#serverLineToDisplayLine(line));\n    }\n\n    #makeTestingChurn() {\n        return {\n            apply_count: 0,\n            apply_total_ms: 0,\n            apply_max_ms: 0,\n            apply_last_ms: null,\n            apply_last_line: null,\n            apply_last_source: '',\n            apply_by_source: {},\n            row_transition_count: 0,\n            row_transition_by_state: {},\n            row_transition_last: '',\n            block_transition_count: 0,\n            block_transition_by_state: {},\n            block_transition_last: '',\n            last_apply_at_ms: null,\n        };\n    }\n\n    /* Project one puffbook line into input/output blocks with the input block owning badge semantics. */\n    #renderLine(line) {\n        return projectLineBlocks(line);\n    }\n\n    #currentBody() {\n        return this._lines.map(line => line.input_text).join('\\n');\n    }\n}\n\nfunction newCursorCopy(cursor) {\n    if (!Array.isArray(cursor) || cursor.length !== 2\n        || !Number.isInteger(cursor[0]) || cursor[0] < 0\n        || !Number.isInteger(cursor[1]) || cursor[1] < 0) {\n        throw new Error(`Cursor must be a non-negative [line, col] pair (got ${JSON.stringify(cursor)}).`);\n    }\n    return [cursor[0], cursor[1]];\n}\n\n/* Rebase one line/column point through the concrete span chain that just mutated predicted state. */\nfunction rebaseProjectionPointThroughSpans(body, point, spans) {\n    if (!point || !Number.isInteger(point.line) || point.line < 0\n        || !Number.isInteger(point.col) || point.col < 0\n        || !Array.isArray(spans)) {\n        throw new Error(`Projection point rebase input is invalid (point=${JSON.stringify(point)} spans_array=${Array.isArray(spans)}).`);\n    }\n    if (spans.length === 0) {\n        return point;\n    }\n    return transformStickyPositionThroughReplaceSpanChain(\n        point,\n        replaceSpanChainFromChange(body, spans, 'projection rebase spans'),\n    );\n}\n\n/* Rebase one single-line cursor through the latest predicted mutation. */\nfunction rebaseProjectionCursorThroughSpans(body, cursor, spans) {\n    const moved = rebaseProjectionPointThroughSpans(body, cursor, spans);\n    return requireProjectionCursor(moved?.line, moved?.col);\n}\n\n/* Advance absolute document ranges through window-local spans. */\nfunction rebaseProjectionSelectionThroughSpans(body, selection, spans, startLine = 0) {\n    return transformSelection(body, selection, spans, startLine);\n}\n\n/* Rebase one viewport band through the latest predicted mutation using its start/end row anchors. */\nfunction rebaseProjectionViewportThroughSpans(body, viewport, spans, bodyStartLine = 0) {\n    if (!viewport) {\n        return null;\n    }\n    const absStartLine = rebaseAbsoluteProjectionLineAnchorThroughSpans(\n        body,\n        viewport.start_line,\n        spans,\n        bodyStartLine,\n    );\n    const absEndLine = rebaseAbsoluteProjectionLineAnchorThroughSpans(\n        body,\n        viewport.end_line,\n        spans,\n        bodyStartLine,\n    );\n    return requireProjectionViewport(absStartLine, absEndLine);\n}\n\n/* Rebase an absolute viewport anchor through spans expressed in the current body-window coordinate space. */\nfunction rebaseAbsoluteProjectionLineAnchorThroughSpans(body, line, spans, bodyStartLine = 0) {\n    if (!Number.isInteger(bodyStartLine) || bodyStartLine < 0) {\n        throw new Error(`Projection body-window start is invalid (line=${JSON.stringify(bodyStartLine)}).`);\n    }\n    if (!Number.isInteger(line) || line < 0 || !Array.isArray(spans)) {\n        throw new Error(`Absolute projection line-anchor rebase input is invalid (line=${JSON.stringify(line)} spans_array=${Array.isArray(spans)}).`);\n    }\n    if (spans.length === 0 || line < bodyStartLine) {\n        return line;\n    }\n    const bodyEndLine = bodyStartLine + splitBody(body).length;\n    if (line <= bodyEndLine) {\n        return bodyStartLine + rebaseProjectionLineAnchorThroughSpans(\n            body,\n            line - bodyStartLine,\n            spans,\n        );\n    }\n    let afterBody = body;\n    for (const span of spans) {\n        afterBody = applyReplaceSpan(afterBody, span);\n    }\n    return line + splitBody(afterBody).length - splitBody(body).length;\n}\n\n/* Rebase one half-open line anchor through concrete spans, preserving the EOF sentinel when the anchor sits just after the body. */\nfunction rebaseProjectionLineAnchorThroughSpans(body, line, spans) {\n    if (!Number.isInteger(line) || line < 0 || !Array.isArray(spans)) {\n        throw new Error(`Projection line-anchor rebase input is invalid (line=${JSON.stringify(line)} spans_array=${Array.isArray(spans)}).`);\n    }\n    if (spans.length === 0) {\n        return line;\n    }\n    const moved = rebaseProjectionPointThroughSpans(body, { line, col: 0 }, spans);\n    if (!moved || !Number.isInteger(moved.line) || moved.line < 0) {\n        throw new Error(`Projection line-anchor rebase produced no valid coordinate (line=${line}).`);\n    }\n    return moved.line;\n}\n\n/* Rebase one observed viewport report so deferred warm-band flushes stay aligned after local edits. */\nfunction rebaseObservedViewportStateThroughSpans(body, state, spans, bodyStartLine = 0) {\n    if (!state) {\n        return null;\n    }\n    const firstVisible = Number.isInteger(state.first_visible_line)\n        ? rebaseAbsoluteProjectionLineAnchorThroughSpans(body, state.first_visible_line, spans, bodyStartLine)\n        : null;\n    const lastVisible = Number.isInteger(state.last_visible_line)\n        ? rebaseAbsoluteProjectionLineAnchorThroughSpans(body, state.last_visible_line, spans, bodyStartLine)\n        : null;\n    const firstWarm = Number.isInteger(state.first_warm_line)\n        ? rebaseAbsoluteProjectionLineAnchorThroughSpans(body, state.first_warm_line, spans, bodyStartLine)\n        : null;\n    const lastWarm = Number.isInteger(state.last_warm_line)\n        ? rebaseAbsoluteProjectionLineAnchorThroughSpans(body, state.last_warm_line, spans, bodyStartLine)\n        : null;\n    return copyProjectionViewportState({\n        first_visible_line: firstVisible,\n        last_visible_line: lastVisible,\n        first_warm_line: firstWarm,\n        last_warm_line: lastWarm,\n    });\n}\n\n/* Rebase one stored absolute line number through the latest predicted mutation. */\nfunction rebaseLineNumberThroughSpans(body, line, spans) {\n    if (!Number.isInteger(line)) {\n        return line ?? null;\n    }\n    return rebaseProjectionPointThroughSpans(body, { line, col: 0 }, spans)?.line ?? line;\n}\n\n/* Project a remote change backwards through the LIFO undo programme. Each\n * older entry is expressed in the body restored by undoing the newer ones. */\nfunction rebaseUndoHistoryThroughSpans(body, history, spans, bodyStartLine = 0) {\n    if (!Array.isArray(history) || history.length === 0 || !Array.isArray(spans) || spans.length === 0) {\n        return Array.isArray(history) ? history.slice() : [];\n    }\n    let remote = replaceSpanChainFromChange(body, spans, 'undo history remote change');\n    let frameBody = body;\n    const next = [];\n    for (let index = history.length - 1; index >= 0; index -= 1) {\n        const entry = history[index];\n        let inverse = entry.undo_spans;\n        const earlierRemote = [];\n        for (const span of remote) {\n            const transformed = transformRemoteThroughLocalChain(inverse, span);\n            // An external overlapping edit invalidates this entry and its\n            // predecessors; newer independent entries can still be undone.\n            if (transformed.kind !== 'ok') return next.reverse();\n            inverse = transformed.local_ops;\n            if (transformed.q) earlierRemote.push(transformed.q);\n        }\n        const movedCursor = rebaseProjectionCursorThroughSpans(frameBody,\n            { line: entry.cursor[0], col: entry.cursor[1] }, remote);\n        for (const span of entry.undo_spans) frameBody = applyReplaceSpan(frameBody, span);\n        const sourceSelection = entry.sourceSelection\n            ? transformSelection(frameBody, entry.sourceSelection, earlierRemote, bodyStartLine) : null;\n        next.push({ ...entry, undo_spans: inverse,\n            ...(sourceSelection ? { sourceSelection } : {}),\n            cursor: movedCursor ? [movedCursor.line, movedCursor.col] : entry.cursor });\n        remote = earlierRemote;\n    }\n    return next.reverse();\n}\n\n/* Rebase one active undo-coalesce session so subsequent keydown grouping stays on the moved line. */\nfunction rebaseUndoCoalesceThroughSpans(body, state, spans) {\n    if (!state) {\n        return null;\n    }\n    const before = Array.isArray(state.cursor_before)\n        ? rebaseProjectionCursorThroughSpans(body, { line: state.cursor_before[0], col: state.cursor_before[1] }, spans)\n        : null;\n    const after = Array.isArray(state.cursor_after)\n        ? rebaseProjectionCursorThroughSpans(body, { line: state.cursor_after[0], col: state.cursor_after[1] }, spans)\n        : null;\n    return {\n        ...state,\n        line: rebaseLineNumberThroughSpans(body, state.line, spans),\n        cursor_before: before ? [before.line, before.col] : state.cursor_before ?? null,\n        cursor_after: after ? [after.line, after.col] : state.cursor_after ?? null,\n    };\n}\n\n/* Rebase the runtime's projected focus and viewport snapshots through one committed predicted mutation. */\nfunction rebaseProjectedUiStateThroughSpans(body, spans, state, bodyStartLine = 0) {\n    if (!Array.isArray(spans) || spans.length === 0) {\n        return {\n            projectedCursor: state.projectedCursor,\n            projectedSelection: state.projectedSelection,\n            projectedViewport: state.projectedViewport,\n            observedViewportState: state.observedViewportState,\n        };\n    }\n    const projectedSelection = rebaseProjectionSelectionThroughSpans(body, state.projectedSelection, spans, bodyStartLine);\n    const focus = projectedSelection ? primaryFocus(projectedSelection) : null;\n    return {\n        projectedCursor: focus ? { line: focus.line - bodyStartLine, col: focus.col }\n            : rebaseProjectionCursorThroughSpans(body, state.projectedCursor, spans),\n        projectedSelection,\n        projectedViewport: rebaseProjectionViewportThroughSpans(body, state.projectedViewport, spans, bodyStartLine),\n        observedViewportState: rebaseObservedViewportStateThroughSpans(body, state.observedViewportState, spans, bodyStartLine),\n    };\n}\n\n/* Rebase one in-flight amend so its tracked logical row survives local prediction moves. */\nfunction rebasePendingAmendThroughSpans(body, spans, amend) {\n    if (!amend || !Array.isArray(spans) || spans.length === 0) {\n        return amend ?? null;\n    }\n    return {\n        ...amend,\n        line_num: rebaseLineNumberThroughSpans(body, amend.line_num, spans),\n    };\n}\n\n/* Rebase undo stacks and coalescing metadata through one committed predicted mutation. */\nfunction rebaseUndoStateThroughSpans(body, spans, state, bodyStartLine = 0) {\n    if (!Array.isArray(spans) || spans.length === 0) {\n        return {\n            editHistory: Array.isArray(state.editHistory) ? state.editHistory.slice() : [],\n            undoCoalesce: state.undoCoalesce ?? null,\n        };\n    }\n    const editHistory = rebaseUndoHistoryThroughSpans(body, state.editHistory, spans, bodyStartLine);\n    return {\n        editHistory,\n        undoCoalesce: editHistory.length === 0\n            ? null\n            : rebaseUndoCoalesceThroughSpans(body, state.undoCoalesce, spans),\n    };\n}\n\nfunction requireProjectionCursor(line, col) {\n    if (!Number.isInteger(line) || line < 0 || !Number.isInteger(col) || col < 0) {\n        throw new Error(`Projection cursor is invalid (line=${JSON.stringify(line)} col=${JSON.stringify(col)}).`);\n    }\n    return { line, col };\n}\n\nfunction sameProjectionCursor(a, b) {\n    return !!a\n        && !!b\n        && a.line === b.line\n        && a.col === b.col;\n}\n\nfunction requireProjectionSelection(line, start, end) {\n    requireProjectionCursor(line, start);\n    requireProjectionCursor(line, end);\n    if (start === end) return null;\n    return { ranges: [{ anchor: { line, col: start }, focus: { line, col: end } }],\n        primaryIndex: 0, verticalColumn: null };\n}\n\nfunction compareSourcePoint(a, b) {\n    return a.line - b.line || a.col - b.col;\n}\n\nfunction requireProjectionViewport(absStartLine, absEndLine) {\n    if (absStartLine === -1 && absEndLine === -1) {\n        return null;\n    }\n    if (!Number.isInteger(absStartLine) || !Number.isInteger(absEndLine)\n        || absStartLine < 0 || absEndLine < absStartLine) {\n        throw new Error(\n            `Projection viewport is invalid (start=${JSON.stringify(absStartLine)} end=${JSON.stringify(absEndLine)}).`,\n        );\n    }\n    return {\n        start_line: absStartLine,\n        end_line: absEndLine,\n    };\n}\n\nexport function bootstrapProjectionViewportLineCount() {\n    const viewportHeight = Number.isFinite(globalThis?.visualViewport?.height)\n        ? globalThis.visualViewport.height\n        : Number.isFinite(globalThis?.innerHeight)\n            ? globalThis.innerHeight\n            : Number.NaN;\n    if (!Number.isFinite(viewportHeight) || viewportHeight <= 0) {\n        return MIN_BOOTSTRAP_PROJECTION_VIEWPORT_LINES;\n    }\n    const visibleLines = Math.max(1, Math.ceil(viewportHeight / BOOTSTRAP_PROJECTION_LINE_PITCH_PX));\n    return Math.max(\n        MIN_BOOTSTRAP_PROJECTION_VIEWPORT_LINES,\n        visibleLines * BOOTSTRAP_PROJECTION_WARM_MULTIPLIER,\n    );\n}\n\nexport function projectionViewportFromBands(state, currentViewport = null) {\n    const firstWarm = state?.first_warm_line;\n    const lastWarm = state?.last_warm_line;\n    const firstVisible = state?.first_visible_line;\n    const lastVisible = state?.last_visible_line;\n    const nextAbsStartLine = Number.isInteger(firstWarm) ? firstWarm : firstVisible;\n    const nextAbsEndLine = Number.isInteger(lastWarm) ? lastWarm + 1 : Number.isInteger(lastVisible) ? lastVisible + 1 : null;\n    if ((nextAbsStartLine === null || nextAbsStartLine === undefined)\n        && (nextAbsEndLine === null || nextAbsEndLine === undefined)) {\n        return null;\n    }\n    const nextViewport = requireProjectionViewport(nextAbsStartLine, nextAbsEndLine);\n    if (!nextViewport || !currentViewport) {\n        return nextViewport;\n    }\n    if (\n        currentViewport.start_line <= nextViewport.start_line\n        && nextViewport.end_line <= currentViewport.end_line\n    ) {\n        return currentViewport;\n    }\n    return nextViewport;\n}\n\nfunction sameProjectionViewport(a, b) {\n    return a === b || (\n        !!a\n        && !!b\n        && a.start_line === b.start_line\n        && a.end_line === b.end_line\n    );\n}\n\n/* Derive viewport edges within the same transaction that accepts a body-window delta. */\nfunction deriveProjectionViewportForBodyWindowDelta(viewport, beforeAbsStartLine, beforeAbsEndLine, afterAbsStartLine, afterAbsEndLine) {\n    if (!viewport) {\n        return viewport;\n    }\n    let viewportAbsStartLine = viewport.start_line;\n    let viewportAbsEndLine = viewport.end_line;\n    if (viewportAbsStartLine === beforeAbsStartLine) {\n        viewportAbsStartLine = afterAbsStartLine;\n    }\n    if (viewportAbsEndLine === beforeAbsEndLine) {\n        viewportAbsEndLine = afterAbsEndLine;\n    }\n    return requireProjectionViewport(viewportAbsStartLine, viewportAbsEndLine);\n}\n\nfunction sameCursor(a, b) {\n    return Array.isArray(a)\n        && Array.isArray(b)\n        && a[0] === b[0]\n        && a[1] === b[1];\n}\n\nfunction undoCoalesceForKeyDown(evt, edits, beforeCursor, afterCursor, opts = {}) {\n    if (opts.isBackspace && beforeCursor[0] === afterCursor[0]\n        && beforeCursor[1] - afterCursor[1] === SPACE_TAB_TEXT.length) {\n        return null;\n    }\n    if (opts.hadSelectionEdit || evt.key === 'paste' || evt.key === 'cut') {\n        return null;\n    }\n    const before = newCursorCopy(beforeCursor);\n    const after = newCursorCopy(afterCursor);\n    if (opts.isEnter) {\n        if (!Array.isArray(edits) || edits.length === 0 || after[0] !== before[0] + 1 || after[1] !== 0) {\n            return null;\n        }\n        return {\n            kind: 'enter',\n            line: after[0],\n            cursor_before: before,\n            cursor_after: after,\n            at: Date.now(),\n        };\n    }\n    if (!Array.isArray(edits) || edits.length !== 1) {\n        return null;\n    }\n    const edit = edits[0];\n    if (edit?.type !== 'replace') {\n        return null;\n    }\n    if (before[0] !== after[0]) {\n        return null;\n    }\n    let kind = null;\n    if (opts.isPrintable) {\n        if (after[1] <= before[1]) {\n            return null;\n        }\n        kind = 'insert';\n    } else if (opts.isBackspace) {\n        if (after[1] >= before[1]) {\n            return null;\n        }\n        kind = 'backspace';\n    } else if (opts.isDelete) {\n        if (after[1] !== before[1]) {\n            return null;\n        }\n        kind = 'delete';\n    } else {\n        return null;\n    }\n    return {\n        kind,\n        line: before[0],\n        cursor_before: before,\n        cursor_after: after,\n        at: Date.now(),\n    };\n}\n\nfunction shouldCoalesceUndo(active, next) {\n    if (!active || !next) {\n        return false;\n    }\n    const compatibleKind = active.kind === next.kind\n        || (active.kind === 'enter' && next.kind === 'insert');\n    if (!compatibleKind || active.line !== next.line) {\n        return false;\n    }\n    if (!sameCursor(active.cursor_after, next.cursor_before)) {\n        return false;\n    }\n    if (next.at - active.at > UNDO_COALESCE_MS) {\n        return false;\n    }\n    return true;\n}\n\nfunction parseEditConflict(msg) {\n    const m = `${msg ?? ''}`.match(/edit conflict: baseline=(-?\\d+) latest=(-?\\d+)/i);\n    if (!m) {\n        return null;\n    }\n    return {\n        baseline: Number.parseInt(m[1], 10),\n        latest: Number.parseInt(m[2], 10),\n    };\n}\n\nfunction isUnknownPuffbookSubscriptionError(msg) {\n    return `${msg ?? ''}`.includes('unknown puffbook subscription');\n}\n\nfunction isPuffbookViewportContractError(msg) {\n    const text = `${msg ?? ''}`;\n    const namesViewportRequest = /Puffbook(?:SetViewport|Snapshot)Request:/.test(text);\n    const namesStrictShapeFailure = text.includes('field_names[')\n        || text.includes('num_fields=')\n        || text.includes('invalid projection viewport');\n    return namesViewportRequest && namesStrictShapeFailure;\n}\n\nfunction singleChangeSpan(body, change, label = 'single change') {\n    const spans = replaceSpanChainFromChange(body, change, label);\n    return spans.length === 1 ? spans[0] : null;\n}\n\n/* Keep best-effort singleton-span heuristics from bypassing the transport recovery path. */\nfunction trySingleChangeSpan(body, change, label = 'single change') {\n    try {\n        return singleChangeSpan(body, change, label);\n    } catch (_err) {\n        return null;\n    }\n}\n\nfunction truncateForLog(text, limit = 80) {\n    if (typeof text !== 'string') {\n        return text;\n    }\n    const escaped = text\n        .replaceAll('\\\\', '\\\\\\\\')\n        .replaceAll('\\n', '\\\\n')\n        .replaceAll('\\r', '\\\\r')\n        .replaceAll('\\t', '\\\\t');\n    if (escaped.length <= limit) {\n        return escaped;\n    }\n    return `${escaped.slice(0, limit - 1)}\u2026`;\n}\n\n/* Snapshot only replayable input data; browser callbacks/events do not survive source loading.\n * Pointer coordinates belong to the current document-owned gesture and are ignored\n * after source edits retire it. Ordinary key/clipboard commands carry no positions.\n */\nfunction snapshotSourceInput(evt) {\n    if (evt.inputType) return { inputType: evt.inputType, data: evt.data };\n    if (evt.key === 'compositionend') return { key: evt.key, data: evt.data };\n    if (evt.key === 'copy' || evt.key === 'cut') return { key: evt.key };\n    const command = {\n        key: evt.key, ctrlKey: evt.ctrlKey === true, metaKey: evt.metaKey === true,\n        altKey: evt.altKey === true, shiftKey: evt.shiftKey === true,\n        altGraphKey: evt.altGraphKey ?? (evt.getModifierState?.('AltGraph') === true),\n        clipboardData: evt.clipboardData,\n    };\n    if (evt.key === 'extend_source_drag') {\n        command.line = evt.line;\n        command.col = evt.col;\n        command.columns = evt.columns?.map(({ line, col }) => ({ line, col }));\n    }\n    return command;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Treat ptrless lazy transport placeholders as opaque until the authoritative payload arrives. */\nfunction isLazyValue(obj) {\n    if (!obj || typeof obj.physicalType !== 'function') {\n        return false;\n    }\n    try {\n        const physicalType = obj.physicalType();\n        return physicalType === 'Lazy'\n            || physicalType === 'LazyHash'\n            || physicalType === 'LazyHandle'\n            || physicalType === 'LazyDerived';\n    } catch (_err) {\n        return false;\n    }\n}\n\nfunction projectOutputSlotValueAt(obj, row, rows, label) {\n    const names = typeof obj?.fieldNames === 'function' ? obj.fieldNames() : null;\n    if (Array.isArray(names) && typeof obj?.field === 'function') {\n        return {\n            field(name) {\n                return projectOutputSlotValueAt(obj.field(name), row, rows, `${label}.${name}`);\n            },\n            fieldNames() {\n                return names;\n            },\n            numFields() {\n                return names.length;\n            },\n            valid() {\n                return typeof obj?.valid === 'function' ? obj.valid() : true;\n            },\n            logicalType() {\n                return typeof obj?.logicalType === 'function' ? obj.logicalType() : null;\n            },\n            physicalType() {\n                return typeof obj?.physicalType === 'function' ? obj.physicalType() : null;\n            },\n            at(n) {\n                return this.field(names[n]);\n            },\n        };\n    }\n    if (!isLazyValue(obj) && obj && typeof obj.length === 'function' && typeof obj.at === 'function') {\n        const len = obj.length();\n        if (len !== rows) {\n            return obj;\n        }\n        return obj.at(row);\n    }\n    return obj;\n}\n\n// projectionOutputRecords expands one authoritative struct-of-columns wire payload into per-row record views.\nexport function projectionOutputRecords(obj) {\n    // A dataframe's row cardinality belongs to its LogicalAxis envelope; its\n    // named physical columns belong to the axis-free Struct payload.\n    if (typeof obj?.physicalType === 'function'\n        && obj.physicalType() === 'LogicalAxis'\n        && typeof obj.items === 'function') {\n        obj = obj.items();\n    }\n    let names = null;\n    try {\n        names = typeof obj?.fieldNames === 'function' ? obj.fieldNames() : null;\n    } catch (_err) {\n        names = null;\n    }\n    if (!Array.isArray(names) || !names.includes('line') || !names.includes('state')) {\n        throw new Error(\n            'Projection outputs must expose field names including line and state '\n            + `(type=${obj?.constructor?.name ?? typeof obj} `\n            + `physical=${typeof obj?.physicalType === 'function' ? obj.physicalType() : '<none>'} `\n            + `logical=${typeof obj?.logicalType === 'function' ? obj.logicalType() : '<none>'} `\n            + `field_names=${Array.isArray(names) ? JSON.stringify(names) : '<none>'}).`\n        );\n    }\n    const lineCol = typeof obj?.field === 'function' ? obj.field('line') : null;\n    if (!lineCol || typeof lineCol.length !== 'function') {\n        throw new Error(\"Projection outputs are missing a readable 'line' column.\");\n    }\n    const rows = lineCol.length();\n    const ret = [];\n    for (let i = 0; i < rows; i++) {\n        ret.push({\n            field(name) {\n                return projectOutputSlotValueAt(obj.field(name), i, rows, name);\n            },\n            fieldNames() {\n                return names;\n            },\n            numFields() {\n                return names.length;\n            },\n            at(n) {\n                return this.field(names[n]);\n            },\n        });\n    }\n    return ret;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { splitBody } from './puffbook-editchain.mjs';\nimport {\n    applyReplaceSpan,\n    replaceSpanLineDelta,\n    shiftReplaceSpanLines,\n} from './puffbook-replacespan.mjs';\nimport { localInputTransportState, makeLocalInputTextOpFromSpan } from './puffbook-ops.mjs';\n\n/* Materialise a complete read-only source projection with the current local overlay. */\nexport function completePredictedSourceSnapshot(snap, pending, pendingStartLine) {\n    const lineCount = splitBody(snap.body).length;\n    const start = snap.body_start_line ?? 0;\n    const end = snap.body_end_line ?? lineCount;\n    const total = snap.total_lines ?? lineCount;\n    validateProjectedBodyWindow(snap.body, start, end, total);\n    if (start !== 0 || end !== total) {\n        throw new Error(`Puffbook snapshot was not a whole document (window=${start}:${end}, total=${total}).`);\n    }\n    const ops = rebasePendingLocalOpsToBodyWindow(pending, pendingStartLine, 0);\n    return { ...replayPredictedBodyWindow(snap.body, 0, total, total, ops), pending: ops };\n}\n\n/* Validate one projected body slice without repairing authoritative metadata. */\nexport function validateProjectedBodyWindow(body, absStartLine, absEndLine, totalLines) {\n    if (typeof body !== 'string') {\n        throw new Error(`Projected body window body must be text (got ${typeof body}).`);\n    }\n    if (!Number.isInteger(totalLines) || totalLines < 1) {\n        throw new Error(`Projected body window total_lines must be a positive integer (got ${JSON.stringify(totalLines)}).`);\n    }\n    if (!Number.isInteger(absStartLine) || !Number.isInteger(absEndLine)\n        || absStartLine < 0 || absEndLine < absStartLine || absEndLine > totalLines) {\n        throw new Error(\n            `Projected body window coordinates are invalid: start=${JSON.stringify(absStartLine)} `\n            + `end=${JSON.stringify(absEndLine)} total_lines=${totalLines}.`,\n        );\n    }\n    const bodyLineCount = body === '' && absStartLine === absEndLine ? 0 : splitBody(body).length;\n    if (absEndLine - absStartLine !== bodyLineCount) {\n        throw new Error(\n            `Projected body window length mismatch: start=${absStartLine} end=${absEndLine} `\n            + `want_lines=${absEndLine - absStartLine} got_lines=${bodyLineCount}.`,\n        );\n    }\n    return {\n        body,\n        start_line: absStartLine,\n        end_line: absEndLine,\n        total_lines: totalLines,\n    };\n}\n\n/* Assemble one sparse server viewport transition against the retained authoritative window. */\nexport function mergeProjectedBodyWindowPatch({\n    previousBody,\n    previousStartLine,\n    previousEndLine,\n    nextStartLine,\n    nextEndLine,\n    totalLines,\n    prefix = '',\n    suffix = '',\n} = {}) {\n    if (typeof previousBody !== 'string') {\n        throw new Error(`Projected body-window patch requires previous authoritative text (got ${typeof previousBody}).`);\n    }\n    if (!Number.isInteger(previousStartLine) || !Number.isInteger(previousEndLine)\n        || previousStartLine < 0 || previousEndLine < previousStartLine) {\n        throw new Error(\n            `Projected body-window patch previous coordinates are invalid: start=${JSON.stringify(previousStartLine)} `\n            + `end=${JSON.stringify(previousEndLine)}.`,\n        );\n    }\n    const previousLineCount = previousBody === '' && previousStartLine === previousEndLine\n        ? 0\n        : splitBody(previousBody).length;\n    if (previousEndLine - previousStartLine !== previousLineCount) {\n        throw new Error(\n            `Projected body-window patch previous length mismatch: start=${previousStartLine} end=${previousEndLine} `\n            + `want_lines=${previousEndLine - previousStartLine} got_lines=${previousLineCount}.`,\n        );\n    }\n    if (typeof prefix !== 'string' || typeof suffix !== 'string') {\n        throw new Error('Projected body-window patch edges must be text.');\n    }\n    if (!Number.isInteger(nextStartLine) || !Number.isInteger(nextEndLine)\n        || nextStartLine < 0 || nextEndLine < nextStartLine\n        || nextStartLine >= previousEndLine || nextEndLine <= previousStartLine) {\n        throw new Error(\n            `Projected body-window patch requires overlapping windows: `\n            + `previous=[${previousStartLine},${previousEndLine}) next=[${nextStartLine},${nextEndLine}).`,\n        );\n    }\n\n    const overlapStart = Math.max(previousStartLine, nextStartLine);\n    const overlapEnd = Math.min(previousEndLine, nextEndLine);\n    const expectedPrefixLines = overlapStart - nextStartLine;\n    const expectedSuffixLines = nextEndLine - overlapEnd;\n    // The wire text \"\" means either no edge rows or one blank edge row;\n    // authoritative coordinates distinguish those cases.\n    const edgeLines = (text, expectedLines) => expectedLines === 0 ? [] : text.split('\\n');\n    const prefixLines = edgeLines(prefix, expectedPrefixLines);\n    const suffixLines = edgeLines(suffix, expectedSuffixLines);\n    if (prefixLines.length !== expectedPrefixLines || suffixLines.length !== expectedSuffixLines) {\n        throw new Error(\n            `Projected body-window patch edge length mismatch: `\n            + `previous=[${previousStartLine},${previousEndLine}) next=[${nextStartLine},${nextEndLine}) `\n            + `prefix_lines=${prefixLines.length} want_prefix_lines=${expectedPrefixLines} `\n            + `suffix_lines=${suffixLines.length} want_suffix_lines=${expectedSuffixLines}.`,\n        );\n    }\n\n    const previousLines = previousLineCount === 0 ? [] : splitBody(previousBody);\n    const overlapLines = previousLines.slice(\n        overlapStart - previousStartLine,\n        overlapEnd - previousStartLine,\n    );\n    return validateProjectedBodyWindow(\n        [...prefixLines, ...overlapLines, ...suffixLines].join('\\n'),\n        nextStartLine,\n        nextEndLine,\n        totalLines,\n    );\n}\n\n/* Replay pending local text ops over one server viewport snapshot while keeping body-window metadata in lockstep. */\nexport function replayPredictedBodyWindow(body, absStartLine, absEndLine, totalLines, pendingOps) {\n    let win = validateProjectedBodyWindow(body, absStartLine, absEndLine, totalLines);\n    if (!Array.isArray(pendingOps)) {\n        throw new Error('Predicted body-window replay requires a pending-operation array.');\n    }\n    const ops = pendingOps;\n    for (const entry of ops) {\n        const span = entry?.span ?? null;\n        if (!span) {\n            continue;\n        }\n        const nextBody = applyReplaceSpan(win.body, span);\n        const lineDelta = replaceSpanLineDelta(span);\n        win = validateProjectedBodyWindow(\n            nextBody,\n            win.start_line,\n            win.end_line + lineDelta,\n            win.total_lines + lineDelta,\n        );\n    }\n    return win;\n}\n\n/* Rebase pending local text ops into one new body-window frame when the authoritative slice anchor moves. */\nexport function rebasePendingLocalOpsToBodyWindow(pendingOps, fromAbsStartLine, toAbsStartLine) {\n    if (!Array.isArray(pendingOps)) {\n        throw new Error('Pending body-window movement requires an operation array.');\n    }\n    if (!Number.isInteger(fromAbsStartLine) || fromAbsStartLine < 0\n        || !Number.isInteger(toAbsStartLine) || toAbsStartLine < 0) {\n        throw new Error(\n            `Pending body-window movement requires non-negative anchors (from=${JSON.stringify(fromAbsStartLine)} `\n            + `to=${JSON.stringify(toAbsStartLine)}).`,\n        );\n    }\n    const ops = pendingOps;\n    if (ops.length === 0 || fromAbsStartLine === toAbsStartLine) {\n        return ops.slice();\n    }\n    const absLineDelta = fromAbsStartLine - toAbsStartLine;\n    return ops.map((op) => {\n        const span = op?.span ?? null;\n        if (!span) {\n            return op;\n        }\n        return makeLocalInputTextOpFromSpan(shiftReplaceSpanLines(span, absLineDelta), {\n            source: op.source ?? 'local',\n            transportState: localInputTransportState(op),\n            editOrdinal: Number.isInteger(op.edit_ordinal) ? op.edit_ordinal : null,\n            acceptedVersion: Number.isInteger(op.accepted_version) ? op.accepted_version : null,\n        });\n    });\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport {\n    editFromBodies,\n} from './puffbook-editchain.mjs';\nimport {\n    applyReplaceSpan,\n    invertReplaceSpan,\n    newReplaceSpan,\n    replaceSpanChainFromChange,\n    replaceSpanFromEdit,\n    replaceSpanToEdit,\n    sameReplaceSpan,\n    validateReplaceSpan,\n} from './puffbook-replacespan.mjs';\n\nexport const PUFFBOOK_OP_KIND = Object.freeze({\n    INPUT_TEXT_EDIT: 'input_text_edit',\n    OUTPUT_CELL_SET: 'output_cell_set',\n    WARNING_SET: 'warning_set',\n    LINE_STATE_SET: 'line_state_set',\n    PAYLOAD_REF_SET: 'payload_ref_set',\n    SNAPSHOT_SET: 'snapshot_set',\n});\n\nexport const LOCAL_INPUT_TRANSPORT_STATE = Object.freeze({\n    LOCAL: 'local',\n    IN_FLIGHT: 'in_flight',\n});\n\nfunction canonicalLocalInputTransportState(transportState) {\n    switch (transportState) {\n    case LOCAL_INPUT_TRANSPORT_STATE.LOCAL:\n    case LOCAL_INPUT_TRANSPORT_STATE.IN_FLIGHT:\n        return transportState;\n    default:\n        return LOCAL_INPUT_TRANSPORT_STATE.LOCAL;\n    }\n}\n\nfunction normaliseEditOrdinal(editOrdinal) {\n    return Number.isInteger(editOrdinal) && editOrdinal > 0 ? editOrdinal : null;\n}\n\nfunction normaliseAcceptedVersion(acceptedVersion) {\n    return Number.isInteger(acceptedVersion) && acceptedVersion >= 0 ? acceptedVersion : null;\n}\n\n/* Materialise one invertible local text op directly from one canonical span plus transport metadata. */\nexport function makeLocalInputTextOpFromSpan(span, {\n    transportState = LOCAL_INPUT_TRANSPORT_STATE.LOCAL,\n    editOrdinal = null,\n    acceptedVersion = null,\n    source = 'local',\n    createdAtMS = null,\n} = {}) {\n    const row = newReplaceSpan(span);\n    const nextTransportState = canonicalLocalInputTransportState(transportState);\n    return {\n        kind: PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT,\n        source,\n        span: row,\n        inverse_span: invertReplaceSpan(row),\n        transport_state: nextTransportState,\n        edit_ordinal: normaliseEditOrdinal(editOrdinal),\n        accepted_version: normaliseAcceptedVersion(acceptedVersion),\n        created_at_ms: Number.isFinite(createdAtMS) ? createdAtMS : null,\n    };\n}\n\n/* Materialise one invertible local text op from one singleton text change over the current predicted body window. */\nexport function makeLocalInputTextOp(changeOrSpan, beforeBody, {\n    transportState = LOCAL_INPUT_TRANSPORT_STATE.LOCAL,\n    editOrdinal = null,\n    createdAtMS = null,\n} = {}) {\n    if (changeOrSpan === null) {\n        throw new Error('Local input text op requires a non-null change.');\n    }\n    if (typeof beforeBody !== 'string') {\n        throw new Error('Local input text op requires beforeBody.');\n    }\n    return makeLocalInputTextOpFromSpan(singleReplaceSpanFromChange(beforeBody, changeOrSpan, 'local input text op change'), {\n        transportState,\n        editOrdinal,\n        createdAtMS,\n        source: 'local',\n    });\n}\n\n/* Clone one local input text op without reconstructing it from document bodies. */\nexport function cloneLocalInputTextOp(op) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('cloneLocalInputTextOp requires a local input text op.');\n    }\n    return makeLocalInputTextOpFromSpan(op.span, {\n        source: op.source ?? 'local',\n        transportState: localInputTransportState(op),\n        editOrdinal: Number.isInteger(op.edit_ordinal) ? op.edit_ordinal : null,\n        acceptedVersion: Number.isInteger(op.accepted_version) ? op.accepted_version : null,\n        createdAtMS: op.created_at_ms,\n    });\n}\n\n/* Clone one local input-op chain so bounded mutations can preserve metadata without sharing object identity. */\nexport function cloneLocalInputTextOps(localOps) {\n    if (!Array.isArray(localOps) || localOps.length === 0) {\n        return [];\n    }\n    return localOps.map((op) => cloneLocalInputTextOp(op));\n}\n\n/* Collapse one before/after body transition into one local input text op when the bodies differ. */\nexport function makeLocalInputTextOpFromBodies(beforeBody, afterBody, opts = {}) {\n    const change = editFromBodies(beforeBody, afterBody);\n    return change === null ? null : makeLocalInputTextOp(change, beforeBody, opts);\n}\n\n/* Keep local send-queue normalisation explicit without reconstructing it from whole-body diffs. */\nexport function compactLocalInputOps(localOps) {\n    if (!Array.isArray(localOps) || localOps.length === 0) {\n        return [];\n    }\n    const out = [];\n    for (const op of localOps) {\n        if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n            continue;\n        }\n        out.push(normaliseLocalInputTextOpTransport(op));\n    }\n    return out;\n}\n\nexport function localInputTransportState(op) {\n    return canonicalLocalInputTransportState(op?.transport_state ?? null);\n}\n\nexport function localInputOpIsInFlight(op) {\n    return localInputTransportState(op) === LOCAL_INPUT_TRANSPORT_STATE.IN_FLIGHT;\n}\n\nexport function localInputOpIsLocal(op) {\n    return localInputTransportState(op) === LOCAL_INPUT_TRANSPORT_STATE.LOCAL;\n}\n\nexport function localInputInFlightPrefixLen(localOps) {\n    const ops = Array.isArray(localOps) ? localOps : [];\n    let n = 0;\n    while (n < ops.length && localInputOpIsInFlight(ops[n])) {\n        n += 1;\n    }\n    return n;\n}\n\nexport function normaliseLocalInputTextOpTransport(op) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('normaliseLocalInputTextOpTransport requires a local input text op.');\n    }\n    op.transport_state = localInputTransportState(op);\n    op.edit_ordinal = normaliseEditOrdinal(op.edit_ordinal);\n    op.accepted_version = normaliseAcceptedVersion(op.accepted_version);\n    return op;\n}\n\nexport function setLocalInputTransportState(op, transportState, { editOrdinal = undefined, clearAcceptedVersion = false } = {}) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('setLocalInputTransportState requires a local input text op.');\n    }\n    const nextTransportState = canonicalLocalInputTransportState(transportState);\n    op.transport_state = nextTransportState;\n    if (editOrdinal !== undefined) {\n        op.edit_ordinal = normaliseEditOrdinal(editOrdinal);\n    } else if (nextTransportState === LOCAL_INPUT_TRANSPORT_STATE.LOCAL) {\n        op.edit_ordinal = null;\n    } else {\n        op.edit_ordinal = normaliseEditOrdinal(op.edit_ordinal);\n    }\n    if (clearAcceptedVersion) {\n        op.accepted_version = null;\n    } else {\n        op.accepted_version = normaliseAcceptedVersion(op.accepted_version);\n    }\n    return op;\n}\n\n/* Coalesce one sequential unsent run into the smallest equivalent additive spans for transport. */\nexport function coalesceAdjacentLocalInputOps(localOps) {\n    const ops = compactLocalInputOps(localOps);\n    const out = [];\n    for (const op of ops) {\n        const cur = newReplaceSpan(op.span);\n        const prev = out.at(-1) ?? null;\n        const joined = prev === null ? null : joinAdjacentTextSpans(prev, cur);\n        if (joined === null) {\n            out.push(cur);\n        } else {\n            out[out.length - 1] = joined;\n        }\n    }\n    return out;\n}\n\n/* Join adjacent insert/backspace/delete runs without broadening into replacement semantics. */\nfunction joinAdjacentTextSpans(a, b) {\n    if (a.start_line !== b.start_line) {\n        return null;\n    }\n    if (a.deleted_text === '' && b.deleted_text === '' && a.inserted_text !== '' && b.inserted_text !== ''\n        && b.start_col === a.start_col + utf8Bytes(a.inserted_text)) {\n        return newReplaceSpan({ ...a, inserted_text: a.inserted_text + b.inserted_text });\n    }\n    if (a.inserted_text === '' && b.inserted_text === '' && a.deleted_text !== '' && b.deleted_text !== '') {\n        if (b.start_col === a.start_col) {\n            return newReplaceSpan({ ...a, deleted_text: a.deleted_text + b.deleted_text });\n        }\n        if (b.start_col + utf8Bytes(b.deleted_text) === a.start_col) {\n            return newReplaceSpan({ ...b, deleted_text: b.deleted_text + a.deleted_text });\n        }\n    }\n    return null;\n}\n\n/* Count UTF-8 bytes because ReplaceSpan columns use the transport's byte coordinate contract. */\nfunction utf8Bytes(text) {\n    return new TextEncoder().encode(text).byteLength;\n}\n\n/* Keep exact server/local ratification logic centralised rather than spread across transport handlers. */\nexport function serverTextChangeAcknowledgesLocalOp(baseBody, serverEdit, localOp) {\n    if (!serverEdit || !localOp || localOp.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        return false;\n    }\n    if (!localOp.span || typeof baseBody !== 'string') {\n        return false;\n    }\n    return sameReplaceSpan(singleReplaceSpanFromChange(baseBody, serverEdit, 'server text change'), localOp.span);\n}\n\n/* Lower one canonical local text op to the websocket Edit boundary only when needed. */\nexport function localInputOpEdit(op) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('localInputOpEdit requires a local input text op.');\n    }\n    return replaceSpanToEdit(op.span);\n}\n\n/* Project one canonical local text op into the target absolute line frame at the websocket boundary. */\nexport function projectLocalInputOpEdit(op, mapLine) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('projectLocalInputOpEdit requires a local input text op.');\n    }\n    if (typeof mapLine !== 'function') {\n        throw new Error('projectLocalInputOpEdit requires a line-mapping function.');\n    }\n    const span = newReplaceSpan(op.span);\n    const mappedLine = mapLine(span.start_line);\n    if (!Number.isInteger(mappedLine) || mappedLine < 0) {\n        throw new Error(`projectLocalInputOpEdit mapped line ${mappedLine} out of range.`);\n    }\n    return replaceSpanToEdit(newReplaceSpan({\n        ...span,\n        start_line: mappedLine,\n    }));\n}\n\n/* Lower one canonical local inverse span to the websocket Edit boundary only when needed. */\nexport function localInputOpInverseEdit(op) {\n    if (!op || op.kind !== PUFFBOOK_OP_KIND.INPUT_TEXT_EDIT) {\n        throw new Error('localInputOpInverseEdit requires a local input text op.');\n    }\n    return replaceSpanToEdit(op.inverse_span);\n}\n\n/* Canonicalise one singleton text change into one ReplaceSpan at the local-op boundary. */\nfunction singleReplaceSpanFromChange(body, changeOrSpan, label) {\n    try {\n        return validateReplaceSpan(changeOrSpan);\n    } catch (_spanErr) {\n        const spans = replaceSpanChainFromChange(body, changeOrSpan, label);\n        if (spans.length !== 1) {\n            throw new Error(`${label} must contain exactly one edit; got ${spans.length}.`);\n        }\n        return spans[0];\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport {\n    completePredictedSourceSnapshot,\n} from './puffbook-body-window.mjs';\nimport { localInputTransportState } from './puffbook-ops.mjs';\n\nfunction serialisePendingOp(op) {\n    return {\n        transport_state: op?.kind === 'input_text_edit' ? localInputTransportState(op) : null,\n        edit_ordinal: Number.isInteger(op?.edit_ordinal) ? op.edit_ordinal : null,\n        accepted_version: Number.isInteger(op?.accepted_version) ? op.accepted_version : null,\n        start_line: op?.span?.start_line ?? null,\n        start_col: op?.span?.start_col ?? null,\n        deleted_text: op?.span?.deleted_text ?? '',\n        inserted_text: op?.span?.inserted_text ?? '',\n    };\n}\n\n/* Combine an exact whole-document server snapshot with the optimistic edits\n   frozen at recording start. */\nexport function completePuffbookRecordingState(state, pending, snap) {\n    if (snap.version !== state.source_version) {\n        throw new Error('Puffbook recording snapshot version does not match its frozen browser state.');\n    }\n    const predicted = completePredictedSourceSnapshot(snap, pending, state.body_window.start_line);\n    return {\n        ...state,\n        source_version: snap.version,\n        acknowledged_body: snap.body,\n        predicted_body: predicted.body,\n        pending_ops: predicted.pending.map(serialisePendingOp),\n        body_window: {\n            start_line: 0,\n            end_line: predicted.end_line,\n            total_lines: predicted.total_lines,\n            full: true,\n        },\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const NULL_OUTPUT_TEXT = 'NULL';\n\n// Compact value rendering keeps the surviving axis visible without expanding\n// the separate logical-type metadata affordance.\nexport function prefixOutputAxis(obj, text) {\n    if (!obj || typeof text !== 'string' || typeof obj.axisName !== 'function') {\n        return text;\n    }\n    const axis = obj.axisName();\n    if (!axis) {\n        return text;\n    }\n    if (typeof axis !== 'string' || !axis.startsWith(':')) {\n        throw new Error(`Puffbook output axis must be a colon-prefixed string; received ${JSON.stringify(axis)}.`);\n    }\n    return text.startsWith(axis) ? text : `${axis}${text}`;\n}\n\n// A successful semantic null is transported as a value result without an\n// attached object. Keep it distinct from an absent statement result.\nexport function materialiseNullOutput(resultKind, output) {\n    return resultKind === 'value' && (output === null || output === undefined)\n        ? NULL_OUTPUT_TEXT\n        : output;\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport function isUnconditionallyMute(inputText) {\n    const trimmed = `${inputText ?? ''}`.trimStart();\n    switch (trimmed.charAt(0)) {\n        case '':\n        case '#':\n            return true;\n    }\n    return false;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const PUFFBOOK_LIFECYCLE = Object.freeze({\n    OPENING: 'opening',\n    LIVE_CURRENT: 'live_current',\n    LIVE_LAPSED_IDLE: 'live_lapsed_idle',\n    LIVE_LAPSED_RECONNECTING: 'live_lapsed_reconnecting',\n    CLOSING: 'closing',\n    CLOSED: 'closed',\n});\n\nconst ALLOWED_NEXT = Object.freeze({\n    [PUFFBOOK_LIFECYCLE.OPENING]: new Set([\n        PUFFBOOK_LIFECYCLE.LIVE_CURRENT,\n        PUFFBOOK_LIFECYCLE.CLOSING,\n    ]),\n    [PUFFBOOK_LIFECYCLE.LIVE_CURRENT]: new Set([\n        PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE,\n        PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING,\n        PUFFBOOK_LIFECYCLE.CLOSING,\n    ]),\n    [PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE]: new Set([\n        PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING,\n        PUFFBOOK_LIFECYCLE.CLOSING,\n    ]),\n    [PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING]: new Set([\n        PUFFBOOK_LIFECYCLE.LIVE_CURRENT,\n        PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE,\n        PUFFBOOK_LIFECYCLE.CLOSING,\n    ]),\n    [PUFFBOOK_LIFECYCLE.CLOSING]: new Set([\n        PUFFBOOK_LIFECYCLE.CLOSED,\n    ]),\n    [PUFFBOOK_LIFECYCLE.CLOSED]: new Set(),\n});\n\n/* Report whether one lifecycle state must keep the puffbook screen mounted. */\nexport function canMountPuffbookScreen(state) {\n    return state === PUFFBOOK_LIFECYCLE.LIVE_CURRENT\n        || state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_IDLE\n        || state === PUFFBOOK_LIFECYCLE.LIVE_LAPSED_RECONNECTING;\n}\n\n/* Own one authoritative puffbook frontend lifecycle and assert legal transitions. */\nexport class PuffbookLifecycleController {\n    #state;\n    #lastReason;\n\n    constructor(initialState = PUFFBOOK_LIFECYCLE.OPENING) {\n        this.#state = initialState;\n        this.#lastReason = 'initial';\n    }\n\n    /* Return the current lifecycle state for this puffbook session. */\n    state() {\n        return this.#state;\n    }\n\n    /* Return one small snapshot that tests and diagnostics can print directly. */\n    snapshot() {\n        return {\n            state: this.#state,\n            can_mount_screen: canMountPuffbookScreen(this.#state),\n            last_reason: this.#lastReason,\n        };\n    }\n\n    /* Report whether the current state permits a mounted puffbook screen. */\n    canMountScreen() {\n        return canMountPuffbookScreen(this.#state);\n    }\n\n    /* Advance to one new lifecycle state, asserting the transition contract. */\n    transition(nextState, reason = 'unspecified') {\n        if (nextState === this.#state) {\n            this.#lastReason = reason;\n            return false;\n        }\n        const allowed = ALLOWED_NEXT[this.#state];\n        if (!allowed?.has(nextState)) {\n            throw new Error(`Illegal puffbook lifecycle transition '${this.#state}' -> '${nextState}' (${reason}).`);\n        }\n        this.#state = nextState;\n        this.#lastReason = reason;\n        return true;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nconst INITIAL_RETRY_DELAY_MS = 250;\nconst MAX_RETRY_DELAY_MS = 5000;\n\nexport function puffbookReconnectDelayMS(attempt) {\n    if (!Number.isInteger(attempt) || attempt < 0) {\n        throw new Error(`Puffbook reconnect attempt must be a non-negative integer, got ${attempt}.`);\n    }\n    return Math.min(INITIAL_RETRY_DELAY_MS * (2 ** Math.min(attempt, 30)), MAX_RETRY_DELAY_MS);\n}\n\n// Restrict automatic retries to transport/lifecycle failures. Projection\n// invariant failures require explicit containment and must not be hidden by a\n// fresh snapshot.\nexport function isRecoverablePuffbookOpenError(err) {\n    const message = `${err?.message || err || ''}`;\n    return err?.code === 'auth/renewal_unavailable'\n        || err?.status === 502\n        || err?.status === 503\n        || err?.status === 504\n        || message.includes('puffworker disconnected')\n        || message.includes('attach maintenance demand target differs from active ordered session')\n        || message.startsWith('WebSocket connection closed.')\n        || message.startsWith('WebSocket connection dropped unexpectedly.');\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport {\n    splitBody,\n} from './puffbook-editchain.mjs';\nimport { isUnconditionallyMute } from './puffbook-line-policy.mjs';\nimport {\n    normaliseLineStatus,\n} from './puffbook-line-status.mjs';\nimport { rebaseOutputLineThroughChange } from './puffbook-output-lines.mjs';\n\nexport const INPUT_SYNC_PHASE = Object.freeze({\n    LOCAL: 'local',\n    SENT: 'sent',\n});\n\n/* Clone one projected input-sync span list so line shells do not share mutable display metadata. */\nexport function cloneInputSyncSpans(spans) {\n    if (!Array.isArray(spans) || spans.length === 0) {\n        return [];\n    }\n    return spans.map((span) => ({\n        start_col: span.start_col,\n        end_col: span.end_col,\n        phase: span.phase,\n    }));\n}\n\n/* Compare one projected input-sync span list by value so display churn follows content, not identity. */\nexport function sameInputSyncSpans(a, b) {\n    const left = Array.isArray(a) ? a : [];\n    const right = Array.isArray(b) ? b : [];\n    if (left.length !== right.length) {\n        return false;\n    }\n    for (let i = 0; i < left.length; i += 1) {\n        if (left[i]?.start_col !== right[i]?.start_col\n            || left[i]?.end_col !== right[i]?.end_col\n            || left[i]?.phase !== right[i]?.phase) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/* Hold one immutable-ish puffbook render state so authority and display can share the same shape. */\nexport const NULL_OUTPUT_CELL = Object.freeze({\n    obj: null,\n    state: 'none',\n    block_type: 'hidden',\n    text: '',\n    preview_kind: null,\n    preview_hints: null,\n});\n\n/* Normalise a maybe-null cell onto the closed display contract. */\nexport function normaliseOutputCell(cell, classifyOutputCell) {\n    if (cell && typeof cell === 'object' && 'state' in cell && 'block_type' in cell) {\n        return cell;\n    }\n    return classifyOutputCell(cell ?? null, 'output');\n}\n\n/* Copy one viewport-projection state bag for deferred sync. */\nexport function copyProjectionViewportState(state) {\n    if (!state || typeof state !== 'object') {\n        return null;\n    }\n    return {\n        first_visible_line: Number.isInteger(state.first_visible_line) ? state.first_visible_line : null,\n        last_visible_line: Number.isInteger(state.last_visible_line) ? state.last_visible_line : null,\n        first_warm_line: Number.isInteger(state.first_warm_line) ? state.first_warm_line : null,\n        last_warm_line: Number.isInteger(state.last_warm_line) ? state.last_warm_line : null,\n    };\n}\n\n/* Rebase one line-keyed side map through a text delta by shifting only the rows at or after the edit line. */\nexport function rebaseLineMap(beforeBody, afterBody, values, change, beforeStartLine = 0, afterStartLine = beforeStartLine) {\n    if (change === null || values.size === 0) {\n        return new Map(values);\n    }\n    return rebaseLineEntries(beforeBody, values, change, beforeStartLine, afterStartLine);\n}\n\n/* Rebase one line-keyed output-cell map through a text delta without losing collection shape. */\nexport function rebaseOutputCells(beforeBody, afterBody, cells, change, beforeStartLine = 0, afterStartLine = beforeStartLine) {\n    const merged = mergeProjectedEntries(cells, new Map());\n    const rebased = rebaseProjectedEntries(beforeBody, merged, change, beforeStartLine, afterStartLine);\n    const next = new Map();\n    for (const [line, entry] of rebased.entries()) {\n        if (entry.cell !== undefined) {\n            next.set(line, entry.cell);\n        }\n    }\n    return next;\n}\n\n/* Compare one line's input-side text shell only. */\nexport function sameProjectedInputLine(a, b) {\n    return !!a\n        && !!b\n        && a.input_text === b.input_text\n        && a.input_block_type === b.input_block_type\n        && a.input_read_only === b.input_read_only\n        && sameInputSyncSpans(a.input_sync_spans, b.input_sync_spans);\n}\n\n/* Project one canonical input block from a predicted line shell. */\nexport function projectInputBlock(line) {\n    const text = line?.input_text ?? '';\n    return {\n        disposition: 'in',\n        block_type: text.startsWith('## ') ? 'title' : (line?.input_block_type ?? 'puff'),\n        text,\n        read_only: line?.input_read_only === true,\n        input_sync_spans: cloneInputSyncSpans(line?.input_sync_spans),\n        status: line?.status ?? null,\n        local_waiting: line?.local_waiting === true,\n    };\n}\n\n/* Project one canonical output block from a predicted line shell. */\nexport function projectOutputBlock(line) {\n    const text = line?.input_text ?? '';\n    return {\n        disposition: 'out',\n        block_type: text.startsWith('## ') || isUnconditionallyMute(text)\n            ? 'hidden'\n            : (line?.output_block_type ?? 'hidden'),\n        state: line?.output_state ?? 'none',\n        text: line?.output_text ?? '',\n        ptrless: line?.output_ptrless ?? null,\n        preview_kind: line?.output_preview_kind ?? null,\n        preview_hints: line?.output_preview_hints ?? null,\n        payload_ref: line?.output_payload_ref ?? null,\n        refreshing: line?.output_refreshing === true,\n        local_waiting: line?.local_waiting === true,\n        server_state_kind: line?.output_server_state_kind ?? null,\n    };\n}\n\n/* Project both row blocks from one predicted line shell without re-deriving wider document state. */\nexport function projectLineBlocks(line) {\n    return [\n        projectInputBlock(line),\n        projectOutputBlock(line),\n    ];\n}\n\n/* Build one empty line shell or override an existing shell shape. */\nexport function makeLine(overrides = {}) {\n    return {\n        input_block_type: 'puff',\n        input_text: '',\n        input_read_only: false,\n        input_sync_spans: [],\n        output_block_type: 'hidden',\n        output_ptrless: null,\n        output_state: 'none',\n        output_text: '',\n        output_preview_kind: null,\n        output_preview_hints: null,\n        output_payload_ref: null,\n        output_refreshing: false,\n        output_server_state_kind: null,\n        status: null,\n        local_waiting: false,\n        ...overrides,\n    };\n}\n\n/* Copy one line shell without retaining object identity. */\nexport function copyLine(line) {\n    return makeLine({\n        ...line,\n        input_sync_spans: cloneInputSyncSpans(line?.input_sync_spans),\n        status: normaliseLineStatus(line?.status ?? null),\n    });\n}\n\nexport function buildReusedLines(prevLines, body) {\n    const texts = splitBody(body);\n    const prev = Array.isArray(prevLines) ? prevLines : [];\n    const next = new Array(texts.length);\n    for (let i = 0; i < texts.length; i += 1) {\n        if (prev[i]?.input_text === texts[i]) {\n            next[i] = copyLine(prev[i]);\n            continue;\n        }\n        next[i] = makeLine({\n            input_text: texts[i],\n        });\n    }\n    return ensureDocLines(next);\n}\n\nexport function ensureDocLines(lines) {\n    if (!Array.isArray(lines)) {\n        throw new Error('Puffbook line materialisation must return an array.');\n    }\n    if (lines.length > 0) {\n        return lines;\n    }\n    return [makeLine()];\n}\n\nfunction diffInputEdits(prevLines, nextLines) {\n    const { prefix, suffix } = sharedLineSpans(prevLines, nextLines);\n    const prevMiddleLength = prevLines.length - prefix - suffix;\n    const nextMiddleLength = nextLines.length - prefix - suffix;\n    const sharedMiddleLength = Math.min(prevMiddleLength, nextMiddleLength);\n    const edits = [];\n    for (let i = 0; i < sharedMiddleLength; i += 1) {\n        const line = prefix + i;\n        if (!sameProjectedInputLine(prevLines[line], nextLines[line])) {\n            edits.push({\n                kind: 'line_input',\n                line,\n                input_block: projectInputBlock(nextLines[line]),\n            });\n        }\n    }\n    if (nextMiddleLength > prevMiddleLength) {\n        for (let i = sharedMiddleLength; i < nextMiddleLength; i += 1) {\n            const line = prefix + i;\n            const [inputBlock, outputBlock] = projectLineBlocks(nextLines[line]);\n            edits.push({\n                kind: 'line_insert',\n                line,\n                input_block: inputBlock,\n                output_block: outputBlock,\n            });\n        }\n    } else if (prevMiddleLength > nextMiddleLength) {\n        for (let i = sharedMiddleLength; i < prevMiddleLength; i += 1) {\n            edits.push({ kind: 'line_remove', line: prefix + sharedMiddleLength });\n        }\n    }\n    return edits;\n}\n\nexport function diffDocEdits(prevLines, nextLines) {\n    const edits = diffInputEdits(prevLines, nextLines);\n    const { prefix, suffix } = sharedLineSpans(prevLines, nextLines);\n    for (let line = 0; line < prefix; line += 1) {\n        pushProjectedEdits(edits, prevLines[line], nextLines[line], line);\n    }\n    for (let i = 0; i < suffix; i += 1) {\n        const prevIdx = prevLines.length - suffix + i;\n        const nextIdx = nextLines.length - suffix + i;\n        pushProjectedEdits(edits, prevLines[prevIdx], nextLines[nextIdx], nextIdx);\n    }\n    return edits;\n}\n\nfunction sharedLineSpans(prevLines, nextLines) {\n    const minLength = Math.min(prevLines.length, nextLines.length);\n    let prefix = 0;\n    while (prefix < minLength && sameProjectedInputLine(prevLines[prefix], nextLines[prefix])) {\n        prefix += 1;\n    }\n    let suffix = 0;\n    while (suffix + prefix < minLength) {\n        const prevIdx = prevLines.length - suffix - 1;\n        const nextIdx = nextLines.length - suffix - 1;\n        if (!sameProjectedInputLine(prevLines[prevIdx], nextLines[nextIdx])) {\n            break;\n        }\n        suffix += 1;\n    }\n    return { prefix, suffix };\n}\n\nfunction pushProjectedEdits(edits, prevLine, nextLine, line) {\n    if (!prevLine || !nextLine) {\n        throw new Error(`Cannot diff projected line state for line ${line}.`);\n    }\n    if (!sameProjectedInputBlock(prevLine, nextLine)) {\n        edits.push({\n            kind: 'line_input',\n            line,\n            input_block: projectInputBlock(nextLine),\n        });\n    }\n    if (!sameProjectedOutputBlock(prevLine, nextLine)) {\n        edits.push({\n            kind: 'line_output',\n            line,\n            output_block: projectOutputBlock(nextLine),\n        });\n    }\n}\n\n/* Append only non-input display edits for one row pair without diffing the whole document view. */\nexport function appendProjectedDisplayEdits(edits, prevLine, nextLine, line) {\n    pushProjectedEdits(edits, prevLine, nextLine, line);\n}\n\nexport function applyServerOutputCell(line, cell) {\n    line.output_ptrless = cell.obj;\n    line.output_state = cell.state;\n    line.output_block_type = cell.block_type;\n    line.output_text = cell.text;\n    line.output_preview_kind = cell.preview_kind ?? null;\n    line.output_preview_hints = cell.preview_hints ?? null;\n}\n\nexport function applyProjectedDisplayLineState(line, cell, status, serverState) {\n    applyServerOutputCell(line, cell ?? NULL_OUTPUT_CELL);\n    line.output_server_state_kind = serverState?.kind ?? null;\n    refreshLineStatus(line, status);\n    line.output_refreshing = serverState?.refreshing === true;\n}\n\nexport function refreshLineStatus(line, status) {\n    line.status = statusForLine(line, status);\n}\n\nfunction statusForLine(line, status) {\n    if (!line || isUnconditionallyMute(line.input_text)) {\n        return null;\n    }\n    if (line.input_block_type !== 'puff' && line.input_block_type !== 'convo') {\n        return null;\n    }\n    return normaliseLineStatus(status);\n}\n\n/* Compare one projected input block's load-bearing fields without caring about object identity. */\nfunction sameProjectedInputBlock(a, b) {\n    return !!a\n        && !!b\n        && a.input_text === b.input_text\n        && a.input_read_only === b.input_read_only\n        && sameInputSyncSpans(a.input_sync_spans, b.input_sync_spans)\n        && projectInputBlock(a).block_type === projectInputBlock(b).block_type\n        && a.status === b.status\n        && a.local_waiting === b.local_waiting;\n}\n\n/* Compare one projected output block's load-bearing fields without caring about object identity. */\nfunction sameProjectedOutputBlock(a, b) {\n    const aa = projectOutputBlock(a);\n    const bb = projectOutputBlock(b);\n    return aa.block_type === bb.block_type\n        && aa.state === bb.state\n        && aa.text === bb.text\n        && aa.ptrless === bb.ptrless\n        && aa.preview_kind === bb.preview_kind\n        && aa.preview_hints === bb.preview_hints\n        && aa.payload_ref === bb.payload_ref\n        && aa.refreshing === bb.refreshing\n        && aa.local_waiting === bb.local_waiting\n        && aa.server_state_kind === bb.server_state_kind;\n}\n\nfunction mergeProjectedEntries(cells, statuses) {\n    const merged = new Map();\n    for (const [line, cell] of cells.entries()) {\n        merged.set(line, { cell });\n    }\n    for (const [line, status] of statuses.entries()) {\n        const entry = merged.get(line);\n        if (entry) {\n            entry.status = status;\n            continue;\n        }\n        merged.set(line, { status });\n    }\n    return merged;\n}\n\nfunction rebaseProjectedEntries(beforeBody, entries, change, beforeStartLine = 0, afterStartLine = beforeStartLine) {\n    if (change === null || entries.size === 0) {\n        return new Map(entries);\n    }\n    return rebaseLineEntries(beforeBody, entries, change, beforeStartLine, afterStartLine);\n}\n\n/* Rebase one line-keyed map through the canonical output-row ownership contract. */\nfunction rebaseLineEntries(beforeBody, entries, change, beforeStartLine, afterStartLine) {\n    const next = new Map();\n    for (const [line, value] of entries.entries()) {\n        if (!Number.isInteger(line) || line < beforeStartLine) {\n            continue;\n        }\n        const rebasedLocalLine = rebaseOutputLineThroughChange(line - beforeStartLine, beforeBody, change);\n        if (!Number.isInteger(rebasedLocalLine) || rebasedLocalLine < 0) {\n            continue;\n        }\n        const nextLine = afterStartLine + rebasedLocalLine;\n        const merged = next.get(nextLine);\n        if (merged && value && typeof value === 'object' && !Array.isArray(value)) {\n            next.set(nextLine, { ...merged, ...value });\n            continue;\n        }\n        next.set(nextLine, value);\n    }\n    return next;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { localInputOpIsInFlight } from './puffbook-ops.mjs';\nimport { splitBody } from './puffbook-editchain.mjs';\nimport { cloneSelection, cloneSourceDrag } from './puffbook-selection.mjs';\nimport { rebaseOutputLineThroughChange } from './puffbook-output-lines.mjs';\nimport {\n    LINE_STATUS_RECOMPUTE,\n    normaliseLineStatus,\n} from './puffbook-line-status.mjs';\nimport { pushTestingPortalTimingTrace } from './lib/evilui/testing-trace.mjs';\nimport {\n    applyReplaceSpan,\n    replaceSpanChainFromChange,\n    replaceSpanLineDelta,\n    validateReplaceSpan,\n} from './puffbook-replacespan.mjs';\nimport { PROJECTION_CANARIES, ProjectionInvariantError } from './puffbook-invariants.mjs';\nimport {\n    appendProjectedDisplayEdits,\n    applyServerOutputCell,\n    buildReusedLines,\n    cloneInputSyncSpans,\n    sameInputSyncSpans,\n    copyLine,\n    diffDocEdits,\n    makeLine,\n    NULL_OUTPUT_CELL,\n    projectInputBlock,\n    projectLineBlocks,\n    refreshLineStatus,\n    INPUT_SYNC_PHASE,\n    sameProjectedInputLine,\n} from './puffbook-state.mjs';\n\n\n\n/* Hold the one runtime truth for puffbook rendering: the predicted document state. */\nexport class PuffbookDocumentState {\n    constructor({\n        body = '',\n        bodyStartLine = 0,\n        bodyEndLine = splitBody(body).length,\n        totalLines = splitBody(body).length,\n        lineRecords = null,\n        lines = null,\n        projectedCursor = { line: 0, col: 0 },\n        projectedSelection = null,\n        projectedViewport = null,\n        observedViewportState = null,\n        computeAvailable = true,\n        undoHistory = [],\n        undoCoalesce = null,\n        redoHistory = [],\n        composition = null,\n        sourceDrag = null,\n    } = {}) {\n        this.body = typeof body === 'string' ? body : '';\n        this.bodyStartLine = bodyStartLine;\n        this.bodyEndLine = bodyEndLine;\n        this.totalLines = totalLines;\n        this.lineRecords = cloneLineRecordMap(lineRecords ?? new Map());\n        this.lines = Array.isArray(lines) ? lines : materialisePredictedLines(this, null);\n        this.projectedCursor = projectedCursor ? { ...projectedCursor } : null;\n        this.projectedSelection = cloneSelection(projectedSelection);\n        this.projectedViewport = projectedViewport ? { ...projectedViewport } : null;\n        this.observedViewportState = observedViewportState ? { ...observedViewportState } : null;\n        this.computeAvailable = computeAvailable === true;\n        this.undoHistory = undoHistory.map(cloneHistoryEntry);\n        this.undoCoalesce = undoCoalesce ? structuredClone(undoCoalesce) : null;\n        this.redoHistory = redoHistory.map(entry => ({ spans: entry.spans.map(span => ({ ...span })),\n            selection: cloneSelection(entry.selection), original: cloneHistoryEntry(entry.original) }));\n        this.composition = composition ? { ...composition } : null;\n        this.sourceDrag = cloneSourceDrag(sourceDrag);\n    }\n\n    /* Materialise one canonical empty predicted state. */\n    static empty() {\n        return new PuffbookDocumentState({\n            body: '',\n            bodyStartLine: 0,\n            bodyEndLine: 1,\n            totalLines: 1,\n        });\n    }\n}\n\nfunction cloneHistoryEntry(entry) {\n    return { ...entry,\n        undo_spans: entry.undo_spans?.map(span => ({ ...span })),\n        cursor: entry.cursor ? [...entry.cursor] : null,\n        ...(entry.sourceSelection ? { sourceSelection: cloneSelection(entry.sourceSelection) } : {}),\n    };\n}\n\n// Compatibility spelling for callers being migrated to the document-state\n// boundary. The value is the same opaque state type, not a second authority.\nexport const PredictedPuffbookState = PuffbookDocumentState;\n\n/* Clone one predicted state for a bounded mutation transaction. */\nexport function clonePredictedState(state) {\n    return new PuffbookDocumentState({\n        body: state.body,\n        bodyStartLine: state.bodyStartLine,\n        bodyEndLine: state.bodyEndLine,\n        totalLines: state.totalLines,\n        lineRecords: cloneLineRecordMap(state.lineRecords),\n        lines: state.lines.map((line) => copyLine(line)),\n        projectedCursor: state.projectedCursor,\n        projectedSelection: state.projectedSelection,\n        projectedViewport: state.projectedViewport,\n        observedViewportState: state.observedViewportState,\n        computeAvailable: state.computeAvailable,\n        undoHistory: state.undoHistory,\n        undoCoalesce: state.undoCoalesce,\n        redoHistory: state.redoHistory,\n        composition: state.composition,\n        sourceDrag: state.sourceDrag,\n    });\n}\n\n/* Install one complete authoritative body window into the document state. */\nexport function installSnapshot(state, snapshot = {}) {\n    if (!(state instanceof PuffbookDocumentState)) {\n        throw new TypeError('installSnapshot requires PuffbookDocumentState.');\n    }\n    const body = typeof snapshot.body === 'string' ? snapshot.body : '';\n    const lines = splitBody(body).length;\n    const startLine = Number.isInteger(snapshot.body_start_line) ? snapshot.body_start_line : 0;\n    const endLine = Number.isInteger(snapshot.body_end_line) ? snapshot.body_end_line : startLine + lines;\n    const totalLines = Number.isInteger(snapshot.total_lines) ? snapshot.total_lines : endLine;\n    if (startLine < 0 || endLine !== startLine + lines || totalLines < endLine) {\n        throw new ProjectionInvariantError({\n            owner: 'portal.document_state',\n            operation: 'installSnapshot',\n            canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n            message: `Snapshot window is inconsistent: start=${startLine} end=${endLine} lines=${lines} total=${totalLines}.`,\n        });\n    }\n    state.body = body;\n    state.bodyStartLine = startLine;\n    state.bodyEndLine = endLine;\n    state.totalLines = totalLines;\n    state.lineRecords = cloneLineRecordMap(snapshot.line_records ?? new Map());\n    state.lines = materialisePredictedLines(state, state.lines);\n    validatePredictedState(state);\n    return state;\n}\n\n/* Accept one text delta and atomically advance body, line records, and shells. */\nexport function acceptTextDelta(state, changeOrSpan, docEdits = []) {\n    if (!(state instanceof PuffbookDocumentState)) {\n        throw new TypeError('acceptTextDelta requires PuffbookDocumentState.');\n    }\n    if (!Array.isArray(docEdits)) {\n        throw new TypeError('acceptTextDelta requires a docEdits array.');\n    }\n    applyPredictedTextEditInPlace(state, changeOrSpan, docEdits);\n    validatePredictedState(state);\n    return state;\n}\n\n/* Apply sparse semantic line changes while retaining the document coordinate owner. */\nexport function applyLineChanges(state, changes, pendingLocalSpans = null) {\n    if (!(state instanceof PuffbookDocumentState)) {\n        throw new TypeError('applyLineChanges requires PuffbookDocumentState.');\n    }\n    if (!Array.isArray(changes)) {\n        throw new TypeError('applyLineChanges requires an array.');\n    }\n    let previousLine = null;\n    for (const change of changes) {\n        if (!change || typeof change !== 'object' || !Number.isInteger(change.line)) {\n            throw new ProjectionInvariantError({\n                owner: 'portal.document_state',\n                operation: 'applyLineChanges',\n                canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n                message: `Line change must carry an integer line coordinate: line=${change?.line}.`,\n            });\n        }\n        if (change.line < state.bodyStartLine || change.line >= state.bodyEndLine) {\n            throw new ProjectionInvariantError({\n                owner: 'portal.document_state',\n                operation: 'applyLineChanges',\n                canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n                message: `Line change is outside the current body window: line=${change.line}.`,\n            });\n        }\n        if (previousLine !== null && change.line <= previousLine) {\n            throw new ProjectionInvariantError({\n                owner: 'portal.document_state',\n                operation: 'applyLineChanges',\n                canary: PROJECTION_CANARIES.SEQUENTIAL_DELTA_REJECTED,\n                message: `Line changes must be strictly ordered and unique: previous=${previousLine} current=${change.line}.`,\n            });\n        }\n        if (change.record !== null && change.record !== undefined && (typeof change.record !== 'object' || Array.isArray(change.record))) {\n            throw new ProjectionInvariantError({\n                owner: 'portal.document_state',\n                operation: 'applyLineChanges',\n                canary: PROJECTION_CANARIES.LIFECYCLE_TRANSITION_INVALID,\n                message: `Line ${change.line} record must be an object, null, or omitted.`,\n            });\n        }\n        previousLine = change.line;\n    }\n\n    // Prepare against an isolated state so a later malformed row cannot leak\n    // earlier mutations or a partially rebuilt render projection.\n    const draft = clonePredictedState(state);\n    for (const change of changes) {\n        if (change.record === null) {\n            draft.lineRecords.delete(change.line);\n        } else if (change.record !== undefined) {\n            draft.lineRecords.set(change.line, cloneLineRecord(change.record));\n        }\n    }\n    draft.lines = materialisePredictedLines(draft, draft.lines, pendingLocalSpans);\n    validatePredictedState(draft);\n    state.lineRecords = draft.lineRecords;\n    state.lines = draft.lines;\n    return state;\n}\n\n/* Replace only the current viewport body window; positional state remains in its new coordinates. */\nexport function updateViewportWindow(state, window = {}) {\n    if (!(state instanceof PuffbookDocumentState)) {\n        throw new TypeError('updateViewportWindow requires PuffbookDocumentState.');\n    }\n    return installSnapshot(state, {\n        body: window.body,\n        body_start_line: window.start_line,\n        body_end_line: window.end_line,\n        total_lines: window.total_lines,\n        line_records: state.lineRecords,\n    });\n}\n\n/* Rebuild the render-facing line shells from one predicted state. */\nexport function materialisePredictedLines(state, prevLines = null, pendingLocalSpans = null) {\n    const next = buildReusedLines(prevLines ?? state.lines ?? [], state.body);\n    for (let lineNum = 0; lineNum < next.length; lineNum += 1) {\n        const absLine = state.bodyStartLine + lineNum;\n        const line = next[lineNum];\n        const rec = state.lineRecords.get(absLine) ?? null;\n        if (pendingLocalSpans !== null) {\n            line.input_sync_spans = cloneInputSyncSpans(pendingLocalSpans.get(absLine));\n        }\n        const status = statusForPredictedLine(state, absLine);\n        const cell = rec?.cell ?? NULL_OUTPUT_CELL;\n        applyServerOutputCell(line, cell);\n        line.output_payload_ref = rec?.payloadRef ?? null;\n        const lineState = rec?.lineState ?? null;\n        line.output_server_state_kind = lineState?.kind ?? null;\n        refreshLineStatus(line, status);\n        line.output_refreshing = predictedLineIsRefreshing(rec);\n    }\n    return next;\n}\n\n/* Report the UI doc-edit delta between two predicted states. */\nexport function diffPredictedStates(prevState, nextState) {\n    if (prevState?.bodyStartLine !== nextState?.bodyStartLine) {\n        return diffViewportProjection(prevState, nextState);\n    }\n    return diffDocEdits(prevState?.lines ?? [makeLine()], nextState?.lines ?? [makeLine()]);\n}\n\n/* Move the mounted local window through an authoritative viewport change as\n   one ordered programme over current line coordinates. */\nfunction diffViewportProjection(prevState, nextState) {\n    const prevLines = prevState?.lines ?? [makeLine()];\n    const nextLines = nextState?.lines ?? [makeLine()];\n    const prevStart = prevState?.bodyStartLine ?? 0;\n    const nextStart = nextState?.bodyStartLine ?? 0;\n    const prevEnd = prevStart + prevLines.length;\n    const nextEnd = nextStart + nextLines.length;\n    const sharedStart = Math.max(prevStart, nextStart);\n    const sharedEnd = Math.min(prevEnd, nextEnd);\n    const sharedLength = Math.max(0, sharedEnd - sharedStart);\n    const prevPrefixLength = Math.min(prevLines.length, Math.max(0, sharedStart - prevStart));\n    const prevSuffixLength = prevLines.length - prevPrefixLength - sharedLength;\n    const nextPrefixLength = Math.min(nextLines.length, Math.max(0, sharedStart - nextStart));\n    const nextSuffixLength = nextLines.length - nextPrefixLength - sharedLength;\n    const edits = [];\n\n    for (let i = 0; i < prevPrefixLength; i += 1) {\n        edits.push({ kind: 'line_remove', line: 0 });\n    }\n    for (let i = 0; i < prevSuffixLength; i += 1) {\n        edits.push({ kind: 'line_remove', line: sharedLength });\n    }\n    for (let i = 0; i < nextPrefixLength; i += 1) {\n        const [inputBlock, outputBlock] = projectLineBlocks(nextLines[i]);\n        edits.push({ kind: 'line_insert', line: i, input_block: inputBlock, output_block: outputBlock });\n    }\n    for (let i = 0; i < nextSuffixLength; i += 1) {\n        const line = nextPrefixLength + sharedLength + i;\n        const [inputBlock, outputBlock] = projectLineBlocks(nextLines[line]);\n        edits.push({ kind: 'line_insert', line, input_block: inputBlock, output_block: outputBlock });\n    }\n\n    const prevShared = prevLines.slice(prevPrefixLength, prevPrefixLength + sharedLength);\n    const nextShared = nextLines.slice(nextPrefixLength, nextPrefixLength + sharedLength);\n    for (const edit of diffDocEdits(prevShared, nextShared)) {\n        edits.push({ ...edit, line: nextPrefixLength + edit.line });\n    }\n    return edits;\n}\n\n/* Rebase all line-keyed predicted side maps through one applied text edit, then rebuild the line shells. */\nexport function applyPredictedBodyEdit(state, changeOrSpan) {\n    const beforeBody = state.body;\n    const oneSpan = singleReplaceSpanFromChange(beforeBody, changeOrSpan, 'predicted body edit');\n    const afterBody = applyReplaceSpan(beforeBody, oneSpan);\n    state.body = afterBody;\n    const lineDelta = replaceSpanLineDelta(oneSpan);\n    state.lineRecords = rebaseLineRecordMap(beforeBody, afterBody, state.lineRecords, oneSpan, state.bodyStartLine, state.bodyStartLine);\n    state.bodyEndLine += lineDelta;\n    state.totalLines += lineDelta;\n    state.lines = materialisePredictedLines(state, state.lines);\n}\n\n/* Apply one text edit by patching only the touched visible rows and appending direct document edits. */\nexport function applyPredictedTextEditInPlace(state, changeOrSpan, docEdits) {\n    if (!Array.isArray(docEdits)) {\n        throw new Error('Predicted in-place text edit requires a docEdits array.');\n    }\n    const startedMS = performance.now();\n    const unwrapStartedMS = performance.now();\n    const beforeBody = state.body;\n    const oneSpan = singleReplaceSpanFromChange(beforeBody, changeOrSpan, 'predicted text edit');\n    const unwrapDurationMS = performance.now() - unwrapStartedMS;\n    const patchStartedMS = performance.now();\n    const patch = patchLinesForSpan(beforeBody, oneSpan);\n    const patchDurationMS = performance.now() - patchStartedMS;\n    const cloneSliceStartedMS = performance.now();\n    const prevSlice = state.lines\n        .slice(patch.relStartLine, patch.relStartLine + patch.oldCount)\n        .map((line) => copyLine(line));\n    const cloneSliceDurationMS = performance.now() - cloneSliceStartedMS;\n    const applyBodyStartedMS = performance.now();\n    const afterBody = applyReplaceSpan(beforeBody, oneSpan);\n    const applyBodyDurationMS = performance.now() - applyBodyStartedMS;\n    state.body = afterBody;\n    const lineDelta = replaceSpanLineDelta(oneSpan);\n    const rebaseLineRecordsStartedMS = performance.now();\n    state.lineRecords = rebaseLineRecordMap(beforeBody, afterBody, state.lineRecords, oneSpan, state.bodyStartLine, state.bodyStartLine);\n    const rebaseLineRecordsDurationMS = performance.now() - rebaseLineRecordsStartedMS;\n    state.bodyEndLine += lineDelta;\n    state.totalLines += lineDelta;\n    const buildNextSliceStartedMS = performance.now();\n    const nextSlice = buildPatchedLines(prevSlice, patch.newTexts);\n    const buildNextSliceDurationMS = performance.now() - buildNextSliceStartedMS;\n    const spliceStartedMS = performance.now();\n    state.lines.splice(patch.relStartLine, patch.oldCount, ...nextSlice);\n    const spliceDurationMS = performance.now() - spliceStartedMS;\n    const refreshLinesStartedMS = performance.now();\n    for (let i = 0; i < nextSlice.length; i += 1) {\n        refreshPredictedLine(state, patch.relStartLine + i);\n    }\n    const refreshLinesDurationMS = performance.now() - refreshLinesStartedMS;\n    const appendDocEditsStartedMS = performance.now();\n    appendTextPatchDocEdits(docEdits, patch.relStartLine, prevSlice, nextSlice);\n    const appendDocEditsDurationMS = performance.now() - appendDocEditsStartedMS;\n    pushTestingPortalTimingTrace('predicted_text_edit_in_place', {\n        line_count: state.lines.length,\n        start_line: patch.relStartLine,\n        old_count: patch.oldCount,\n        new_count: patch.newTexts.length,\n        line_delta: lineDelta,\n        output_cells_count: lineRecordFieldCount(state.lineRecords, 'cell'),\n        statuses_count: lineRecordFieldCount(state.lineRecords, 'status'),\n        line_states_count: lineRecordFieldCount(state.lineRecords, 'lineState'),\n        payload_refs_count: lineRecordFieldCount(state.lineRecords, 'payloadRef'),\n        unwrap_ms: Number(unwrapDurationMS.toFixed(3)),\n        patch_ms: Number(patchDurationMS.toFixed(3)),\n        clone_prev_slice_ms: Number(cloneSliceDurationMS.toFixed(3)),\n        apply_body_ms: Number(applyBodyDurationMS.toFixed(3)),\n        rebase_line_records_ms: Number(rebaseLineRecordsDurationMS.toFixed(3)),\n        build_next_slice_ms: Number(buildNextSliceDurationMS.toFixed(3)),\n        splice_ms: Number(spliceDurationMS.toFixed(3)),\n        refresh_lines_ms: Number(refreshLinesDurationMS.toFixed(3)),\n        append_doc_edits_ms: Number(appendDocEditsDurationMS.toFixed(3)),\n        total_ms: Number((performance.now() - startedMS).toFixed(3)),\n    });\n}\n\n/* Keep predicted-state invariants fail-fast so rendering never has to repair model corruption. */\nexport function validatePredictedState(state) {\n    if (!(state instanceof PredictedPuffbookState)) {\n        throw new ProjectionInvariantError({\n            owner: 'portal.predicted_state',\n            operation: 'validate',\n            canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n            message: 'Predicted puffbook state must be a PredictedPuffbookState.',\n        });\n    }\n    const lineCount = splitBody(state.body).length;\n    if (state.bodyEndLine - state.bodyStartLine !== lineCount) {\n        throw new ProjectionInvariantError({\n            owner: 'portal.predicted_state',\n            operation: 'validate',\n            canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n            message: `Predicted body window mismatch: start=${state.bodyStartLine} end=${state.bodyEndLine} lines=${lineCount}.`,\n        });\n    }\n    if (state.totalLines < lineCount) {\n        throw new ProjectionInvariantError({\n            owner: 'portal.predicted_state',\n            operation: 'validate',\n            canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n            message: `Predicted total_lines ${state.totalLines} cannot be smaller than body line count ${lineCount}.`,\n        });\n    }\n    if (!Array.isArray(state.lines) || state.lines.length !== lineCount) {\n        throw new ProjectionInvariantError({\n            owner: 'portal.predicted_state',\n            operation: 'validate',\n            canary: PROJECTION_CANARIES.STATE_COORDINATE_MISMATCH,\n            message: `Predicted line shell count mismatch: lines=${state.lines?.length ?? 'null'} body_lines=${lineCount}.`,\n        });\n    }\n}\n\n/* Canonicalise one singleton predicted-state text change into one ReplaceSpan. */\nfunction singleReplaceSpanFromChange(body, changeOrSpan, label) {\n    try {\n        return validateReplaceSpan(changeOrSpan);\n    } catch (_spanErr) {\n        const spans = replaceSpanChainFromChange(body, changeOrSpan, label);\n        if (spans.length !== 1) {\n            throw new Error(`${label} must contain exactly one edit; got ${spans.length}.`);\n        }\n        return spans[0];\n    }\n}\n\nfunction statusForPredictedLine(state, line) {\n    const rec = state.lineRecords.get(line) ?? null;\n    if (hasOwnLineRecordField(rec, 'status')) {\n        const status = normaliseLineStatus(rec.status ?? null);\n        if (!state.computeAvailable && status === LINE_STATUS_RECOMPUTE) {\n            return null;\n        }\n        return status;\n    }\n    const lineState = rec?.lineState ?? null;\n    if (lineState?.kind === 'terminal_pending') {\n        return state.computeAvailable ? LINE_STATUS_RECOMPUTE : null;\n    }\n    return null;\n}\n\n/* Project only native lifecycle flags onto refreshing output presentation. */\nfunction predictedLineIsRefreshing(rec) {\n    const lineState = rec?.lineState ?? null;\n    return lineState?.refreshing === true\n        || lineState?.has_payload_ref === true;\n}\n\n/* Refresh one visible predicted row from the current line-keyed side maps. */\nfunction refreshPredictedLine(state, lineNum, pendingLocalSpans = null) {\n    const line = state.lines[lineNum] ?? null;\n    if (!line) {\n        throw new Error(`Predicted line ${lineNum} out of range during refresh.`);\n    }\n    const absLine = state.bodyStartLine + lineNum;\n    const rec = state.lineRecords.get(absLine) ?? null;\n    if (pendingLocalSpans !== null) {\n        line.input_sync_spans = cloneInputSyncSpans(pendingLocalSpans.get(absLine));\n    }\n    const status = statusForPredictedLine(state, absLine);\n    const cell = rec?.cell ?? NULL_OUTPUT_CELL;\n    applyServerOutputCell(line, cell);\n    line.output_payload_ref = rec?.payloadRef ?? null;\n    const lineState = rec?.lineState ?? null;\n    line.output_server_state_kind = lineState?.kind ?? null;\n    refreshLineStatus(line, status);\n    line.output_refreshing = predictedLineIsRefreshing(rec);\n}\n\n/* Build one replacement slice for the edited line span while preserving existing row identity outside that span. */\nfunction buildPatchedLines(prevSlice, newTexts) {\n    const template = prevSlice[0] ?? makeLine();\n    return newTexts.map((text, i) => {\n        const line = copyLine(prevSlice[i] ?? template);\n        line.input_text = text;\n        return line;\n    });\n}\n\n/* Append structural and local display edits for one patched line span without diffing the whole document. */\nfunction appendTextPatchDocEdits(docEdits, relStartLine, prevSlice, nextSlice) {\n    // Diff only the touched slice so row-preserving inserts such as splitting a\n    // blank line before an output row emit the minimal structural delta rather\n    // than transiently copying that output onto the inserted blank row.\n    for (const edit of diffDocEdits(prevSlice, nextSlice)) {\n        docEdits.push({\n            ...edit,\n            line: relStartLine + edit.line,\n        });\n    }\n}\n\n/* Apply one canonical pending-sync map onto visible lines and retarget staged input blocks onto the new spans. */\nexport function applyPredictedInputSyncSpans(state, syncSpans, docEdits = null) {\n    const spans = syncSpans instanceof Map ? syncSpans : new Map();\n    const lastStructural = Array.isArray(docEdits)\n        ? docEdits.findLastIndex(edit => edit.kind === 'line_insert' || edit.kind === 'line_remove') : -1;\n    for (let lineNum = 0; lineNum < state.lines.length; lineNum += 1) {\n        const absLine = state.bodyStartLine + lineNum;\n        const line = state.lines[lineNum];\n        const previous = line.input_sync_spans;\n        line.input_sync_spans = cloneInputSyncSpans(spans.get(absLine));\n        if (Array.isArray(docEdits) && !sameInputSyncSpans(previous, line.input_sync_spans)) {\n            // Earlier edits describe their own sequential source frame. Replacing\n            // their blocks with a later frame can duplicate rows after inserts.\n            const latest = docEdits.findLastIndex((edit, index) => index >= lastStructural\n                && edit.line === lineNum && 'input_block' in edit);\n            if (latest >= 0) docEdits[latest].input_block = projectInputBlock(line);\n            else docEdits.push({ kind: 'line_input', line: lineNum, input_block: projectInputBlock(line) });\n        }\n    }\n}\n\n/* Project the currently unratified local text footprint onto absolute visible line spans. */\nexport function pendingLocalInputSpans(baseBody, localOps, absStartLine = 0) {\n    if (typeof baseBody !== 'string') {\n        throw new Error('Pending local input span projection requires a string baseBody.');\n    }\n    if (!Number.isInteger(absStartLine) || absStartLine < 0) {\n        throw new Error(`Pending local line projection requires a non-negative absStartLine; got ${absStartLine}.`);\n    }\n    const relLines = buildPendingSyncModel(baseBody, Array.isArray(localOps) ? localOps : []);\n    const out = new Map();\n    for (let relLine = 0; relLine < relLines.length; relLine += 1) {\n        const spans = compressPendingSyncLine(relLines[relLine]?.phases ?? []);\n        if (spans.length > 0) {\n            out.set(absStartLine + relLine, spans);\n        }\n    }\n    return out;\n}\n\n/* Replay local ops over one parallel phase model so in-flight and local spans can coexist within a line. */\nfunction buildPendingSyncModel(baseBody, localOps) {\n    const lines = splitBody(baseBody).map((text) => ({\n        text,\n        phases: new Array(text.length).fill(null),\n    }));\n    for (const op of localOps) {\n        const span = op?.span ?? null;\n        if (!span || !Number.isInteger(span.start_line) || !Number.isInteger(span.start_col)) {\n            throw new Error('Pending local input span projection requires canonical local input spans.');\n        }\n        applyPendingSyncSpan(lines, span, localInputOpIsInFlight(op) ? INPUT_SYNC_PHASE.SENT : INPUT_SYNC_PHASE.LOCAL);\n    }\n    return lines;\n}\n\n/* Apply one local replace span onto the sync model in the same sequence used for the predicted body itself. */\nfunction applyPendingSyncSpan(lines, span, phase) {\n    const relStartLine = span.start_line;\n    const first = lines[relStartLine] ?? null;\n    if (!first) {\n        throw new Error(`Pending local sync span start line ${relStartLine} out of range.`);\n    }\n    const startCol = codeUnitIndexForByteOffset(first.text, span.start_col);\n    const deleted = splitBody(span.deleted_text ?? '');\n    const inserted = splitBody(span.inserted_text ?? '');\n    const relEndLine = relStartLine + deleted.length - 1;\n    const last = lines[relEndLine] ?? null;\n    if (!last) {\n        throw new Error(`Pending local sync span end line ${relEndLine} out of range.`);\n    }\n    const endCol = deleted.length === 1\n        ? startCol + deleted[0].length\n        : deleted.at(-1).length;\n    assertPendingSyncDeleteMatches(lines, span, startCol, relEndLine, endCol, deleted);\n    const prefixText = first.text.slice(0, startCol);\n    const prefixPhases = first.phases.slice(0, startCol);\n    const suffixText = last.text.slice(endCol);\n    const suffixPhases = last.phases.slice(endCol);\n    const repl = inserted.map((text) => ({\n        text,\n        phases: new Array(text.length).fill(phase),\n    }));\n    if (repl.length === 1) {\n        repl[0] = {\n            text: `${prefixText}${repl[0].text}${suffixText}`,\n            phases: [...prefixPhases, ...repl[0].phases, ...suffixPhases],\n        };\n    } else {\n        repl[0] = {\n            text: `${prefixText}${repl[0].text}`,\n            phases: [...prefixPhases, ...repl[0].phases],\n        };\n        const tail = repl.length - 1;\n        repl[tail] = {\n            text: `${repl[tail].text}${suffixText}`,\n            phases: [...repl[tail].phases, ...suffixPhases],\n        };\n    }\n    lines.splice(relStartLine, deleted.length, ...repl);\n}\n\n/* Assert that one sync-model deletion still matches the current replayed text before splicing it away. */\nfunction assertPendingSyncDeleteMatches(lines, span, startCol, endLine, endCol, deleted) {\n    if (deleted.length === 1) {\n        const actual = lines[span.start_line].text.slice(startCol, endCol);\n        if (actual !== deleted[0]) {\n            throw new Error(\n                `Pending local sync span deleted_text mismatch at ${span.start_line}:${span.start_col}; `\n                + `expected ${JSON.stringify(deleted[0])} got ${JSON.stringify(actual)}.`,\n            );\n        }\n        return;\n    }\n    const firstTail = lines[span.start_line].text.slice(startCol);\n    if (firstTail !== deleted[0]) {\n        throw new Error(\n            `Pending local sync span first-line tail mismatch at ${span.start_line}:${span.start_col}; `\n            + `expected ${JSON.stringify(deleted[0])} got ${JSON.stringify(firstTail)}.`,\n        );\n    }\n    for (let i = 1; i < deleted.length - 1; i += 1) {\n        const actual = lines[span.start_line + i]?.text ?? null;\n        if (actual !== deleted[i]) {\n            throw new Error(\n                `Pending local sync span middle-line mismatch at ${span.start_line + i}:0; `\n                + `expected ${JSON.stringify(deleted[i])} got ${JSON.stringify(actual)}.`,\n            );\n        }\n    }\n    const lastHead = lines[endLine].text.slice(0, endCol);\n    if (lastHead !== deleted.at(-1)) {\n        throw new Error(\n            `Pending local sync span last-line head mismatch at ${endLine}:0; `\n            + `expected ${JSON.stringify(deleted.at(-1))} got ${JSON.stringify(lastHead)}.`,\n        );\n    }\n}\n\n/* Summarise one per-code-unit phase stream into maximal contiguous coloured spans. */\nfunction compressPendingSyncLine(phases) {\n    const spans = [];\n    let run = null;\n    let start = 0;\n    for (let i = 0; i <= phases.length; i += 1) {\n        const phase = i < phases.length ? phases[i] : null;\n        if (phase === run) {\n            continue;\n        }\n        if (run !== null) {\n            spans.push({\n                start_col: start,\n                end_col: i,\n                phase: run,\n            });\n        }\n        run = phase;\n        start = i;\n    }\n    return spans;\n}\n\n/* Resolve one edited line span and replacement texts without scanning untouched rows. */\nfunction patchLinesForSpan(body, span) {\n    const row = validateReplaceSpan(span);\n    const beforeLines = splitBody(body);\n    const relStartLineText = beforeLines[row.start_line] ?? null;\n    if (relStartLineText === null) {\n        throw new Error(`Predicted edit start line ${row.start_line} out of range.`);\n    }\n    const startCol = codeUnitIndexForByteOffset(relStartLineText, row.start_col);\n    const startIndex = lineBodyIndex(beforeLines, row.start_line) + startCol;\n    const endIndex = startIndex + row.deleted_text.length;\n    const deletedText = body.slice(startIndex, endIndex);\n    if (deletedText !== row.deleted_text) {\n        throw new Error(\n            `Predicted span deleted_text mismatch at ${row.start_line}:${row.start_col}; `\n            + `expected ${JSON.stringify(row.deleted_text)} got ${JSON.stringify(deletedText)}.`,\n        );\n    }\n    const oldTexts = splitBody(row.deleted_text);\n    const relEndLine = row.start_line + oldTexts.length - 1;\n    const relEndLineText = beforeLines[relEndLine] ?? null;\n    if (relEndLineText === null) {\n        throw new Error(`Predicted edit end line ${relEndLine} out of range.`);\n    }\n    const prefix = relStartLineText.slice(0, startCol);\n    const endCol = oldTexts.length === 1\n        ? startCol + (oldTexts[0]?.length ?? 0)\n        : (oldTexts.at(-1)?.length ?? 0);\n    const suffix = relEndLineText.slice(endCol);\n    return {\n        relStartLine: row.start_line,\n        oldCount: oldTexts.length,\n        newTexts: splitBody(`${prefix}${row.inserted_text}${suffix}`),\n    };\n}\n\n/* Return one line's body-start code-unit index by summing only the preceding visible rows. */\nfunction lineBodyIndex(lines, line) {\n    let off = 0;\n    for (let i = 0; i < line; i += 1) {\n        off += lines[i].length + 1;\n    }\n    return off;\n}\n\n/* Advance one code-unit index by an exact UTF-8 byte length from the current body position. */\nfunction advanceCodeUnitIndexByUtf8Bytes(text, startIndex, byteLen) {\n    let bytes = 0;\n    let i = startIndex;\n    while (i < text.length && bytes < byteLen) {\n        const cp = text.codePointAt(i);\n        const step = cp > 0xFFFF ? 2 : 1;\n        bytes += utf8ByteWidth(cp);\n        if (bytes > byteLen) {\n            throw new Error(`UTF-8 byte span ${byteLen} splits one code point at body index ${i}.`);\n        }\n        i += step;\n    }\n    if (bytes !== byteLen) {\n        throw new Error(`UTF-8 byte span ${byteLen} out of range for body tail starting at ${startIndex}.`);\n    }\n    return i;\n}\n\n/* Convert one exact UTF-8 byte offset inside one line to its code-unit index. */\nfunction codeUnitIndexForByteOffset(text, byteOffset) {\n    let bytes = 0;\n    let i = 0;\n    while (i < text.length && bytes < byteOffset) {\n        const cp = text.codePointAt(i);\n        const step = cp > 0xFFFF ? 2 : 1;\n        bytes += utf8ByteWidth(cp);\n        if (bytes > byteOffset) {\n            throw new Error(`UTF-8 byte offset ${byteOffset} splits one code point inside line text.`);\n        }\n        i += step;\n    }\n    if (bytes !== byteOffset) {\n        throw new Error(`UTF-8 byte offset ${byteOffset} out of range for line text.`);\n    }\n    return i;\n}\n\n/* Report one code point's UTF-8 width so byte-based Edit coordinates can patch visible lines directly. */\nfunction utf8ByteWidth(cp) {\n    if (!Number.isInteger(cp) || cp < 0) {\n        throw new Error(`Cannot encode invalid code point ${cp}.`);\n    }\n    if (cp <= 0x7F) {\n        return 1;\n    }\n    if (cp <= 0x7FF) {\n        return 2;\n    }\n    if (cp <= 0xFFFF) {\n        return 3;\n    }\n    if (cp <= 0x10FFFF) {\n        return 4;\n    }\n    throw new Error(`Code point ${cp} exceeds UTF-8 range.`);\n}\n\n/* Clone one canonical line-record map while preserving shared payload identity. */\nfunction cloneLineRecordMap(map) {\n    const next = new Map();\n    for (const [line, rec] of map.entries()) {\n        next.set(line, cloneLineRecord(rec));\n    }\n    return next;\n}\n\n/* Rebase one canonical line-record map through a source edit. */\nexport function rebaseLineRecordMap(beforeBody, afterBody, values, changeOrSpan, beforeStartLine = 0, afterStartLine = beforeStartLine) {\n    return rebaseLineEntries(beforeBody, values, changeOrSpan, beforeStartLine, afterStartLine);\n}\n\n\n/* Compare one field name against one line record without walking prototype state. */\nfunction hasOwnLineRecordField(rec, field) {\n    return !!rec && Object.prototype.hasOwnProperty.call(rec, field);\n}\n\nfunction lineRecordFieldCount(records, field) {\n    let count = 0;\n    for (const record of records.values()) {\n        if (hasOwnLineRecordField(record, field)) {\n            count += 1;\n        }\n    }\n    return count;\n}\n\n\n/* Copy one line-record shell without cloning embedded shared payloads by default. */\nfunction cloneLineRecordShallow(rec) {\n    return { ...(rec ?? {}) };\n}\n\n/* Clone one line record while preserving shared payload identity except where state snapshots need detachment. */\nfunction cloneLineRecord(rec) {\n    if (!rec) {\n        return {};\n    }\n    const next = cloneLineRecordShallow(rec);\n    if (hasOwnLineRecordField(next, 'status')) {\n        next.status = normaliseLineStatus(next.status ?? null);\n        if (next.status === null) {\n            delete next.status;\n        }\n    }\n    return next;\n}\n\n/* Rebase one canonical line-record map through the canonical output-row ownership contract. */\nfunction rebaseLineEntries(beforeBody, entries, change, beforeStartLine, afterStartLine) {\n    const next = new Map();\n    for (const [line, value] of entries.entries()) {\n        if (!Number.isInteger(line) || line < beforeStartLine) {\n            continue;\n        }\n        const rebasedLocalLine = rebaseOutputLineThroughChange(line - beforeStartLine, beforeBody, change);\n        if (!Number.isInteger(rebasedLocalLine) || rebasedLocalLine < 0) {\n            continue;\n        }\n        const nextLine = afterStartLine + rebasedLocalLine;\n        const merged = next.get(nextLine);\n        if (merged && value && typeof value === 'object' && !Array.isArray(value)) {\n            next.set(nextLine, { ...merged, ...value });\n            continue;\n        }\n        next.set(nextLine, value);\n    }\n    return next;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Phase 0 names the invariant boundary shared by later projection reducers. */\nexport const PROJECTION_CANARIES = Object.freeze({\n    STATE_COMMIT_REENTRY: 'state_commit_reentry',\n    STATE_COORDINATE_MISMATCH: 'state_coordinate_mismatch',\n    SEQUENTIAL_DELTA_REJECTED: 'sequential_delta_rejected',\n    UNKNOWN_WIRE_FIELD: 'unknown_wire_field',\n    PAYLOAD_MEMBERSHIP_MISMATCH: 'payload_membership_mismatch',\n    LIFECYCLE_TRANSITION_INVALID: 'lifecycle_transition_invalid',\n});\n\n/* Typed internal failure for a projection invariant; never use for user edit conflicts. */\nexport class ProjectionInvariantError extends Error {\n    constructor({ owner, operation, canary, message, details = null } = {}) {\n        if (typeof owner !== 'string' || owner.length === 0) {\n            throw new TypeError('ProjectionInvariantError requires a non-empty owner.');\n        }\n        if (typeof operation !== 'string' || operation.length === 0) {\n            throw new TypeError('ProjectionInvariantError requires a non-empty operation.');\n        }\n        if (typeof canary !== 'string' || canary.length === 0) {\n            throw new TypeError('ProjectionInvariantError requires a non-empty canary.');\n        }\n        super(message ?? `${owner}.${operation} violated ${canary}`);\n        this.name = 'ProjectionInvariantError';\n        this.owner = owner;\n        this.operation = operation;\n        this.canary = canary;\n        this.details = details;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { diffPredictedStates } from './puffbook-predicted-state.mjs';\nimport { projectInputBlock, sameProjectedInputLine } from './puffbook-state.mjs';\n\n/* Keep input-side repaint edits for rows whose text already matches and only display sync/status changed. */\nfunction authoritativeInputRepaintEdits(prevDisplayState, nextDisplayState) {\n    const prevLines = Array.isArray(prevDisplayState?.lines) ? prevDisplayState.lines : [];\n    const nextLines = Array.isArray(nextDisplayState?.lines) ? nextDisplayState.lines : [];\n    const limit = Math.min(prevLines.length, nextLines.length);\n    const edits = [];\n    for (let line = 0; line < limit; line += 1) {\n        const prevLine = prevLines[line] ?? null;\n        const nextLine = nextLines[line] ?? null;\n        if (!prevLine || !nextLine) {\n            continue;\n        }\n        if ((prevLine.input_text ?? '') !== (nextLine.input_text ?? '')) {\n            continue;\n        }\n        if (sameProjectedInputLine(prevLine, nextLine)) {\n            continue;\n        }\n        edits.push({\n            kind: 'line_input',\n            line,\n            input_block: projectInputBlock(nextLine),\n        });\n    }\n    return edits;\n}\n\n/* Choose the scene-facing doc edits for one authoritative server event, including pure sync-span recolours on ratified predicted text. */\nexport function buildServerEditDocEdits(\n    prevDisplayState,\n    nextDisplayState,\n    sourceSpans,\n    version,\n    who = null,\n    emittedAt = null,\n    streamSeq = null,\n) {\n    const spans = Array.isArray(sourceSpans) ? sourceSpans : [];\n    if (spans.length === 0) {\n        return diffPredictedStates(prevDisplayState, nextDisplayState);\n    }\n    return [{\n        kind: 'apply_text_edits',\n        source_spans: spans,\n        output_lines: [],\n        version,\n        who,\n        emitted_at: emittedAt,\n        seq: streamSeq,\n    }, ...authoritativeInputRepaintEdits(prevDisplayState, nextDisplayState)];\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { editFromBodies, splitBody } from './puffbook-editchain.mjs';\nimport {\n    cloneLocalInputTextOps,\n    compactLocalInputOps,\n    localInputInFlightPrefixLen,\n    localInputOpIsInFlight,\n    makeLocalInputTextOpFromSpan,\n} from './puffbook-ops.mjs';\nimport {\n    applyPredictedInputSyncSpans,\n    acceptTextDelta,\n    clonePredictedState,\n    diffPredictedStates,\n    pendingLocalInputSpans,\n    validatePredictedState,\n} from './puffbook-predicted-state.mjs';\nimport {\n    applyReplaceSpan,\n    materialiseReplaceSpans,\n    integrateAuthoritativeSpan,\n    invertReplaceSpan,\n    rebaseLocalSpanOverRemoteChain,\n    replaceSpanChainFromChange,\n    sameReplaceSpan,\n    transformRemoteThroughLocalChain,\n    transformPair,\n} from './puffbook-replacespan.mjs';\n\n/* Start one bounded predicted-state mutation so intermediate undo/redo work never leaks into scene churn. */\nexport function beginPredictedMutation({ reason, predicted, localOps, baseBody = predicted?.body ?? '' }) {\n    if (typeof baseBody !== 'string') {\n        throw new Error('Predicted mutation requires a string baseBody.');\n    }\n    const clonedLocalOps = cloneLocalInputTextOps(localOps);\n    return {\n        reason,\n        before: predicted,\n        work: clonePredictedState(predicted),\n        baseBodyBefore: baseBody,\n        baseBodyNext: baseBody,\n        docEdits: [],\n        textSpans: [],\n        incrementalDocEdits: false,\n        localOpsBefore: cloneLocalInputTextOps(clonedLocalOps),\n        localOpsNext: clonedLocalOps,\n    };\n}\n\n/* Apply one local text op directly to the working predicted state and then compact the retained local op chain. */\nexport function absorbLocalInputTextOp(txn, op) {\n    acceptTextDelta(txn.work, op.span, txn.docEdits);\n    txn.textSpans.push(op.span);\n    txn.incrementalDocEdits = true;\n    txn.localOpsNext.push(op);\n    txn.localOpsNext = compactLocalInputOps(txn.localOpsNext);\n    applyPredictedInputSyncSpans(txn.work, pendingLocalInputSpans(txn.baseBodyNext, txn.localOpsNext), txn.docEdits);\n}\n\n/* Apply one local text op directly onto the live predicted state so keystrokes do not snapshot the full document. */\nexport function applyLocalInputTextOpDirect(predicted, localOps, op, baseBody = predicted?.body ?? '') {\n    validatePredictedState(predicted);\n    if (typeof baseBody !== 'string') {\n        throw new Error('Direct local input application requires a string baseBody.');\n    }\n    const docEdits = [];\n    acceptTextDelta(predicted, op.span, docEdits);\n    const localOpsNext = compactLocalInputOps([\n        ...(Array.isArray(localOps) ? localOps : []),\n        op,\n    ]);\n    applyPredictedInputSyncSpans(predicted, pendingLocalInputSpans(baseBody, localOpsNext), docEdits);\n    validatePredictedState(predicted);\n    return {\n        predictedNext: predicted,\n        docEdits,\n        textSpans: [op.span],\n        localOpsNext,\n    };\n}\n\n/* Absorb one authoritative text delta directly in predicted space while rebasing or dropping locals behind it. */\nexport function absorbServerTextChange(txn, change) {\n    const remoteSpans = changeSpans(txn.baseBodyNext, change);\n    const plan = planServerTextAbsorb(txn.work.body, txn.localOpsNext.slice(), remoteSpans);\n    if (plan.droppedLocalOps.length > 0) {\n        const fallbackDocEdits = tryAbsorbSentHeadProjectionRatification(txn, change, remoteSpans, plan);\n        if (fallbackDocEdits !== null) {\n            return fallbackDocEdits;\n        }\n        return absorbLiveAuthoritativeOverlap(txn, change);\n    }\n    const docEdits = [];\n    for (const span of plan.predictedServerSpans) {\n        acceptTextDelta(txn.work, span, docEdits);\n        txn.textSpans.push(span);\n    }\n    txn.docEdits.push(...squashRedundantPredictedDocEdits(docEdits));\n    txn.incrementalDocEdits = true;\n    txn.baseBodyNext = applyRemoteSpans(txn.baseBodyNext, remoteSpans);\n    txn.localOpsNext = compactLocalInputOps(plan.localOpsNext);\n    validatePredictedState(txn.work);\n    return txn.docEdits;\n}\n\n/* Ctrl+Z may precede an amendment's source publication. Put its inverse\n * before the later local input chain, preserving the already visible text. */\nexport function absorbUndoneServerTextChange(txn, change) {\n    const spans = changeSpans(txn.baseBodyNext, change);\n    txn.baseBodyNext = applyRemoteSpans(txn.baseBodyNext, spans);\n    const inverseOps = spans.slice().reverse().map((span) => makeLocalInputTextOpFromSpan(\n        invertReplaceSpan(span), { transportState: 'local' },\n    ));\n    txn.localOpsNext = [...inverseOps, ...txn.localOpsNext];\n    applyPredictedInputSyncSpans(txn.work, pendingLocalInputSpans(txn.baseBodyNext, txn.localOpsNext), txn.docEdits);\n    txn.incrementalDocEdits = true;\n    assertPredictedBodyMatchesLocalOps(txn.baseBodyNext, txn.localOpsNext, txn.work.body, 'Pending amendment undo');\n}\n\n/* Ratify one origin-identified sent batch while retaining its successor-frame local tail unchanged. */\nexport function ratifyOriginBatch(predicted, baseBody, localOps, ordinal) {\n    validatePredictedState(predicted);\n    if (typeof baseBody !== 'string') {\n        throw new Error('Origin ratification requires a string authoritative base body.');\n    }\n    if (!Number.isInteger(ordinal) || ordinal <= 0) {\n        throw new Error(`Origin ratification requires a positive batch ordinal (got ${JSON.stringify(ordinal)}).`);\n    }\n    const ops = cloneLocalInputTextOps(localOps);\n    let end = 0;\n    while (end < ops.length && localInputOpIsInFlight(ops[end]) && ops[end]?.edit_ordinal === ordinal) {\n        end += 1;\n    }\n    if (end === 0) {\n        throw new Error(`Origin ratification batch ${ordinal} is not the sent queue head.`);\n    }\n    // The projection may clip the authoritative edit payload when this batch\n    // grows just beyond its tracked body window. The origin identifies the\n    // accepted local batch exactly, so advance the authoritative base from\n    // that batch rather than reinterpreting a partial or empty projection.\n    let baseBodyNext = baseBody;\n    for (let i = 0; i < end; i += 1) {\n        baseBodyNext = applyReplaceSpan(baseBodyNext, ops[i].span);\n    }\n    const localOpsNext = ops.slice(end);\n    assertPredictedBodyMatchesLocalOps(baseBodyNext, localOpsNext, predicted.body, `Origin ratification batch ${ordinal}`);\n    return {\n        predictedNext: predicted,\n        baseBodyNext,\n        localOpsNext,\n        docEdits: [],\n        textSpans: [],\n    };\n}\n\n/* Recover one live authoritative overlap by dropping only the conflicted local ops and reprojecting the surviving tail. */\nfunction absorbLiveAuthoritativeOverlap(txn, change) {\n    const recovery = reconcileLocalInputOpsWithServerChange(txn.baseBodyNext, txn.localOpsNext, change);\n    const targetPredictedBody = predictedBodyFromLocalOps(recovery.authoritativeAfter, recovery.localOpsNext);\n    const visibleRepair = editFromBodies(txn.work.body, targetPredictedBody);\n    const docEdits = [];\n    if (visibleRepair !== null) {\n        for (const span of changeSpans(txn.work.body, visibleRepair)) {\n            acceptTextDelta(txn.work, span, docEdits);\n            txn.textSpans.push(span);\n        }\n    }\n    txn.docEdits.push(...squashRedundantPredictedDocEdits(docEdits));\n    txn.incrementalDocEdits = true;\n    txn.baseBodyNext = recovery.authoritativeAfter;\n    txn.localOpsNext = recovery.localOpsNext;\n    validatePredictedState(txn.work);\n    return txn.docEdits;\n}\n\n/* Recover one live sent-prefix ratification whose stable-window projection differs from the optimistic local visible span. */\nfunction tryAbsorbSentHeadProjectionRatification(txn, change, remoteSpans, plan) {\n    const ops = Array.isArray(txn.localOpsNext) ? txn.localOpsNext.slice() : [];\n    const head = ops[0] ?? null;\n    if (!head || !localInputOpIsInFlight(head) || !plan.droppedLocalOps.includes(head)) {\n        return null;\n    }\n    const authoritativeBefore = txn.baseBodyNext;\n    const authoritativeAfter = applyRemoteSpans(authoritativeBefore, remoteSpans);\n    const tailOpsNext = reconcileSentPrefixProjectionTail(\n        authoritativeBefore,\n        authoritativeAfter,\n        ops,\n        1,\n        'Sent-head projection ratification overlapped queued local tail',\n    );\n    const targetPredictedBody = predictedBodyFromLocalOps(authoritativeAfter, tailOpsNext);\n    const visibleRepair = editFromBodies(txn.work.body, targetPredictedBody);\n    const docEdits = [];\n    if (visibleRepair !== null) {\n        for (const span of changeSpans(txn.work.body, visibleRepair)) {\n            acceptTextDelta(txn.work, span, docEdits);\n            txn.textSpans.push(span);\n        }\n    }\n    txn.docEdits.push(...squashRedundantPredictedDocEdits(docEdits));\n    txn.incrementalDocEdits = true;\n    txn.baseBodyNext = authoritativeAfter;\n    txn.localOpsNext = tailOpsNext;\n    validatePredictedState(txn.work);\n    return txn.docEdits;\n}\n\n/* Finish one transaction by validating the final state and diffing the starting and ending predicted snapshots. */\nexport function finishPredictedMutation(txn) {\n    validatePredictedState(txn.work);\n    return {\n        predictedNext: txn.work,\n        baseBodyNext: txn.baseBodyNext,\n        localOpsNext: txn.localOpsNext,\n        docEdits: txn.incrementalDocEdits ? txn.docEdits : diffPredictedStates(txn.before, txn.work),\n        textSpans: txn.textSpans,\n    };\n}\n\n/* Replay one local-op chain over one base body without reconstructing the chain from whole-body diffs. */\nexport function predictedBodyFromLocalOps(baseBody, localOps) {\n    let cur = baseBody;\n    const ops = Array.isArray(localOps) ? localOps : [];\n    for (const op of ops) {\n        cur = applyReplaceSpan(cur, op.span);\n    }\n    return cur;\n}\n\n/* Assert that one sequential local-op chain still reproduces the visible predicted body exactly. */\nexport function assertPredictedBodyMatchesLocalOps(baseBody, localOps, predictedBody, label = 'local op chain') {\n    if (typeof baseBody !== 'string' || typeof predictedBody !== 'string') {\n        throw new Error(`${label} invariant requires string base and predicted bodies.`);\n    }\n    const ops = Array.isArray(localOps) ? localOps : [];\n    const replayedBody = predictedBodyFromLocalOps(baseBody, ops);\n    if (replayedBody === predictedBody) {\n        return;\n    }\n    throw new Error(\n        `${label} diverged from predicted body `\n        + `(pending=${ops.length} `\n        + `base_lines=${splitBody(baseBody).length} `\n        + `replayed_lines=${splitBody(replayedBody).length} `\n        + `predicted_lines=${splitBody(predictedBody).length}).`,\n    );\n}\n\n/* Reconcile one transport-recovery snapshot under the current in-flight sent-prefix contract. */\nexport function reconcileTransportRecoveryLocalOps(authoritativeBefore, authoritativeAfter, localOps) {\n    if (typeof authoritativeBefore !== 'string' || typeof authoritativeAfter !== 'string') {\n        throw new Error('Transport recovery reconciliation requires before/after body strings.');\n    }\n    const ops = compactLocalInputOps(Array.isArray(localOps) ? localOps.slice() : []);\n    if (authoritativeAfter === authoritativeBefore) {\n        return {\n            kind: 'ok',\n            localOpsNext: ops,\n        };\n    }\n    const matchedPrefix = matchingLocalPrefixLen(authoritativeBefore, authoritativeAfter, ops);\n    if (matchedPrefix > 0) {\n        return {\n            kind: 'ok',\n            localOpsNext: compactLocalInputOps(ops.slice(matchedPrefix)),\n        };\n    }\n    const head = ops[0] ?? null;\n    if (head === null) {\n        throw new Error('Transport recovery authoritative body advanced with no pending local op.');\n    }\n    const sentCount = sentPrefixLen(ops);\n    if (sentCount === 0) {\n        throw new Error(\n            `Transport recovery authoritative body advanced without one sent prefix in flight `\n            + `(pending=${ops.length} head_start=${head.span.start_line}:${head.span.start_col} `\n            + `before=${JSON.stringify(authoritativeBefore)} after=${JSON.stringify(authoritativeAfter)}).`,\n        );\n    }\n    return {\n        kind: 'ok',\n        localOpsNext: reconcileSentPrefixProjectionTail(\n            authoritativeBefore,\n            authoritativeAfter,\n            ops,\n            sentCount,\n            'Transport recovery authoritative body diverged from sent-head ratification contract',\n        ),\n    };\n}\n\n/* Ratify one exact queued local prefix when the authoritative after-body already includes it verbatim. */\nexport function ratifyVisibleLocalPrefixToBody(predicted, baseBody, localOps, authoritativeAfter) {\n    validatePredictedState(predicted);\n    if (typeof baseBody !== 'string' || typeof authoritativeAfter !== 'string') {\n        throw new Error('Visible local-prefix ratification requires string body inputs.');\n    }\n    if (authoritativeAfter === baseBody) {\n        return null;\n    }\n    const ops = compactLocalInputOps(Array.isArray(localOps) ? localOps.slice() : []);\n    const matchedPrefix = matchingLocalPrefixLen(baseBody, authoritativeAfter, ops);\n    if (matchedPrefix === 0) {\n        return null;\n    }\n    const localOpsNext = compactLocalInputOps(ops.slice(matchedPrefix));\n    assertPredictedBodyMatchesLocalOps(\n        authoritativeAfter,\n        localOpsNext,\n        predicted.body,\n        'Visible local-prefix ratification',\n    );\n    return {\n        predictedNext: predicted,\n        baseBodyNext: authoritativeAfter,\n        localOpsNext,\n        docEdits: [],\n        textSpans: [],\n    };\n}\n\n/* Ratify a sent local prefix from the transport acknowledgement while source publication catches up asynchronously. */\nexport function ratifyVisibleSentPrefixToVersion(out, baseBodyBefore, localOpsBefore, version) {\n    if (!out || !out.predictedNext || !Array.isArray(out.localOpsNext) || typeof out.baseBodyNext !== 'string') {\n        throw new Error('Visible sent-prefix ratification requires a predicted mutation output.');\n    }\n    if (typeof baseBodyBefore !== 'string') {\n        throw new Error('Visible sent-prefix ratification requires a string authoritative base body.');\n    }\n    const beforeOps = compactLocalInputOps(Array.isArray(localOpsBefore) ? cloneLocalInputTextOps(localOpsBefore) : []);\n    const sentCount = localInputInFlightPrefixLen(beforeOps);\n    let optimisticBaseBody = baseBodyBefore;\n    for (let i = 0; i < sentCount; i += 1) {\n        optimisticBaseBody = applyReplaceSpan(optimisticBaseBody, beforeOps[i].span);\n        try {\n            assertPredictedBodyMatchesLocalOps(\n                optimisticBaseBody,\n                beforeOps.slice(i + 1),\n                out.predictedNext.body,\n                `Visible sent-prefix ratification version ${version}`,\n            );\n            return {\n                ...out,\n                baseBodyNext: optimisticBaseBody,\n                localOpsNext: compactLocalInputOps(beforeOps.slice(i + 1)),\n            };\n        } catch (_err) {\n            // Continue until the optimistic sent prefix matches the retained local tail.\n        }\n    }\n    let invariantErr = null;\n    try {\n        assertPredictedBodyMatchesLocalOps(\n            out.baseBodyNext,\n            out.localOpsNext,\n            out.predictedNext.body,\n            `Visible sent-prefix ratification version ${version}`,\n        );\n        return out;\n    } catch (err) {\n        invariantErr = err;\n    }\n    if (sentCount <= 0) {\n        throw invariantErr;\n    }\n    optimisticBaseBody = baseBodyBefore;\n    for (let i = 0; i < sentCount; i += 1) {\n        optimisticBaseBody = applyReplaceSpan(optimisticBaseBody, beforeOps[i].span);\n        try {\n            assertPredictedBodyMatchesLocalOps(\n                optimisticBaseBody,\n                out.localOpsNext,\n                out.predictedNext.body,\n                `Visible sent-prefix ratification version ${version}`,\n            );\n            return {\n                ...out,\n                baseBodyNext: optimisticBaseBody,\n            };\n        } catch (_err) {\n            // Continue until the optimistic sent prefix matches the retained local tail.\n        }\n    }\n    throw invariantErr;\n}\n\n/* Project one queued local op back into the authoritative base frame by commuting it across the local prefix inverse chain. */\nexport function tryProjectLocalInputOpToBaseFrame(op, priorLocalOps) {\n    if (!op || op.kind !== 'input_text_edit') {\n        throw new Error('Base-frame projection requires a local input text op.');\n    }\n    const projected = tryProjectLocalInputOpsToBaseFrame([op], priorLocalOps);\n    if (projected.kind !== 'ok') {\n        return projected;\n    }\n    return {\n        kind: 'ok',\n        op: projected.ops[0],\n    };\n}\n\n/* Project one sequential outbound batch across one sequential local prefix. */\nexport function tryProjectLocalInputOpsToBaseFrame(ops, priorLocalOps) {\n    if (!Array.isArray(ops) || ops.length === 0) {\n        return { kind: 'ok', ops: [] };\n    }\n    const prefix = Array.isArray(priorLocalOps) ? priorLocalOps : [];\n    let inversePrefix = [];\n    for (let i = prefix.length - 1; i >= 0; i -= 1) {\n        const prior = prefix[i];\n        if (!prior?.inverse_span) {\n            throw new Error(`Base-frame projection prefix op ${i} is missing inverse_span.`);\n        }\n        inversePrefix.push(prior.inverse_span);\n    }\n    const projected = [];\n    for (const op of ops) {\n        if (!op || op.kind !== 'input_text_edit') {\n            throw new Error('Base-frame projection batch requires local input text ops.');\n        }\n        const transformed = transformRemoteThroughLocalChain(inversePrefix, op.span);\n        if (transformed.kind !== 'ok' || transformed.q === null) {\n            const blockingIndex = transformed.local\n                ? inversePrefix.findIndex((span) => sameReplaceSpan(span, transformed.local))\n                : -1;\n            return {\n                kind: 'blocked',\n                blocking_op: blockingIndex >= 0\n                    ? prefix[prefix.length - 1 - blockingIndex] ?? null\n                    : prefix.at(-1) ?? null,\n            };\n        }\n        projected.push(makeLocalInputTextOpFromSpan(transformed.q, {\n            source: op.source ?? 'local',\n            transportState: op.transport_state ?? 'local',\n            editOrdinal: Number.isInteger(op.edit_ordinal) ? op.edit_ordinal : null,\n            acceptedVersion: Number.isInteger(op.accepted_version) ? op.accepted_version : null,\n            createdAtMS: op.created_at_ms,\n        }));\n        inversePrefix = transformed.local_ops;\n    }\n    return { kind: 'ok', ops: projected };\n}\n\n/* Project one queued local op back into the authoritative base frame by commuting it across the local prefix inverse chain. */\nexport function projectLocalInputOpToBaseFrame(op, priorLocalOps) {\n    const projected = tryProjectLocalInputOpToBaseFrame(op, priorLocalOps);\n    if (projected.kind !== 'ok') {\n        const prior = projected.blocking_op ?? null;\n        throw new Error(\n            `Queued local op cannot commute back across prefix inverse at `\n            + `${prior?.span?.start_line ?? -1}:${prior?.span?.start_col ?? -1}.`,\n        );\n    }\n    return projected.op;\n}\n\n/* Reconcile one retained local-op chain against one authoritative server delta without touching scene state. */\nexport function reconcileLocalInputOpsWithServerChange(authoritativeBefore, localOps, change) {\n    const remoteSpans = changeSpans(authoritativeBefore, change);\n    const reconciled = reconcileLocalOpChainWithRemoteSpans(localOps, remoteSpans);\n    for (const op of reconciled.droppedLocalOps) {\n        warnDroppedConflictingLocalInputOp(op, remoteSpans.length);\n    }\n    return {\n        kind: 'ok',\n        localOpsNext: compactLocalInputOps(reconciled.localOpsNext),\n        authoritativeAfter: applyRemoteSpans(authoritativeBefore, remoteSpans),\n    };\n}\n\n/* Count the current contiguous sent prefix so transport logic stays local-op-native. */\nfunction sentPrefixLen(ops) {\n    let n = 0;\n    return localInputInFlightPrefixLen(ops);\n}\n\n/* Detect one exact queued-prefix ratification directly from body equality during transport recovery. */\nfunction matchingLocalPrefixLen(baseBody, authoritativeAfter, ops) {\n    let cur = baseBody;\n    for (let i = 0; i < ops.length; i += 1) {\n        cur = applyReplaceSpan(cur, ops[i].span);\n        if (cur === authoritativeAfter) {\n            return i + 1;\n        }\n    }\n    return 0;\n}\n\n/* Reconcile the queued tail after one sent prefix has ratified, even when the authoritative visible body shape differs. */\nfunction reconcileSentPrefixProjectionTail(authoritativeBefore, authoritativeAfter, ops, sentCount, conflictLabel) {\n    if (!Array.isArray(ops) || ops.length === 0) {\n        return [];\n    }\n    let optimisticBody = authoritativeBefore;\n    let tailOpsNext = compactLocalInputOps(ops);\n    const n = Math.min(sentCount, ops.length);\n    for (let i = 0; i < n; i += 1) {\n        optimisticBody = applyReplaceSpan(optimisticBody, ops[i].span);\n        tailOpsNext = compactLocalInputOps(ops.slice(i + 1));\n        if (authoritativeAfter === optimisticBody) {\n            return tailOpsNext;\n        }\n    }\n    if (tailOpsNext.length === 0) {\n        return [];\n    }\n    const projectionChange = editFromBodies(optimisticBody, authoritativeAfter);\n    if (projectionChange === null) {\n        return tailOpsNext;\n    }\n    const reconciled = reconcileLocalInputOpsWithServerChange(optimisticBody, tailOpsNext, projectionChange);\n    if (reconciled.localOpsNext.length !== tailOpsNext.length) {\n        throw new Error(\n            `${conflictLabel} `\n            + `(tail_before=${tailOpsNext.length} tail_after=${reconciled.localOpsNext.length}).`,\n        );\n    }\n    return reconciled.localOpsNext;\n}\n\n/* Lower one authoritative change chain onto canonical spans at the body boundary, then keep later operators span-native. */\nfunction changeSpans(body, change) {\n    return replaceSpanChainFromChange(body, change, 'authoritative change spans');\n}\n\n/* Rebase one local input op through one authoritative remote-span chain using canonical operator methods only. */\nfunction rebaseLocalOpOverRemoteSpans(op, remoteSpans) {\n    const rebased = rebaseLocalSpanOverRemoteChain(op.span, remoteSpans);\n    if (rebased.kind !== 'ok') {\n        return rebased;\n    }\n    return {\n        kind: 'ok',\n        op: makeLocalInputTextOpFromSpan(rebased.span, {\n            source: op.source ?? 'local',\n            transportState: op.transport_state ?? null,\n            editOrdinal: Number.isInteger(op.edit_ordinal) ? op.edit_ordinal : null,\n            acceptedVersion: Number.isInteger(op.accepted_version) ? op.accepted_version : null,\n        }),\n    };\n}\n\n/* Plan one visible remote-span absorb directly in predicted space while preserving the authoritative/local split. */\nfunction planServerTextAbsorb(predictedBody, localOps, remoteSpans) {\n    let ops = localOps.slice();\n    let curPredictedBody = predictedBody;\n    const predictedServerSpans = [];\n    const droppedLocalOps = [];\n    for (const remoteSpan of remoteSpans) {\n        const step = transformRemoteSpanThroughLocalOps(curPredictedBody, ops, remoteSpan);\n        predictedServerSpans.push(...step.predictedSpans);\n        ops = step.localOpsNext;\n        curPredictedBody = step.predictedBodyNext;\n        droppedLocalOps.push(...step.droppedLocalOps);\n    }\n    return {\n        predictedServerSpans,\n        localOpsNext: ops,\n        droppedLocalOps,\n    };\n}\n\n/* Reconcile one retained local chain against authoritative spans without projecting visible scene edits. */\nfunction reconcileLocalOpChainWithRemoteSpans(localOps, remoteSpans) {\n    let ops = Array.isArray(localOps) ? localOps.slice() : [];\n    const droppedLocalOps = [];\n    for (const remoteSpan of remoteSpans) {\n        const step = reconcileLocalOpsWithRemoteSpan(ops, remoteSpan);\n        ops = step.localOpsNext;\n        droppedLocalOps.push(...step.droppedLocalOps);\n    }\n    return {\n        localOpsNext: ops,\n        droppedLocalOps,\n    };\n}\n\n/* Reconcile one authoritative span against the queued local chain, rewriting the suffix immediately when one local op is dropped. */\nfunction reconcileLocalOpsWithRemoteSpan(localOps, remoteSpan) {\n    const pending = Array.isArray(localOps) ? localOps.slice() : [];\n    let q = remoteSpan;\n    const keptLocalOps = [];\n    const droppedLocalOps = [];\n    for (let i = 0; i < pending.length; i += 1) {\n        const op = pending[i];\n        if (q === null) {\n            keptLocalOps.push(op);\n            continue;\n        }\n        const pair = transformPair(op.span, q);\n        if (pair.kind === 'conflict') {\n            droppedLocalOps.push(op);\n            rebaseQueuedLocalSuffixAcrossDroppedInverse(pending, i + 1, op);\n            continue;\n        }\n        if (pair.class === 'ack') {\n            q = null;\n            continue;\n        }\n        keptLocalOps.push(makeLocalInputTextOpFromSpan(pair.l2, {\n            source: op.source ?? 'local',\n            transportState: op.transport_state ?? null,\n            editOrdinal: Number.isInteger(op.edit_ordinal) ? op.edit_ordinal : null,\n            acceptedVersion: Number.isInteger(op.accepted_version) ? op.accepted_version : null,\n        }));\n        q = pair.q;\n    }\n    return {\n        localOpsNext: compactLocalInputOps(keptLocalOps),\n        droppedLocalOps,\n    };\n}\n\n/* Pull the queued suffix back across one dropped local op immediately so later ops stay in the surviving frame. */\nfunction rebaseQueuedLocalSuffixAcrossDroppedInverse(localOps, start, droppedOp) {\n    for (let i = start; i < localOps.length; i += 1) {\n        const rebased = rebaseLocalOpOverRemoteSpans(localOps[i], [droppedOp.inverse_span]);\n        if (rebased.kind !== 'ok') {\n            throw new Error(\n                `Queued local suffix cannot commute across dropped inverse at `\n                + `${droppedOp.span.start_line}:${droppedOp.span.start_col}.`,\n            );\n        }\n        localOps[i] = rebased.op;\n    }\n}\n\nfunction transformRemoteSpanThroughLocalOps(predictedBody, localOps, remoteSpan) {\n    const head = localOps[0] ?? null;\n    if (head && sameReplaceSpan(head.span, remoteSpan)) {\n        return {\n            predictedBodyNext: predictedBody,\n            predictedSpans: [],\n            localOpsNext: localOps.slice(1),\n            droppedLocalOps: [],\n        };\n    }\n    const integrated = integrateAuthoritativeSpan(\n        predictedBody,\n        localOps.map((op) => op.span),\n        remoteSpan,\n    );\n    const survivors = [];\n    const droppedLocalOps = [];\n    let survivorIndex = 0;\n    for (const op of localOps) {\n        const rebased = rebaseLocalOpOverRemoteSpans(op, [remoteSpan]);\n        if (rebased.kind === 'ack') {\n            continue;\n        }\n        if (rebased.kind === 'conflict') {\n            droppedLocalOps.push(op);\n            continue;\n        }\n        const expected = integrated.local_ops[survivorIndex] ?? null;\n        if (expected === null) {\n            throw new Error('Integrated authoritative span dropped one surviving local op unexpectedly.');\n        }\n        if (\n            rebased.op.span.start_line !== expected.start_line\n            || rebased.op.span.start_col !== expected.start_col\n            || rebased.op.span.deleted_text !== expected.deleted_text\n            || rebased.op.span.inserted_text !== expected.inserted_text\n        ) {\n            throw new Error('Integrated authoritative span disagreed with local-op rebase result.');\n        }\n        survivors.push(rebased.op);\n        survivorIndex += 1;\n    }\n    if (survivorIndex !== integrated.local_ops.length) {\n        throw new Error(\n            `Integrated authoritative span survivor mismatch `\n            + `(rebased=${survivorIndex} integrated=${integrated.local_ops.length}).`,\n        );\n    }\n    return {\n        predictedBodyNext: integrated.predicted_body,\n        predictedSpans: integrated.predicted_spans,\n        localOpsNext: survivors,\n        droppedLocalOps,\n    };\n}\n\n/* Apply one remote-span chain at the authoritative boundary after the operator methods finish rebasing locals. */\nfunction applyRemoteSpans(body, remoteSpans) {\n    let cur = body;\n    for (const span of remoteSpans) {\n        cur = applyReplaceSpan(cur, span);\n    }\n    return cur;\n}\n\n/* Collapse adjacent same-line projected edits so multi-step server absorbs still surface one final line patch. */\nfunction squashRedundantPredictedDocEdits(edits) {\n    const out = [];\n    for (const edit of edits) {\n        const prev = out.at(-1) ?? null;\n        if (\n            prev\n            && prev.kind === edit.kind\n            && Number.isInteger(prev.line)\n            && prev.line === edit.line\n            && (\n                edit.kind === 'line_input'\n                || edit.kind === 'line_output'\n            )\n        ) {\n            out[out.length - 1] = edit;\n            continue;\n        }\n        out.push(edit);\n    }\n    return out;\n}\n\n/* Surface one precise console warning when an overlapping authoritative delta forces one local edit to be dropped. */\nfunction warnDroppedConflictingLocalInputOp(op, authoritativeSpanCount) {\n    console.warn('Dropping conflicting local puffbook edit after authoritative overlap.', {\n        local_span: op?.span ?? null,\n        inverse_span: op?.inverse_span ?? null,\n        authoritative_span_count: authoritativeSpanCount,\n    });\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\n/* Project the visible predicted revision head from one authoritative base plus the retained local tail. */\nexport function currentRevisionFromPending(pending, serverVersion) {\n    return serverVersion + (Array.isArray(pending) ? pending.length : 0);\n}\n", "// Copyright (c) 2025-2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { normalizePasteText } from './lib/evilui/clipboard-text.mjs';\nimport { Document } from './lib/evilui/document.mjs';\nimport { SPACE_TAB_TEXT, isSpaceTabKey, spaceTabBackspaceStart } from './lib/evilui/space-tabs.mjs';\nimport { isTableViewData } from './lib/evilui/tableview-helpers.mjs';\n\nconst CONVO_KIND = 'convo_v1';\nconst DEFAULT_USER_ID = 'user';\nconst DEFAULT_ASSISTANT_ID = 'assistant';\n\nexport function createDefaultConvo() {\n    return {\n        kind: CONVO_KIND,\n        title: 'New convo',\n        llm_state: {\n            conversation_id: null,\n        },\n        parties: [\n            { id: DEFAULT_USER_ID, label: 'You', kind: 'human' },\n            { id: DEFAULT_ASSISTANT_ID, label: 'LLM', kind: 'llm', provider: 'openai' },\n        ],\n        turns: [],\n    };\n}\n\nexport function serializeConvo(model) {\n    return `${JSON.stringify(model, null, 2)}\\n`;\n}\n\nexport function parseConvoText(text) {\n    const raw = `${text ?? ''}`.trim();\n    if (raw === '') {\n        return createDefaultConvo();\n    }\n\n    let parsed = null;\n    try {\n        parsed = JSON.parse(raw);\n    } catch (err) {\n        throw new Error(`Convo file is not valid JSON: ${err.message}`);\n    }\n\n    if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n        throw new Error('Convo file must be a JSON object.');\n    }\n    if (parsed.kind !== CONVO_KIND) {\n        throw new Error(`Convo file kind must be '${CONVO_KIND}'.`);\n    }\n    if (!Array.isArray(parsed.parties) || parsed.parties.length < 2) {\n        throw new Error('Convo file must contain at least two parties.');\n    }\n    if (!Array.isArray(parsed.turns)) {\n        throw new Error('Convo file must contain a turns array.');\n    }\n    const llmState = (!parsed.llm_state || typeof parsed.llm_state !== 'object' || Array.isArray(parsed.llm_state))\n        ? { conversation_id: null }\n        : {\n            conversation_id: typeof parsed.llm_state.conversation_id === 'string' && parsed.llm_state.conversation_id !== ''\n                ? parsed.llm_state.conversation_id\n                : null,\n        };\n\n    const seen = new Set();\n    const parties = parsed.parties.map((party, i) => {\n        if (!party || typeof party !== 'object' || Array.isArray(party)) {\n            throw new Error(`Party ${i} must be an object.`);\n        }\n        if (typeof party.id !== 'string' || party.id.trim() === '') {\n            throw new Error(`Party ${i} must have a non-empty string id.`);\n        }\n        if (seen.has(party.id)) {\n            throw new Error(`Duplicate party id '${party.id}'.`);\n        }\n        seen.add(party.id);\n        return {\n            id: party.id,\n            label: typeof party.label === 'string' && party.label.trim() !== '' ? party.label : party.id,\n            kind: typeof party.kind === 'string' && party.kind !== '' ? party.kind : 'unknown',\n            provider: typeof party.provider === 'string' && party.provider !== '' ? party.provider : null,\n        };\n    });\n\n    const turns = parsed.turns.map((turn, i) => {\n        if (!turn || typeof turn !== 'object' || Array.isArray(turn)) {\n            throw new Error(`Turn ${i} must be an object.`);\n        }\n        if (typeof turn.prompt !== 'string' || turn.prompt.trim() === '') {\n            throw new Error(`Turn ${i} prompt must be a non-empty string.`);\n        }\n        if (!Array.isArray(turn.responses)) {\n            throw new Error(`Turn ${i} responses must be an array.`);\n        }\n        return {\n            prompt: turn.prompt,\n            responses: turn.responses.map((resp, j) => {\n                if (!resp || typeof resp !== 'object' || Array.isArray(resp)) {\n                    throw new Error(`Turn ${i} response ${j} must be an object.`);\n                }\n                if (typeof resp.author !== 'string' || !seen.has(resp.author)) {\n                    throw new Error(`Turn ${i} response ${j} must reference a known author.`);\n                }\n                if (typeof resp.content !== 'string' || resp.content.trim() === '') {\n                    throw new Error(`Turn ${i} response ${j} content must be a non-empty string.`);\n                }\n                return {\n                    author: resp.author,\n                    content: resp.content,\n                    created_at: typeof resp.created_at === 'string' && resp.created_at !== ''\n                        ? resp.created_at\n                        : new Date(0).toISOString(),\n                };\n            }),\n            created_at: typeof turn.created_at === 'string' && turn.created_at !== ''\n                ? turn.created_at\n                : new Date(0).toISOString(),\n        };\n    });\n\n    return {\n        kind: CONVO_KIND,\n        title: typeof parsed.title === 'string' && parsed.title.trim() !== '' ? parsed.title : 'Convo',\n        llm_state: llmState,\n        parties,\n        turns,\n    };\n}\n\nfunction responderParty(model) {\n    const party = model.parties.find((it) => it.kind !== 'human');\n    if (!party) {\n        throw new Error('Convo file does not define a non-human responder.');\n    }\n    return party;\n}\n\nfunction partyLabel(model, id) {\n    return model.parties.find((it) => it.id === id)?.label ?? id;\n}\n\nexport function buildLLMMessages(model) {\n    const out = [];\n    for (const turn of model.turns) {\n        out.push({\n            role: 'user',\n            content: turn.prompt,\n        });\n        for (const resp of turn.responses) {\n            out.push({\n                role: resp.author === DEFAULT_USER_ID ? 'user' : 'assistant',\n                content: resp.content,\n            });\n        }\n    }\n    return out;\n}\n\nfunction titleFromPath(path) {\n    const lastSlash = path.lastIndexOf('/');\n    const name = lastSlash >= 0 ? path.substring(lastSlash + 1) : path;\n    return name.endsWith('.convo') ? name.substring(0, name.length - '.convo'.length) : name;\n}\n\nexport function llmCompletionText(payload) {\n    const text = payload?.data?.response;\n    if (typeof text !== 'string') {\n        throw new Error('LLM response payload did not contain data.response.');\n    }\n    return text.trim();\n}\n\nexport function llmConversationID(payload) {\n    const id = payload?.data?.conversation_id;\n    return typeof id === 'string' && id !== '' ? id : null;\n}\n\nfunction makeLine(overrides = {}) {\n    return {\n        input_block_type: 'convo',\n        input_text: '',\n        output_block_type: 'hidden',\n        output_ptrless: null,\n        output_state: 'none',\n        output_text: '',\n        output_warning: '',\n        submitted: false,\n        ...overrides,\n    };\n}\n\nfunction renderTurnResponses(model, turn) {\n    if (!Array.isArray(turn.responses) || turn.responses.length === 0) {\n        return '';\n    }\n    return turn.responses.map((resp) => {\n        const label = partyLabel(model, resp.author);\n        return `${label}: ${resp.content}`;\n    }).join('\\n\\n');\n}\n\nfunction modelToLines(model) {\n    const lines = model.turns.map((turn) => makeLine({\n        input_text: turn.prompt,\n        output_block_type: turn.responses.length > 0 ? 'text' : 'hidden',\n        output_text: renderTurnResponses(model, turn),\n        output_state: 'done',\n        submitted: true,\n    }));\n    lines.push(makeLine());\n    return lines;\n}\n\nfunction cloneModel(model) {\n    return {\n        ...model,\n        llm_state: {\n            conversation_id: model.llm_state?.conversation_id ?? null,\n        },\n        parties: model.parties.map((party) => ({ ...party })),\n        turns: model.turns.map((turn) => ({\n            ...turn,\n            responses: turn.responses.map((resp) => ({ ...resp })),\n        })),\n    };\n}\n\nexport async function createConvo(api, fileRef, opts = {}) {\n    if (!api) {\n        throw new Error('api instance is required.');\n    }\n    const doc = new ConvoDocument(api, fileRef, {\n        read_only: opts.read_only === true,\n        onLoadError: opts.onLoadError ?? null,\n    });\n    await doc.open();\n    return doc;\n}\n\nclass ConvoDocument extends Document {\n    #api;\n    #readOnly;\n    #onLoadError;\n    #closed;\n    #model;\n    #queuedEdits;\n    #pending;\n\n    constructor(api, fileRef, opts = {}) {\n        super(fileRef);\n        this.#api = api;\n        this.#readOnly = opts.read_only === true;\n        this.#onLoadError = opts.onLoadError ?? null;\n        this.#closed = false;\n        this.#model = createDefaultConvo();\n        this.#queuedEdits = [];\n        this.#pending = false;\n        this._lines = [makeLine()];\n    }\n\n    async open() {\n        try {\n            const raw = await this.#api.getConvo(this.fileRef);\n            this.#model = parseConvoText(raw);\n            if (this.#model.title === 'Convo' || this.#model.title === 'New convo') {\n                this.#model.title = titleFromPath(this.fileRef.path);\n            }\n            this._lines = modelToLines(this.#model);\n            this.#stage([{ kind: 'reset', line: 0 }]);\n        } catch (err) {\n            this.#onLoadError?.(err, this);\n            throw err;\n        }\n    }\n\n    close() {\n        this.#closed = true;\n    }\n\n    matchesFileRef(ref) {\n        return ref?.lake === this.fileRef?.lake\n            && ref?.branch === this.fileRef?.branch\n            && ref?.path === this.fileRef?.path;\n    }\n\n    get read_only() {\n        return this.#readOnly;\n    }\n\n    get api() {\n        return this.#api;\n    }\n\n    render() {\n        const blocks = new Array(this._lines.length * 2);\n        for (let i = 0; i < this._lines.length; i++) {\n            const [input, output] = this.renderLine(i);\n            blocks[i * 2] = input;\n            blocks[i * 2 + 1] = output;\n        }\n        return blocks;\n    }\n\n    renderLine(lineNum) {\n        const line = this._lines[lineNum];\n        if (!line) {\n            throw new Error(`Cannot render line ${lineNum}; out of bounds.`);\n        }\n        const input = {\n            disposition: 'in',\n            block_type: line.input_block_type,\n            text: line.input_text,\n            error: line.output_state === 'error' ? line.output_text : '',\n            warning: line.output_warning,\n            read_only: line.submitted || this.#readOnly,\n        };\n        const output = {\n            disposition: 'out',\n            block_type: line.output_block_type,\n            state: line.output_state,\n            text: line.output_text,\n            ptrless: line.output_ptrless,\n        };\n        if (!line.submitted && line.input_text.trim() === '') {\n            output.block_type = 'hidden';\n        } else if (isTableViewData(line.output_ptrless)\n            || line.output_ptrless?.logicalType?.().startsWith('Struct')) {\n            output.block_type = 'tableview';\n        }\n        return [\n            input,\n            {\n                ...output,\n            },\n        ];\n    }\n\n    update() {\n        const edits = this.#queuedEdits;\n        this.#queuedEdits = [];\n        return { edits };\n    }\n\n    applyKeyDown(evt, cursor, selectionRange = null) {\n        const lineNum = cursor?.[0] ?? 0;\n        const line = this._lines[lineNum] ?? null;\n        const draftLine = this._lines.length - 1;\n        if (!line || lineNum !== draftLine || this.#readOnly || line.submitted) {\n            return [false, cursor];\n        }\n\n        if (evt.key === 'Enter') {\n            const prompt = line.input_text.trim();\n            if (prompt === '' || this.#pending) {\n                return [false, cursor];\n            }\n            void this.#submitDraft(prompt);\n            return [true, [this._lines.length - 1, 0]];\n        }\n\n        const before = line.input_text;\n        const next = applySingleLineKey(before, cursor[1] ?? 0, evt, selectionRange);\n        if (!next) {\n            return [false, cursor];\n        }\n        if (next.text === before && next.cursor === (cursor[1] ?? 0)) {\n            return [false, [lineNum, next.cursor]];\n        }\n        this._lines[lineNum] = makeLine({\n            ...line,\n            input_text: next.text,\n        });\n        this.#stage([{ kind: 'line_replace', line: lineNum }]);\n        return [true, [lineNum, next.cursor]];\n    }\n\n    async #submitDraft(prompt) {\n        const turnIndex = this._lines.length - 1;\n        const responder = responderParty(this.#model);\n        const createdAt = new Date().toISOString();\n        this.#model = cloneModel(this.#model);\n        this.#model.turns.push({\n            prompt,\n            responses: [],\n            created_at: createdAt,\n        });\n\n        this._lines[turnIndex] = makeLine({\n            input_text: prompt,\n            output_block_type: 'text',\n            output_state: 'none',\n            output_text: 'Waiting for LLM...',\n            submitted: true,\n        });\n        this._lines.push(makeLine());\n        this.#pending = true;\n        this.#stage([\n            { kind: 'line_replace', line: turnIndex },\n            { kind: 'line_insert', line: turnIndex + 1 },\n        ]);\n        await this.#save();\n\n        try {\n            const completion = await this.#api.llmCompletion({\n                prompt_name: 'puff',\n                conversation_id: this.#model.llm_state?.conversation_id ?? '',\n                messages: buildLLMMessages(this.#model),\n            });\n            const reply = llmCompletionText(completion);\n            if (reply === '') {\n                throw new Error('LLM returned a blank response.');\n            }\n            const conversationID = llmConversationID(completion);\n            if (conversationID) {\n                this.#model.llm_state.conversation_id = conversationID;\n            }\n            const turn = this.#model.turns[turnIndex];\n            turn.responses.push({\n                author: responder.id,\n                content: reply,\n                created_at: new Date().toISOString(),\n            });\n            this._lines[turnIndex] = makeLine({\n                input_text: turn.prompt,\n                output_block_type: 'text',\n                output_state: 'done',\n                output_text: renderTurnResponses(this.#model, turn),\n                submitted: true,\n            });\n            this.#stage([{ kind: 'line_output', line: turnIndex }]);\n            await this.#save();\n        } catch (err) {\n            this._lines[turnIndex] = makeLine({\n                input_text: prompt,\n                output_block_type: 'text',\n                output_state: 'error',\n                output_text: err?.detail || err?.message || 'LLM request failed.',\n                submitted: true,\n            });\n            this.#stage([{ kind: 'line_output', line: turnIndex }]);\n        } finally {\n            this.#pending = false;\n        }\n    }\n\n    async #save() {\n        if (this.#closed) {\n            return;\n        }\n        await this.#api.putConvo(this.fileRef, serializeConvo(this.#model));\n    }\n\n    #stage(edits) {\n        this.#queuedEdits.push(...edits);\n    }\n}\n\nfunction applySingleLineKey(text, cursor, evt, selectionRange) {\n    if (evt.ctrlKey || evt.metaKey) {\n        if (evt.key === 'copy') {\n            return null;\n        }\n        if (evt.key === 'paste') {\n            return replaceSelection(text, cursor, selectionRange, normalizePasteText(evt.clipboardData, { multiline: false }));\n        }\n        if (evt.key === 'cut') {\n            return replaceSelection(text, cursor, selectionRange, '');\n        }\n        return null;\n    }\n\n    const hasSelection = Array.isArray(selectionRange) && selectionRange.length === 2 && selectionRange[0] !== selectionRange[1];\n    const selStart = hasSelection ? Math.min(selectionRange[0], selectionRange[1]) : cursor;\n    const selEnd = hasSelection ? Math.max(selectionRange[0], selectionRange[1]) : cursor;\n\n    switch (evt.key) {\n    case 'Tab':\n        return isSpaceTabKey(evt) ? replaceSelection(text, cursor, selectionRange, SPACE_TAB_TEXT) : null;\n    case 'ArrowLeft':\n        return { text, cursor: hasSelection ? selStart : Math.max(0, cursor - 1) };\n    case 'ArrowRight':\n        return { text, cursor: hasSelection ? selEnd : Math.min(text.length, cursor + 1) };\n    case 'Home':\n        return { text, cursor: 0 };\n    case 'End':\n        return { text, cursor: text.length };\n    case 'Backspace':\n        if (hasSelection) {\n            return replaceSelection(text, cursor, selectionRange, '');\n        }\n        if (cursor <= 0) {\n            return { text, cursor };\n        }\n        {\n            const start = evt.altKey ? cursor - 1 : spaceTabBackspaceStart(text, cursor);\n            return { text: text.substring(0, start) + text.substring(cursor), cursor: start };\n        }\n    case 'Delete':\n        if (hasSelection) {\n            return replaceSelection(text, cursor, selectionRange, '');\n        }\n        if (cursor >= text.length) {\n            return { text, cursor };\n        }\n        return {\n            text: text.substring(0, cursor) + text.substring(cursor + 1),\n            cursor,\n        };\n    default:\n        if (typeof evt.key === 'string' && evt.key.length === 1 && !evt.altKey) {\n            return replaceSelection(text, cursor, selectionRange, evt.key);\n        }\n        return null;\n    }\n}\n\nfunction replaceSelection(text, cursor, selectionRange, insert) {\n    const hasSelection = Array.isArray(selectionRange) && selectionRange.length === 2 && selectionRange[0] !== selectionRange[1];\n    const start = hasSelection ? Math.min(selectionRange[0], selectionRange[1]) : cursor;\n    const end = hasSelection ? Math.max(selectionRange[0], selectionRange[1]) : cursor;\n    const nextText = text.substring(0, start) + insert + text.substring(end);\n    return {\n        text: nextText,\n        cursor: start + insert.length,\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nexport const CHROME_EPSILON = 1e-4;\n\nexport function normPath(path) {\n    if (!path || path === '/') {\n        return '';\n    }\n    return `/${path}`.replace(/\\/+/g, '/').replace(/\\/$/, '');\n}\n\nexport function childPath(parentPath, childName) {\n    const parent = normPath(parentPath);\n    const child = `${childName}`.replace(/^\\/+/, '');\n    return normPath(parent ? `${parent}/${child}` : `/${child}`);\n}\n\n/* Return every potentially grantable ancestor. The caller verifies ownership\n * of the selected artifact before applying any mutation. */\nexport function permissionGrantPaths(path) {\n    const normalized = normPath(path);\n    const parts = normalized.split('/').filter(Boolean);\n    if (parts.length === 0 || (parts[0] === 'home' && parts.length < 2)) {\n        throw new Error(`permissionGrantPaths: expected an artifact path below a managed top-level directory (was ${JSON.stringify(path)}).`);\n    }\n    const firstGrantableSegment = parts[0] === 'home' ? 2 : 1;\n    const paths = [];\n    for (let i = firstGrantableSegment; i <= parts.length; i += 1) {\n        paths.push(`/${parts.slice(0, i).join('/')}`);\n    }\n    return paths;\n}\n\nexport function nearlyEqual(a, b, eps = CHROME_EPSILON) {\n    return Math.abs(a - b) <= eps;\n}\n\nexport function formatTooltipGroups(groups) {\n    if (!Array.isArray(groups) || groups.length === 0) {\n        return '-';\n    }\n    return groups.join(' ');\n}\n\nexport function formatDirectoryItemTooltip(item) {\n    return `${item.name}\\nowner: ${item.owner ?? '-'}\\nread: ${formatTooltipGroups(item.read_groups)}\\nwrite: ${formatTooltipGroups(item.write_groups)}`;\n}\n\n/* Keep one compact filename-like label for route-driven artifact banners. */\nexport function routeArtifactLabel(path) {\n    const norm = normPath(path);\n    if (!norm) {\n        return '/';\n    }\n    const parts = norm.split('/').filter(Boolean);\n    return parts.at(-1) ?? norm;\n}\n\n/* Limit direct route-open banner handling to document artifact paths, not directories. */\nexport function isDocumentArtifactPath(path) {\n    const norm = normPath(path);\n    return norm.endsWith('.puffbook') || norm.endsWith('.convo');\n}\n\n/* Derive one stable user-facing banner payload for direct artifact read failures. */\nexport function describeArtifactReadErrorBanner(path, err, { backendUnavailable = false } = {}) {\n    const itemName = routeArtifactLabel(path);\n    if (err?.status === 403) {\n        return {\n            title: 'Forbidden',\n            detail: `You do not have read access to ${itemName}.`,\n        };\n    }\n    if (err?.status === 404) {\n        return {\n            title: 'Not Found',\n            detail: `Could not find ${itemName}.`,\n        };\n    }\n    if (backendUnavailable) {\n        return {\n            title: 'Backend Unavailable',\n            detail: `Could not load ${itemName}. Backend not responding.`,\n        };\n    }\n    const detail = `${err?.detail || err?.message || err || ''}`.trim();\n    return {\n        title: 'Load Failed',\n        detail: detail ? `Could not read ${itemName}. ${detail}` : `Could not read ${itemName}.`,\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { normPath } from './lib/evilui/directory-utils.mjs';\n\nexport const DEFAULT_PORTAL_RETURN_PATH = '/lake/~/';\n\n// Portal may be mounted below a proxy prefix such as /<user-name>/proxy/<port>.\n// Keep that prefix as base and treat the first /lake segment as the app route.\nexport function splitPortalLakeRoute(path) {\n    const idx = path.indexOf('/lake');\n    if (idx === -1) {\n        return null;\n    }\n    const end = idx + '/lake'.length;\n    const next = path[end] || '';\n    if (next !== '' && next !== '/') {\n        return null;\n    }\n    return {\n        base: path.substring(0, idx),\n        lakePath: next === '/' ? path.substring(end + 1) : '',\n    };\n}\n\n// Collapse transitional duplicate lake prefixes from earlier route experiments.\nfunction trimDuplicateLakePrefix(path) {\n    while (path.startsWith('lake/')) {\n        path = path.substring('lake/'.length);\n    }\n    return path.replace(/^\\/+/, '').replace(/\\/+/g, '/');\n}\n\n/* Report whether one lake-local route path is a direct document artifact path. */\nexport function isDocumentLakePath(path) {\n    const trimmed = trimDuplicateLakePrefix(`${path || ''}`).replace(/\\/+$/, '');\n    return trimmed.endsWith('.puffbook') || trimmed.endsWith('.convo');\n}\n\n/* Classify one lake-local route path under the trailing-slash directory invariant. */\nexport function classifyPortalLakePath(path) {\n    const raw = trimDuplicateLakePrefix(`${path || ''}`);\n    const trimmed = raw.replace(/\\/+$/, '');\n    if (trimmed === '') {\n        return {\n            kind: 'directory',\n            routePath: '',\n            canonicalRoutePath: '',\n        };\n    }\n    if (trimmed === '~') {\n        return {\n            kind: 'directory',\n            routePath: '~',\n            canonicalRoutePath: '~/',\n        };\n    }\n    if (isDocumentLakePath(trimmed)) {\n        return {\n            kind: 'artifact',\n            routePath: trimmed,\n            canonicalRoutePath: trimmed,\n        };\n    }\n    if (raw.endsWith('/')) {\n        return {\n            kind: 'directory',\n            routePath: trimmed,\n            canonicalRoutePath: `${trimmed}/`,\n        };\n    }\n    return {\n        kind: 'legacy',\n        routePath: trimmed,\n        canonicalRoutePath: trimmed,\n    };\n}\n\n/* Build one canonical browser pathname for a portal file-system path. */\nexport function portalLakePathFromFilePath(path, { directory = false } = {}) {\n    const norm = normPath(path);\n    if (directory) {\n        return norm ? `/lake${norm}/` : '/lake/';\n    }\n    return `/lake${norm}`;\n}\n\n/* Build one canonical mounted portal pathname from base and lake-local route path. */\nexport function mountedPortalLakePath(base, path, { directory = false } = {}) {\n    const mountBase = `${base || ''}`.replace(/\\/+$/, '');\n    const local = classifyPortalLakePath(path);\n    const lakePath = directory\n        ? (local.routePath ? `${local.routePath}/` : '')\n        : local.routePath;\n    return lakePath ? `${mountBase}/lake/${lakePath}` : `${mountBase}/lake/`;\n}\n\n// Rewrite only path-based portal routes. Hash routes were removed, so\n// any URL with search or hash state is preserved rather than reinterpreted.\nexport function portalReturnPath(url) {\n    const lakeRoute = splitPortalLakeRoute(url.pathname);\n    // Empty mount roots such as / and /<user-name>/proxy/<port>/ land on home.\n    if (!lakeRoute && url.pathname.endsWith('/') && !url.search && !url.hash) {\n        return `${url.pathname.replace(/\\/+$/, '')}${DEFAULT_PORTAL_RETURN_PATH}`;\n    }\n\n    if (lakeRoute && !url.search && !url.hash) {\n        const route = classifyPortalLakePath(lakeRoute.lakePath || '');\n        if (route.kind !== 'legacy') {\n            return mountedPortalLakePath(lakeRoute.base, route.canonicalRoutePath, {\n                directory: route.kind === 'directory',\n            });\n        }\n    }\n\n    // /~ is the shorthand for the current path-based home route.\n    const tildeMatch = url.pathname.match(/^(.*)\\/~\\/?$/);\n    if (tildeMatch && !url.search && !url.hash) {\n        return `${tildeMatch[1] || ''}/lake/~/`;\n    }\n\n    return `${url.pathname}${url.search}${url.hash}` || DEFAULT_PORTAL_RETURN_PATH;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { DEFAULT_PORTAL_RETURN_PATH, portalReturnPath } from './portal-routes.mjs';\n\nconst AUTH_REDIRECT_BACKOFF_KEY = 'portal.auth_redirect_backoff.v1';\nconst AUTH_CALLBACK_MISSING_STATE_RETRY_KEY = 'portal.auth_callback_missing_state_retry.v1';\nconst MISSING_OIDC_STATE_TEXT = 'no matching state found in storage';\nconst AUTH_REDIRECT_BASE_MS = 5000;\nconst AUTH_REDIRECT_MAX_MS = 5 * 60 * 1000;\n\nexport function expandHomeRoutePath(path, username) {\n    if (!path) {\n        return path;\n    }\n    if (path === '~') {\n        return username ? `home/${username}` : path;\n    }\n    if (path.startsWith('~/')) {\n        return username ? `home/${username}/${path.substring(2)}` : path;\n    }\n    return path;\n}\n\nexport function callbackReturnPath(state, origin) {\n    const raw = state?.return_to;\n    if (typeof raw !== 'string' || raw.trim() === '') {\n        return DEFAULT_PORTAL_RETURN_PATH;\n    }\n\n    try {\n        const url = new URL(raw, origin);\n        if (url.origin !== origin) {\n            console.warn(`Ignoring OIDC callback return target on foreign origin '${url.origin}'.`);\n            return DEFAULT_PORTAL_RETURN_PATH;\n        }\n        return portalReturnPath(url);\n    } catch (err) {\n        console.warn('Ignoring malformed OIDC callback return target.', err);\n        return DEFAULT_PORTAL_RETURN_PATH;\n    }\n}\n\nexport function readAuthRedirectBackoff(storage) {\n    try {\n        const raw = storage.getItem(AUTH_REDIRECT_BACKOFF_KEY);\n        if (!raw) {\n            return { attempts: 0, nextAtMs: 0 };\n        }\n        const parsed = JSON.parse(raw);\n        return {\n            attempts: Number.isInteger(parsed?.attempts) && parsed.attempts >= 0 ? parsed.attempts : 0,\n            nextAtMs: Number.isFinite(parsed?.nextAtMs) && parsed.nextAtMs > 0 ? parsed.nextAtMs : 0,\n        };\n    } catch (err) {\n        console.warn('Could not read auth redirect backoff state.', err);\n        return { attempts: 0, nextAtMs: 0 };\n    }\n}\n\nexport function writeAuthRedirectBackoff(storage, state) {\n    try {\n        storage.setItem(AUTH_REDIRECT_BACKOFF_KEY, JSON.stringify(state));\n    } catch (err) {\n        console.warn('Could not persist auth redirect backoff state.', err);\n    }\n}\n\nexport function clearAuthRedirectBackoff(storage) {\n    try {\n        storage.removeItem(AUTH_REDIRECT_BACKOFF_KEY);\n    } catch (err) {\n        console.warn('Could not clear auth redirect backoff state.', err);\n    }\n}\n\nexport function isMissingOidcStateError(err) {\n    const msg = (err?.message || String(err)).toLowerCase();\n    return msg.includes(MISSING_OIDC_STATE_TEXT);\n}\n\nexport function callbackRetryAlreadyUsed(storage) {\n    try {\n        return storage.getItem(AUTH_CALLBACK_MISSING_STATE_RETRY_KEY) === '1';\n    } catch (err) {\n        console.warn('Could not read callback retry flag.', err);\n        return false;\n    }\n}\n\nexport function markCallbackRetryUsed(storage) {\n    try {\n        storage.setItem(AUTH_CALLBACK_MISSING_STATE_RETRY_KEY, '1');\n    } catch (err) {\n        console.warn('Could not persist callback retry flag.', err);\n    }\n}\n\nexport function clearCallbackRetryUsed(storage) {\n    try {\n        storage.removeItem(AUTH_CALLBACK_MISSING_STATE_RETRY_KEY);\n    } catch (err) {\n        console.warn('Could not clear callback retry flag.', err);\n    }\n}\n\nexport function nextAuthRedirectDelayMs(attempts) {\n    if (attempts <= 0) {\n        return 0;\n    }\n    return Math.min(AUTH_REDIRECT_BASE_MS * (2 ** Math.max(0, attempts - 1)), AUTH_REDIRECT_MAX_MS);\n}\n\nexport function authRedirectBackoffRemainingMs(storage, nowMs = Date.now()) {\n    const state = readAuthRedirectBackoff(storage);\n    if (state.nextAtMs <= nowMs) {\n        return 0;\n    }\n    return state.nextAtMs - nowMs;\n}\n\nexport function noteAuthRedirectAttempt(storage, nowMs = Date.now()) {\n    const prev = readAuthRedirectBackoff(storage);\n    const attempts = prev.attempts + 1;\n    const delayMs = nextAuthRedirectDelayMs(attempts);\n    const next = {\n        attempts,\n        nextAtMs: nowMs + delayMs,\n    };\n    writeAuthRedirectBackoff(storage, next);\n    return next;\n}\n\nexport function apiCanServeRoutes(state) {\n    return state.connection === 'ready'\n        && (state.auth === 'authenticated' || state.auth === 'local');\n}\n\nexport function shouldBootstrapRouteAfterAPIStateChange(next, prev) {\n    return apiCanServeRoutes(next)\n        && (prev.connection !== 'ready' || prev.auth === 'reauth_required');\n}\n\n/* Describe the minimum badge work needed to reach one desired presentation target. */\nexport function disconnectBadgeReconciliation(previous, next) {\n    const target = {\n        visible: next?.visible === true,\n        labelText: typeof next?.labelText === 'string' ? next.labelText : '',\n    };\n    const labelChanged = previous?.labelText !== target.labelText;\n    const visibilityChanged = previous?.visible !== target.visible;\n    return {\n        target,\n        labelChanged,\n        visibilityChanged,\n        changed: labelChanged || visibilityChanged,\n    };\n}\n\n/* Suppress only unresolved/down startup state; established worker and document health remain authoritative. */\nexport function noComputeBadgeShouldBeVisible({\n    startupGraceActive,\n    workerConnected,\n    activePuffbookComputeAvailable,\n}) {\n    if (startupGraceActive === true && workerConnected !== true) {\n        return false;\n    }\n    return workerConnected !== true || activePuffbookComputeAvailable === false;\n}\n\n/* Delay unhealthy presentation, but hide immediately when compute recovers. */\nexport function createNoComputeBadgeVisibility(setVisible) {\n    let visible = false;\n    let showTimeout = null;\n    return (requestedVisible) => {\n        if (requestedVisible !== true) {\n            if (showTimeout !== null) {\n                clearTimeout(showTimeout);\n                showTimeout = null;\n            }\n            visible = false;\n            setVisible(false);\n            return;\n        }\n        if (visible || showTimeout !== null) {\n            return;\n        }\n        showTimeout = setTimeout(() => {\n            showTimeout = null;\n            visible = true;\n            setVisible(true);\n        }, 2_000);\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const PORTAL_INPUT_RECORDING_FORMAT = 'evil-portal-input-v1';\nexport const PORTAL_INPUT_RECORDING_WINDOW_MS = 30_000;\nconst DEFAULT_MAX_EVENTS = 100_000;\nconst DEFAULT_MAX_BYTES = 16 * 1024 * 1024;\nconst DEFAULT_MOUSE_MOVE_INTERVAL_MS = 100;\n\nfunction finiteOrNull(value) {\n    return Number.isFinite(value) ? value : null;\n}\n\nfunction bool(value) {\n    return value === true;\n}\n\nfunction keyIdentity(event) {\n    if (typeof event?.code === 'string' && event.code !== '') {\n        return `code:${event.code}`;\n    }\n    return typeof event?.key === 'string' ? `key:${event.key}` : null;\n}\n\nfunction canvasCoordinates(event, canvas) {\n    if (!canvas || typeof canvas.getBoundingClientRect !== 'function') {\n        return {\n            client_x: finiteOrNull(event?.clientX),\n            client_y: finiteOrNull(event?.clientY),\n            canvas_x: null,\n            canvas_y: null,\n            canvas_rect: null,\n        };\n    }\n    const rect = canvas.getBoundingClientRect();\n    const clientX = finiteOrNull(event?.clientX);\n    const clientY = finiteOrNull(event?.clientY);\n    const width = finiteOrNull(rect?.width);\n    const height = finiteOrNull(rect?.height);\n    return {\n        client_x: clientX,\n        client_y: clientY,\n        canvas_x: clientX !== null && width !== null && width > 0\n            ? (clientX - rect.left) / width\n            : null,\n        canvas_y: clientY !== null && height !== null && height > 0\n            ? (clientY - rect.top) / height\n            : null,\n        canvas_rect: [\n            finiteOrNull(rect?.left),\n            finiteOrNull(rect?.top),\n            width,\n            height,\n        ],\n    };\n}\n\n/* Convert a live browser event immediately; never retain Event or DataTransfer objects. */\nexport function snapshotMouseEvent(event, canvas) {\n    return {\n        ...canvasCoordinates(event, canvas),\n        button: Number.isInteger(event?.button) ? event.button : null,\n        buttons: Number.isInteger(event?.buttons) ? event.buttons : null,\n        detail: Number.isInteger(event?.detail) ? event.detail : null,\n        movement_x: finiteOrNull(event?.movementX),\n        movement_y: finiteOrNull(event?.movementY),\n        ctrl: bool(event?.ctrlKey),\n        shift: bool(event?.shiftKey),\n        alt: bool(event?.altKey),\n        meta: bool(event?.metaKey),\n        pointer_type: typeof event?.pointerType === 'string' ? event.pointerType : null,\n        pointer_id: Number.isInteger(event?.pointerId) ? event.pointerId : null,\n        pointer_locked: typeof document !== 'undefined'\n            && (document.pointerLockElement === canvas || document.mozPointerLockElement === canvas),\n        event_timestamp_ms: finiteOrNull(event?.timeStamp),\n    };\n}\n\nexport function snapshotWheelEvent(event, canvas) {\n    return {\n        ...snapshotMouseEvent(event, canvas),\n        delta_x: finiteOrNull(event?.deltaX),\n        delta_y: finiteOrNull(event?.deltaY),\n        delta_z: finiteOrNull(event?.deltaZ),\n        delta_mode: Number.isInteger(event?.deltaMode) ? event.deltaMode : null,\n    };\n}\n\nexport function snapshotKeyEvent(event) {\n    return {\n        key: typeof event?.key === 'string' ? event.key : null,\n        code: typeof event?.code === 'string' ? event.code : null,\n        location: Number.isInteger(event?.location) ? event.location : null,\n        repeat: bool(event?.repeat),\n        composing: bool(event?.isComposing),\n        ctrl: bool(event?.ctrlKey),\n        shift: bool(event?.shiftKey),\n        alt: bool(event?.altKey),\n        meta: bool(event?.metaKey),\n        event_timestamp_ms: finiteOrNull(event?.timeStamp),\n    };\n}\n\nexport function snapshotBeforeInputEvent(event) {\n    let transferText = null;\n    const transfer = event?.dataTransfer ?? event?.clipboardData ?? null;\n    if (transfer && typeof transfer.getData === 'function') {\n        transferText = transfer.getData('text') || '';\n    } else if (typeof transfer === 'string') {\n        transferText = transfer;\n    }\n    return {\n        input_type: typeof event?.inputType === 'string' ? event.inputType : null,\n        data: typeof event?.data === 'string' ? event.data : null,\n        transfer_text: transferText,\n        composing: bool(event?.isComposing),\n        event_timestamp_ms: finiteOrNull(event?.timeStamp),\n    };\n}\n\nexport function snapshotCompositionEvent(event) {\n    return {\n        data: typeof event?.data === 'string' ? event.data : null,\n        event_timestamp_ms: finiteOrNull(event?.timeStamp),\n    };\n}\n\nexport class PortalInputRecorder {\n    #durationMs;\n    #maxEvents;\n    #maxBytes;\n    #now;\n    #entries = [];\n    #start = 0;\n    #bytes = 0;\n    #nextSeq = 1;\n    #capacityTruncatedAtMs = null;\n    #acceptedKeys = new Set();\n    #acceptedMouseButtons = new Set();\n    #mouseMoveIntervalMs;\n    #lastMouseMoveAtMs = -Infinity;\n    #pendingMouseMove = null;\n\n    constructor({\n        durationMs = PORTAL_INPUT_RECORDING_WINDOW_MS,\n        maxEvents = DEFAULT_MAX_EVENTS,\n        maxBytes = DEFAULT_MAX_BYTES,\n        mouseMoveIntervalMs = DEFAULT_MOUSE_MOVE_INTERVAL_MS,\n        now = () => performance.now(),\n    } = {}) {\n        if (!Number.isFinite(durationMs) || durationMs <= 0) {\n            throw new Error('PortalInputRecorder: durationMs must be positive.');\n        }\n        this.#durationMs = durationMs;\n        this.#maxEvents = maxEvents;\n        this.#maxBytes = maxBytes;\n        this.#mouseMoveIntervalMs = mouseMoveIntervalMs;\n        this.#now = now;\n    }\n\n    nextSequence() {\n        this.flushMouseMove();\n        return this.#nextSeq;\n    }\n\n    record(kind, payload = {}, { role = 'stimulus', atMs = this.#now() } = {}) {\n        if (typeof kind !== 'string' || kind === '') {\n            throw new Error('PortalInputRecorder.record(): kind must be non-empty.');\n        }\n        if (!Number.isFinite(atMs)) {\n            throw new Error('PortalInputRecorder.record(): atMs must be finite.');\n        }\n        const entry = {\n            seq: this.#nextSeq++,\n            at_ms: atMs,\n            kind,\n            role,\n            ...payload,\n        };\n        // Four bytes per UTF-16 code unit is a conservative UTF-8 upper bound.\n        const bytes = JSON.stringify(entry).length * 4;\n        this.#entries.push({ entry, bytes });\n        this.#bytes += bytes;\n        this.#prune(atMs);\n        return entry.seq;\n    }\n\n    /* Complete a browser event after Portal's next-frame WebGL pick resolves.\n       Sequence identity and timing remain immutable. */\n    annotate(seq, patch) {\n        if (!Number.isInteger(seq) || seq <= 0 || !patch || typeof patch !== 'object' || Array.isArray(patch)) {\n            return false;\n        }\n        for (let index = this.#entries.length - 1; index >= this.#start; index--) {\n            const item = this.#entries[index];\n            if (item.entry.seq !== seq) continue;\n            const { seq: _seq, at_ms: _atMs, kind: _kind, role: _role, ...safePatch } = patch;\n            this.#bytes -= item.bytes;\n            item.entry = { ...item.entry, ...safePatch };\n            item.bytes = JSON.stringify(item.entry).length * 4;\n            this.#bytes += item.bytes;\n            this.#prune(this.#now());\n            return true;\n        }\n        return false;\n    }\n\n    discard(seq) {\n        if (!Number.isInteger(seq) || seq <= 0) return false;\n        for (let index = this.#entries.length - 1; index >= this.#start; index--) {\n            const item = this.#entries[index];\n            if (item.entry.seq !== seq) continue;\n            this.#bytes -= item.bytes;\n            this.#entries.splice(index, 1);\n            return true;\n        }\n        return false;\n    }\n\n    noteKeyDown(event) {\n        this.flushMouseMove();\n        const identity = keyIdentity(event);\n        if (identity !== null) {\n            this.#acceptedKeys.add(identity);\n        }\n        return this.record('key_down', snapshotKeyEvent(event));\n    }\n\n    noteMouseDown(event, canvas) {\n        this.flushMouseMove();\n        const button = Number.isInteger(event?.button) ? event.button : null;\n        if (button !== null) {\n            this.#acceptedMouseButtons.add(button);\n        }\n        return this.record('mouse_down', snapshotMouseEvent(event, canvas));\n    }\n\n    noteMouseUp(event, canvas, { returnSequence = false } = {}) {\n        this.flushMouseMove();\n        const button = Number.isInteger(event?.button) ? event.button : null;\n        if (button === null || !this.#acceptedMouseButtons.has(button)) {\n            return false;\n        }\n        this.#acceptedMouseButtons.delete(button);\n        const seq = this.record('mouse_up', snapshotMouseEvent(event, canvas));\n        return returnSequence ? seq : true;\n    }\n\n    noteKeyUp(event) {\n        this.flushMouseMove();\n        const identity = keyIdentity(event);\n        if (identity === null || !this.#acceptedKeys.has(identity)) {\n            return false;\n        }\n        this.#acceptedKeys.delete(identity);\n        this.record('key_up', snapshotKeyEvent(event));\n        return true;\n    }\n\n    noteInputReset(kind, payload = {}) {\n        this.flushMouseMove();\n        this.#acceptedKeys.clear();\n        this.#acceptedMouseButtons.clear();\n        return this.record(kind, payload, { role: 'boundary' });\n    }\n\n    noteMouseMove(event, canvas, atMs = this.#now()) {\n        this.#pendingMouseMove = {\n            atMs,\n            payload: snapshotMouseEvent(event, canvas),\n        };\n        if (atMs - this.#lastMouseMoveAtMs >= this.#mouseMoveIntervalMs) {\n            this.flushMouseMove();\n        }\n    }\n\n    flushMouseMove() {\n        if (this.#pendingMouseMove === null) {\n            return false;\n        }\n        const pending = this.#pendingMouseMove;\n        this.#pendingMouseMove = null;\n        this.#lastMouseMoveAtMs = pending.atMs;\n        this.record('mouse_move', pending.payload, { atMs: pending.atMs });\n        return true;\n    }\n\n    snapshot(metadata = {}, atMs = this.#now(), { origin = 'first', originAtMs = null } = {}) {\n        this.flushMouseMove();\n        this.#prune(atMs);\n        const live = this.#entries.slice(this.#start).map(({ entry }) => entry);\n        const firstAt = Number.isFinite(originAtMs)\n            ? originAtMs\n            : (origin === 'window' ? atMs - this.#durationMs : (live[0]?.at_ms ?? atMs));\n        return {\n            format: PORTAL_INPUT_RECORDING_FORMAT,\n            recording_window_ms: this.#durationMs,\n            saved_at_ms: atMs,\n            truncated: this.#capacityTruncatedAtMs !== null\n                && this.#capacityTruncatedAtMs >= atMs - this.#durationMs,\n            metadata,\n            events: live.map(({ at_ms: eventAt, ...entry }) => ({\n                ...entry,\n                t_ms: eventAt - firstAt,\n            })),\n        };\n    }\n\n    #dropOldest() {\n        const item = this.#entries[this.#start++];\n        this.#bytes -= item.bytes;\n    }\n\n    #prune(nowMs) {\n        const cutoff = nowMs - this.#durationMs;\n        while (this.#start < this.#entries.length && this.#entries[this.#start].entry.at_ms < cutoff) {\n            this.#dropOldest();\n        }\n        while ((this.#entries.length - this.#start) > this.#maxEvents || this.#bytes > this.#maxBytes) {\n            this.#capacityTruncatedAtMs = nowMs;\n            this.#dropOldest();\n        }\n        if (this.#start > 4096 && this.#start * 2 > this.#entries.length) {\n            this.#entries = this.#entries.slice(this.#start);\n            this.#start = 0;\n        }\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nexport const PORTAL_RECORDING_FORMAT = 'evil-portal-recording-v1';\nexport const PORTAL_RECORDING_SESSION_FORMAT = 'evil-portal-recording-session-v2';\nexport const PORTAL_RECORDING_MAX_DURATION_MS = 90_000;\nexport const PORTAL_RECORDING_CHUNK_INTERVAL_MS = 5_000;\nconst DEFAULT_MAX_CONSOLE_ENTRIES = 30_000;\nconst DEFAULT_MAX_CONSOLE_BYTES = 16 * 1024 * 1024;\nconst CONSOLE_METHODS = ['debug', 'log', 'info', 'warn', 'error'];\nconst SENSITIVE_KEY = /(?:authorization|cookie|password|secret|session|token)/i;\nconst MAX_LAKE_CONFLICT_ATTEMPTS = 5;\nconst RECORDING_RECOVERY_DB = 'evil-portal-recording-recovery-v1';\nconst RECORDING_RECOVERY_STORE = 'pending-recordings';\n\nfunction encodedBytes(value) {\n    return JSON.stringify(value).length * 4;\n}\n\nfunction redactString(value) {\n    return value\n        .replace(/([?&](?:code|token|state|session|secret)=)[^&#\\s]*/gi, '$1[redacted]')\n        .replace(/\\b(Bearer)\\s+[A-Za-z0-9._~+\\/-]+=*/gi, '$1 [redacted]');\n}\n\nexport function safeConsoleValue(value, { depth = 0, seen = new WeakSet() } = {}) {\n    if (value === null || value === undefined || typeof value === 'boolean' || typeof value === 'number') {\n        return value ?? null;\n    }\n    if (typeof value === 'string') {\n        const limited = value.length > 8_192 ? `${value.slice(0, 8_192)}\u2026[truncated]` : value;\n        return redactString(limited);\n    }\n    if (typeof value === 'bigint') return `${value}n`;\n    if (typeof value === 'symbol') return String(value);\n    if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`;\n    if (value instanceof Error) {\n        return {\n            name: value.name,\n            message: redactString(value.message),\n            stack: typeof value.stack === 'string' ? redactString(value.stack).slice(0, 16_384) : null,\n        };\n    }\n    if (depth >= 4) return '[Max depth]';\n    if (typeof value !== 'object') return String(value);\n    if (seen.has(value)) return '[Circular]';\n    seen.add(value);\n    if (ArrayBuffer.isView(value)) {\n        return `[${value.constructor.name} length=${value.length ?? value.byteLength}]`;\n    }\n    if (value instanceof ArrayBuffer) return `[ArrayBuffer byteLength=${value.byteLength}]`;\n    if (Array.isArray(value)) {\n        return value.slice(0, 100).map((item) => safeConsoleValue(item, { depth: depth + 1, seen }));\n    }\n    const out = {};\n    for (const key of Object.keys(value).slice(0, 100)) {\n        if (SENSITIVE_KEY.test(key)) {\n            out[key] = '[redacted]';\n            continue;\n        }\n        try {\n            out[key] = safeConsoleValue(value[key], { depth: depth + 1, seen });\n        } catch (error) {\n            out[key] = `[Unserialisable: ${error instanceof Error ? error.message : String(error)}]`;\n        }\n    }\n    return out;\n}\n\nexport class PortalConsoleRecorder {\n    #maxEntries;\n    #maxBytes;\n    #now;\n    #entries = [];\n    #bytes = 0;\n    #nextSeq = 1;\n    #truncated = false;\n    #active = false;\n    #startedAtMs = 0;\n    #uninstall = null;\n\n    constructor({\n        maxEntries = DEFAULT_MAX_CONSOLE_ENTRIES,\n        maxBytes = DEFAULT_MAX_CONSOLE_BYTES,\n        now = () => performance.now(),\n    } = {}) {\n        this.#maxEntries = maxEntries;\n        this.#maxBytes = maxBytes;\n        this.#now = now;\n    }\n\n    start(atMs = this.#now()) {\n        this.#entries = [];\n        this.#bytes = 0;\n        this.#nextSeq = 1;\n        this.#truncated = false;\n        this.#startedAtMs = atMs;\n        this.#active = true;\n    }\n\n    record(level, args, { atMs = this.#now(), source = 'console' } = {}) {\n        if (!this.#active) return false;\n        const entry = {\n            seq: this.#nextSeq++,\n            at_ms: atMs,\n            level,\n            source,\n            arguments: Array.from(args ?? []).map((item) => safeConsoleValue(item)),\n        };\n        const bytes = encodedBytes(entry);\n        this.#entries.push({ entry, bytes });\n        this.#bytes += bytes;\n        while (this.#entries.length > this.#maxEntries || this.#bytes > this.#maxBytes) {\n            this.#bytes -= this.#entries.shift().bytes;\n            this.#truncated = true;\n        }\n        return true;\n    }\n\n    stop(atMs = this.#now()) {\n        this.#active = false;\n        const result = this.snapshot(atMs);\n        this.#entries = [];\n        this.#bytes = 0;\n        this.#truncated = false;\n        return result;\n    }\n\n    snapshot(atMs = this.#now()) {\n        return {\n            truncated: this.#truncated,\n            entries: this.#entries\n                .filter(({ entry }) => entry.at_ms <= atMs)\n                .map(({ entry: { at_ms: eventAt, ...entry } }) => ({\n                    ...entry,\n                    t_ms: Math.max(0, eventAt - this.#startedAtMs),\n                })),\n        };\n    }\n\n    cancel() {\n        this.#active = false;\n        this.#entries = [];\n        this.#bytes = 0;\n        this.#truncated = false;\n    }\n\n    install(target = globalThis) {\n        if (this.#uninstall !== null) return this.#uninstall;\n        const originals = new Map();\n        for (const method of CONSOLE_METHODS) {\n            const original = target.console?.[method];\n            if (typeof original !== 'function') continue;\n            originals.set(method, original);\n            target.console[method] = (...args) => {\n                this.record(method, args);\n                return original.apply(target.console, args);\n            };\n        }\n        const onError = (event) => this.record('error', [event.error ?? event.message], { source: 'window.error' });\n        const onRejection = (event) => this.record('error', [event.reason], { source: 'unhandledrejection' });\n        target.addEventListener?.('error', onError);\n        target.addEventListener?.('unhandledrejection', onRejection);\n        this.#uninstall = () => {\n            for (const [method, original] of originals) target.console[method] = original;\n            target.removeEventListener?.('error', onError);\n            target.removeEventListener?.('unhandledrejection', onRejection);\n            this.#uninstall = null;\n        };\n        return this.#uninstall;\n    }\n}\n\nfunction canvasToBlob(canvas, type, quality) {\n    return new Promise((resolve, reject) => {\n        canvas.toBlob((blob) => {\n            if (blob) resolve(blob);\n            else reject(new Error(`Portal recording frame encoding returned an empty ${type} blob.`));\n        }, type, quality);\n    });\n}\n\n/* Call immediately after WebGL presentation so preserveDrawingBuffer is not required. */\nexport async function captureRecordingCanvas(sourceCanvas, {\n    capturedAtMs = performance.now(),\n    capturedAtUtc = new Date().toISOString(),\n    createCanvas = () => document.createElement('canvas'),\n} = {}) {\n    if (!sourceCanvas?.width || !sourceCanvas?.height) {\n        throw new Error('Portal recording cannot capture an empty WebGL canvas.');\n    }\n    const destination = createCanvas();\n    destination.width = sourceCanvas.width;\n    destination.height = sourceCanvas.height;\n    const context = destination.getContext('2d');\n    if (!context) throw new Error('Portal recording could not acquire a 2D capture context.');\n    context.drawImage(sourceCanvas, 0, 0, destination.width, destination.height);\n    const blob = await canvasToBlob(destination, 'image/webp', 0.86);\n    return {\n        blob,\n        captured_at_ms: capturedAtMs,\n        captured_at_utc: capturedAtUtc,\n        width: destination.width,\n        height: destination.height,\n    };\n}\n\nexport function recordingDate(date = new Date()) {\n    return date.toISOString().slice(0, 10);\n}\n\nexport function recordingUsernameComponent(username) {\n    const component = String(username ?? '').trim().replace(/[^A-Za-z0-9._@+-]/g, '_');\n    if (!component || component === '.' || component === '..') {\n        throw new Error(`Recording username cannot form a Lake path component (was ${JSON.stringify(username)}).`);\n    }\n    return component;\n}\n\nexport function highestRecordingSession(listing) {\n    let highest = 0;\n    for (const item of listing?.data ?? []) {\n        if (item?.type && item.type !== 'directory') continue;\n        const match = /^rec-(\\d{4,})$/.exec(item?.name ?? '');\n        if (match) highest = Math.max(highest, Number(match[1]));\n    }\n    return highest;\n}\n\nfunction shellSingleQuote(value) {\n    return `'${String(value).replaceAll(\"'\", `'\"'\"'`)}'`;\n}\n\n/* A Lake file is not expected to retain an executable bit, so the handoff\n   deliberately documents `bash run-replay.sh` rather than direct execution. */\nexport function recordingReplayScript(recordingPath) {\n    return `#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\nREPLAY_RUN_ID=\"$(date -u +'%Y-%m-%dT%H-%M-%SZ')-$$\"\n\ncd /home/jovyan/work/portal/www\n\nPORTAL_E2E_LOCAL_STACK=1 npm run debug:recording -- \\\\\n  ${shellSingleQuote(recordingPath)} \\\\\n  --base-url http://localhost:8000 \\\\\n  --chrome-bin /usr/bin/google-chrome \\\\\n  --headless \\\\\n  --allow-current-state \\\\\n  --output \"$SCRIPT_DIR/playwright-replay/$REPLAY_RUN_ID\" \\\\\n  \"$@\"\n`;\n}\n\nfunction recordingName(number) {\n    return `rec-${String(number).padStart(4, '0')}`;\n}\n\nfunction wait(ms) {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function retryLakeConflict(operation) {\n    for (let attempt = 0; attempt < MAX_LAKE_CONFLICT_ATTEMPTS; attempt++) {\n        try {\n            return await operation();\n        } catch (error) {\n            if (error?.status !== 409 || attempt === MAX_LAKE_CONFLICT_ATTEMPTS - 1) throw error;\n            await wait(25 * (2 ** attempt));\n        }\n    }\n    throw new Error('unreachable Lake conflict retry state');\n}\n\nexport class PortalRecordingLakeStore {\n    constructor(api, { lake = 'primary', branch = 'main' } = {}) {\n        this.api = api;\n        this.lake = lake;\n        this.branch = branch;\n    }\n\n    async openRecording(username, date = recordingDate()) {\n        const user = recordingUsernameComponent(username);\n        const datePath = `/bug-reports/recordings/${user}/${date}`;\n        await this.#ensurePath(datePath);\n        const listing = await this.api.listPath(this.#ref(datePath));\n        return await this.#createRecording(datePath, highestRecordingSession(listing) + 1, user, date);\n    }\n\n    async finalise(recording, report) {\n        const baseManifest = { ...report.manifest, recording: recording.path, status: 'finalizing' };\n        const completionStatus = report.manifest?.completion_status === 'interrupted'\n            ? 'interrupted'\n            : 'complete';\n        await this.#writeJSON(`${recording.path}/manifest.json`, baseManifest);\n        /* Lake file writes advance one branch head; keep this sequence strictly serial. */\n        await this.#writeJSON(`${recording.path}/actions.json`, report.actions);\n        await this.#writeJSON(`${recording.path}/console.json`, report.console);\n        if (report.puffbookState) {\n            await this.#ensurePath(`${recording.path}/state`);\n            await this.#writeJSON(`${recording.path}/state/puffbook.json`, report.puffbookState);\n        }\n        if (report.viewState) {\n            await this.#ensurePath(`${recording.path}/state`);\n            await this.#writeJSON(`${recording.path}/state/view.json`, report.viewState);\n        }\n        if (report.session) {\n            await this.#ensurePath(`${recording.path}/state`);\n            await this.#writeJSON(`${recording.path}/state/session.json`, report.session);\n        }\n        if (report.startScreenshot?.blob) {\n            await this.#uploadFile(\n                this.#ref(`${recording.path}/start.webp`),\n                report.startScreenshot.blob,\n                { contentType: 'image/webp' },\n            );\n        }\n        if (report.endScreenshot?.blob) {\n            await this.#uploadFile(\n                this.#ref(`${recording.path}/end.webp`),\n                report.endScreenshot.blob,\n                { contentType: 'image/webp' },\n            );\n        }\n        await this.#writeJSON(`${recording.path}/manifest.json`, { ...baseManifest, status: completionStatus });\n    }\n\n    async initialiseReplayState(recording, { puffbookState, viewState, session, startScreenshot, startedAtUtc, metadata }) {\n        if (puffbookState || viewState || session) {\n            await this.#ensurePath(`${recording.path}/state`);\n        }\n        if (puffbookState) {\n            await this.#writeJSON(`${recording.path}/state/puffbook.json`, puffbookState);\n        }\n        if (viewState) {\n            await this.#writeJSON(`${recording.path}/state/view.json`, viewState);\n        }\n        if (session) {\n            await this.#writeJSON(`${recording.path}/state/session.json`, session);\n        }\n        if (startScreenshot?.blob) {\n            await this.#uploadFile(\n                this.#ref(`${recording.path}/start.webp`),\n                startScreenshot.blob,\n                { contentType: 'image/webp' },\n            );\n        }\n        await this.#writeJSON(`${recording.path}/manifest.json`, {\n            format: PORTAL_RECORDING_FORMAT,\n            status: 'recording',\n            username: recording.username,\n            recording: recording.path,\n            started_at_utc: startedAtUtc,\n            starting_url: metadata.url,\n            starting_route: metadata.route,\n            viewport: metadata.viewport,\n            canvas: metadata.canvas,\n            puffbook_state: puffbookState ? {\n                present: true,\n                full_body: puffbookState.body_window?.full === true,\n                pending_edit_count: puffbookState.pending_ops?.length ?? 0,\n                file_ref: puffbookState.file_ref,\n            } : { present: false },\n            features: {\n                view_state: viewState ? 1 : 0,\n                pointer_target_verification: viewState ? 1 : 0,\n                document_epochs: session ? 2 : 0,\n            },\n        });\n        await this.#writeJSON(`${recording.path}/heartbeat.json`, {\n            format: PORTAL_RECORDING_FORMAT,\n            status: 'recording',\n            started_at_utc: startedAtUtc,\n            heartbeat_at_utc: new Date().toISOString(),\n            chunk_count: 0,\n        });\n    }\n\n    async writeRecordingSession(recording, session) {\n        await this.#ensurePath(`${recording.path}/state`);\n        await this.#writeJSON(`${recording.path}/state/session.json`, session);\n    }\n\n    async writeChunk(recording, chunkNumber, chunk) {\n        await this.#ensurePath(`${recording.path}/chunks`);\n        const filename = `chunk-${String(chunkNumber).padStart(4, '0')}.json`;\n        await this.#writeJSON(`${recording.path}/chunks/${filename}`, chunk);\n        await this.#writeJSON(`${recording.path}/heartbeat.json`, {\n            format: PORTAL_RECORDING_FORMAT,\n            status: 'recording',\n            started_at_utc: chunk.started_at_utc,\n            heartbeat_at_utc: new Date().toISOString(),\n            chunk_count: chunkNumber,\n            last_action_seq: chunk.last_action_seq,\n            last_console_seq: chunk.last_console_seq,\n        });\n    }\n\n    #ref(path) {\n        return { lake: this.lake, branch: this.branch, path };\n    }\n\n    async #ensurePath(path) {\n        const components = path.split('/').filter(Boolean);\n        let current = '';\n        for (const component of components) {\n            current += `/${component}`;\n            if (await this.api.pathExists(this.#ref(current))) continue;\n            try {\n                await retryLakeConflict(() => this.api.makeDirectory(this.#ref(current)));\n            } catch (error) {\n                if (!(await this.api.pathExists(this.#ref(current)))) throw error;\n            }\n        }\n    }\n\n    async #createRecording(datePath, number, username, date) {\n        let candidate = number;\n        let path;\n        while (true) {\n            path = `${datePath}/${recordingName(candidate)}`;\n            if (await this.api.pathExists(this.#ref(path))) {\n                candidate += 1;\n                continue;\n            }\n            try {\n                await retryLakeConflict(() => this.api.makeDirectory(this.#ref(path)));\n                break;\n            } catch (error) {\n                if (!(await this.api.pathExists(this.#ref(path)))) throw error;\n                candidate += 1;\n            }\n        }\n        await this.#writeJSON(`${path}/manifest.json`, {\n            format: PORTAL_RECORDING_FORMAT,\n            status: 'recording',\n            username,\n            recording: path,\n            opened_at_utc: new Date().toISOString(),\n        });\n        await this.#uploadFile(\n            this.#ref(`${path}/run-replay.sh`),\n            new Blob([recordingReplayScript(path)], { type: 'text/x-shellscript' }),\n            { contentType: 'text/x-shellscript' },\n        );\n        return { path, number: candidate, date, username };\n    }\n\n    async #writeJSON(path, value) {\n        const body = new Blob([`${JSON.stringify(value, null, 2)}\\n`], { type: 'application/json' });\n        await this.#uploadFile(this.#ref(path), body, { contentType: 'application/json' });\n    }\n\n    async #uploadFile(ref, body, options) {\n        await retryLakeConflict(() => this.api.uploadFile(ref, body, options));\n    }\n}\n\nfunction requestResult(request) {\n    return new Promise((resolve, reject) => {\n        request.onsuccess = () => resolve(request.result);\n        request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n    });\n}\n\nfunction transactionDone(transaction) {\n    return new Promise((resolve, reject) => {\n        transaction.oncomplete = () => resolve();\n        transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted.'));\n        transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed.'));\n    });\n}\n\n/* Keep the exact finalisation payload outside page memory so refresh can resume\n   a save without depending on unreliable unload-time network requests. */\nexport class PortalRecordingRecoveryStore {\n    #indexedDB;\n    #openPromise = null;\n\n    constructor({ indexedDB = globalThis.indexedDB } = {}) {\n        this.#indexedDB = indexedDB ?? null;\n    }\n\n    async put(record) {\n        if (!record?.id) throw new Error('Recording recovery record requires an id.');\n        const db = await this.#open();\n        if (!db) return false;\n        const transaction = db.transaction(RECORDING_RECOVERY_STORE, 'readwrite');\n        transaction.objectStore(RECORDING_RECOVERY_STORE).put(record);\n        await transactionDone(transaction);\n        return true;\n    }\n\n    async owned(ownerToken, username) {\n        const db = await this.#open();\n        if (!db) return [];\n        const transaction = db.transaction(RECORDING_RECOVERY_STORE, 'readonly');\n        const done = transactionDone(transaction);\n        const records = await requestResult(transaction.objectStore(RECORDING_RECOVERY_STORE).getAll());\n        await done;\n        return records.filter((record) => (\n            record?.owner_token === ownerToken && record?.username === username\n        ));\n    }\n\n    async delete(id) {\n        const db = await this.#open();\n        if (!db) return false;\n        const transaction = db.transaction(RECORDING_RECOVERY_STORE, 'readwrite');\n        transaction.objectStore(RECORDING_RECOVERY_STORE).delete(id);\n        await transactionDone(transaction);\n        return true;\n    }\n\n    #open() {\n        if (!this.#indexedDB) return Promise.resolve(null);\n        if (this.#openPromise) return this.#openPromise;\n        this.#openPromise = new Promise((resolve, reject) => {\n            const request = this.#indexedDB.open(RECORDING_RECOVERY_DB, 1);\n            request.onupgradeneeded = () => {\n                const db = request.result;\n                if (!db.objectStoreNames.contains(RECORDING_RECOVERY_STORE)) {\n                    db.createObjectStore(RECORDING_RECOVERY_STORE, { keyPath: 'id' });\n                }\n            };\n            request.onsuccess = () => resolve(request.result);\n            request.onerror = () => reject(request.error ?? new Error('Could not open recording recovery storage.'));\n        });\n        return this.#openPromise;\n    }\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport { expandHomeRoutePath } from './portal-policy.mjs';\nimport { classifyPortalLakePath } from './portal-routes.mjs';\n\n/* Resolve one browser lake route into its authoritative bootstrap target and strategy. */\nexport function resolvePortalRouteTarget(lakePath, username) {\n    const route = classifyPortalLakePath(lakePath ?? '');\n    const cleanPath = expandHomeRoutePath(route.routePath, username || '');\n    const normalizedTarget = cleanPath ? `/${cleanPath}` : '';\n    const parentPath = normalizedTarget ? (normalizedTarget.substring(0, normalizedTarget.lastIndexOf('/')) || '') : '';\n    const artifactKind = cleanPath.endsWith('.puffbook')\n        ? 'puffbook'\n        : (cleanPath.endsWith('.convo') ? 'convo' : null);\n    return {\n        routeKind: route.kind,\n        cleanPath,\n        normalizedTarget,\n        parentPath,\n        artifactKind,\n        requiresStat: route.kind !== 'directory',\n        isDirectory: route.kind === 'directory',\n        isArtifact: route.kind === 'artifact',\n    };\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\nimport { resolveConfiguredAPIBaseUrl } from './api-config.mjs';\nconst CLIENT_IP_HINT_TIMEOUT_MS = 2000;\nconst ENROLLMENT_FLOW_PATH = '/if/flow/user-enrollment/';\nconst AUTH_REDIRECT_BACKOFF_KEY = 'portal.auth_redirect_backoff.v1';\nconst AUTH_CALLBACK_MISSING_STATE_RETRY_KEY = 'portal.auth_callback_missing_state_retry.v1';\nconst INVITE_PENDING_TOKEN_KEY = 'portal.invite_pending_token.v1';\nconst INVITE_PENDING_TOKEN_MAX_AGE_MS = 30 * 60 * 1000;\nexport const INVITE_FORCE_REAUTH_BROADCAST_KEY = 'portal.auth_force_reauth.v1';\nlet clientIPHintPromise = null;\n\nclass InviteAPIError extends Error {\n    /* Preserve backend invite error codes so routing can distinguish wrong-user sessions. */\n    constructor(prefix, res, code, detail) {\n        super(`${prefix}: ${detail}`);\n        this.name = 'InviteAPIError';\n        this.status = res.status;\n        this.code = code;\n    }\n}\n\n/* Extract one invite-token from /join/<token>. */\nfunction inviteRouteFromPath(pathname) {\n    const match = String(pathname || '').match(/^(.*)\\/join\\/([^/]+)\\/?$/);\n    if (!match) {\n        return null;\n    }\n    let token = match[2];\n    try {\n        token = decodeURIComponent(token);\n    } catch (_err) {\n        return null;\n    }\n    if (!/^[A-Za-z0-9_-]{16,128}$/.test(token)) {\n        return null;\n    }\n    const prefix = match[1].replace(/\\/+$/, '');\n    return {\n        token,\n        portalPath: prefix === '' ? '/' : `${prefix}/`,\n    };\n}\n\n/* Remove one narrow set of local auth keys without clearing unrelated portal state. */\nfunction clearInviteAuthLocalState(storage) {\n    if (!storage) {\n        return;\n    }\n    const keys = [];\n    for (let i = 0; i < storage.length; i += 1) {\n        const key = storage.key(i);\n        if (typeof key !== 'string' || key.trim() === '') {\n            continue;\n        }\n        const lowered = key.toLowerCase();\n        if (lowered.startsWith('oidc.') || key === INVITE_FORCE_REAUTH_BROADCAST_KEY) {\n            keys.push(key);\n        }\n    }\n    for (const key of keys) {\n        storage.removeItem(key);\n    }\n}\n\n/* Persist one invite token across enrolment hops where OIDC callback state may lose custom fields. */\nfunction setPendingInviteToken(token, storage = globalThis.window?.sessionStorage) {\n    if (!storage) {\n        return;\n    }\n    const clean = String(token || '').trim();\n    if (!/^[A-Za-z0-9_-]{16,128}$/.test(clean)) {\n        return;\n    }\n    try {\n        storage.setItem(INVITE_PENDING_TOKEN_KEY, JSON.stringify({\n            token: clean,\n            at_ms: Date.now(),\n        }));\n    } catch (_err) {\n        // Best-effort cache only.\n    }\n}\n\n/* Read one pending invite token when callback state is missing invite_token after signup. */\nfunction getPendingInviteToken(storage = globalThis.window?.sessionStorage) {\n    if (!storage) {\n        return '';\n    }\n    try {\n        const raw = storage.getItem(INVITE_PENDING_TOKEN_KEY);\n        if (typeof raw !== 'string' || raw.trim() === '') {\n            return '';\n        }\n        const parsed = JSON.parse(raw);\n        const token = String(parsed?.token || '').trim();\n        const atMs = Number(parsed?.at_ms || 0);\n        if (!/^[A-Za-z0-9_-]{16,128}$/.test(token) || !Number.isFinite(atMs) || atMs <= 0) {\n            storage.removeItem(INVITE_PENDING_TOKEN_KEY);\n            return '';\n        }\n        if (Date.now() > atMs + INVITE_PENDING_TOKEN_MAX_AGE_MS) {\n            storage.removeItem(INVITE_PENDING_TOKEN_KEY);\n            return '';\n        }\n        return token;\n    } catch (_err) {\n        return '';\n    }\n}\n\n/* Remove one cached pending invite token after consume succeeds or expires. */\nfunction clearPendingInviteToken(storage = globalThis.window?.sessionStorage) {\n    if (!storage) {\n        return;\n    }\n    try {\n        storage.removeItem(INVITE_PENDING_TOKEN_KEY);\n    } catch (_err) {\n        // Best-effort cache only.\n    }\n}\n\n/* Clear stale portal auth state so the invite flow can start under a different principal. */\nexport function clearInviteSessionAndReload(win = globalThis.window, { reload = true } = {}) {\n    if (!win) {\n        throw new Error('Invite session clearing requires a browser window.');\n    }\n    win.sessionStorage?.removeItem(AUTH_REDIRECT_BACKOFF_KEY);\n    win.sessionStorage?.removeItem(AUTH_CALLBACK_MISSING_STATE_RETRY_KEY);\n    clearInviteAuthLocalState(win.localStorage);\n    win.localStorage?.setItem(INVITE_FORCE_REAUTH_BROADCAST_KEY, String(Date.now()));\n    if (reload) {\n        win.location.reload();\n    }\n}\n\n/* Read one concise API error from a JSON:API error envelope. */\nasync function inviteAPIError(prefix, res) {\n    let code = '';\n    let detail = `HTTP ${res.status}`;\n    try {\n        const payload = await res.json();\n        const first = payload?.errors?.[0];\n        if (typeof first?.code === 'string' && first.code.trim() !== '') {\n            code = first.code.trim();\n        }\n        if (typeof first?.detail === 'string' && first.detail.trim() !== '') {\n            detail = first.detail.trim();\n        } else if (typeof first?.title === 'string' && first.title.trim() !== '') {\n            detail = first.title.trim();\n        }\n    } catch (_err) {\n        // Fall back to generic HTTP detail when the body is not JSON.\n    }\n    return new InviteAPIError(prefix, res, code, detail);\n}\n\n/* Canonicalise one best-effort client IP hint to compact text or empty string. */\nfunction normaliseClientIPHint(raw) {\n    let value = String(raw || '').trim();\n    if (value === '') {\n        return '';\n    }\n    if (value.includes('\\n')) {\n        value = value.split('\\n', 1)[0].trim();\n    }\n    // Keep diagnostics bounded and reject clearly malformed payload text.\n    if (value.length > 128 || /[\\s,]/.test(value)) {\n        return '';\n    }\n    if (/^[0-9.]+$/.test(value) || /^[0-9A-Fa-f:]+$/.test(value)) {\n        return value;\n    }\n    return '';\n}\n\n/* Query one public-IP service with timeout and return one parsed IP hint string. */\nasync function fetchClientIPHintFrom(url, parser) {\n    const ctrl = new AbortController();\n    const timer = window.setTimeout(() => ctrl.abort(), CLIENT_IP_HINT_TIMEOUT_MS);\n    try {\n        const res = await fetch(url, {\n            method: 'GET',\n            cache: 'no-store',\n            signal: ctrl.signal,\n        });\n        if (!res.ok) {\n            return '';\n        }\n        return normaliseClientIPHint(await parser(res));\n    } catch (_err) {\n        return '';\n    } finally {\n        window.clearTimeout(timer);\n    }\n}\n\n/* Resolve one untrusted client IP hint for diagnostics, caching the first successful result. */\nasync function resolveClientIPHint() {\n    if (clientIPHintPromise !== null) {\n        return await clientIPHintPromise;\n    }\n    clientIPHintPromise = (async () => {\n        const ipify = await fetchClientIPHintFrom(\n            'https://api64.ipify.org?format=json',\n            async (res) => (await res.json())?.ip || '',\n        );\n        if (ipify !== '') {\n            return ipify;\n        }\n        return await fetchClientIPHintFrom(\n            'https://api.ipify.org',\n            async (res) => await res.text(),\n        );\n    })();\n    return await clientIPHintPromise;\n}\n\n/* Resolve one invite token and record one click before login handoff. */\nasync function resolveInviteToken(apiBaseUrl, token) {\n    const clientIPHint = await resolveClientIPHint();\n    const res = await fetch(`${apiBaseUrl}/invites/resolve`, {\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ data: { token, client_ip_hint: clientIPHint } }),\n    });\n    if (!res.ok) {\n        throw await inviteAPIError('Invite resolve failed', res);\n    }\n    const payload = await res.json();\n    const emailHint = typeof payload?.data?.email_hint === 'string'\n        ? payload.data.email_hint.trim()\n        : '';\n    const usernameHint = typeof payload?.data?.username_hint === 'string'\n        ? payload.data.username_hint.trim()\n        : '';\n    const firstClick = !!payload?.data?.first_click;\n    return { firstClick, usernameHint, emailHint };\n}\n\n/* Build one enrolment-flow URL that returns through OIDC callback flow afterwards. */\nfunction enrollmentURLFromSigninRedirect(signinHref, emailHint) {\n    const signinURL = new URL(signinHref);\n    const ret = new URL(ENROLLMENT_FLOW_PATH, signinURL.origin);\n    const next = `${signinURL.pathname}${signinURL.search}`;\n    if (next !== '') {\n        ret.searchParams.set('next', next);\n    }\n    const hint = String(emailHint || '').trim();\n    if (hint !== '') {\n        ret.searchParams.set('email', hint);\n        ret.searchParams.set('login_hint', hint);\n    }\n    return ret.href;\n}\n\n/* Consume one invite token for the current authenticated subject. */\nasync function consumeInviteToken(apiBaseUrl, token, accessToken) {\n    if (typeof accessToken !== 'string' || accessToken.trim() === '') {\n        throw new Error('Invite consume failed: missing access token.');\n    }\n    const res = await fetch(`${apiBaseUrl}/invites/consume`, {\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application/json',\n            Authorization: `Bearer ${accessToken}`,\n        },\n        body: JSON.stringify({ data: { token } }),\n    });\n    if (!res.ok) {\n        throw await inviteAPIError('Invite consume failed', res);\n    }\n    await res.json();\n}\n\n/* Decide whether one invite-consume error means the cached pending token should be discarded. */\nfunction shouldDropPendingInviteToken(err) {\n    const status = Number(err?.status || 0);\n    return err?.code === 'invite/wrong_principal'\n        || err?.code === 'invite/not_found'\n        || status === 404\n        || status === 409;\n}\n\n/* Carry one invite target hint into Authentik without treating it as authority. */\nfunction inviteLoginQuery(resolved, forceLogin) {\n    const query = {};\n    const hint = resolved.emailHint || resolved.usernameHint;\n    if (hint !== '') {\n        query.login_hint = hint;\n    }\n    if (forceLogin) {\n        query.prompt = 'login';\n    }\n    return query;\n}\n\n/* Consume callback-carried invite token if present, else no-op. */\nexport async function maybeConsumeCallbackInvite(callback) {\n    let token = typeof callback?.state?.invite_token === 'string'\n        ? callback.state.invite_token.trim()\n        : '';\n    if (token === '') {\n        token = getPendingInviteToken();\n    }\n    if (token === '') {\n        return false;\n    }\n    const apiBaseUrl = await resolveConfiguredAPIBaseUrl();\n    await consumeInviteToken(apiBaseUrl, token, callback?.access_token || '');\n    clearPendingInviteToken();\n    return true;\n}\n\n/* Consume one cached invite token for one already-authenticated session outside callback handling. */\nexport async function maybeConsumePendingInvite(accessToken) {\n    const token = getPendingInviteToken();\n    if (token === '') {\n        return false;\n    }\n    if (typeof accessToken !== 'string' || accessToken.trim() === '') {\n        return false;\n    }\n    const apiBaseUrl = await resolveConfiguredAPIBaseUrl();\n    try {\n        await consumeInviteToken(apiBaseUrl, token, accessToken);\n        clearPendingInviteToken();\n        return true;\n    } catch (err) {\n        if (shouldDropPendingInviteToken(err)) {\n            clearPendingInviteToken();\n            return false;\n        }\n        throw err;\n    }\n}\n\n/* Handle /join/<token> startup behaviour before ordinary portal route boot. */\nexport async function maybeHandleInviteRoute({\n    pathname,\n    origin,\n    user,\n    defaultReturnPath,\n    beginSigninRedirect,\n    buildSigninRedirectURL,\n    replaceLocation,\n    clearInviteSession = clearInviteSessionAndReload,\n}) {\n    const route = inviteRouteFromPath(pathname);\n    if (!route) {\n        return false;\n    }\n    if (typeof beginSigninRedirect !== 'function') {\n        throw new Error('Invite route handling requires beginSigninRedirect callback.');\n    }\n    if (typeof buildSigninRedirectURL !== 'function') {\n        throw new Error('Invite route handling requires buildSigninRedirectURL callback.');\n    }\n    if (typeof replaceLocation !== 'function') {\n        throw new Error('Invite route handling requires replaceLocation callback.');\n    }\n    if (typeof clearInviteSession !== 'function') {\n        throw new Error('Invite route handling requires clearInviteSession callback.');\n    }\n\n    const apiBaseUrl = await resolveConfiguredAPIBaseUrl();\n    const token = route.token;\n    setPendingInviteToken(token);\n    const resolved = await resolveInviteToken(apiBaseUrl, token);\n    let forceLoginOnce = false;\n    const returnURL = new URL(route.portalPath || defaultReturnPath, origin);\n    if (user && !user.expired && typeof user.access_token === 'string' && user.access_token !== '') {\n        try {\n            await consumeInviteToken(apiBaseUrl, token, user.access_token);\n            clearPendingInviteToken();\n            replaceLocation(returnURL.href);\n            return true;\n        } catch (err) {\n            if (err?.code === 'invite/wrong_principal') {\n                clearInviteSession(globalThis.window, { reload: false });\n                forceLoginOnce = true;\n            }\n            const status = Number(err?.status || 0);\n            if (!Number.isFinite(status) || status < 400 || status >= 500) {\n                throw err;\n            }\n        }\n    }\n\n    if (resolved.firstClick) {\n        const query = inviteLoginQuery(resolved, forceLoginOnce);\n        const signinHref = await buildSigninRedirectURL({\n            reason: forceLoginOnce ? 'invite/wrong_principal' : 'invite/signup',\n            returnTo: returnURL.href,\n            statePatch: { invite_token: token },\n            extraQueryParams: query,\n        });\n        replaceLocation(enrollmentURLFromSigninRedirect(signinHref, resolved.emailHint));\n        return true;\n    }\n\n    const query = inviteLoginQuery(resolved, true);\n    const redirected = await beginSigninRedirect({\n        reason: 'invite/login',\n        manual: true,\n        returnTo: returnURL.href,\n        statePatch: { invite_token: token },\n        extraQueryParams: query,\n    });\n    if (!redirected) {\n        throw new Error('Could not start invite sign-in redirect.');\n    }\n    return true;\n}\n", "// Copyright (c) 2026 Evil Works. All rights reserved.\n// SPDX-License-Identifier: LicenseRef-EvilWorks-Proprietary\n\nimport {\n    gpuDiagCompactSnapshot,\n    gpuDiagJitterSnapshot,\n    gpuDiagSummarizeJitterWindow,\n} from './lib/evilui/browser-gpu-diagnostics.mjs';\nimport { testingLiveTextGroupSummary as evilfontTestingLiveTextGroupSummary } from './lib/evilfont/evilfont.mjs';\nimport { PORTAL_DEBUG_BUILD_VERSION } from './debug-build-version.mjs';\n\nconst DEFAULT_WINDOW_MS = 10_000;\nconst DEFAULT_REPORT_EVERY_MS = 10_000;\nconst DEFAULT_RING_SIZE = 4;\nconst DEFAULT_LAG_TICK_MS = 50;\nconst BUNDLE_WORST_LIMIT = 8;\nconst BUNDLE_RECENT_LIMIT = 6;\nfunction supportsLongTaskObserver() {\n    if (typeof PerformanceObserver !== 'function') {\n        return false;\n    }\n    const ua = globalThis.navigator?.userAgent ?? '';\n    if (ua.includes('Firefox/')) {\n        return false;\n    }\n    return !!PerformanceObserver.supportedEntryTypes?.includes?.('longtask');\n}\n\n/* Round timing values to one decimal place so console bundles stay compact and comparable. */\nfunction roundMs(value) {\n    return Math.round(value * 10) / 10;\n}\n\n/* Keep one sorted copy for quantiles so callers can pass ordinary unsorted sample arrays cheaply. */\nfunction sortedNumbers(values) {\n    return values\n        .filter(Number.isFinite)\n        .slice()\n        .sort((a, b) => a - b);\n}\n\n/* Use linear interpolation so high quantiles remain stable even when a window has few frames. */\nfunction quantileFromSorted(values, q) {\n    if (!Array.isArray(values) || values.length === 0) {\n        return null;\n    }\n    const clamped = Math.max(0, Math.min(1, q));\n    const index = (values.length - 1) * clamped;\n    const lo = Math.floor(index);\n    const hi = Math.ceil(index);\n    if (lo === hi) {\n        return values[lo];\n    }\n    const weight = index - lo;\n    return values[lo] * (1 - weight) + values[hi] * weight;\n}\n\n/* Summarise one latency series with the high quantiles needed to see visible jitter tails. */\nfunction seriesStats(values) {\n    const sorted = sortedNumbers(values);\n    if (sorted.length === 0) {\n        return null;\n    }\n    const sum = sorted.reduce((acc, value) => acc + value, 0);\n    return {\n        samples: sorted.length,\n        min_ms: roundMs(sorted[0]),\n        avg_ms: roundMs(sum / sorted.length),\n        p50_ms: roundMs(quantileFromSorted(sorted, 0.50)),\n        p90_ms: roundMs(quantileFromSorted(sorted, 0.90)),\n        p95_ms: roundMs(quantileFromSorted(sorted, 0.95)),\n        p99_ms: roundMs(quantileFromSorted(sorted, 0.99)),\n        max_ms: roundMs(sorted[sorted.length - 1]),\n    };\n}\n\n/* Keep long-task attribution compact while preserving the named application scopes that overlapped it. */\nfunction compactPortalLongTask(entry) {\n    return {\n        start_ms: roundMs(entry?.start_perf_ms),\n        end_ms: roundMs(entry?.end_perf_ms),\n        duration_ms: roundMs(entry?.duration_ms),\n        active_scope: entry?.active_scope ?? null,\n        matching_scopes: Array.isArray(entry?.matching_scopes)\n            ? entry.matching_scopes.slice(0, 4).map((scope) => ({\n                scope: scope?.scope ?? '',\n                duration_ms: roundMs(scope?.duration_ms),\n                overlap_ms: roundMs(scope?.overlap_ms),\n                depth: Number.isInteger(scope?.depth) ? scope.depth : null,\n                bytes: Number.isFinite(scope?.bytes) ? scope.bytes : null,\n                event_type: scope?.event_type ?? null,\n                line: Number.isInteger(scope?.line) ? scope.line : null,\n            }))\n            : [],\n    };\n}\n\n/* Read the independent portal timing ring so browser long tasks identify the application work they interrupted. */\nfunction portalLongTaskAttribution(cutoffMS) {\n    const trace = globalThis.testingPortalTimingTrace?.();\n    if (!Array.isArray(trace)) {\n        return [];\n    }\n    return trace\n        .filter((entry) => entry?.event === 'portal_longtask'\n            && Number.isFinite(entry?.end_perf_ms)\n            && entry.end_perf_ms >= cutoffMS)\n        .slice(-BUNDLE_WORST_LIMIT)\n        .map(compactPortalLongTask);\n}\n\n/* Keep the output transition tail beside frame timing: its wall-clock trace cannot share the RAF clock. */\nfunction compactPuffbookEvents() {\n    const trace = globalThis.testingPuffbookTrace?.();\n    if (!Array.isArray(trace)) {\n        return [];\n    }\n    return trace.slice(-BUNDLE_WORST_LIMIT).map((entry) => ({\n        seq: Number.isInteger(entry?.seq) ? entry.seq : null,\n        at_wall_ms: Number.isFinite(entry?.at_ms) ? entry.at_ms : null,\n        event: entry?.event ?? '',\n        version: Number.isFinite(entry?.version) ? entry.version : null,\n        line: Number.isInteger(entry?.line) ? entry.line : null,\n        payload_ref: typeof entry?.payload_ref === 'string' ? entry.payload_ref : null,\n        state: entry?.state ?? entry?.terminal_kind ?? null,\n        attempt: Number.isInteger(entry?.attempt) ? entry.attempt : null,\n        detail: typeof entry?.detail === 'string' ? entry.detail.slice(0, 240) : null,\n    }));\n}\n\n/* Collapse repeated wake reasons into deterministic descending counts for log readability. */\nfunction countValues(values) {\n    const counts = new Map();\n    for (const value of values) {\n        const key = value || 'unspecified';\n        counts.set(key, (counts.get(key) || 0) + 1);\n    }\n    return Array.from(counts.entries())\n        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n        .map(([key, count]) => ({ key, count }));\n}\n\n/* Estimate missed presentation windows from frame gaps using the window-local median gap as the nominal vsync period. */\nfunction estimateMissedVsync(frames) {\n    const gaps = sortedNumbers(frames.map((frame) => frame.frame_gap_ms).filter((value) => value > 0));\n    if (gaps.length === 0) {\n        return {\n            nominal_vsync_ms: null,\n            total_missed_windows: 0,\n            stall_frame_count: 0,\n            histogram: [],\n        };\n    }\n    const nominal = quantileFromSorted(gaps, 0.50);\n    const counts = new Map();\n    let totalMissed = 0;\n    let stallFrames = 0;\n    for (const frame of frames) {\n        const gap = frame?.frame_gap_ms;\n        if (!Number.isFinite(gap) || gap <= 0) {\n            continue;\n        }\n        const presentedWindows = Math.max(1, Math.round(gap / nominal));\n        const missed = Math.max(0, presentedWindows - 1);\n        frame.estimated_missed_vsync_windows = missed;\n        if (missed === 0) {\n            continue;\n        }\n        totalMissed += missed;\n        stallFrames += 1;\n        counts.set(missed, (counts.get(missed) || 0) + 1);\n    }\n    return {\n        nominal_vsync_ms: roundMs(nominal),\n        total_missed_windows: totalMissed,\n        stall_frame_count: stallFrames,\n        histogram: Array.from(counts.entries())\n            .sort((a, b) => a[0] - b[0])\n            .map(([missed_windows, count]) => ({ missed_windows, count })),\n    };\n}\n\n/* Merge one compact key/count list into a caller-owned aggregate map. */\nfunction mergeCountEntries(counts, entries) {\n    for (const entry of entries ?? []) {\n        if (!entry?.key || !Number.isFinite(entry.count) || entry.count <= 0) {\n            continue;\n        }\n        counts.set(entry.key, (counts.get(entry.key) || 0) + entry.count);\n    }\n}\n\n/* Sort one caller-owned count map into the same compact key/count shape used elsewhere in the probe. */\nfunction sortCountEntries(counts) {\n    return Array.from(counts.entries())\n        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n        .map(([key, count]) => ({ key, count }));\n}\n\n/* Keep only the hottest recent records so the console bundle shows real outliers, not just rollups. */\nfunction topEntries(entries, key, limit = BUNDLE_WORST_LIMIT) {\n    return entries\n        .slice()\n        .sort((a, b) => (b[key] ?? 0) - (a[key] ?? 0))\n        .slice(0, limit);\n}\n\n/* Derive one approximate total from tracker stats without changing the tracker report schema. */\nfunction statsTotalMs(stats) {\n    if (!stats || !Number.isFinite(stats.samples) || !Number.isFinite(stats.avg_ms)) {\n        return 0;\n    }\n    return stats.samples * stats.avg_ms;\n}\n\n/* Keep one perf stat compact enough for recurring jitter bundles while preserving totals. */\nfunction compactPerfStats(stats) {\n    if (!stats || !Number.isFinite(stats.samples) || stats.samples <= 0) {\n        return null;\n    }\n    return {\n        samples: stats.samples,\n        avg_ms: roundMs(stats.avg_ms ?? 0),\n        max_ms: roundMs(stats.max_ms ?? 0),\n        total_ms: roundMs(statsTotalMs(stats)),\n    };\n}\n\n/* Keep one perf counter stat compact while preserving total and per-frame averages. */\nfunction compactCounterStats(stats) {\n    if (!stats || !Number.isFinite(stats.samples) || stats.samples <= 0) {\n        return null;\n    }\n    return {\n        samples: stats.samples,\n        total: stats.total ?? 0,\n        avg: roundMs(stats.avg ?? 0),\n        max: stats.max ?? 0,\n    };\n}\n\n/* Match draw-path timers without depending on one specific renderer family. */\nfunction isCpuDrawTimerName(name) {\n    return name === 'scene_draw'\n        || name.startsWith('scene_draw_')\n        || name.startsWith('tile_draw_')\n        || name.startsWith('slab_draw_')\n        || name.startsWith('scatterplot_draw_')\n        || name.startsWith('uniform_zebra_stripes_draw_')\n        || name.startsWith('demon_draw_');\n}\n\n/* Surface CPU and GPU draw instrumentation when perf instrumentation is enabled. */\nfunction readPerformanceWindow() {\n    const snapshot = globalThis.__eviluiPerformanceTracker?.snapshot?.() ?? null;\n    if (!snapshot?.timers && !snapshot?.counters) {\n        return null;\n    }\n    const timerEntries = Object.entries(snapshot?.timers ?? {})\n        .filter(([, stats]) => Number.isFinite(stats?.samples) && stats.samples > 0)\n        .map(([name, stats]) => ({\n            name,\n            samples: stats.samples,\n            avg_ms: roundMs(stats.avg_ms ?? 0),\n            max_ms: roundMs(stats.max_ms ?? 0),\n            total_ms: roundMs(statsTotalMs(stats)),\n        }));\n    const gpuTimers = timerEntries\n        .filter(({ name }) => name.startsWith('gpu_draw_'))\n        .sort((a, b) => b.total_ms - a.total_ms || b.max_ms - a.max_ms || a.name.localeCompare(b.name));\n    const cpuDrawTimers = timerEntries\n        .filter(({ name }) => isCpuDrawTimerName(name))\n        .sort((a, b) => b.total_ms - a.total_ms || b.max_ms - a.max_ms || a.name.localeCompare(b.name));\n    const counterEntries = Object.entries(snapshot?.counters ?? {})\n        .filter(([, stats]) => Number.isFinite(stats?.samples) && stats.samples > 0)\n        .map(([name, stats]) => ({\n            name,\n            samples: stats.samples,\n            total: stats.total ?? 0,\n            avg: roundMs(stats.avg ?? 0),\n            max: stats.max ?? 0,\n        }));\n    const cpuDrawCounters = counterEntries\n        .filter(({ name }) => name.startsWith('scene_draw_'))\n        .sort((a, b) => b.total - a.total || b.max - a.max || a.name.localeCompare(b.name));\n    const gpuTotalMs = gpuTimers.reduce((acc, entry) => acc + entry.total_ms, 0);\n    const frameCount = snapshot.frame_count ?? 0;\n    const summary = {\n        frame_count: frameCount,\n        span_ms: Number.isFinite(snapshot.span_ms) ? roundMs(snapshot.span_ms) : null,\n        fps_avg: Number.isFinite(snapshot.fps_avg) ? roundMs(snapshot.fps_avg) : null,\n        slow_frames: Array.isArray(snapshot.slow_frames) ? snapshot.slow_frames.slice(0, 6) : [],\n    };\n    if (gpuTimers.length > 0) {\n        summary.gpu = {\n            total_ms: roundMs(gpuTotalMs),\n            avg_ms_per_frame: frameCount > 0 ? roundMs(gpuTotalMs / frameCount) : null,\n            top_timers: gpuTimers.slice(0, 8),\n        };\n    }\n    if (cpuDrawTimers.length > 0 || cpuDrawCounters.length > 0) {\n        const opaqueResourceTimers = cpuDrawTimers.filter(({ name }) =>\n            name.startsWith('scene_draw_opaque.')\n            || name.startsWith('tile_draw_opaque.')\n            || name.startsWith('slab_draw_opaque.')\n            || name.startsWith('scatterplot_draw_opaque.')\n            || name.startsWith('uniform_zebra_stripes_draw_opaque.')\n            || name.startsWith('demon_draw_opaque.'),\n        );\n        const textResourceTimers = cpuDrawTimers.filter(({ name }) =>\n            name.startsWith('scene_draw_text.')\n            || name.startsWith('tile_draw_text.')\n            || name.startsWith('slab_draw_text.')\n            || name.startsWith('scatterplot_draw_text.')\n            || name.startsWith('uniform_zebra_stripes_draw_text.')\n            || name.startsWith('demon_draw_text.'),\n        );\n        const transparentResourceTimers = cpuDrawTimers.filter(({ name }) =>\n            name.startsWith('scene_draw_transparent.')\n            || name.startsWith('tile_draw_transparent.')\n            || name.startsWith('slab_draw_transparent.')\n            || name.startsWith('scatterplot_draw_transparent.')\n            || name.startsWith('uniform_zebra_stripes_draw_transparent.')\n            || name.startsWith('demon_draw_transparent.'),\n        );\n        summary.cpu_draw = {\n            total_ms: roundMs(statsTotalMs(snapshot?.timers?.scene_draw)),\n            avg_ms_per_frame: compactPerfStats(snapshot?.timers?.scene_draw)?.avg_ms ?? null,\n            passes: {\n                scene_draw: compactPerfStats(snapshot?.timers?.scene_draw),\n                bind_target: compactPerfStats(snapshot?.timers?.scene_draw_bind_target),\n                clear: compactPerfStats(snapshot?.timers?.scene_draw_clear),\n                opaque: compactPerfStats(snapshot?.timers?.scene_draw_opaque),\n                text: compactPerfStats(snapshot?.timers?.scene_draw_text),\n                transparent: compactPerfStats(snapshot?.timers?.scene_draw_transparent),\n            },\n            top_timers: cpuDrawTimers.slice(0, 12),\n            top_opaque_timers: opaqueResourceTimers.slice(0, 8),\n            top_text_timers: textResourceTimers.slice(0, 8),\n            top_transparent_timers: transparentResourceTimers.slice(0, 8),\n            top_counters: cpuDrawCounters.slice(0, 12),\n            counters: {\n                call_count: compactCounterStats(snapshot?.counters?.['scene_draw_call_count']),\n                batcher_count: compactCounterStats(snapshot?.counters?.['scene_draw_batcher_count']),\n                opaque_dispatch_count: compactCounterStats(snapshot?.counters?.['scene_draw_dispatch_count.opaque']),\n                text_dispatch_count: compactCounterStats(snapshot?.counters?.['scene_draw_dispatch_count.text']),\n                transparent_dispatch_count: compactCounterStats(snapshot?.counters?.['scene_draw_dispatch_count.transparent']),\n            },\n            slow_frames: Array.isArray(snapshot.slow_frames) ? snapshot.slow_frames.slice(0, 6) : [],\n        };\n    }\n    return Object.keys(summary).length > 0 ? summary : null;\n}\n\n/* Pull one named delta out of a compact key/delta list without forcing callers to rebuild a map. */\nfunction deltaForKey(entries, key) {\n    const entry = Array.isArray(entries) ? entries.find((item) => item?.key === key) : null;\n    return entry?.delta ?? 0;\n}\n\n/* Keep the main-screen activity block compact so the recurring bundle stays readable in the console. */\nfunction compactGpuActivity(activity) {\n    if (!activity) {\n        return null;\n    }\n    return {\n        scene_fully_rendered: activity.scene_fully_rendered === true,\n        renderless: activity.renderless === true,\n        wake_reason: activity.wake_reason ?? '',\n        active_events: Array.isArray(activity.active_events) ? activity.active_events.slice(0, 6) : [],\n        did_direct_pick: activity.did_direct_pick === true,\n        direct_pick_reason: activity.direct_pick_reason || '',\n        did_passive_pick: activity.did_passive_pick === true,\n        passive_pick_reason: activity.passive_pick_reason || '',\n        camera: activity.camera ? {\n            mode: activity.camera.mode ?? '',\n            moving: activity.camera.moving === true,\n            reasons: Array.isArray(activity.camera.reasons) ? activity.camera.reasons.slice(0, 6) : [],\n            wheel_velocity_y: Number.isFinite(activity.camera.wheel_velocity_y) ? roundMs(activity.camera.wheel_velocity_y) : 0,\n            zoom_velocity: Number.isFinite(activity.camera.zoom_velocity) ? roundMs(activity.camera.zoom_velocity) : 0,\n        } : null,\n    };\n}\n\n/* Keep renderer hot spots short enough that repeated 10s prints remain skimmable during live scrolling. */\nfunction compactTopEntries(entries, limit = 4) {\n    return Array.isArray(entries) ? entries.slice(0, limit) : [];\n}\n\nfunction perfKeyPart(value) {\n    return String(value).replace(/[^A-Za-z0-9_.:-]/g, '_');\n}\n\nfunction textGroupPerfKey(fontName, scopeKey = null) {\n    const fontKey = perfKeyPart(fontName);\n    if (!scopeKey || scopeKey === 'global') {\n        return fontKey;\n    }\n    return `${fontKey}.${perfKeyPart(scopeKey)}`;\n}\n\n/* Allow tests to override the live evilfont batch summary without mutating the real registry. */\nfunction readLiveTextGroupSummary() {\n    if (typeof globalThis.__testingLiveTextGroupSummary === 'function') {\n        return globalThis.__testingLiveTextGroupSummary();\n    }\n    return evilfontTestingLiveTextGroupSummary();\n}\n\n/* Decode text-group upload ownership from GPU resource origins so one bundle can attribute churn to specific batches. */\nfunction buildTextUploadMaps(origins = []) {\n    const byKey = new Map();\n    const byFont = new Map();\n    const groupPrefix = 'evilfont.sync_group_buffer.';\n    const spanPrefix = 'evilfont.sync_span_matrix_texture.';\n\n    function ensureGroup(key) {\n        const current = byKey.get(key) ?? {\n            key,\n            buffer_upload_bytes: 0,\n            buffer_upload_events: 0,\n            span_texture_upload_bytes: 0,\n            span_texture_upload_events: 0,\n        };\n        byKey.set(key, current);\n        return current;\n    }\n\n    function ensureFont(fontName) {\n        const current = byFont.get(fontName) ?? {\n            font_name: fontName,\n            buffer_upload_bytes: 0,\n            buffer_upload_events: 0,\n            span_texture_upload_bytes: 0,\n            span_texture_upload_events: 0,\n        };\n        byFont.set(fontName, current);\n        return current;\n    }\n\n    function fontNameForKey(key) {\n        const dot = key.indexOf('.');\n        return dot < 0 ? key : key.slice(0, dot);\n    }\n\n    for (const entry of origins ?? []) {\n        const origin = entry?.origin ?? '';\n        let key = null;\n        let kind = null;\n        if (origin.startsWith(groupPrefix)) {\n            key = origin.slice(groupPrefix.length);\n            kind = 'buffer';\n        } else if (origin.startsWith(spanPrefix)) {\n            key = origin.slice(spanPrefix.length);\n            if (key.endsWith('.create')) {\n                key = key.slice(0, -'.create'.length);\n            }\n            kind = 'span_texture';\n        }\n        if (!key || !kind) {\n            continue;\n        }\n        const group = ensureGroup(key);\n        const font = ensureFont(fontNameForKey(key));\n        if (kind === 'buffer') {\n            group.buffer_upload_bytes += entry?.uploaded_buffer_bytes ?? 0;\n            group.buffer_upload_events += entry?.upload_buffer_events ?? 0;\n            font.buffer_upload_bytes += entry?.uploaded_buffer_bytes ?? 0;\n            font.buffer_upload_events += entry?.upload_buffer_events ?? 0;\n        } else {\n            group.span_texture_upload_bytes += entry?.uploaded_texture_bytes ?? 0;\n            group.span_texture_upload_events += entry?.upload_texture_events ?? 0;\n            font.span_texture_upload_bytes += entry?.uploaded_texture_bytes ?? 0;\n            font.span_texture_upload_events += entry?.upload_texture_events ?? 0;\n        }\n    }\n    return { byKey, byFont };\n}\n\n/* Summarise live text batching and recent sync payloads so puffbook-wide batch churn is visible in the recurring bundle. */\nfunction buildTextBatchSummary(gpuState) {\n    const live = readLiveTextGroupSummary() ?? null;\n    const textGroups = Array.isArray(gpuState?.text?.groups) ? gpuState.text.groups : [];\n    const origins = [\n        ...(gpuState?.resources?.top_origins_by_uploaded_bytes ?? []),\n        ...(gpuState?.resources?.top_origins_by_live_bytes ?? []),\n    ];\n    const uploads = buildTextUploadMaps(origins);\n    const textByKey = new Map(textGroups.map((entry) => [entry.key, entry]));\n    const liveTopGroups = Array.isArray(live?.top_groups) ? live.top_groups : [];\n    const liveByFont = Array.isArray(live?.by_font) ? live.by_font : [];\n    const liveByScope = Array.isArray(live?.by_scope) ? live.by_scope : [];\n    const globalScope = liveByScope.find((entry) => entry?.scope_key === 'global') ?? null;\n    const chunkScopes = liveByScope.filter((entry) => entry?.scope_key?.includes?.('.chunk.'));\n\n    return {\n        live_totals: live?.totals ?? null,\n        global_scope: globalScope ? {\n            groups: globalScope.groups ?? 0,\n            nodes: globalScope.nodes ?? 0,\n            instance_count: globalScope.instance_count ?? 0,\n            span_count: globalScope.span_count ?? 0,\n        } : null,\n        chunk_scope_totals: chunkScopes.length > 0 ? {\n            scopes: chunkScopes.length,\n            groups: chunkScopes.reduce((sum, entry) => sum + (entry.groups ?? 0), 0),\n            nodes: chunkScopes.reduce((sum, entry) => sum + (entry.nodes ?? 0), 0),\n            instance_count: chunkScopes.reduce((sum, entry) => sum + (entry.instance_count ?? 0), 0),\n            span_count: chunkScopes.reduce((sum, entry) => sum + (entry.span_count ?? 0), 0),\n        } : null,\n        by_font: liveByFont\n            .map((entry) => {\n                const upload = uploads.byFont.get(entry.font_name) ?? null;\n                return {\n                    font_name: entry.font_name,\n                    groups: entry.groups ?? 0,\n                    nodes: entry.nodes ?? 0,\n                    instance_count: entry.instance_count ?? 0,\n                    span_count: entry.span_count ?? 0,\n                    buffer_upload_bytes: upload?.buffer_upload_bytes ?? 0,\n                    buffer_upload_events: upload?.buffer_upload_events ?? 0,\n                    span_texture_upload_bytes: upload?.span_texture_upload_bytes ?? 0,\n                    span_texture_upload_events: upload?.span_texture_upload_events ?? 0,\n                };\n            })\n            .sort((a, b) => b.nodes - a.nodes || b.instance_count - a.instance_count || a.font_name.localeCompare(b.font_name))\n            .slice(0, 4),\n        top_groups: liveTopGroups\n            .map((entry) => {\n                const perfKey = textGroupPerfKey(entry.font_name, entry.scope_key);\n                const snap = textByKey.get(perfKey) ?? null;\n                const upload = uploads.byKey.get(perfKey) ?? null;\n                return {\n                    font_name: entry.font_name,\n                    scope_key: entry.scope_key,\n                    scope_kind: entry.scope_kind,\n                    node_count: entry.node_count ?? 0,\n                    presented_node_count: entry.presented_node_count ?? 0,\n                    instance_count: entry.instance_count ?? 0,\n                    span_count: entry.span_count ?? 0,\n                    sync_count: snap?.sync_count ?? 0,\n                    span_upload_count: snap?.span_upload_count ?? 0,\n                    span_skip_count: snap?.span_skip_count ?? 0,\n                    unchanged_span_skip_count: snap?.unchanged_span_skip_count ?? 0,\n                    last_sync: snap?.last_sync ? {\n                        instance_count: snap.last_sync.instance_count ?? 0,\n                        span_count: snap.last_sync.span_count ?? 0,\n                        presented_node_count: snap.last_sync.presented_node_count ?? 0,\n                        visible_node_count: snap.last_sync.visible_node_count ?? 0,\n                        transform_only: snap.last_sync.transform_only === true,\n                        scope_key: snap.last_sync.scope_key ?? '',\n                    } : null,\n                    buffer_upload_bytes: upload?.buffer_upload_bytes ?? 0,\n                    buffer_upload_events: upload?.buffer_upload_events ?? 0,\n                    span_texture_upload_bytes: upload?.span_texture_upload_bytes ?? 0,\n                    span_texture_upload_events: upload?.span_texture_upload_events ?? 0,\n                };\n            })\n            .slice(0, 6),\n    };\n}\n\n/* Keep recent TableView motion records compact so jitter bundles stay readable in the console. */\nfunction compactTableviewEntry(entry) {\n    if (!entry) {\n        return null;\n    }\n    return {\n        at_ms: roundMs(entry.at_ms ?? 0),\n        frame_index: Number.isFinite(entry.frame_index) ? entry.frame_index : null,\n        line: Number.isFinite(entry.line) ? entry.line : null,\n        table_name: entry.table_name ?? null,\n        kind: entry.kind ?? '',\n        direction: Number.isFinite(entry.direction) ? entry.direction : null,\n        row_band: Number.isFinite(entry.row_band) ? entry.row_band : null,\n        col_band: Number.isFinite(entry.col_band) ? entry.col_band : null,\n        entries_first: Number.isFinite(entry.entries_first) ? entry.entries_first : null,\n        entries_last: Number.isFinite(entry.entries_last) ? entry.entries_last : null,\n        stage_ms: Number.isFinite(entry.stage_ms) ? roundMs(entry.stage_ms) : null,\n        duration_ms: Number.isFinite(entry.duration_ms) ? roundMs(entry.duration_ms) : null,\n        reconcile_built: Number.isFinite(entry.reconcile_built) ? entry.reconcile_built : null,\n        evicted_chunks: Number.isFinite(entry.evicted_chunks) ? entry.evicted_chunks : null,\n        evicted_row_bands: Number.isFinite(entry.evicted_row_bands) ? entry.evicted_row_bands : null,\n        render_window_visible: Number.isFinite(entry.render_window_visible) ? entry.render_window_visible : null,\n        render_window_total: Number.isFinite(entry.render_window_total) ? entry.render_window_total : null,\n        scroll_x: Number.isFinite(entry.scroll_x) ? roundMs(entry.scroll_x) : null,\n        scroll_y: Number.isFinite(entry.scroll_y) ? roundMs(entry.scroll_y) : null,\n        throw_vx: Number.isFinite(entry.throw_vx) ? roundMs(entry.throw_vx) : null,\n        throw_vy: Number.isFinite(entry.throw_vy) ? roundMs(entry.throw_vy) : null,\n        loaded_row_bands: Number.isFinite(entry.loaded_row_bands) ? entry.loaded_row_bands : null,\n        loaded_chunks: Number.isFinite(entry.loaded_chunks) ? entry.loaded_chunks : null,\n    };\n}\n\n/* Keep one recent frame-demand sample compact while preserving the owner labels we need to debug hot loops. */\nfunction compactFrameDemand(entry) {\n    if (!entry) {\n        return null;\n    }\n    return {\n        at_ms: roundMs(entry.at_ms ?? 0),\n        hot: entry.hot === true,\n        reasons: Array.isArray(entry.reasons) ? entry.reasons.slice(0, 8) : [],\n        presenter_hot: entry.presenter_hot === true,\n        presenter_hot_until_ms: Number.isFinite(entry.presenter_hot_until_ms) ? roundMs(entry.presenter_hot_until_ms) : null,\n        presenter_quiescent_for_ms: Number.isFinite(entry.presenter_quiescent_for_ms) ? roundMs(entry.presenter_quiescent_for_ms) : null,\n        presenter_last_promote_reason: entry.presenter_last_promote_reason ?? '',\n        scheduled_think_owners: Array.isArray(entry.scheduled_think_owners)\n            ? entry.scheduled_think_owners.slice(0, 8).map((item) => ({\n                key: item?.key ?? 'unspecified',\n                count: Number.isFinite(item?.count) ? item.count : 0,\n            }))\n            : [],\n        pending_scheduled_think_owners: Array.isArray(entry.pending_scheduled_think_owners)\n            ? entry.pending_scheduled_think_owners.slice(0, 8).map((item) => ({\n                key: item?.key ?? 'unspecified',\n                count: Number.isFinite(item?.count) ? item.count : 0,\n            }))\n            : [],\n    };\n}\n\n/* Keep recent scheduled-think ownership churn compact so cold re-arm loops are easy to correlate. */\nfunction compactScheduledThinkEvent(entry) {\n    if (!entry) {\n        return null;\n    }\n    return {\n        at_ms: roundMs(entry.at_ms ?? 0),\n        kind: entry.kind ?? 'unspecified',\n        scene_label: entry.scene_label ?? 'scene',\n        owner_label: entry.owner_label ?? 'Node',\n        reason: entry.reason ?? null,\n        cadence: entry.cadence ?? null,\n        delay_ms: Number.isFinite(entry.delay_ms) ? roundMs(entry.delay_ms) : null,\n        pending_count: Number.isFinite(entry.pending_count) ? entry.pending_count : null,\n    };\n}\n\n/* Keep one wake request sample compact while preserving any stage-level scheduled-think ownership seen at request time. */\nfunction compactWakeEvent(entry) {\n    if (!entry) {\n        return null;\n    }\n    return {\n        at_ms: roundMs(entry.at_ms ?? 0),\n        reason: entry.reason ?? 'unspecified',\n        stage_scheduled_think_total_pending: Number.isFinite(entry.stage_scheduled_think_total_pending)\n            ? entry.stage_scheduled_think_total_pending\n            : null,\n        stage_scheduled_think_owners: Array.isArray(entry.stage_scheduled_think_owners)\n            ? entry.stage_scheduled_think_owners.slice(0, 8).map((item) => ({\n                key: item?.key ?? 'unspecified',\n                count: Number.isFinite(item?.count) ? item.count : 0,\n            }))\n            : [],\n    };\n}\n\n/* Read one trailing-window TableView motion summary so jitter bundles can be correlated with momentum. */\nfunction readTableviewWindow(at, windowMs) {\n    const report = globalThis.__tableviewLiveProbe?.report?.({\n        sinceAtMs: at - windowMs,\n    }) ?? null;\n    if (!report) {\n        return null;\n    }\n    return {\n        summary: report.summary ?? null,\n        recent_entries: Array.isArray(report.recent_entries)\n            ? report.recent_entries.slice(-BUNDLE_RECENT_LIMIT).map(compactTableviewEntry)\n            : [],\n    };\n}\n\n/* Collapse perf and GPU diagnostic windows into one compact section. */\nfunction buildGpuSummary(perfWindow, gpuWindow, gpuState) {\n    if (!perfWindow && !gpuWindow && !gpuState) {\n        return null;\n    }\n    const bufferEvents = gpuWindow?.resource_upload_events_delta?.buffer ?? 0;\n    const bufferBytes = gpuWindow?.resource_uploaded_bytes_delta?.buffer ?? 0;\n    const textureEvents = gpuWindow?.resource_upload_events_delta?.texture ?? 0;\n    const textureBytes = gpuWindow?.resource_uploaded_bytes_delta?.texture ?? 0;\n    const renderbufferEvents = gpuWindow?.resource_upload_events_delta?.renderbuffer ?? 0;\n    const renderbufferBytes = gpuWindow?.resource_uploaded_bytes_delta?.renderbuffer ?? 0;\n    const tileSyncCount = gpuWindow?.tile?.totals?.sync_count ?? 0;\n    const textSyncCount = gpuWindow?.text?.totals?.sync_count ?? 0;\n    const textSpanUploadCount = gpuWindow?.text?.totals?.span_upload_count ?? 0;\n    const tileUploadBytes = gpuWindow?.tile?.totals?.upload_bytes ?? 0;\n    const activityCounts = gpuWindow?.frame?.activity_count_deltas ?? null;\n    const uploadsActive = bufferEvents > 0\n        || bufferBytes > 0\n        || textureEvents > 0\n        || textureBytes > 0\n        || renderbufferEvents > 0\n        || renderbufferBytes > 0;\n    const syncActive = tileSyncCount > 0\n        || textSyncCount > 0\n        || textSpanUploadCount > 0\n        || tileUploadBytes > 0\n        || (gpuWindow?.tile?.totals?.full_rebuild_count ?? 0) > 0\n        || (gpuWindow?.text?.totals?.instance_propagation_count ?? 0) > 0;\n    const summary = {};\n    if (perfWindow) {\n        if (perfWindow.gpu) {\n            summary.draw = {\n                frame_count: perfWindow.frame_count,\n                span_ms: perfWindow.span_ms,\n                fps_avg: perfWindow.fps_avg,\n                total_ms: perfWindow.gpu.total_ms,\n                avg_ms_per_frame: perfWindow.gpu.avg_ms_per_frame,\n                top_timers: perfWindow.gpu.top_timers,\n            };\n        }\n        if (perfWindow.cpu_draw) {\n            summary.cpu_draw = {\n                frame_count: perfWindow.frame_count,\n                span_ms: perfWindow.span_ms,\n                fps_avg: perfWindow.fps_avg,\n                total_ms: perfWindow.cpu_draw.total_ms,\n                avg_ms_per_frame: perfWindow.cpu_draw.avg_ms_per_frame,\n                passes: perfWindow.cpu_draw.passes,\n                top_timers: perfWindow.cpu_draw.top_timers,\n                top_opaque_timers: perfWindow.cpu_draw.top_opaque_timers,\n                top_text_timers: perfWindow.cpu_draw.top_text_timers,\n                top_transparent_timers: perfWindow.cpu_draw.top_transparent_timers,\n                top_counters: perfWindow.cpu_draw.top_counters,\n                counters: perfWindow.cpu_draw.counters,\n                slow_frames: perfWindow.cpu_draw.slow_frames,\n            };\n        }\n    }\n    if (gpuState) {\n        summary.current = {\n            activity: compactGpuActivity(gpuState.frame?.activity),\n            scene: {\n                presentation_revision: gpuState.scene?.presentation_revision ?? 0,\n                last_presentation: gpuState.scene?.last_presentation ? {\n                    revision: gpuState.scene.last_presentation.revision ?? 0,\n                    reason: gpuState.scene.last_presentation.reason ?? '',\n                } : null,\n            },\n            resources: {\n                live_bytes: gpuState.resources?.bytes?.live ?? null,\n                top_live_origins: compactTopEntries(gpuState.resources?.top_origins_by_live_bytes),\n                top_uploaded_origins: compactTopEntries(gpuState.resources?.top_origins_by_uploaded_bytes),\n            },\n            hot_groups: {\n                tile_by_upload_bytes: compactTopEntries(gpuState.tile?.summary?.top_groups_by_upload_bytes, 3),\n                text_by_sync_count: compactTopEntries(gpuState.text?.propagation_summary?.groups_by_count, 3),\n                text_by_span_skip_count: compactTopEntries(gpuState.text?.groups, 3).map((entry) => ({\n                    key: entry.key,\n                    unchanged_span_skip_count: entry.unchanged_span_skip_count ?? 0,\n                    span_skip_count: entry.span_skip_count ?? 0,\n                        sync_count: entry.sync_count ?? 0,\n                })),\n            },\n            text_batches: buildTextBatchSummary(gpuState),\n            scatterplot: {\n                rebuild_count: gpuState.scatterplot?.rebuild_count ?? 0,\n                draw_count: gpuState.scatterplot?.draw_count ?? 0,\n                plots: compactTopEntries(gpuState.scatterplot?.plots, 3).map((entry) => ({\n                    key: entry.key,\n                    kind: entry.kind,\n                    at_ms: Number.isFinite(entry.at_ms) ? roundMs(entry.at_ms) : null,\n                })),\n            },\n        };\n    }\n    if (gpuWindow) {\n        summary.window = {\n            draw_count: gpuWindow.frame?.draw_count_delta ?? 0,\n            picker_triggers: gpuWindow.picker?.trigger_count_delta ?? 0,\n            picker_trigger_reasons: compactTopEntries(gpuWindow.picker?.reason_deltas),\n            readbacks: gpuWindow.readbacks_delta,\n            presentation_revision_delta: gpuWindow.scene?.presentation_revision_delta ?? 0,\n            presentation_reason_deltas: compactTopEntries(gpuWindow.scene?.presentation_reason_deltas),\n            activity_counts: activityCounts ? [\n                { key: 'frames', count: activityCounts.frames ?? 0 },\n                { key: 'user_input', count: activityCounts.user_input ?? 0 },\n                { key: 'mouse_moved', count: activityCounts.mouse_moved ?? 0 },\n                { key: 'direct_pick', count: activityCounts.direct_pick ?? 0 },\n                { key: 'passive_pick', count: activityCounts.passive_pick ?? 0 },\n                { key: 'camera_motion', count: activityCounts.camera_motion ?? 0 },\n                { key: 'scene_not_fully_rendered', count: activityCounts.scene_not_fully_rendered ?? 0 },\n            ].filter((entry) => entry.count > 0) : [],\n            active_event_deltas: compactTopEntries(gpuWindow.frame?.active_event_deltas),\n            camera_motion_reason_deltas: compactTopEntries(gpuWindow.frame?.camera_motion_reason_deltas),\n            passive_pick_reason_deltas: compactTopEntries(gpuWindow.frame?.passive_pick_reason_deltas),\n            direct_pick_reason_deltas: compactTopEntries(gpuWindow.frame?.direct_pick_reason_deltas),\n        };\n    }\n    if (uploadsActive) {\n        summary.uploads = {\n            buffer_events: bufferEvents,\n            buffer_bytes: bufferBytes,\n            texture_events: textureEvents,\n            texture_bytes: textureBytes,\n            renderbuffer_events: renderbufferEvents,\n            renderbuffer_bytes: renderbufferBytes,\n        };\n    }\n    if (syncActive) {\n        summary.sync = {\n            tile_sync_count: tileSyncCount,\n            tile_full_rebuild_count: gpuWindow?.tile?.totals?.full_rebuild_count ?? 0,\n            tile_transform_only_sync_count: gpuWindow?.tile?.totals?.transform_only_sync_count ?? 0,\n            text_dirty_count: gpuWindow?.text?.totals?.dirty_count ?? 0,\n            text_sync_count: textSyncCount,\n            text_span_upload_count: textSpanUploadCount,\n            text_full_dirty_count: gpuWindow?.text?.totals?.sync_full_dirty_count ?? 0,\n            text_instance_dirty_count: gpuWindow?.text?.totals?.sync_instance_dirty_count ?? 0,\n            text_transform_only_sync_count: gpuWindow?.text?.totals?.transform_only_sync_count ?? 0,\n            text_instance_propagation_count: gpuWindow?.text?.totals?.instance_propagation_count ?? 0,\n            tile_upload_bytes: tileUploadBytes,\n            tile_clip_rect_delta: deltaForKey(gpuWindow?.tile?.propagation_reason_deltas, 'clip_rect'),\n            text_clip_rect_delta: deltaForKey(gpuWindow?.text?.instance_propagation_reason_deltas, 'clip_rect'),\n        };\n    }\n    /* Always emit dirty stats so zero-delta windows are distinguishable from missing instrumentation. */\n    summary.dirty = {\n        total_dirty_delta: gpuWindow?.dirty_summary?.total_dirty_delta ?? 0,\n        top_dirty_labels: compactTopEntries(gpuWindow?.dirty_summary?.top_dirty_labels),\n        top_dirty_sources: compactTopEntries(gpuWindow?.dirty_summary?.top_dirty_sources),\n        top_dirty_source_paths: compactTopEntries(gpuWindow?.dirty_summary?.top_dirty_source_paths),\n        top_dirty_kinds: compactTopEntries(gpuWindow?.dirty_summary?.top_dirty_kinds),\n        top_instance_propagation_sources: compactTopEntries(gpuWindow?.dirty_summary?.top_instance_propagation_sources),\n        top_instance_propagation_reasons: compactTopEntries(gpuWindow?.dirty_summary?.top_instance_propagation_reasons),\n    };\n    return Object.keys(summary).length > 0 ? summary : null;\n}\n\n/* Keep recurring TableView reporting focused on windows with actual activity. */\nfunction buildTableviewSummary(tableviewWindow) {\n    const summary = tableviewWindow?.summary ?? null;\n    if (!summary) {\n        return null;\n    }\n    const entryCount = summary.entry_count ?? 0;\n    const momentumEntryCount = summary.momentum_entry_count ?? 0;\n    const throwSpeedMax = summary.throw_speed?.max ?? 0;\n    const maxLoadedChunks = summary.max_loaded_chunks ?? 0;\n    const maxLoadedRowBands = summary.max_loaded_row_bands ?? 0;\n    const rowBandLoadCount = summary.row_band_load_count ?? 0;\n    const chunkBuildCount = summary.chunk_build_count ?? 0;\n    const chunkEvictCount = summary.chunk_evict_count ?? 0;\n    const rowBandEvictCount = summary.row_band_evict_count ?? 0;\n    const textDirty = summary.text_dirty ?? null;\n    const textDirtyChunkCount = textDirty?.chunk_count ?? 0;\n    const textDirtyHeaderCount = textDirty?.header_count ?? 0;\n    const suspiciousChunkTextDirtyTotal = textDirty?.suspicious_chunk_total ?? 0;\n    const active = entryCount > 0\n        || momentumEntryCount > 0\n        || throwSpeedMax > 0\n        || rowBandLoadCount > 0\n        || chunkBuildCount > 0\n        || chunkEvictCount > 0\n        || rowBandEvictCount > 0\n        || textDirtyChunkCount > 0\n        || textDirtyHeaderCount > 0\n        || suspiciousChunkTextDirtyTotal > 0\n        || maxLoadedChunks > 0\n        || maxLoadedRowBands > 0;\n    if (!active) {\n        return null;\n    }\n    return {\n        entry_count: entryCount,\n        momentum_entry_count: momentumEntryCount,\n        throw_speed_max: throwSpeedMax,\n        stage_ms_max: summary.stage_ms?.max ?? 0,\n        update_chunk_ms_max: summary.update_chunk_ms?.max ?? 0,\n        reconcile_ms_max: summary.reconcile_ms?.max ?? 0,\n        render_window_ms_max: summary.render_window_ms?.max ?? 0,\n        churn_ms_max: summary.churn_ms?.max ?? 0,\n        reconcile_built_total: summary.reconcile_built_total ?? 0,\n        row_band_load_count: rowBandLoadCount,\n        chunk_build_count: chunkBuildCount,\n        chunk_evict_count: chunkEvictCount,\n        row_band_evict_count: rowBandEvictCount,\n        max_loaded_row_bands: maxLoadedRowBands,\n        max_loaded_chunks: maxLoadedChunks,\n        text_dirty: textDirty ? {\n            chunk_count: textDirtyChunkCount,\n            chunk_frames: textDirty.chunk_frames ?? 0,\n            chunk_churn_frames: textDirty.chunk_churn_frames ?? 0,\n            header_count: textDirtyHeaderCount,\n            header_frames: textDirty.header_frames ?? 0,\n            missing_frame_index_count: textDirty.missing_frame_index_count ?? 0,\n            suspicious_chunk_total: suspiciousChunkTextDirtyTotal,\n            suspicious_chunk_frames: textDirty.suspicious_chunk_frames ?? 0,\n            recent_suspicious_frames: Array.isArray(textDirty.recent_suspicious_frames)\n                ? textDirty.recent_suspicious_frames.slice(-BUNDLE_RECENT_LIMIT).map((entry) => ({\n                    frame_index: Number.isFinite(entry?.frame_index) ? entry.frame_index : null,\n                    expected_chunk_text_dirty_budget: Number.isFinite(entry?.expected_chunk_text_dirty_budget)\n                        ? entry.expected_chunk_text_dirty_budget\n                        : null,\n                    chunk_text_dirty_count: Number.isFinite(entry?.chunk_text_dirty_count)\n                        ? entry.chunk_text_dirty_count\n                        : null,\n                    chunk_build_count: Number.isFinite(entry?.chunk_build_count) ? entry.chunk_build_count : null,\n                    chunk_evict_count: Number.isFinite(entry?.chunk_evict_count) ? entry.chunk_evict_count : null,\n                    tables: Array.isArray(entry?.tables) ? entry.tables.slice(0, 4) : [],\n                    scopes: Array.isArray(entry?.scopes) ? entry.scopes.slice(0, 6) : [],\n                    source_counts: entry?.source_counts && typeof entry.source_counts === 'object'\n                        ? Object.fromEntries(\n                            Object.entries(entry.source_counts)\n                                .filter(([, count]) => Number.isFinite(count) && count > 0)\n                                .sort(([a], [b]) => a.localeCompare(b)),\n                        )\n                        : {},\n                }))\n                : [],\n        } : null,\n        recent: tableviewWindow.recent_entries ?? [],\n    };\n}\n\n/* Create a small always-on browser probe that rolls 10s jitter bundles into a console-visible ring. */\n/* Sample one rolling jitter window while letting callers choose a slower reporting cadence for lower log volume. */\nexport function createPortalJitterProbe({\n    label = 'portal_jitter',\n    windowMs = DEFAULT_WINDOW_MS,\n    reportEveryMs = DEFAULT_REPORT_EVERY_MS,\n    ringSize = DEFAULT_RING_SIZE,\n    lagTickMs = DEFAULT_LAG_TICK_MS,\n    printToConsole = false,\n} = {}) {\n    const win = typeof window !== 'undefined' ? window : null;\n    if (!win || typeof performance === 'undefined') {\n        return {\n            noteWake() {},\n            noteFrame() {},\n            report() {\n                return null;\n            },\n            reset() {\n                return null;\n            },\n        };\n    }\n\n    const state = {\n        label,\n        windowMs,\n        reportEveryMs,\n        ringSize,\n        createdAtMs: performance.now(),\n        frames: [],\n        pendingWakes: [],\n        wakeEvents: [],\n        longTasks: [],\n        mainThreadLags: [],\n        gpuFrames: [],\n        frameDemandFrames: [],\n        scheduledThinkEvents: [],\n        ring: [],\n        lastFrameStartMs: null,\n        lastFrameGapMs: null,\n        lastLagTickMs: performance.now(),\n        foregroundSinceMs: document.visibilityState === 'visible' ? performance.now() : null,\n    };\n\n    /* Discard mixed-visibility samples: a bundle is useful only after one full visible integration window. */\n    function resetForegroundWindow(now = performance.now()) {\n        state.frames = [];\n        state.pendingWakes = [];\n        state.wakeEvents = [];\n        state.longTasks = [];\n        state.mainThreadLags = [];\n        state.gpuFrames = [];\n        state.frameDemandFrames = [];\n        state.scheduledThinkEvents = [];\n        state.lastFrameStartMs = null;\n        state.lastFrameGapMs = null;\n        state.lastLagTickMs = now;\n    }\n\n    function noteVisibility(now = performance.now()) {\n        if (document.visibilityState !== 'visible') {\n            state.foregroundSinceMs = null;\n            resetForegroundWindow(now);\n            return;\n        }\n        state.foregroundSinceMs = now;\n        resetForegroundWindow(now);\n    }\n\n    /* Drop stale per-sample records so every emitted bundle covers only the previous window. */\n    function prune(now) {\n        const cutoff = now - state.windowMs;\n        while (state.frames.length > 0 && state.frames[0].end_ms < cutoff) {\n            state.frames.shift();\n        }\n        while (state.wakeEvents.length > 0 && state.wakeEvents[0].at_ms < cutoff) {\n            state.wakeEvents.shift();\n        }\n        while (state.longTasks.length > 0 && state.longTasks[0].end_ms < cutoff) {\n            state.longTasks.shift();\n        }\n        while (state.mainThreadLags.length > 0 && state.mainThreadLags[0].at_ms < cutoff) {\n            state.mainThreadLags.shift();\n        }\n        while (state.gpuFrames.length > 0 && state.gpuFrames[0].at_ms < cutoff) {\n            state.gpuFrames.shift();\n        }\n        while (state.frameDemandFrames.length > 0 && state.frameDemandFrames[0].end_ms < cutoff) {\n            state.frameDemandFrames.shift();\n        }\n        while (state.scheduledThinkEvents.length > 0 && state.scheduledThinkEvents[0].at_ms < cutoff) {\n            state.scheduledThinkEvents.shift();\n        }\n        while (state.pendingWakes.length > 0 && state.pendingWakes[0].at_ms < cutoff) {\n            state.pendingWakes.shift();\n        }\n    }\n\n    /* Sample event-loop slippage independently of frame production so idle hitches still show up. */\n    function scheduleLagTick() {\n        win.setTimeout(() => {\n            const now = performance.now();\n            const lagMs = Math.max(0, now - state.lastLagTickMs - lagTickMs);\n            state.lastLagTickMs = now;\n            state.mainThreadLags.push({\n                at_ms: now,\n                lag_ms: lagMs,\n            });\n            prune(now);\n            scheduleLagTick();\n        }, lagTickMs);\n    }\n\n    /* Record browser long tasks directly so large main-thread stalls can be correlated with jitter tails. */\n    function installLongTaskObserver() {\n        if (!supportsLongTaskObserver()) {\n            return;\n        }\n        try {\n            const observer = new PerformanceObserver((list) => {\n                for (const entry of list.getEntries()) {\n                    const startMs = Number(entry.startTime || 0);\n                    const durationMs = Number(entry.duration || 0);\n                    state.longTasks.push({\n                        start_ms: startMs,\n                        end_ms: startMs + durationMs,\n                        duration_ms: durationMs,\n                    });\n                }\n                prune(performance.now());\n            });\n            observer.observe({ entryTypes: ['longtask'] });\n        } catch (_err) {\n        }\n    }\n\n    /* Roll the live window into one retained bundle without emitting routine console noise during normal portal use. */\n    function emitBundle(at = performance.now()) {\n        if (document.visibilityState !== 'visible'\n            || state.foregroundSinceMs === null\n            || at - state.foregroundSinceMs < state.windowMs) {\n            return null;\n        }\n        const bundle = buildBundle(at);\n        state.ring.push(bundle);\n        if (state.ring.length > state.ringSize) {\n            state.ring.splice(0, state.ring.length - state.ringSize);\n        }\n        if (printToConsole) {\n            console.log('Portal performance bundle', bundle);\n        }\n        return bundle;\n    }\n\n    /* Summarise current samples into one 10s bundle with quantiles, hot phases, and worst outliers. */\n    function buildBundle(at = performance.now()) {\n        prune(at);\n        const frames = state.frames.slice();\n        const frameGaps = frames.map((frame) => frame.frame_gap_ms);\n        const frameGapJitter = frames.map((frame) => frame.frame_gap_jitter_ms);\n        const frameDurations = frames.map((frame) => frame.frame_total_ms);\n        const callbackLag = frames.map((frame) => frame.callback_lag_ms);\n        const rafRequestLatency = frames.map((frame) => frame.raf_request_to_callback_ms);\n        const wakeOldest = frames.map((frame) => frame.wake_to_frame_oldest_ms);\n        const missedVsync = estimateMissedVsync(frames);\n        const longTaskDurations = state.longTasks.map((entry) => entry.duration_ms);\n        const mainThreadLag = state.mainThreadLags.map((entry) => entry.lag_ms);\n        const portalLongTasks = portalLongTaskAttribution(at - state.windowMs);\n        const puffbookEvents = compactPuffbookEvents();\n        const phaseValues = new Map();\n\n        for (const frame of frames) {\n            for (const [name, value] of Object.entries(frame.phase_durations_ms ?? {})) {\n                const values = phaseValues.get(name) ?? [];\n                values.push(value);\n                phaseValues.set(name, values);\n            }\n        }\n\n        const phaseStats = {};\n        for (const [name, values] of Array.from(phaseValues.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {\n            phaseStats[name] = seriesStats(values);\n        }\n\n        const worstFrames = topEntries(frames, 'frame_total_ms').map((frame) => ({\n            frame_stamp: frame.frame_stamp,\n            start_ms: roundMs(frame.start_ms),\n            frame_gap_ms: roundMs(frame.frame_gap_ms),\n            frame_gap_jitter_ms: roundMs(frame.frame_gap_jitter_ms),\n            estimated_missed_vsync_windows: Number.isFinite(frame.estimated_missed_vsync_windows)\n                ? frame.estimated_missed_vsync_windows\n                : 0,\n            frame_total_ms: roundMs(frame.frame_total_ms),\n            callback_lag_ms: roundMs(frame.callback_lag_ms),\n            raf_request_to_callback_ms: roundMs(frame.raf_request_to_callback_ms),\n            wake_to_frame_oldest_ms: roundMs(frame.wake_to_frame_oldest_ms),\n            wake_reason: frame.wake_reason,\n            phase_durations_ms: Object.fromEntries(\n                Object.entries(frame.phase_durations_ms ?? {})\n                    .sort((a, b) => b[1] - a[1])\n                    .slice(0, 8)\n                    .map(([name, value]) => [name, roundMs(value)]),\n            ),\n        }));\n\n        const worstLongTasks = topEntries(state.longTasks, 'duration_ms').map((entry) => ({\n            start_ms: roundMs(entry.start_ms),\n            duration_ms: roundMs(entry.duration_ms),\n        }));\n\n        const worstMainThreadLags = topEntries(state.mainThreadLags, 'lag_ms').map((entry) => ({\n            at_ms: roundMs(entry.at_ms),\n            lag_ms: roundMs(entry.lag_ms),\n        }));\n        const gpuWindow = state.gpuFrames.length > 0\n            ? gpuDiagSummarizeJitterWindow(state.gpuFrames[0], state.gpuFrames[state.gpuFrames.length - 1])\n            : null;\n        const gpuState = gpuDiagCompactSnapshot();\n        const perfWindow = readPerformanceWindow();\n        const tableviewWindow = readTableviewWindow(at, state.windowMs);\n        const gpuSummary = buildGpuSummary(perfWindow, gpuWindow, gpuState);\n        const tableviewSummary = buildTableviewSummary(tableviewWindow);\n        const demandReasonValues = state.frameDemandFrames.flatMap((entry) => entry.reasons ?? []);\n        const scheduledThinkOwnerCounts = new Map();\n        const pendingScheduledThinkOwnerCounts = new Map();\n        for (const entry of state.frameDemandFrames) {\n            mergeCountEntries(scheduledThinkOwnerCounts, entry.scheduled_think_owners);\n            mergeCountEntries(pendingScheduledThinkOwnerCounts, entry.pending_scheduled_think_owners);\n        }\n        const hotFrameCount = state.frameDemandFrames.filter((entry) => entry.hot === true).length;\n        const latestDemand = state.frameDemandFrames[state.frameDemandFrames.length - 1] ?? null;\n        const wakeOwnerCounts = new Map();\n        const frameStepOwnerCounts = new Map();\n        const wakeRequestOwnerCounts = new Map();\n        const scheduledThinkReasonCounts = new Map();\n        const frameStepReasonCounts = new Map();\n        const wakeReasonCounts = new Map();\n        let wakeRequestPendingMax = 0;\n        for (const entry of state.scheduledThinkEvents) {\n            const reason = entry.reason ?? 'unspecified';\n            scheduledThinkReasonCounts.set(reason, (scheduledThinkReasonCounts.get(reason) || 0) + 1);\n            if (entry.kind === 'wake' && entry.owner_label) {\n                wakeOwnerCounts.set(entry.owner_label, (wakeOwnerCounts.get(entry.owner_label) || 0) + 1);\n                wakeReasonCounts.set(reason, (wakeReasonCounts.get(reason) || 0) + 1);\n            }\n            if (entry.kind === 'schedule' && entry.owner_label && entry.cadence === 'frame_step') {\n                frameStepOwnerCounts.set(entry.owner_label, (frameStepOwnerCounts.get(entry.owner_label) || 0) + 1);\n                frameStepReasonCounts.set(reason, (frameStepReasonCounts.get(reason) || 0) + 1);\n            }\n        }\n        for (const entry of state.wakeEvents) {\n            if (entry.reason !== 'scene_scheduled_think') {\n                continue;\n            }\n            wakeRequestPendingMax = Math.max(\n                wakeRequestPendingMax,\n                Number.isFinite(entry.stage_scheduled_think_total_pending) ? entry.stage_scheduled_think_total_pending : 0,\n            );\n            mergeCountEntries(wakeRequestOwnerCounts, entry.stage_scheduled_think_owners);\n        }\n\n        const spanMs = frames.length > 1\n            ? Math.max(0, frames[frames.length - 1].end_ms - frames[0].start_ms)\n            : 0;\n\n        return {\n            label: state.label,\n            bundle_version: PORTAL_DEBUG_BUILD_VERSION,\n            portal_runtime_version: globalThis.__portalDebugBuildVersion__ ?? null,\n            scene_runtime_version: globalThis.__sceneDebugBuildVersion__ ?? null,\n            frame_wakeup_runtime_version: globalThis.__frameWakeupDebugBuildVersion__ ?? null,\n            emitted_at_ms: roundMs(at),\n            window_ms: state.windowMs,\n            visibility: document.visibilityState,\n            frame_count: frames.length,\n            fps_avg: spanMs > 0 ? roundMs((frames.length * 1000) / spanMs) : null,\n            timing: {\n                nominal_vsync_ms: missedVsync.nominal_vsync_ms,\n                frame_gap_ms: seriesStats(frameGaps),\n                frame_gap_jitter_ms: seriesStats(frameGapJitter),\n                frame_total_ms: seriesStats(frameDurations),\n                callback_lag_ms: seriesStats(callbackLag),\n                raf_request_to_callback_ms: seriesStats(rafRequestLatency),\n                wake_to_frame_ms: seriesStats(wakeOldest),\n                missed_vsync: {\n                    total_missed_windows: missedVsync.total_missed_windows,\n                    stall_frame_count: missedVsync.stall_frame_count,\n                    histogram: missedVsync.histogram,\n                },\n            },\n            main_thread: {\n                longtask_duration_ms: seriesStats(longTaskDurations),\n                longtask_count: state.longTasks.length,\n                lag_ms: seriesStats(mainThreadLag),\n                portal_longtask_attribution: portalLongTasks,\n                puffbook_recent_events: puffbookEvents,\n            },\n            wake_reasons: countValues(state.wakeEvents.map((entry) => entry.reason)),\n            wake_requests: {\n                scene_scheduled_think_total_pending_max: wakeRequestPendingMax,\n                scene_scheduled_think_owners: sortCountEntries(wakeRequestOwnerCounts),\n                recent: state.wakeEvents.slice(-BUNDLE_RECENT_LIMIT).map(compactWakeEvent),\n            },\n            hot_frames: {\n                count: hotFrameCount,\n                reasons: countValues(demandReasonValues),\n                scheduled_think_owners: sortCountEntries(scheduledThinkOwnerCounts),\n                recent: state.frameDemandFrames.slice(-BUNDLE_RECENT_LIMIT).map(compactFrameDemand),\n            },\n            scheduled_thinks: {\n                pending_owners: latestDemand?.pending_scheduled_think_owners ?? [],\n                persistent_owners: sortCountEntries(pendingScheduledThinkOwnerCounts),\n                frame_step_owners: sortCountEntries(frameStepOwnerCounts),\n                wake_owners: sortCountEntries(wakeOwnerCounts),\n                reasons: sortCountEntries(scheduledThinkReasonCounts),\n                frame_step_reasons: sortCountEntries(frameStepReasonCounts),\n                wake_reasons: sortCountEntries(wakeReasonCounts),\n                events_by_kind: countValues(state.scheduledThinkEvents.map((entry) => entry.kind)),\n                recent: state.scheduledThinkEvents.slice(-BUNDLE_RECENT_LIMIT).map(compactScheduledThinkEvent),\n            },\n            phase_durations_ms: phaseStats,\n            gpu: gpuSummary,\n            tableview: tableviewSummary,\n            outliers: {\n                frames: worstFrames,\n                longtasks: worstLongTasks,\n                main_thread_lags: worstMainThreadLags,\n            },\n        };\n    }\n\n    /* Record one wake request so the next produced frame can report true wake-to-frame latency. */\n    function noteWake(reason = 'unspecified', at = performance.now(), opts = {}) {\n        const entry = {\n            at_ms: at,\n            reason,\n            stage_scheduled_think_total_pending: Number.isFinite(opts?.stage_scheduled_think_total_pending)\n                ? opts.stage_scheduled_think_total_pending\n                : null,\n            stage_scheduled_think_owners: Array.isArray(opts?.stage_scheduled_think_owners)\n                ? opts.stage_scheduled_think_owners.map((item) => ({\n                    key: item?.key ?? 'unspecified',\n                    count: Number.isFinite(item?.count) ? item.count : 0,\n                }))\n                : [],\n        };\n        state.pendingWakes.push(entry);\n        state.wakeEvents.push(entry);\n        prune(at);\n    }\n\n    /* Record one completed frame with its phase timings and any pending wake latencies it discharged. */\n    function noteFrame({\n        frameStamp = 0,\n        callbackStartAt = performance.now(),\n        frameEndAt = callbackStartAt,\n        rafTimestamp = callbackStartAt,\n        rafRequestAt = null,\n        wakeReason = '',\n        phaseDurations = null,\n        frameDemand = null,\n    } = {}) {\n        prune(frameEndAt);\n        const frameGapMs = state.lastFrameStartMs === null ? 0 : Math.max(0, callbackStartAt - state.lastFrameStartMs);\n        const frameGapJitterMs = state.lastFrameGapMs === null ? 0 : Math.abs(frameGapMs - state.lastFrameGapMs);\n        state.lastFrameStartMs = callbackStartAt;\n        state.lastFrameGapMs = frameGapMs;\n\n        const wakes = state.pendingWakes.splice(0, state.pendingWakes.length);\n        const wakeLatencies = wakes.map((entry) => Math.max(0, callbackStartAt - entry.at_ms));\n        const wakeLatencyAvg = wakeLatencies.length > 0\n            ? wakeLatencies.reduce((acc, value) => acc + value, 0) / wakeLatencies.length\n            : 0;\n        state.frames.push({\n            frame_stamp: frameStamp,\n            start_ms: callbackStartAt,\n            end_ms: frameEndAt,\n            frame_gap_ms: frameGapMs,\n            frame_gap_jitter_ms: frameGapJitterMs,\n            frame_total_ms: Math.max(0, frameEndAt - callbackStartAt),\n            callback_lag_ms: Math.max(0, callbackStartAt - rafTimestamp),\n            raf_request_to_callback_ms: rafRequestAt === null ? 0 : Math.max(0, callbackStartAt - rafRequestAt),\n            wake_to_frame_oldest_ms: wakeLatencies.length > 0 ? Math.max(...wakeLatencies) : 0,\n            wake_to_frame_newest_ms: wakeLatencies.length > 0 ? Math.min(...wakeLatencies) : 0,\n            wake_to_frame_avg_ms: wakeLatencyAvg,\n            wake_count: wakeLatencies.length,\n            wake_reason: wakeReason || wakes[wakes.length - 1]?.reason || '',\n            phase_durations_ms: phaseDurations ?? {},\n        });\n        const gpuSnapshot = gpuDiagJitterSnapshot?.() ?? null;\n        if (gpuSnapshot) {\n            state.gpuFrames.push(gpuSnapshot);\n        }\n        state.frameDemandFrames.push({\n            end_ms: frameEndAt,\n            at_ms: frameEndAt,\n            hot: frameDemand?.hot === true,\n            reasons: Array.isArray(frameDemand?.reasons) ? frameDemand.reasons.slice() : [],\n            presenter_hot: frameDemand?.presenter?.hot === true,\n            presenter_hot_until_ms: Number.isFinite(frameDemand?.presenter?.hot_until_ms) ? frameDemand.presenter.hot_until_ms : null,\n            presenter_quiescent_for_ms: Number.isFinite(frameDemand?.presenter?.quiescent_for_ms) ? frameDemand.presenter.quiescent_for_ms : null,\n            presenter_last_promote_reason: frameDemand?.presenter?.last_promote_reason ?? '',\n            scheduled_think_owners: Array.isArray(frameDemand?.scheduled_think_owners)\n                ? frameDemand.scheduled_think_owners.map((entry) => ({\n                    key: entry?.key ?? 'unspecified',\n                    count: Number.isFinite(entry?.count) ? entry.count : 0,\n                }))\n                : [],\n            pending_scheduled_think_owners: Array.isArray(frameDemand?.pending_scheduled_think_owners)\n                ? frameDemand.pending_scheduled_think_owners.map((entry) => ({\n                    key: entry?.key ?? 'unspecified',\n                    count: Number.isFinite(entry?.count) ? entry.count : 0,\n                }))\n                : [],\n        });\n        prune(frameEndAt);\n    }\n\n    /* Record one scheduled-think ownership event so cold self-rearming loops stay visible in steady-state captures. */\n    function noteScheduledThink({\n        kind = 'unspecified',\n        scene_label = 'scene',\n        owner_label = 'Node',\n        reason = null,\n        cadence = null,\n        delay_ms = null,\n        pending_count = null,\n        at = performance.now(),\n    } = {}) {\n        state.scheduledThinkEvents.push({\n            at_ms: at,\n            kind,\n            scene_label,\n            owner_label,\n            reason,\n            cadence,\n            delay_ms,\n            pending_count,\n        });\n        prune(at);\n    }\n\n    /* Reset all rolling state so a fresh capture can start cleanly around one user interaction. */\n    function reset(label = state.label) {\n        const now = performance.now();\n        state.label = label;\n        state.createdAtMs = now;\n        resetForegroundWindow(now);\n        state.ring = [];\n        state.foregroundSinceMs = document.visibilityState === 'visible' ? now : null;\n        return {\n            ok: true,\n            label,\n            reset_at_ms: roundMs(now),\n        };\n    }\n\n    /* Expose the live ring plus a freshly built current-window bundle for backdoor inspection. */\n    function report() {\n        return {\n            label: state.label,\n            created_at_ms: roundMs(state.createdAtMs),\n            current_bundle: buildBundle(performance.now()),\n            ring: state.ring.slice(),\n        };\n    }\n\n    installLongTaskObserver();\n    scheduleLagTick();\n    document.addEventListener?.('visibilitychange', () => noteVisibility(performance.now()));\n    win.setInterval(() => {\n        emitBundle(performance.now());\n    }, state.reportEveryMs);\n\n    return {\n        noteWake,\n        noteFrame,\n        noteScheduledThink,\n        report,\n        reset,\n    };\n}\n"],
  "mappings": "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;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA;AAAA,IAGN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA;AAAA,IAGN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA,IACN;AAAA,IAAM;AAAA;AAAA,IAGN;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA;AAAA,IAGH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA,IAAG;AAAA,IACH;AAAA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ACL,IAAAA,IAAG,gBAAgB,QAAQ,IAAI;AAC/B,IAAAA,IAAG,SAAS,GAAG,GAAGA,IAAG,oBAAoBA,IAAG,mBAAmB;AAAA,EACjE;AACF;AApzTA,IAiDI,SA0XA,IAuEA,SAikBA,OACA,OACA,OAsoBA,IA0DE,QACA,iBACA,SACA,kBACA,OACA,gBACA,SACA,0BACA,0BACA,wBACA,cACA,+BACA,gCACA,4BACA,kCACA,qBAEA,oBAyEA,iBAgFA,gBA0DA,aACA,gBACA,wBACA,aAEA,QACA,iBACA,SACA,kBACA,OACA,gBACA,SACA,YA0EA,YACA,SAiXA,cAoSA,UACA,kBAykBA,mBA8vCA,wBA6KA,qBACA,kBACA,sBACA,mBACA,uBACA,oBACA,wBACA,qBACA,+BACA,4BACA,wBACA,qBACA,0BACA,uBACA,0BACA,uBACA,uBACA,oBACA,sBACA,mBAGA,yBACA,sBACA,uBAEF,YA4JE,gBAoEA,IACA,YAKAO,gBAGA,oBAwBA,OACA,KACA,QACA,WACA,iBACA,mBACA,iBAKA,iBAGA,SACA,UACA,uBASA,cACA,oBACA,cACA,oBAGA,6BACA,6BACA,6BACA,6BACA,6BACA,6BAGA,oBACA,oBACA,gBACA,gBACA,gBACA,iBACA,iBACA,oBACA,mBACA,sBACA,sBAGA,kBACA,mBACA,qBACA,oBACA,kBACA,oBACA,oCACA,gCACA,qBAEA,IACA,UACA,MACA,MACA,MACA,KACA,QACA,OACA,QACA,OACA,KACA,WACA,OACA,OACA,OACA,MACA,OACA,MACA,OACA,MACA,MACA,OACA,UACA,YACA,gBACA,SACA,QACA,QACA,QACA,OACA,SACA,QACA,SACA,QACA,OACA,cACA,aACA,WACA,SACA,UACA,SACA,SACA,SACA,QACA,YACA,UACA,SACA,SACA,UAEA,qBACA,qBACA,sBACA,qBACA,oBAGA,MACA,iBACA,OACA,kBACA,OACA,gBACA,SACA,wBACA,wBACA,sBACA,YACA,gBACA,6BACA,8BACA,0BACA,gCACA,mBAEA,IACA,YACA,KACA,aACA,aACA,cAIA,8BACA,+BACA,+BACA,+BAEA,+BACA,qCACA,qCACA,qCAEA,2BACA,oBACA,2BACA,qBACA,4BACA,sBACA,uBACA,0CACA,2CACA,2BACA,kCAEA,iCACA,iCACA,kCACA,kCAEA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,+BACA,+BACA,+BACA,gCACA,gCACA,gCACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,uCACA,uCACA,uCACA,wCACA,wCACA,wCAEA,gCACA,sCACA,sCACA,wCAEA,0BACA,iCACA,gCACA,uCAEA,YAyCF,6BA85DEa,QAQA,UAGA,cACA,wBAMA,gBACA,aACA,iBACA,eACA,kBAEA,iBACA,mBACA,6BACA,uBACA,2CACA,6CACA,yBACA,sCAEA,OACA,YACA,YACA,YACA,KACA,UACA,UACA,UACA,MACA,WACA,WACA,WACA,YACA,YACA,YACA,YACA,cACA,YACA,mBACA,cACA,cACA,cACA,cACA,cACA,cACA,kBACA,yBACA,qBACA,cACA,mBACA,mBACA,mBACA,gBACA,gBACA,kBACA,sBACA,yBACA,yBACA,2BACA,+BAEA,cACA,kBACA,YACA,kBAEA,SAkWA,aAqBA,SAgCA,SA0JA,mBAwBA,MAqIA,oBAiBA,wBAkIA,SACA,SA8+BA,SAyOA,qBAwBA,yBAsDA,WACA,gBAsKA,aAOA,iBAEA,mBACA,oBACA,kBACA,mBAGA,OACA,SACA,QACA,mBACA,eACA,gBACA,eAEA,kBACA,oBACA,0BA6CA,qBAeA;AAlkTN;AAAA;AAiDA,IAAI,UAAU;AA0Xd,IAAI,KAAkB,uBAAO,OAAO;AAAA,MAClC,WAAW;AAAA,MACX;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,gBAAgB;A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AAM,mBAAmB,oBAAI,IAAI;AACjC,IAAM,kBAAkB,oBAAI,IAAI;AAChC,IAAM,oBAAoB,oBAAI,IAAI;AAClC,IAAI,qBAAqB;AACzB,IAAI,wBAAwB;AAC5B,IAAM,gBAAgB,oBAAI,IAAI;AAC9B,IAAM,oBAAoB,oBAAI,IAAI;AAClC,IAAM,kBAAkB,oBAAI,IAAI;AAChC,IAAM,mBAAmB,oBAAI,IAAI;AACjC,IAAM,oBAAoB,oBAAI,IAAI;AAClC,IAAM,kBAAkB,oBAAI,QAAQ;AACpC,IAAI,qBAAqB;AAAA;AAAA;;;ACrGzB,IAKa,gBACA,2BACA,4BACA,+BACA,gCACA,uBACA,oBACA,+BACA,wBACA,sBACA,oBAOA,UAiCA,uBACA,kCACA,mCACA,sCACA,uCACA,8BACA,2BACA,sCACA,+BACA,6BACA,2BAGA,iBAqBA,oBACA,+BACA,gCACA,mCACA,oCACA,2BACA,wBACA,mCACA,4BACA,0BACA,wBAOA,cAiCA,8BACA,yCACA,0CACA,6CACA,8CACA,qCACA,kCACA,6CACA,sCACA,oCACA,kCAKA,wBA2BA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCASA,0BAuCA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAGA,0BAqBA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCAGA,4BAqBA,sCACA,iDACA,kDACA,qDACA,sDACA,6CACA,0CACA,qDACA,8CACA,4CACA,0CAIA,gCAwBA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCASA,4BAuCA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAOA,0BAiCA,sCACA,iDACA,kDACA,qDACA,sDACA,6CACA,0CACA,qDACA,8CACA,4CACA,0CAQA,gCAoCA,sCACA,iDACA,kDACA,qDACA,sDACA,6CACA,0CACA,qDACA,8CACA,4CACA,0CAYA,gCAgDA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCAeA,4BAyDA,qCACA,gDACA,iDACA,oDACA,qDACA,4CACA,yCACA,oDACA,6CACA,2CACA,yCASA,+BAuCA,oCACA,+CACA,gDACA,mDACA,oDACA,2CACA,wCACA,mDACA,4CACA,0CACA,wCAMA,8BA8BA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAMA,0BA8BA,0BACA,qCACA,sCACA,yCACA,0CACA,iCACA,8BACA,yCACA,kCACA,gCACA,8BAGA,oBAqBA,wBACA,mCACA,oCACA,uCACA,wCACA,+BACA,4BACA,uCACA,gCACA,8BACA,4BAKA,kBA2BA,0BACA,qCACA,sCACA,yCACA,0CACA,iCACA,8BACA,yCACA,kCACA,gCACA,8BAKA,oBA2BA,2BACA,sCACA,uCACA,0CACA,2CACA,kCACA,+BACA,0CACA,mCACA,iCACA,+BAKA,qBA2BA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCAIA,4BAwBA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCAIA,4BAwBA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCAWA,uBA6CA,+BACA,0CACA,2CACA,8CACA,+CACA,sCACA,mCACA,8CACA,uCACA,qCACA,mCAUA,yBA0CA,0BACA,qCACA,sCACA,yCACA,0CACA,iCACA,8BACA,yCACA,kCACA,gCACA,8BAIA,oBAwBA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCAIA,uBAwBA,yBACA,oCACA,qCACA,wCACA,yCACA,gCACA,6BACA,wCACA,iCACA,+BACA,6BAMA,mBA8BA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCAIA,uBAwBA,iCACA,4CACA,6CACA,gDACA,iDACA,wCACA,qCACA,gDACA,yCACA,uCACA,qCASA,2BAuCA,0CACA,qDACA,sDACA,yDACA,0DACA,iDACA,8CACA,yDACA,kDACA,gDACA,8CAcA,oCAsDA,6CACA,wDACA,yDACA,4DACA,6DACA,oDACA,iDACA,4DACA,qDACA,mDACA,iDAKA,uCA2BA,qCACA,gDACA,iDACA,oDACA,qDACA,4CACA,yCACA,oDACA,6CACA,2CACA,yCAOA,+BAiCA,qCACA,gDACA,iDACA,oDACA,qDACA,4CACA,yCACA,oDACA,6CACA,2CACA,yCAQA,+BAoCA,4CACA,uDACA,wDACA,2DACA,4DACA,mDACA,gDACA,2DACA,oDACA,kDACA,gDAaA,sCAmDA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCAIA,uBAwBA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAGA,0BAqBA,oCACA,+CACA,gDACA,mDACA,oDACA,2CACA,wCACA,mDACA,4CACA,0CACA,wCASA,8BAuCA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAQA,0BAoCA,iCACA,4CACA,6CACA,gDACA,iDACA,wCACA,qCACA,gDACA,yCACA,uCACA,qCAQA,2BAoCA,oCACA,+CACA,gDACA,mDACA,oDACA,2CACA,wCACA,mDACA,4CACA,0CACA,wCAMA,8BA8BA,qCACA,gDACA,iDACA,oDACA,qDACA,4CACA,yCACA,oDACA,6CACA,2CACA,yCAMA,+BA8BA,8CACA,yDACA,0DACA,6DACA,8DACA,qDACA,kDACA,6DACA,sDACA,oDACA,kDASA,wCAuCA,2CACA,sDACA,uDACA,0DACA,2DACA,kDACA,+CACA,0DACA,mDACA,iDACA,+CASA,qCAuCA,4BACA,uCACA,wCACA,2CACA,4CACA,mCACA,gCACA,2CACA,oCACA,kCACA,gCAIA,sBAwBA,+BACA,0CACA,2CACA,8CACA,+CACA,sCACA,mCACA,8CACA,uCACA,qCACA,mCAGA,yBAqBA,0CACA,qDACA,sDACA,yDACA,0DACA,iDACA,8CACA,yDACA,kDACA,gDACA,8CAKA,oCA2BA,iCACA,4CACA,6CACA,gDACA,iDACA,wCACA,qCACA,gDACA,yCACA,uCACA,qCASA,2BAuCA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCASA,uBAuCA,6BACA,wCACA,yCACA,4CACA,6CACA,oCACA,iCACA,4CACA,qCACA,mCACA,iCAGA,uBAqBA,8BACA,yCACA,0CACA,6CACA,8CACA,qCACA,kCACA,6CACA,sCACA,oCACA,kCASA,wBAuCA,iCACA,4CACA,6CACA,gDACA,iDACA,wCACA,qCACA,gDACA,yCACA,uCACA,qCAMA,2BA8BA,kCACA,6CACA,8CACA,iDACA,kDACA,yCACA,sCACA,iDACA,0CACA,wCACA,sCAMA,4BA8BA,iCACA,4CACA,6CACA,gDACA,iDACA,wCACA,qCACA,gDACA,yCACA,uCACA,qCAWA,2BA6CA,8BACA,yCACA,0CACA,6CACA,8CACA,qCACA,kCACA,6CACA,sCACA,oCACA,kCAWA,wBA6CA,0CACA,qDACA,sDACA,yDACA,0DACA,iDACA,8CACA,yDACA,kDACA,gDACA,8CAIA,oCAwBA,mCACA,8CACA,+CACA,kDACA,mDACA,0CACA,uCACA,kDACA,2CACA,yCACA,uCAIA,6BAwBA,4CACA,uDACA,wDACA,2DACA,4DACA,mDACA,gDACA,2DACA,oDACA,kDACA,gDAGA,sCAqBA,8BACA,yCACA,0CACA,6CACA,8CACA,qCACA,kCACA,6CACA,sCACA,oCACA,kCAYA,wBAgDA,uCACA,kDACA,mDACA,sDACA,uDACA,8CACA,2CACA,sDACA,+CACA,6CACA,2CAGA,iCAqBA,gCACA,2CACA,4CACA,+CACA,gDACA,uCACA,oCACA,+CACA,wCACA,sCACA,oCAWA,0BA6CA,4BACA,uCACA,wCACA,2CACA,4CACA,mCACA,gCACA,2CACA,oCACA,kCACA,gCAGA,sBAqBA,6BACA,wCACA,yCACA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",
  "names": ["name", "len", "axis", "name", "gl", "length", "lerp", "angle", "base", "internalFormat", "info", "isArrayBuffer", "level", "clearEventHandlers", "onError", "onLoad", "cb", "img", "location", "typeInfo", "normalize", "log", "matches", "next", "error", "program", "resolve", "token", "isArray", "node", "errors", "programs", "glEnumToString", "getShared2DContext", "filename", "error", "min", "max", "gl", "dims", "name", "gl", "gl", "mesh", "requestFrame", "name", "matches", "controls", "next", "name", "next", "scale", "gl", "rotationZ", "angle", "clamp", "progress", "eased", "gl", "gl", "IDENTITY_MATRIX", "name", "isTransformStateKey", "config", "length", "lineHeight", "axis", "w", "previous", "identity", "HASH_BYTES", "axis", "name", "QWORD", "name", "length", "QWORD", "name", "QWORD", "decoder", "QWORD", "QWORD", "length", "QWORD", "length", "QWORD", "bytesForBits", "ARRAY_ALIGN", "QWORD", "length", "bytesForBits", "ARRAY_ALIGN", "QWORD", "length", "QWORD", "length", "decoder", "encoder", "AllStructDescriptors", "name", "length", "QWORD", "arrowDelimiters", "QWORD", "length", "QWORD", "bytesForBits", "ARRAY_ALIGN", "QWORD", "length", "axis", "QWORD", "HASH_BYTES", "QWORD", "length", "QWORD", "length", "name", "topCountEntries", "name", "QWORD", "AllStructDescriptors", "length", "previous", "declaredFlags", "actualOuter", "roundMS", "ARRAY_ALIGN", "name", "length", "min", "max", "HASH_BYTES", "previous", "FILE_MAGIC", "FILE_FORMAT_REVISION_V2", "SELF_EDGE_REL", "sum", "concatBytes", "payloadHash", "axis", "i64Bytes", "f32Bytes", "f64Bytes", "ARRAY_ALIGN", "AllStructDescriptors", "name", "AllStructDescriptors", "pushTestingPortalTrace", "roundMS", "next", "AllStructDescriptors", "Response", "name", "name", "angle", "name", "name", "length", "source", "hashFloat32Array", "setBufferData", "gl", "isTransformStateKey", "name", "uploadBytes", "lineHeight", "clipped", "lineHeight", "gl", "hashFloat32Array", "setBufferData", "gl", "setBufferSubData", "isTransformStateKey", "len", "dot", "axis", "angle", "length", "error", "error", "mountRoot", "hudPoint", "name", "axis", "min", "max", "name", "unquoteText", "scalarText", "name", "unquoteText", "scalarText", "len", "gl", "gl", "resolve", "controls", "gl", "DRAW_PASS_NAMES", "gl", "glContextUsable", "pickClipAllowsNode", "v3", "w", "name", "next", "dims", "pickPrepareToken", "window", "handled", "window", "dims", "distance", "scale", "next", "world", "gl", "gl", "wait", "hashFloat32Array", "setBufferData", "gl", "setBufferSubData", "isTransformStateKey", "gl", "create", "axis", "length", "normalize", "len", "dot", "tl", "tr", "bl", "br", "mesh", "gl", "previewFlagsValue", "previewValue", "previewRowCount", "previewCell", "name", "editParts", "name", "next", "textEncoder", "mustNonNegativeInt", "editParts", "utf8Length", "nextBody", "codeUnitIndexForByteOffset", "utf8Length", "textEncoder", "comparePosition", "range", "length", "inserted", "frame", "spans", "name", "lineHeight", "matches", "previous", "row", "position", "distance", "next", "cell", "local", "absoluteLine", "scale", "w", "min", "max", "next", "window", "window", "window", "PANEL_WIDTH", "PANEL_WIDTH", "PANEL_PADDING", "ENTRY_PADDING", "wait", "gl", "name", "gl", "name", "error", "config", "lineHeight", "name", "next", "textSummary", "controls", "w", "hasWheelInput", "dot", "result", "controls", "next", "gl", "findNode", "hasWheelInput", "gl", "name", "name", "scale", "axis", "cross", "next", "length", "icon", "min", "max", "gl", "window", "next", "result", "lineHeight", "sameColor", "lineHeight", "next", "clamp", "maintainSelection", "matches", "document", "error", "PANEL_WIDTH", "PANEL_HEIGHT", "CONTENT_Z", "length", "clipboardText", "gl", "name", "window_", "document_", "init_globals", "isBrowser", "init_globals", "assert", "init_assert", "assert", "init_assert", "noop", "level", "length", "init_formatters", "isBrowser", "COLOR", "name", "isBrowser", "window_", "init_formatters", "init_assert", "isBrowser", "level", "noop", "assert", "init_dist", "log", "VERSION", "init_dist", "level", "name", "VERSION", "assert", "init_assert", "globals", "self_", "window_", "global_", "document_", "isBrowser", "matches", "nodeVersion", "init_globals", "init_assert", "resolve", "assert", "error", "assert", "init_assert", "init_globals", "init_assert", "isBrowser", "name", "assert", "error", "init_globals", "name", "onMessage", "error", "isBrowser", "name", "isBrowser", "version", "assert", "init_assert", "init_globals", "VERSION", "assert", "init_assert", "isBrowser", "assert", "VERSION", "error", "init_globals", "init_assert", "init_dist", "init_assert", "init_globals", "isBrowser", "name", "error", "init_dist", "length", "length", "copy", "filename", "isBuffer", "toArrayBuffer", "copyToArrayBuffer", "copy", "init_dist", "matches", "matches", "init_dist", "error", "resolve", "init_dist", "init_dist", "init_dist", "init_dist", "init_dist", "init_dist", "getFirstCharacters", "getMagicString", "length", "init_dist", "textEncoder", "init_dist", "DEFAULT_CHUNK_SIZE", "DEFAULT_CHUNK_SIZE", "toArrayBuffer", "error", "init_dist", "init_dist", "isBuffer", "textDecoder", "toArrayBuffer", "init_dist", "init_dist", "init_dist", "assert", "init_dist", "len", "name", "init_dist", "fetch", "init_dist", "init_dist", "VERSION", "init_version", "init_dist", "textDecoder", "error", "URL", "resolve", "error", "error", "parseImageNode", "init_dist", "init_dist", "init_version", "VERSION", "parseImageNode", "init_dist", "init_dist", "assert", "init_assert", "length", "assert", "init_assert", "assert", "length", "result", "init_assert", "init_dist", "init_assert", "name", "assert", "mesh", "ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE", "ATTRIBUTE_TYPE_TO_COMPONENTS", "ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY", "length", "w", "textDecoder", "init_dist", "mesh", "max", "decode", "encode", "name", "mesh", "isArray", "len", "init_dist", "decode", "name", "decodePropertyTextures", "decodePropertyTables", "findPropertyTableByClass", "processPropertyTable", "getPropertyDataFromBinarySource", "getArrayOffsetsForProperty", "getStringOffsetsForProperty", "getPropertyDataNumeric", "isArray", "mesh", "VERSION", "init_version", "VERSION", "init_version", "resolve", "init_dist", "gl", "error", "resolve", "textureFormats", "init_dist", "init_version", "VERSION", "init_dist", "getMagicString", "version", "LITTLE_ENDIAN", "textDecoder", "init_dist", "decode", "decode", "name", "name", "init_dist", "name", "preprocess", "isBrowser", "resolve", "init_dist", "VERSION", "init_version", "init_dist", "init_dist", "parse", "init_dist", "init_version", "VERSION", "init_dist", "name", "decode", "encode", "name", "preprocess", "mesh", "init_dist", "scale", "min", "max", "length", "assert", "init_assert", "init_assert", "length", "assert", "EPSILON", "init_common", "create", "forEach", "init_common", "w", "create", "length", "normalize", "len", "dot", "cross", "w", "transformMat3", "rotateX", "rotateY", "rotateZ", "forEach", "init_common", "cross", "rotateX", "rotateY", "rotateZ", "transformMat3", "create", "transpose", "multiply", "translate", "scale", "w", "init_common", "IDENTITY_MATRIX3", "IDENTITY_MATRIX", "INDICES", "transpose", "multiply", "scale", "translate", "transformMat3", "create", "normalize", "w", "len", "forEach", "init_common", "create", "setAxisAngle", "axis", "slerp", "EPSILON", "normalize", "rotationTo", "sqlerp", "init_quat", "init_common", "dot", "cross", "init_dist", "init_quat", "decode", "name", "materials", "mesh", "length", "scale", "init_dist", "decode", "encode", "name", "assert", "init_assert", "decode", "encode", "name", "decode", "encode", "name", "textDecoder", "EXTENSIONS", "preprocess", "preprocess", "mesh", "textDecoder", "assert", "fetch", "loadImage", "init_dist", "init_assert", "parse", "init_version", "VERSION", "BYTES", "COMPONENTS", "init_assert", "init_dist", "assert", "mesh", "copyToArrayBuffer", "init_dist", "IDENTITY_MATRIX", "name", "mesh", "gl", "init_dist", "next", "scale", "decayBoundaryHitAfterS", "min", "max", "gl", "scale", "position", "velocity", "next", "dot", "length", "gl", "resolve", "ORIENTATION_INDEX", "normalizeStackAlignment", "ALIGN_INDEX", "normalizeStackSpacing", "cross", "next", "next", "interactiveScenes", "Log", "name", "_CryptoUtils", "encoder", "logger", "resolve", "len", "_SigninRequest", "_a", "config", "config", "next", "live", "name", "editParts", "held", "length", "config", "textEncoder", "resolve", "err", "resp", "onMessage", "Response", "eventLagMS", "w", "setTestingCurrentDocument", "setTestingCurrentScreen", "setTestingPuffbookError", "gl", "next", "supportsLongTaskObserver", "max", "setTestingCurrentDocument", "setTestingCurrentScreen", "setTestingPuffbookError", "name", "version", "previous", "distance", "cell", "mesh", "min", "max", "axis", "scale", "angle", "error", "next", "name", "sameColor", "text", "name", "min", "max", "error", "window", "window", "error", "PANEL_WIDTH", "PANEL_PADDING", "INPUT_HEIGHT", "CONTENT_Z", "window", "add", "name", "level", "error", "window", "window", "previous", "ROW_HEIGHT", "window", "name", "name", "len", "axis", "sameInputSyncSpans", "sameInputSyncSpans", "next", "sameInputSyncSpans", "window", "next", "singleReplaceSpanFromChange", "previous", "sameInputSyncSpans", "codeUnitIndexForByteOffset", "codeUnitIndexForByteOffset", "utf8ByteWidth", "next", "version", "changeSpans", "changeSpans", "textEncoder", "window", "previous", "fieldText", "name", "value", "fieldText", "name", "name", "ret", "name", "unquoteText", "text", "isLazyPhysicalType", "cell", "metadataTitle", "metadataTitle", "create", "textEncoder", "next", "error", "version", "inverse", "commitStartedMS", "resolve", "fieldText", "next", "name", "makeLine", "next", "next", "next", "previous", "BUTTON_HEIGHT", "WIDTH", "scale", "w", "name", "previous", "gl", "next", "angle", "error", "filename", "resolve", "window", "version", "identity", "error", "level", "resolve", "wait", "filename", "indexedDB", "AUTH_REDIRECT_BACKOFF_KEY", "AUTH_CALLBACK_MISSING_STATE_RETRY_KEY", "next", "beginSigninRedirect", "buildSigninRedirectURL", "query", "sortCountEntries", "name", "perfKeyPart", "dot", "label", "w", "gl", "name", "incCount", "name", "min", "max", "next", "gl", "nowMS", "sameMat16", "error", "second", "identity", "resolve", "document", "dims", "dot", "location"]
}
